import { getToken } from "../../../common/common.js"; class TiradasAlernativas { constructor(functions = {}) { this.getDimensionLibro = functions.getDimensionLibro; this.csrf_token = getToken(); this.csrf_hash = $('#mainContainer').find('input[name="' + this.csrf_token + '"]').val(); this.addTirada = $('#add_tirada_alt'); this.tirada = $('#tirada_alt'); this.table = null; } init() { const self = this; this.addTirada.on('click', this.addTiradaAlt.bind(this)); this.table = $('#tableTiradas').DataTable({ "language": { "url": "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json" }, "paging": false, "info": false, "searching": false, "ordering": true, "autoWidth": false, "responsive": true, "columnDefs": [ { orderable: false, searchable: false, targets: [$('#tableTiradas').find("tr:first th").length - 1] }, ], "columns": [ { data: "tirada" }, { data: 'coste_impresion' }, { data: 'coste_envio', render: function (data, type, row) { return parseFloat(data).toFixed(2); }, }, { data: 'margen', render: function (data, type, row) { return data + '%'; } }, { data: 'total_pedido', render: function (data, type, row) { return parseFloat(data).toFixed(2); } }, { data: 'precio_unidad', render: function (data, type, row) { return parseFloat(data).toFixed(4); } }, { data: function (row, type, set, meta) { return ` `; }, className: 'row-edit dt-center' } ], order: [[0, 'asc']] }); // Evento de borrado de una fila de la tabla de tiradas $(document).on('click', '.btn-delete-tirada', function (e) { const row = $(this).closest('tr'); $('#tableTiradas').DataTable().row(row) .remove() .draw(); showBreadCrumbSaveButton(true); }) $(document).on('click', '.comfirm-tirada-alt', function (e) { const row = $(this).closest('tr'); const data = self.table.row(row).data(); self.table.row(row).remove().draw(); $('#tirada').val(data.tirada).trigger('change'); $(document).trigger('update-envios', { tirada_inicial: $('#tirada').val(), tirada: data.tirada }); }); $(document).on('update-tiradas-alternativas', async function () { await self.updateTiradasAlternativas(); $(document).trigger('update-tiradas-alternativas-completed'); }); } async updateTiradasAlternativas() { const self = this; if ($('#tableTiradas').DataTable().rows().count() > 0) { // se obtiene la primera columna de la tabla de tiradas const data = $('#tableTiradas').DataTable().rows().data().toArray(); // se borra la tabla de tiradas $('#tableTiradas').DataTable().clear().draw(); const tiradas = data.map(row => row.tirada); // por cada tirada, se añade una fila a la tabla de tiradas tiradas.forEach(function (tirada) { self.addTiradaAlt(tirada); }); } } cargar(datos) { if (datos != null && datos != undefined && datos.length > 0) { this.table.clear().draw(); this.table.rows.add(datos).draw(); } } generate_json_tiradas() { const data = this.table.rows().data().toArray(); return JSON.stringify(data); } addTiradaAlt(tiradaExterna = null) { const self = this; const id = window.location.href.split('/').pop(); const tirada = tiradaExterna === null || isNaN(tiradaExterna) ? parseInt(this.tirada.val()) : tiradaExterna; const tirada_ejemplo = parseInt($('#tirada').val()); const POD = parseInt($('#POD').val()); if ((tirada_ejemplo > POD && tirada <= POD) || (tirada_ejemplo <= POD && tirada > POD)) { popErrorAlert('No se pueden mezclar tiradas POD y no POD', 'alert-tiradas_alt'); return; } if (this.table.rows().count() > 0) { let tiradas = this.table.rows().data().toArray(); if (tiradas.find(t => parseInt(t.tirada) == tirada)) { popErrorAlert('La tirada ya existe', 'alert-tiradas_alt'); return; } } const dimension = this.getDimensionLibro(); const envios = JSON.stringify($('#tableOfDireccionesEnvio').DataTable().rows().data().toArray()); let datos = { id: id, tirada: this.tirada.val(), peso_libro: this.get_peso_libro(), tirada_base: $('#tirada').val(), paginas: $('#paginas').val(), merma: this.getMerma(tirada), tipo_impresion_id: $('#tipo_impresion_id').val(), json_tiradas: this.generate_json_lp(), json_acabados: this.generate_json_servicios('acabados'), json_encuadernaciones: this.generate_json_servicios('encuadernaciones'), json_manipulado: this.generate_json_servicios('manipulado'), json_envios: envios, 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: $('#lomo_cubierta').val(), faja_alto: $('#faja_alto').val(), solapas_faja: $('#faja_solapas_ancho').val(), }; $.ajax({ type: "POST", url: '/presupuestotiradasalternativas/datatable_2', 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 data.lineas.forEach(function (value) { coste_total += value.total_coste; margen_total += value.total_margen; }); if (data.servicios) { costes_servicios += data.servicios.coste; margen_servicios += data.servicios.margen; } $('#tableOfServiciosPreimpresion').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { var rowData = this.data(); costes_servicios += parseFloat(rowData.coste); margen_servicios += parseFloat(rowData.precio) - parseFloat(rowData.coste); }); $('#tableOfServiciosExtra').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { var rowData = this.data(); costes_servicios += parseFloat(rowData.coste); margen_servicios += parseFloat(rowData.precio) - parseFloat(rowData.coste); }); if (data.envios) { coste_envio += data.envios.coste; margen_envio += data.envios.margen; } // Se añade la fila a la tabla de tiradas self.table.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(4), }).draw(false); } }, error: function (e) { } }); } generate_json_lp() { const data = $('#tableLineasPresupuesto').DataTable().data().toArray(); let json = this.filterData(data, ['paginas', 'numPagColor', 'paginas_impresion', 'papel', // papel generico 'papel_impresion_id', 'gramaje', 'maquina_id', 'aFavorFibra', 'row_id', 'check_papel_total', 'check_impresion_total', 'cobAmarillo', // tipologia de papel 'cobCyan', 'cobMagenta', 'cobNegro', 'cobCG', 'gotaColor', 'gotaNegro']); json.forEach(element => { element['check_papel_total'] = $('#' + element['row_id'] + '_checkPapel').is(':checked') ? 1 : 0; element['check_impresion_total'] = $('#' + element['row_id'] + '_checkClicks').is(':checked') ? 1 : 0; }); return JSON.stringify(json); } generate_json_servicios(servicios) { let json = []; switch (servicios) { case 'acabados': $('#tableOfServiciosAcabado').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { var rowData = this.data(); json.push(rowData); }); break; case 'encuadernaciones': $('#tableOfServiciosEncuadernacion').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { var rowData = this.data(); json.push(rowData); }); break; case 'presimpresion': $('#tableOfServiciosPreimpresion').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { var rowData = this.data(); json.push(rowData); }); break; case 'manipulado': $('#tableOfServiciosManipulado').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { var rowData = this.data(); json.push(rowData); }); break; case 'extra': $('#tableOfServiciosExtra').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { var rowData = this.data(); json.push(rowData); }); break; } return JSON.stringify(json); } get_peso_libro() { var peso_total_libro = 0.0 $('#tableLineasPresupuesto').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { var rowData = this.data(); peso_total_libro += parseFloat(rowData.peso) }) return peso_total_libro; } getMerma(tirada) { let merma = 0; if (tirada > parseInt($('#POD').val())) { merma = tirada * 0.1 <= 30 ? tirada * 0.1 : 30 } else { let merma_lineas = [] $('#tableLineasPresupuesto').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { var rowData = this.data(); if (rowData.row_id != 'lp_guardas' && rowData.row_id != 'lp_cubierta' && rowData.row_id != 'lp_sobrecubierta') { const formas_linea = $('#isCosido').val() == 0 ? parseInt(rowData.formas) : parseInt(rowData.formas) / 2 if (formas_linea > tirada) merma_lineas.push(formas_linea - tirada) else merma_lineas.push(tirada % formas_linea) } }) if (merma_lineas.length > 0) merma = Math.max(...merma_lineas) else merma = 0 } return merma; } filterData(data, keys) { return data.map(obj => { const newObj = {}; keys.forEach(key => { if (obj.hasOwnProperty(key)) { newObj[key] = obj[key]; } }); return newObj; }); } } export default TiradasAlernativas;