From d322392153d9c67c522b1b9b0a0191fd7d675319 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Jim=C3=A9nez?= <“jaimejimenezortega@gmail.com”> Date: Mon, 4 Mar 2024 19:10:12 +0100 Subject: [PATCH] =?UTF-8?q?falta=20a=C3=B1adir=20rotativa=20y=20actualizar?= =?UTF-8?q?=20cuando=20cambie=20presupuesto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ci4/app/Language/es/Presupuestos.php | 5 +- .../cosidotapablanda/_datosEnvios.js | 47 ++-- .../cosidotapablanda/_datosEnvios.php | 99 ++++---- .../cosidotapablanda/_datosEnvios.test.js | 44 ++++ .../_tiradasAlternativasItems.js | 216 ++++++++++++------ .../_tiradasAlternativasItems.php | 5 + .../viewCosidotapablandaForm.php | 9 + 7 files changed, 277 insertions(+), 148 deletions(-) create mode 100644 ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.test.js diff --git a/ci4/app/Language/es/Presupuestos.php b/ci4/app/Language/es/Presupuestos.php index 62f7d36a..b208a914 100755 --- a/ci4/app/Language/es/Presupuestos.php +++ b/ci4/app/Language/es/Presupuestos.php @@ -265,8 +265,9 @@ return [ 'errorRotColor' => 'Papeles y gramajes deben ser iguales en color y BN', 'error_servicios_anadidos' => 'Hay servicios sin datos', 'error_servicios_duplicados' => 'El servicio seleccionado ya está añadido', - 'formato_papel' => 'Debe seleccionar un formato de papel' + 'formato_papel' => 'Debe seleccionar un formato de papel', + 'tirada_alt_duplicada' => 'Ya existe una tirada alternativa para ese valor', + 'tirada_alt_tipo' => 'No se puede calcular una tirada alternativa POD para una presupuesto no POD o viceversa', ], - ]; diff --git a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.js b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.js index 2ec74831..5d584c1d 100644 --- a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.js +++ b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.js @@ -13,44 +13,59 @@ function get_peso_libro(){ async function get_precio_envio(peso, paisId, cp, tipo_envio){ data = { - tipo: 'get_tarifa', - peso: peso, - paisId: paisId, + tipo: 'get_tarifa', + peso: peso, + paisId: paisId, cp: cp, tipo_envio: tipo_envio, } data = Object.assign(data, window.token_ajax); - const response = await fetch(window.location.origin + window.url_get_precio_envio , { method: "POST", body: JSON.stringify(data), headers: { "Content-type": "application/json; charset=UTF-8", } - }) + }); + const values = await response.json(); yeniden(values[window.csrf_token]); - console.log(values.data); return values.data; } + async function get_coste_envio_tiradasAlternativas(tirada){ var peso_libro = get_peso_libro(); var tirada_inicial = parseInt($('#tirada').val()); - var precio_envio = 0.0; - var margen_envio = 0.0; + var coste = 0.0; + var margen = 0.0; - $('#tableOfDireccionesEnvio').DataTable().rows().every( function ( rowIdx, tableLoop, rowLoop ) { - const rowData = this.data(); + const table = $('#tableOfDireccionesEnvio').DataTable(); + const rows = table.rows().nodes(); + + for (let i = 0; i < rows.length; i++) { + const rowData = table.row(rows[i]).data(); const porcentaje = parseInt(rowData.cantidad)/tirada_inicial*100.0; const cantidad = Math.floor(tirada*porcentaje/100.0); - const precio_linea = get_precio_envio(cantidad*peso_libro/1000.0, rowData.paisId, rowData.cp, parseInt(rowData.entregaPieCalle)==1?'palets':'cajas'); - console.log(precio_linea); - precio_envio += parseFloat(precio_linea.precio); - margen_envio += parseFloat(precio_linea.precio*precio_linea.margen/100.0); - }) - return {precio_envio, margen_envio}; + const peso_envio = cantidad*peso_libro/1000.0; + const datos_tarifa = await get_precio_envio(peso_envio, rowData.paisId, rowData.cp, parseInt(rowData.entregaPieCalle)==1?'palets':'cajas'); + + if(datos_tarifa.id!=null){ + + if(peso_envio>parseFloat(datos_tarifa.peso_max)){ + coste += parseFloat(datos_tarifa.peso_min) + (peso_envio-parseFloat(datos_tarifa.peso_min))*parseFloat(datos_tarifa.precio_adicional); + } + // si no se calcula linealmente + else{ + m=((parseFloat(datos_tarifa.precio_max)-parseFloat(datos_tarifa.precio_min))/(parseFloat(datos_tarifa.peso_max)-parseFloat(datos_tarifa.peso_min))); + b=parseFloat(datos_tarifa.precio_max)-m*parseFloat(datos_tarifa.peso_max); + coste += parseFloat(m*peso_envio+b); + } + } + margen += coste*datos_tarifa.margen/100.0; + } + return {coste, margen}; } \ No newline at end of file diff --git a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.php b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.php index 4d827f60..bd065c65 100755 --- a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.php +++ b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.php @@ -90,73 +90,64 @@ const actionBtns_direcciones = function(data) { `; }; -async function updateTablaEnvios(){ +function updateTablaEnvios(){ var peso_total_libro = get_peso_libro(); - tableEnvios.rows().every( function ( rowIdx, tableLoop, rowLoop ) { + tableEnvios.rows().every(async function ( rowIdx, tableLoop, rowLoop ) { var rowData = this.data(); const peso_envio = peso_total_libro*parseInt(rowData.cantidad)/1000.0; - const data = get_precio_envio(peso_envio, rowData.paisId, rowData.cp, parseInt(rowData.entregaPieCalle)==1?'palets':'cajas'); + var datos_tarifa = await get_precio_envio(peso_envio, rowData.paisId, rowData.cp, parseInt(rowData.entregaPieCalle)==1?'palets':'cajas'); + - if(data.length >0){ - - var precios = [] - for (var i = 0; i < data.length; i++) { - if(peso_envio>data[i].peso_max){ - data[i].precio = (data[i].peso_min + (peso_envio-data[i].peso_min)*data[i].precio_adicional).toFixed(2); + if(datos_tarifa.id!=null){ + + if(peso_envio>parseFloat(datos_tarifa.peso_max)){ + datos_tarifa.precio = parseFloat(datos_tarifa.peso_min) + (peso_envio-parseFloat(datos_tarifa.peso_min))*parseFloat(datos_tarifa.precio_adicional); } // si no se calcula linealmente else{ - m=((data[i].precio_max-data[i].precio_min)/(data[i].peso_max-data[i].peso_min)) - b=data[i].precio_max-m*data[i].peso_max - data[i].precio = (m*peso_envio+b).toFixed(2); + m=((parseFloat(datos_tarifa.precio_max)-parseFloat(datos_tarifa.precio_min))/(parseFloat(datos_tarifa.peso_max)-parseFloat(datos_tarifa.peso_min))); + b=parseFloat(datos_tarifa.precio_max)-m*parseFloat(datos_tarifa.peso_max); + datos_tarifa.precio = parseFloat(m*peso_envio+b); } - data[i].margen = data[i].margen + + + datos_tarifa.cantidad = parseInt($('#add_cantidad').val()); + datos_tarifa.peso = peso_envio; + console.log(datos_tarifa.precio) + + tableEnvios.row(rowIdx) + .data({ + 'tarifa_id': datos_tarifa.id, + 'cantidad': rowData.cantidad, + 'peso': datos_tarifa.peso.toFixed(3), + 'att': rowData.att, + 'email': rowData.email, + 'direccion': rowData.direccion, + 'cp': rowData.cp, + 'municipio': rowData.municipio, + 'provincia': rowData.provincia, + 'paisId': rowData.paisId, + 'telefono': rowData.telefono, + 'proveedor': datos_tarifa.proveedor, + 'proveedor_id': datos_tarifa.proveedor_id, + 'precio': datos_tarifa.precio.toFixed(2), + 'margen': datos_tarifa.margen, + 'entregaPieCalle': rowData.entregaPieCalle, + 'actionBtns_direcciones': actionBtns_direcciones, + }) + .draw(); + + checkInsertar() + updateTotales(false, false, true) + + } + else{ + popErrorAlert('', 'error-tarifa') } - - const tarifa_final = data.reduce((previous, current) => { - return current.precio < previous.precio ? current : previous; - }); - tarifa_final.cantidad=parseInt($('#add_cantidad').val()) - tarifa_final.peso=peso_envio - - - tableEnvios.row(rowIdx) - .data({ - 'tarifa_id': tarifa_final.id, - 'cantidad': rowData.cantidad, - 'peso': tarifa_final.peso.toFixed(3), - 'att': rowData.att, - 'email': rowData.email, - 'direccion': rowData.direccion, - 'cp': rowData.cp, - 'municipio': rowData.municipio, - 'provincia': rowData.provincia, - 'paisId': rowData.paisId, - 'telefono': rowData.telefono, - 'proveedor': tarifa_final.proveedor, - 'proveedor_id': tarifa_final.proveedor_id, - 'precio': tarifa_final.precio, - 'margen': tarifa_final.margen, - 'entregaPieCalle': rowData.entregaPieCalle, - 'actionBtns_direcciones': actionBtns_direcciones, - }) - .draw(); - - - checkInsertar() - updateTotales(false, false, true) - - } - else{ - popErrorAlert('', 'error-tarifa') - } - /** - * @var mixed }) - */ }) } diff --git a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.test.js b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.test.js new file mode 100644 index 00000000..c9224499 --- /dev/null +++ b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.test.js @@ -0,0 +1,44 @@ +// Test case 1: Valid inputs +const peso = 10; +const paisId = 1; +const cp = "12345"; +const tipo_envio = "express"; + +get_precio_envio(peso, paisId, cp, tipo_envio) + .then(data => { + console.log("Test case 1 - Result:", data); + // Add your assertions here + }) + .catch(error => { + console.error("Test case 1 - Error:", error); + }); + +// Test case 2: Invalid inputs +const peso = -5; +const paisId = 0; +const cp = ""; +const tipo_envio = "standard"; + +get_precio_envio(peso, paisId, cp, tipo_envio) + .then(data => { + console.log("Test case 2 - Result:", data); + // Add your assertions here + }) + .catch(error => { + console.error("Test case 2 - Error:", error); + }); + +// Test case 3: Network error +const peso = 20; +const paisId = 2; +const cp = "54321"; +const tipo_envio = "priority"; + +get_precio_envio(peso, paisId, cp, tipo_envio) + .then(data => { + console.log("Test case 3 - Result:", data); + // Add your assertions here + }) + .catch(error => { + console.error("Test case 3 - Error:", error); + }); \ No newline at end of file diff --git a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_tiradasAlternativasItems.js b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_tiradasAlternativasItems.js index 6abcf4cc..2061eea2 100644 --- a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_tiradasAlternativasItems.js +++ b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_tiradasAlternativasItems.js @@ -20,16 +20,7 @@ var tableTiradas; while (!window.hasOwnProperty("datatable_lang_url") && !window.hasOwnProperty("datatable_TA_url")) await new Promise(resolve => setTimeout(resolve, 200)); initTableTiradas(); - - // For debugging purposes - tableTiradas.row.add({ - tirada: 15, - coste_impresion: 0, - coste_envio: 0, - margen: 0, - total_pedido: 0, - precio_unidad: 0 - }).draw(false); + fill_tiradas_alternativas(); })(); @@ -37,84 +28,129 @@ var tableTiradas; // Evento de añadir una tirada alternativa $('#add_tirada_alt').on('click', function () { - const dimension = getDimensionLibro(); + // se comprueba que la tirada no existe ya en la tabla + const tirada_alt = parseInt($('#tirada_alt').val()); + const exists = tableTiradas.rows().data().toArray().some(row => row.tirada == tirada_alt); + const isPOD = parseInt($('#tirada').val())<= parseInt($('#POD').val()); - let datos = { - tirada: $('#tirada_alt').val(), - merma: get_merma_tirada_alternativa($('#tirada_alt').val()), - tipo_impresion_id: $('#tipo_impresion_id').val(), - json_tiradas: generate_json_tiradas(), - ancho: dimension.ancho, - alto: dimension.alto, - cliente_id: $('#clienteId').find(":selected").val(), - solapas_cubierta: $('#solapas').is(':checked')?1:0, - solapas_cubierta_ancho: $('#solapas').is(':checked')?parseInt($('#solapas_ancho').val()):0, - solapas_sobrecubierta: $('#solapas_sobrecubierta').is(':checked')?1:0, - solapas_sobrecubierta_ancho: $('#solapas_sobrecubierta').is(':checked')?parseInt($('#solapas_ancho_sobrecubierta').val()):0, - lomo: getLomoExterior(), - }; - - datos = Object.assign(datos, window.token_ajax); + const typeIsOk = tirada_alt <= parseInt($('#POD').val()) && isPOD || tirada_alt > parseInt($('#POD').val()) && !isPOD; - // Se realiza la petición AJAX - $.ajax({ - type: "POST", - url: window.get_tirada_url, - data: datos, - success: async function (data) { + if (!exists && typeIsOk) { - var coste_total = 0.0; - var margen_total = 0.0; + const dimension = getDimensionLibro(); - var costes_servicios = 0.0; - var margen_servicios = 0.0; + let datos = { + tirada: $('#tirada_alt').val(), + merma: get_merma_tirada_alternativa($('#tirada_alt').val()), + tipo_impresion_id: $('#tipo_impresion_id').val(), + json_tiradas: generate_json_tiradas(), + ancho: dimension.ancho, + alto: dimension.alto, + cliente_id: $('#clienteId').find(":selected").val(), + solapas_cubierta: $('#solapas').is(':checked')?1:0, + solapas_cubierta_ancho: $('#solapas').is(':checked')?parseInt($('#solapas_ancho').val()):0, + solapas_sobrecubierta: $('#solapas_sobrecubierta').is(':checked')?1:0, + solapas_sobrecubierta_ancho: $('#solapas_sobrecubierta').is(':checked')?parseInt($('#solapas_ancho_sobrecubierta').val()):0, + lomo: getLomoExterior(), + }; + + datos = Object.assign(datos, window.token_ajax); - if(data.lineas.length >0){ - // Se cogen los valores de la linea con los datos correspondientes - $.each(data.lineas, function(key, value) { + // Se realiza la petición AJAX + $.ajax({ + type: "POST", + url: window.get_tirada_url, + data: datos, + success: async function (data) { + + var coste_total = 0.0; + var margen_total = 0.0; + + var costes_servicios = 0.0; + var margen_servicios = 0.0; + + var coste_envio = 0.0; + var margen_envio = 0.0; + + if(data.lineas.length >0){ + // Se cogen los valores de la linea con los datos correspondientes + $.each(data.lineas, function(key, value) { + + coste_total += value.total_coste; + margen_total += value.total_margen; + }); - coste_total += value.total_coste; - margen_total += value.total_margen; - }); - - // Se obtiene el precio de los servicios - const valueAcabados = await get_servAcabados_tiradasAlternativas(parseInt(datos.tirada)); - costes_servicios += valueAcabados.coste; - margen_servicios += valueAcabados.margen; + // Se obtiene el precio de los servicios + const valueAcabados = await get_servAcabados_tiradasAlternativas(parseInt(datos.tirada)); + costes_servicios += valueAcabados.coste; + margen_servicios += valueAcabados.margen; - const valueEncuadernacion = await get_servEncuadernacion_tiradasAlternativas( - parseInt(datos.tirada), parseInt( $('#paginas').val()), parseInt(dimension.ancho), parseInt(dimension.alto)); - costes_servicios += valueEncuadernacion.coste; - margen_servicios += valueEncuadernacion.margen; + const valueEncuadernacion = await get_servEncuadernacion_tiradasAlternativas( + parseInt(datos.tirada), parseInt( $('#paginas').val()), parseInt(dimension.ancho), parseInt(dimension.alto)); + costes_servicios += valueEncuadernacion.coste; + margen_servicios += valueEncuadernacion.margen; - const valueManipulado = await get_servManipulado_tiradasAlternativas(parseInt(datos.tirada)); - costes_servicios += valueManipulado.coste; - margen_servicios += valueManipulado.margen; + const valueManipulado = await get_servManipulado_tiradasAlternativas(parseInt(datos.tirada)); + costes_servicios += valueManipulado.coste; + margen_servicios += valueManipulado.margen; - const valuePreimpresion = await get_servPreimpresion_tiradasAlternativas(parseInt(datos.tirada)); - costes_servicios += valuePreimpresion.coste; - margen_servicios += valuePreimpresion.margen; + const valuePreimpresion = await get_servPreimpresion_tiradasAlternativas(parseInt(datos.tirada)); + costes_servicios += valuePreimpresion.coste; + margen_servicios += valuePreimpresion.margen; - const valueTransporte = await get_coste_envio_tiradasAlternativas(parseInt(datos.tirada)); + const valueTransporte = await get_coste_envio_tiradasAlternativas(parseInt(datos.tirada)); + coste_envio = valueTransporte.coste; + margen_envio = valueTransporte.margen; - console.log(coste_total); - console.log(margen_total); - console.log(costes_servicios); - console.log(margen_servicios); - console.log(valueTransporte); - } - yeniden(data[window.csrf_token]); + // Se añade la fila a la tabla de tiradas + tableTiradas.row.add({ + tirada: datos.tirada, + coste_impresion: coste_total.toFixed(2), + coste_envio: coste_envio.toFixed(2), + margen: ((margen_total + margen_servicios + margen_envio)/(coste_total+coste_envio)*100.0).toFixed(2), + total_pedido: (coste_total + costes_servicios + coste_envio).toFixed(2), + precio_unidad: ((coste_total + costes_servicios + coste_envio) / datos.tirada).toFixed(2), - }, - error: function(e){} - }); + }).draw(false); + } + + yeniden(data[window.csrf_token]); + + }, + error: function(e){} + }); + } + else { + var htmlString = ''; + if(!typeIsOk){ + htmlString = ` + `; + } + + else{ + htmlString = ` + `; + } + $('#alert-tiradas_alt').html(htmlString); + } }); - - - // Función para obtener el lomo exterior function getLomoExterior(){ let lomoTotal = 0 @@ -155,7 +191,11 @@ function initTableTiradas() { { data: "tirada" }, { data: 'coste_impresion' }, { data: 'coste_envio' }, - { data: 'margen' }, + { data: 'margen' , + render: function ( data, type, row ) { + return data + '%'; + } + }, { data: 'total_pedido' }, { data: 'precio_unidad' }, { @@ -166,11 +206,9 @@ function initTableTiradas() { }); } - // Evento de borrado de una fila de la tabla de tiradas $(document).on('click', '.btn-delete-tirada', function (e) { - console.log(generate_json_tiradas()); const row = $(this).closest('tr'); tableTiradas.row(row) .remove() @@ -254,4 +292,30 @@ function get_merma_tirada_alternativa(tirada){ merma = 0 } return merma; -} \ No newline at end of file +} + + +function fill_tiradas_alternativas(){ + tableTiradas.clear().draw(); + const text = $('#tirada_alternativa_json_data').val() + if(text.length>0){ + + const data = JSON.parse(text); + if(data.length>0){ + $.each(data, function(key, value) { + tableTiradas.row.add({ + tirada: value.tirada, + coste_impresion: value.coste_impresion, + coste_envio: value.coste_envio, + margen: value.margen, + total_pedido: value.total_pedido, + precio_unidad: value.precio_unidad, + }).draw(false); + }); + } + } +} + + + + \ No newline at end of file diff --git a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_tiradasAlternativasItems.php b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_tiradasAlternativasItems.php index 095b44d2..4077d49a 100644 --- a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_tiradasAlternativasItems.php +++ b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_tiradasAlternativasItems.php @@ -11,10 +11,12 @@
+

+ '>
@@ -54,6 +56,9 @@ window.datatable_TA_url = ""; window.get_tirada_url = ""; + + window.error_lang_tirada_alt_duplicada = ""; + window.error_lang_tirada_alt_tipo = ""; endSection() ?> diff --git a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/viewCosidotapablandaForm.php b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/viewCosidotapablandaForm.php index 8e610471..594f467f 100755 --- a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/viewCosidotapablandaForm.php +++ b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/viewCosidotapablandaForm.php @@ -192,11 +192,19 @@ const url_parts = url.split('/'); section("additionalInlineJs") ?> + // funcion que genera un JSON con la tabla de tiradas alternativas + function generate_json_tiradas() { + const data = tableTiradas.rows().data().toArray(); + $('#tirada_alternativa_json_data').val(JSON.stringify(data)); + } + + if (url_parts[url_parts.length - 2] == 'edit') { id = url_parts[url_parts.length - 1]; } else { id = -1; } + $('#presupuestoForm').on("submit", function(event) { event.preventDefault(); @@ -205,6 +213,7 @@ const url_parts = url.split('/'); $.when(fill_bbdd_from_lp(id).then(function(data, textStatus, jqXHR) { generateCompJSON() + generate_json_tiradas() form = $('#presupuestoForm').serialize() form += getValuesResumenForm()