diff --git a/ci4/app/Controllers/Presupuestos/Presupuestoadmin.php b/ci4/app/Controllers/Presupuestos/Presupuestoadmin.php
index d6973597..e13c2a5c 100644
--- a/ci4/app/Controllers/Presupuestos/Presupuestoadmin.php
+++ b/ci4/app/Controllers/Presupuestos/Presupuestoadmin.php
@@ -232,12 +232,22 @@ class Presupuestoadmin extends \App\Controllers\BaseResourceController
$postData = $this->request->getPost();
$postData['updated_at'] = gmdate('Y-m-d H:m:s', time());
-
+
$sanitizedData = $this->sanitized($postData, $nullIfEmpty);
-
- // JJO
$sanitizedData['user_updated_id'] = auth()->user()->id;
+ if(isset($sanitizedData['total_aceptado_revisado']) && $sanitizedData['total_aceptado_revisado'] != 0
+ && $sanitizedData['total_aceptado_revisado'] != null && $sanitizedData['total_aceptado_revisado'] != ""){
+ $sanitizedData['aprobado_at'] = $sanitizedData['updated_at'];
+ $sanitizedData['aprobado_user_id'] = $sanitizedData['user_updated_id'];
+ }
+
+ if ($presupuestoEntity->estado_id == 1 && isset($postData['confirmar']) && $postData['confirmar'] == 1) {
+ $sanitizedData['aprobado_at'] = $sanitizedData['updated_at'];
+ $sanitizedData['aprobado_user_id'] = $sanitizedData['user_updated_id'];
+ $sanitizedData['total_aceptado_revisado'] = $sanitizedData['total_presupuesto'];
+ }
+
if ($this->request->getPost('is_duplicado') == null) {
$sanitizedData['is_duplicado'] = 0;
}
@@ -633,6 +643,12 @@ class Presupuestoadmin extends \App\Controllers\BaseResourceController
$data['resumen']['total_factor'] = is_numeric($presupuesto->total_factor) ? $presupuesto->total_factor : 0;
$data['resumen']['total_factor_ponderado'] = is_numeric($presupuesto->total_factor_ponderado) ? $presupuesto->total_factor_ponderado : 0;
+ $data['total_aceptado_revisado'] = $presupuesto->total_aceptado_revisado;
+ $data['aprobado_by_at'] = ($presupuesto->aprobado_user_id != null)?
+ model('App\Models\UserModel')->getFullName($presupuesto->aprobado_user_id) . ', '
+ . date('d/m/Y H:i:s', strtotime($presupuesto->aprobado_at)):'';
+
+
$data['resumen']['iva_reducido'] = $presupuesto->iva_reducido;
$data['created_by'] = model('App\Models\Usuarios\UserModel')->getFullName($presupuesto->user_created_id);
diff --git a/ci4/app/Database/Migrations/2025-04-03-200406_AddTotalAceptadoRevisadoToPresupuestos.php b/ci4/app/Database/Migrations/2025-04-03-200406_AddTotalAceptadoRevisadoToPresupuestos.php
new file mode 100755
index 00000000..5bf43d37
--- /dev/null
+++ b/ci4/app/Database/Migrations/2025-04-03-200406_AddTotalAceptadoRevisadoToPresupuestos.php
@@ -0,0 +1,25 @@
+forge->addColumn('presupuestos', [
+ 'total_aceptado_revisado' => [
+ 'type' => 'FLOAT',
+ 'null' => true,
+ 'default' => null,
+ 'after' => 'total_aceptado' // Opcional: reemplazar con la última columna actual
+ ],
+ ]);
+ }
+
+ public function down()
+ {
+ $this->forge->dropColumn('presupuestos', 'total_aceptado_revisado');
+ }
+}
diff --git a/ci4/app/Entities/Presupuestos/PresupuestoEntity.php b/ci4/app/Entities/Presupuestos/PresupuestoEntity.php
index c4993d9c..2b28d821 100755
--- a/ci4/app/Entities/Presupuestos/PresupuestoEntity.php
+++ b/ci4/app/Entities/Presupuestos/PresupuestoEntity.php
@@ -100,6 +100,7 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity
"total_factor" => null,
"total_factor_ponderado" => null,
'total_aceptado' => null,
+ 'total_aceptado_revisado' => null,
'iva_reducido' => null,
'excluir_rotativa' => null,
"acabado_cubierta_id" => null,
@@ -173,6 +174,7 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity
"total_factor" => "?float",
"total_factor_ponderado" => "?float",
'total_aceptado' => "?float",
+ 'total_aceptado_revisado' => "?float",
'iva_reducido' => "?boolean",
'excluir_rotativa' => "?boolean",
"acabado_cubierta_id" => "int",
diff --git a/ci4/app/Models/Presupuestos/PresupuestoDireccionesModel.php b/ci4/app/Models/Presupuestos/PresupuestoDireccionesModel.php
index 90da4d00..cc24fb30 100755
--- a/ci4/app/Models/Presupuestos/PresupuestoDireccionesModel.php
+++ b/ci4/app/Models/Presupuestos/PresupuestoDireccionesModel.php
@@ -74,6 +74,7 @@ class PresupuestoDireccionesModel extends \App\Models\BaseModel
$builder->where('t1.presupuesto_id', $presupuesto_id);
$builder->join("lg_paises t2", "t1.pais_id = t2.id", "left");
+ $builder->orderBy('t1.id', 'DESC');
return empty($search)
? $builder
diff --git a/ci4/app/Models/Presupuestos/PresupuestoModel.php b/ci4/app/Models/Presupuestos/PresupuestoModel.php
index 38f9aada..676e78b8 100755
--- a/ci4/app/Models/Presupuestos/PresupuestoModel.php
+++ b/ci4/app/Models/Presupuestos/PresupuestoModel.php
@@ -119,6 +119,7 @@ class PresupuestoModel extends \App\Models\BaseModel
"total_descuento",
"total_descuentoPercent",
"total_presupuesto",
+ "total_aceptado_revisado",
"total_precio_unidad",
"total_factor",
"total_factor_ponderado",
diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_resumenPresupuestoItems.php b/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_resumenPresupuestoItems.php
index 5f4c691b..31a2a04b 100644
--- a/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_resumenPresupuestoItems.php
+++ b/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_resumenPresupuestoItems.php
@@ -2,14 +2,12 @@
-
+
- estado_id == 2): ?>
-
-
-
- >
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
El total aceptado y revisado tiene que ser mayor que total costes + precio de envío
+
+
+
+
+
+ estado_id == 2) ? "disabled" : "" ?> type="text"
+ class="autonumeric-currency form-control text-center fs-5"
+ id="total_aceptado_revisado">
+
+
+
+
+
+ estado_id == 2): ?>
+
+
+
+ >
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/httpdocs/assets/js/safekat/components/chat.js b/httpdocs/assets/js/safekat/components/chat.js
index e0de09bf..043a6fef 100644
--- a/httpdocs/assets/js/safekat/components/chat.js
+++ b/httpdocs/assets/js/safekat/components/chat.js
@@ -68,7 +68,7 @@ class Chat {
}
if (this.chatHistoryBody[0]) {
- console.log("History body");
+ //console.log("History body");
this.scrollbarChatHistory = new PerfectScrollbar(this.chatHistoryBody[0], {
wheelPropagation: false,
suppressScrollX: true,
diff --git a/httpdocs/assets/js/safekat/pages/presupuestoAdmin/presupuestoAdminEdit.js b/httpdocs/assets/js/safekat/pages/presupuestoAdmin/presupuestoAdminEdit.js
index 7894e139..c597c3ce 100644
--- a/httpdocs/assets/js/safekat/pages/presupuestoAdmin/presupuestoAdminEdit.js
+++ b/httpdocs/assets/js/safekat/pages/presupuestoAdmin/presupuestoAdminEdit.js
@@ -82,7 +82,7 @@ class PresupuestoAdminEdit {
// Autonumeric
AutoNumeric.multiple('.autonumeric-currency', { decimalPlaces: 2, currencySymbol: '€', currencySymbolPlacement: 's', digitGroupSeparator: '.', decimalCharacter: ',' });
-
+
const impresion_id = $('#tipo_impresion_id').val();
let tipoLibro = '';
if (impresion_id == 1 || impresion_id == 2) {
@@ -120,6 +120,30 @@ class PresupuestoAdminEdit {
this.tiradasAlternativas.init();
this.resumen.init();
+ $('#btn_ajustar_revisado').on('click', function () {
+
+ this.resumen.updateTotales({ updateLP: true, updateServicios: true, updateEnvio: true }, true);
+ }.bind(this));
+
+ $('#total_aceptado_revisado').on('change', function () {
+ let totalCostes = AutoNumeric.getAutoNumericElement($('#totalCostes')[0]);
+ let envio_base = AutoNumeric.getAutoNumericElement($('#precioEnvios')[0]);
+ let autoTotalAceptado = AutoNumeric.getAutoNumericElement($('#total_aceptado_revisado')[0]);
+ let total_aceptado_revisado = autoTotalAceptado.getNumber();
+
+ if (total_aceptado_revisado && total_aceptado_revisado != 0) {
+ const nuevoTotal = totalCostes.getNumber() + envio_base.getNumber();
+
+ if (total_aceptado_revisado < nuevoTotal) {
+ // Solo usá .set(), no .val() ni .html()
+ autoTotalAceptado.set(nuevoTotal);
+ total_aceptado_revisado = nuevoTotal;
+ }
+
+ totalMargenes = total_aceptado_revisado - nuevoTotal;
+ }
+ }.bind(this));
+
if (window.location.href.includes("edit")) {
setTimeout(() => {
@@ -142,7 +166,7 @@ class PresupuestoAdminEdit {
target.removeClass('d-none');
}
});
-
+
$(document).on('update-presupuesto', this.updatePresupuesto.bind(this));
@@ -375,6 +399,10 @@ class PresupuestoAdminEdit {
self.tipo_impresion.val(response.data.tipo_impresion);
self.POD.val(response.data.POD);
+ AutoNumeric.getAutoNumericElement($('#total_aceptado_revisado')[0]).set(response.data.total_aceptado_revisado);
+
+ $('#aprobado_by_at').html(response.data.aprobado_by_at);
+
$('#created_by').html(response.data.created_by);
$('#updated_by').html(response.data.updated_by);
$('#created_at').html(response.data.created_at);
@@ -620,7 +648,7 @@ class PresupuestoAdminEdit {
const svgData = serializer.serializeToString(shapeSvgEl);
const svgBlob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' });
const svgUrl = URL.createObjectURL(svgBlob);
- const img = new Image(shapeSvgEl.getBoundingClientRect().width,shapeSvgEl.getBoundingClientRect().height);
+ const img = new Image(shapeSvgEl.getBoundingClientRect().width, shapeSvgEl.getBoundingClientRect().height);
img.onload = () => {
const scaleFactor = 3; // Increase resolution (e.g., 2x, 3x)
const canvas = document.createElement('canvas');
@@ -631,7 +659,7 @@ class PresupuestoAdminEdit {
canvas.height = height * scaleFactor;
const ctx = canvas.getContext('2d');
ctx.scale(scaleFactor, scaleFactor);
- ctx.drawImage(img, 0,0,width,height);
+ ctx.drawImage(img, 0, 0, width, height);
const pngUrl = canvas.toDataURL('image/png');
const downloadLink = document.createElement('a');
downloadLink.href = pngUrl;
diff --git a/httpdocs/assets/js/safekat/pages/presupuestoAdmin/sections/envios.js b/httpdocs/assets/js/safekat/pages/presupuestoAdmin/sections/envios.js
index a67afda7..00170f69 100644
--- a/httpdocs/assets/js/safekat/pages/presupuestoAdmin/sections/envios.js
+++ b/httpdocs/assets/js/safekat/pages/presupuestoAdmin/sections/envios.js
@@ -41,14 +41,13 @@ class Envios {
processing: true,
autoWidth: true,
responsive: true,
- order: [[0, "asc"]],
pageLength: 20,
lengthChange: false,
searching: false,
paging: false,
info: false,
scrollX: true,
-
+ ordering: false,
columns: [
{ 'data': 'tarifa_id' },
{ 'data': 'cantidad' },
@@ -87,10 +86,10 @@ class Envios {
{
orderable: false,
searchable: false,
- targets: [$('#tableOfDireccionesEnvio').find("tr:first th").length - 1]
+ // all columns
+ targets: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
+ //targets: [$('#tableOfDireccionesEnvio').find("tr:first th").length - 1]
},
- { "orderData": [0], "targets": 0 },
-
],
language: {
url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json"
diff --git a/httpdocs/assets/js/safekat/pages/presupuestoAdmin/sections/resumen.js b/httpdocs/assets/js/safekat/pages/presupuestoAdmin/sections/resumen.js
index cc09be38..ca466e56 100644
--- a/httpdocs/assets/js/safekat/pages/presupuestoAdmin/sections/resumen.js
+++ b/httpdocs/assets/js/safekat/pages/presupuestoAdmin/sections/resumen.js
@@ -11,7 +11,7 @@ class Resumen {
const self = this;
this.toastPresupuestoTotal = null
$(".update-totales").on("change", function () {
- self.updateTotales(true, true, true)
+ self.updateTotales(null, { updateLP: true, updateServicios: true, updateEnvio: true });
});
$(document).on('update-totales', async function () {
@@ -26,22 +26,22 @@ class Resumen {
// Mapear los valores a los elementos HTML por ID
$("#totalCostePapel").val(resumen.total_coste_papel || 0);
$("#totalCostePapel").html(resumen.total_coste_papel || 0);
- $("#porcentajeMargenPapel").val(resumen.total_margenPercent_papel ? resumen.total_margenPercent_papel: 0);
- $("#porcentajeMargenPapel").html(resumen.total_margenPercent_papel ? resumen.total_margenPercent_papel: 0);
+ $("#porcentajeMargenPapel").val(resumen.total_margenPercent_papel ? resumen.total_margenPercent_papel : 0);
+ $("#porcentajeMargenPapel").html(resumen.total_margenPercent_papel ? resumen.total_margenPercent_papel : 0);
$("#margenPapel").val(resumen.total_margen_papel || 0);
$("#margenPapel").html(resumen.total_margen_papel || 0);
$("#totalCosteImpresion").val(resumen.total_coste_impresion || 0);
$("#totalCosteImpresion").html(resumen.total_coste_impresion || 0);
- $("#porcentajeMargenImpresion").val(resumen.total_margenPercent_impresion ? resumen.total_margenPercent_impresion: 0);
- $("#porcentajeMargenImpresion").html(resumen.total_margenPercent_impresion ? resumen.total_margenPercent_impresion: 0);
+ $("#porcentajeMargenImpresion").val(resumen.total_margenPercent_impresion ? resumen.total_margenPercent_impresion : 0);
+ $("#porcentajeMargenImpresion").html(resumen.total_margenPercent_impresion ? resumen.total_margenPercent_impresion : 0);
$("#margenImpresion").val(resumen.total_margen_impresion || 0);
$("#margenImpresion").html(resumen.total_margen_impresion || 0);
$("#totalServicios").html(resumen.total_coste_servicios || 0);
$("#totalServicios").val(resumen.total_coste_servicios || 0);
- $("#porcentajeMargenServicios").val(resumen.total_margenPercent_servicios ? resumen.total_margenPercent_servicios: 0);
- $("#porcentajeMargenServicios").html(resumen.total_margenPercent_servicios ? resumen.total_margenPercent_servicios: 0);
+ $("#porcentajeMargenServicios").val(resumen.total_margenPercent_servicios ? resumen.total_margenPercent_servicios : 0);
+ $("#porcentajeMargenServicios").html(resumen.total_margenPercent_servicios ? resumen.total_margenPercent_servicios : 0);
$("#margenServicios").val(resumen.total_margen_servicios || 0);
$("#margenServicios").html(resumen.total_margen_servicios || 0);
@@ -52,11 +52,11 @@ class Resumen {
$("#margenEnvios").html(resumen.total_margen_envios || 0);
$("#margenEnvios").val(resumen.total_margen_envios || 0);
- $("#totalCostes").html(resumen.total_costes || 0);
- $("#porcentajeMargen").html(resumen.porcentajeMargen ? resumen.porcentajeMargen: 0);
+ $("#totalCostes").html(resumen.total_costes || 0).val();
+ $("#porcentajeMargen").html(resumen.porcentajeMargen ? resumen.porcentajeMargen : 0);
$("#totalMargenes").html(resumen.total_margenes || 0);
$("#totalCostes").val(resumen.total_costes || 0);
- $("#porcentajeMargen").val(resumen.porcentajeMargen ? resumen.porcentajeMargen: 0);
+ $("#porcentajeMargen").val(resumen.porcentajeMargen ? resumen.porcentajeMargen : 0);
$("#totalMargenes").val(resumen.total_margenes || 0);
$("#totalAntesDescuento").html(resumen.total_antes_descuento || 0);
@@ -64,14 +64,14 @@ class Resumen {
$("#descuentoTotal").html(resumen.total_descuento || 0);
$("#totalDespuesDecuento").html(resumen.total_presupuesto || 0).trigger("change")
$("#precioUnidadPresupuesto").html(resumen.total_precio_unidad || 0);
- $("#factor").html(resumen.total_factor|| 0);
- $("#factor_ponderado").html(resumen.total_factor_ponderado|| 0);
+ $("#factor").html(resumen.total_factor || 0);
+ $("#factor_ponderado").html(resumen.total_factor_ponderado || 0);
$("#totalAntesDescuento").val(resumen.total_antes_descuento || 0);
$("#descuentoTotal").val(resumen.total_descuento || 0);
$("#totalDespuesDecuento").val(resumen.total_presupuesto || 0).trigger("change")
$("#precioUnidadPresupuesto").val(resumen.total_precio_unidad || 0);
- $("#factor").val(resumen.total_factor|| 0);
- $("#factor_ponderado").val(resumen.total_factor_ponderado|| 0);
+ $("#factor").val(resumen.total_factor || 0);
+ $("#factor_ponderado").val(resumen.total_factor_ponderado || 0);
if (resumen.total_aceptado !== undefined) {
$("#totalAceptado").html(resumen.total_aceptado || 0);
@@ -94,7 +94,7 @@ class Resumen {
- async updateTotales(event, data = {}) {
+ async updateTotales(data = {}, ajustar = false) {
const self = this;
@@ -181,7 +181,7 @@ class Resumen {
$('#porcentajeMargenImpresion').html(porcentajeMargenImpresion).val(porcentajeMargenImpresion.toFixed(2))
$('#totalCosteImpresion').html(totalImpresion).val(totalImpresion.toFixed(2))
$('#margenImpresion').html(margenImpresion).val(margenImpresion.toFixed(2))
-
+
}
else {
@@ -297,8 +297,47 @@ class Resumen {
margenEnvios = parseFloat($('#margenEnvios').attr('val'))
}
- let totalCostes = parseFloat(totalPapel.toFixed(2)) + parseFloat(totalImpresion.toFixed(2)) + parseFloat(totalServicios.toFixed(2)) + parseFloat(totalEnvios.toFixed(2))
+ let totalCostes = parseFloat(totalPapel.toFixed(2)) + parseFloat(totalImpresion.toFixed(2))
+ + parseFloat(totalServicios.toFixed(2)) + parseFloat(totalEnvios.toFixed(2))
+
let totalMargenes = parseFloat(margenPapel.toFixed(2)) + parseFloat(margenImpresion.toFixed(2)) + parseFloat(margenServicios.toFixed(2)) + parseFloat(margenEnvios.toFixed(2))
+
+ let autoTotalAceptado = AutoNumeric.getAutoNumericElement($('#total_aceptado_revisado')[0]);
+ let total_aceptado_revisado = autoTotalAceptado.getNumber();
+
+ if (ajustar) {
+ if (total_aceptado_revisado && total_aceptado_revisado != 0) {
+ const nuevoTotal = totalCostes + totalEnvios_base;
+
+
+ if (total_aceptado_revisado < nuevoTotal) {
+
+ if($('#total_aceptado')){
+ $('#div_ajustar_error').removeClass('d-none');
+ $('#error_recalcular_margen').hide().empty().
+ html('El presupuesto está confirmado y el total coste + precio de envio es menor que el total aceptado y revisado').
+ fadeIn("slow", function(){
+ setTimeout(function(){
+ $('#div_ajustar_error').addClass('d-none');
+ }, 5000);
+ });
+
+ }
+ else{
+ autoTotalAceptado.set(nuevoTotal);
+ total_aceptado_revisado = nuevoTotal;
+ }
+
+
+
+ }
+
+ if(!($('#total_aceptado') && total_aceptado_revisado < nuevoTotal)){
+ totalMargenes = total_aceptado_revisado - nuevoTotal;
+ }
+ }
+ }
+
let porcentajeMargen = totalCostes + totalMargenes > 0 ? (100 * totalMargenes / (totalCostes + totalMargenes)).toFixed(0) : 0
$('#totalCostes').html(totalCostes).val(totalCostes.toFixed(2))
$('#totalMargenes').html(totalMargenes).val(totalMargenes.toFixed(2))
@@ -307,11 +346,10 @@ class Resumen {
if ($('#total_descuentoPercent').val() < 0) {
$('#total_descuentoPercent').val(0)
}
- let totalAntesDescuento = totalCostes + totalMargenes - parseFloat(totalEnvios.toFixed(2)) + totalEnvios_base;
+ let totalAntesDescuento = totalCostes + totalMargenes + totalEnvios_base;
let totalDescuento = totalAntesDescuento * parseInt($('#total_descuentoPercent').val() || 0) / 100
let totalPresupuesto = totalAntesDescuento - totalDescuento; // para el calculo del precio_u solo se tiene en cuenta el base
let precioUnidad = totalPresupuesto / parseInt($('#tirada').val())
- totalPresupuesto += totalEnvios;
$('#totalAntesDescuento').html(totalAntesDescuento).val(totalAntesDescuento.toFixed(2))
$('#descuentoTotal').html(totalDescuento).val(totalDescuento.toFixed(2))
@@ -369,9 +407,18 @@ class Resumen {
data.total_aceptado = $('#totalDespuesDecuento').val();
}
+ let autoTotalAceptado = AutoNumeric.getAutoNumericElement($('#total_aceptado_revisado')[0]);
+ let total_aceptado_revisado = autoTotalAceptado.getNumber();
+ if (total_aceptado_revisado && total_aceptado_revisado != 0) {
+ data.total_aceptado_revisado = total_aceptado_revisado;
+ }
+
return data;
}
+ updateFromTotalAceptadoRevisado() {
+ }
+
roundToTwoDecimals(num) {
return parseFloat(num.toFixed(2));
}