diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index 0278a980..2b8b0b45 100755 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -822,6 +822,7 @@ $routes->group('produccion', ['namespace' => 'App\Controllers\Produccion'], func $routes->get('rotativa', 'Ordentrabajo::index_planning_rotativa'); $routes->get('papel/datatable', 'Ordentrabajo::papel_gramaje_datatable'); $routes->get('papel/plana/datatable', 'Ordentrabajo::papel_pliego_datatable'); + $routes->get('maquina/plana/datatable', 'Ordentrabajo::maquina_plana_datatable'); $routes->get('rotativa/datatable', 'Ordentrabajo::planning_rotativa_datatable'); $routes->get('plana/datatable', 'Ordentrabajo::planning_plana_datatable'); $routes->post('tarea/toggle/corte/(:num)', 'Ordentrabajo::tarea_toggle_corte/$1'); diff --git a/ci4/app/Controllers/Produccion/Ordentrabajo.php b/ci4/app/Controllers/Produccion/Ordentrabajo.php index ce6dacdd..43194ba9 100755 --- a/ci4/app/Controllers/Produccion/Ordentrabajo.php +++ b/ci4/app/Controllers/Produccion/Ordentrabajo.php @@ -372,6 +372,15 @@ class Ordentrabajo extends BaseController ->add("action", fn($q) => ["title" => lang('Produccion.datatable.filter_by_paper'), 'data' => $q]) ->toJson(true); } + public function maquina_plana_datatable() + { + // return $this->response->setStatusCode(400); + $q = $this->produccionService->maquinaPlanaDatatableQuery(); + return DataTable::of($q) + ->edit("tiempoReal", fn($q) => $q->tiempoReal) + ->add("action", fn($q) => ["title" => lang('Produccion.datatable.filter_by_machine'), 'data' => $q]) + ->toJson(true); + } public function reset_tareas(int $orden_trabajo_id) { $r = $this->produccionService->init($orden_trabajo_id)->resetAllTareas(); diff --git a/ci4/app/Language/es/Produccion.php b/ci4/app/Language/es/Produccion.php index a7907544..9552d726 100755 --- a/ci4/app/Language/es/Produccion.php +++ b/ci4/app/Language/es/Produccion.php @@ -13,6 +13,7 @@ return [ 'prod' => 'Producción' ], "datatable" => [ + "nombre" => "Nombre", "ot_id" => "OT ID", "barcode" => "Código", "pedido_id" => "Pedido ID", @@ -38,6 +39,7 @@ return [ "progreso" => "Progreso", "logo" => "Logo impresion", "filter_by_task" => "Filtrar por tarea", + "filter_by_machine" => "Filtrar por máquina", "filter_by_paper" => "Filtrar por papel", "metros" => "Metros", "corte" => "Corte", @@ -141,7 +143,7 @@ return [ "attr_not_exist" => "El atributo {0,string} no pertenece al modelo Pedido" ], - + "maquinas_planas" => "Máquinas planas", "progress_ferro" => "Ferro", "progress_preimpresion" => "Preimpresión", "progress_logistica" => "Logística", diff --git a/ci4/app/Services/ProductionService.php b/ci4/app/Services/ProductionService.php index 18e769df..ba3be5b5 100755 --- a/ci4/app/Services/ProductionService.php +++ b/ci4/app/Services/ProductionService.php @@ -913,6 +913,29 @@ class ProductionService extends BaseService + return $q; + } + public function maquinaPlanaDatatableQuery() + { + $q = $this->otModel->builder()->select([ + "lg_maquinas.nombre as maquinaNombre", + "lg_maquinas.id as maquinaId", + "COUNT(orden_trabajo_tareas.id) as tareasCount", + "presupuesto_linea.pliegos_pedido as pliegosPedido", + "SUM(ordenes_trabajo.total_tirada) as totalTirada", + "SUM(orden_trabajo_tareas.tiempo_real) as tiempoReal" + ]) + ->join("orden_trabajo_tareas", "orden_trabajo_tareas.orden_trabajo_id = ordenes_trabajo.id", "left") + ->join("presupuesto_linea", "presupuesto_linea.id = orden_trabajo_tareas.presupuesto_linea_id", "left") + ->join("presupuestos", "presupuestos.id = presupuesto_linea.presupuesto_id", "right") + ->join('lg_maquinas',"lg_maquinas.id = orden_trabajo_tareas.maquina_id","left") + ->where("orden_trabajo_tareas.deleted_at", null) + ->where("orden_trabajo_tareas.presupuesto_linea_id IS NOT NULL", NULL, FALSE) + ->whereIn("presupuesto_linea.tipo", $this->TIPOS_PLANA) + ->groupBy('lg_maquinas.id'); + + + return $q; } /** @@ -1323,7 +1346,8 @@ class ProductionService extends BaseService ->whereIn("presupuesto_linea.tipo", $this->TIPOS_ROTATIVA) ->where('lg_maquinas.is_rotativa', true) ->where("orden_trabajo_tareas.deleted_at", null) - ->orderBy("orden_trabajo_tareas.orden", "ASC"); + ->orderBy("orden_trabajo_tareas.orden", "ASC") + ->groupBy('lg_maquinas.id'); if ($q) { $query->like('lg_maquinas.nombre', $q); } @@ -1341,7 +1365,8 @@ class ProductionService extends BaseService ->whereIn("presupuesto_linea.tipo", $this->TIPOS_PLANA) ->where('lg_maquinas.is_rotativa', false) ->where("orden_trabajo_tareas.deleted_at", null) - ->orderBy("orden_trabajo_tareas.orden", "ASC"); + ->orderBy("orden_trabajo_tareas.orden", "ASC") + ->groupBy('lg_maquinas.id'); if ($q) { $query->like('lg_maquinas.nombre', $q); } diff --git a/ci4/app/Views/themes/vuexy/components/tables/planning_maquina_table.php b/ci4/app/Views/themes/vuexy/components/tables/planning_maquina_table.php new file mode 100755 index 00000000..ef47fd01 --- /dev/null +++ b/ci4/app/Views/themes/vuexy/components/tables/planning_maquina_table.php @@ -0,0 +1,28 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
(HH:MM)
Total:
+
\ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/form/produccion/ot/viewPlanningRotativa.php b/ci4/app/Views/themes/vuexy/form/produccion/ot/viewPlanningRotativa.php index 2c5f572c..29d216ab 100755 --- a/ci4/app/Views/themes/vuexy/form/produccion/ot/viewPlanningRotativa.php +++ b/ci4/app/Views/themes/vuexy/form/produccion/ot/viewPlanningRotativa.php @@ -76,14 +76,17 @@
- "planning-pliego-datatable"]) ?> +
+ "planning-pliego-datatable"]) ?> +
+ "planning-maquina-datatable"]) ?>
diff --git a/httpdocs/assets/js/safekat/pages/produccion/planning_rotativa/planning_rotativa.js b/httpdocs/assets/js/safekat/pages/produccion/planning_rotativa/planning_rotativa.js index eddacb06..ede9535b 100644 --- a/httpdocs/assets/js/safekat/pages/produccion/planning_rotativa/planning_rotativa.js +++ b/httpdocs/assets/js/safekat/pages/produccion/planning_rotativa/planning_rotativa.js @@ -10,6 +10,7 @@ class PlanningRotativa { this.tablePlanningPlana = this.item.find("#planning-plana-datatable") this.papelGramajeTablePlanning = this.item.find("#planning-papel-datatable") this.papelPliegoTablePlanning = this.item.find("#planning-pliego-datatable") + this.maquinaTablePlanning = this.item.find("#planning-maquina-datatable") this.papelImpresionHeader = this.item.find('#papel-impresion-name-header') this.papelImpresionPlanaHeader = this.item.find('#papel-impresion-name-plana-header') @@ -27,7 +28,7 @@ class PlanningRotativa { { data: 'papel_ancho', searchable: false, sortable: false, width: "5rem", render: d => `${d}` }, { data: 'papel_alto', searchable: false, sortable: false, width: "5rem", render: d => `${d}` }, { data: 'papel_impresion', searchable: false, sortable: false }, - { data: 'papel_gramaje',name:"presupuesto_linea.gramaje", searchable: false, sortable: false, width: "5rem", render: d => `${d}` }, + { data: 'papel_gramaje', name: "presupuesto_linea.gramaje", searchable: false, sortable: false, width: "5rem", render: d => `${d}` }, { data: 'corte', searchable: false, sortable: false, render: this.renderCorteImage.bind(this), width: "10rem" }, { data: 'metros_check', searchable: false, sortable: false, render: d => `` }, { data: 'metros', searchable: false, sortable: false, render: d => `${d}` }, @@ -44,10 +45,10 @@ class PlanningRotativa { { data: 'papel_ancho', searchable: false, sortable: false, width: "5rem", render: d => `${d}` }, { data: 'papel_alto', searchable: false, sortable: false, width: "5rem", render: d => `${d}` }, { data: 'papel_impresion', searchable: false, sortable: false }, - { data: 'papel_gramaje', name:"presupuesto_linea.gramaje", searchable: false, sortable: false, width: "5rem", render: d => `${d}` }, + { data: 'papel_gramaje', name: "presupuesto_linea.gramaje", searchable: false, sortable: false, width: "5rem", render: d => `${d}` }, { data: 'pliegos_check', searchable: false, sortable: false, render: d => `` }, { data: 'pliegosPedido', searchable: false, sortable: false, render: d => `${d}` }, - { data: 'tiempo_real_sum', searchable: false, sortable: false,render: d => this.formatSeconds(parseFloat(d))}, + { data: 'tiempo_real_sum', searchable: false, sortable: false, render: d => this.formatSeconds(parseFloat(d)) }, { data: 'action', searchable: false, sortable: false, render: this._renderBtnAction }, ] @@ -65,6 +66,20 @@ class PlanningRotativa { }, + ] + this.maquinaPlanaDatatableColumns = [ + { data: 'maquinaNombre', searchable: true, sortable: true }, + { data: 'tareasCount', searchable: true, sortable: true }, + { data: 'totalTirada', searchable: false, sortable: false }, + { data: 'pliegosPedido', searchable: false, sortable: false, render: d => `${d}` }, + { data: 'tiempoReal', searchable: false, sortable: false, render: d => this.formatSeconds(d) }, + { + data: 'action', searchable: false, sortable: false, render: (d) => { + return `` + } + }, + + ] this.papelPliegoDatatableColumns = [ { data: 'papelImpresionNombre', searchable: true, sortable: true }, @@ -86,8 +101,8 @@ class PlanningRotativa { `/produccion/ordentrabajo/planning/select/maquina/rotativa`, "Seleccione una maquina", true, { - dropdownCssClass: "h-2" - }, $('body')); + dropdownCssClass: "h-2" + }, $('body')); this.papelImpresionFilter = new ClassSelect(this.tablePlanningRot.find(".planning-papel-select"), `/produccion/ordentrabajo/planning/select/papel/rotativa`, "Seleccione un papel", true, {}, $('body')); this.maquinaSelectFilterPlana = new ClassSelect(this.tablePlanningPlana.find(".planning-maquina-select"), `/produccion/ordentrabajo/planning/select/maquina/plana`, "Seleccione una maquina", true, {}, $('body')); this.maquinaPadreSelectFilterPlana = new ClassSelect(this.tablePlanningPlana.find(".planning-maquina-padre-select"), `/produccion/ordentrabajo/planning/select/maquina/padre/plana`, "Máquina padre", true, {}, $('body')); @@ -116,6 +131,7 @@ class PlanningRotativa { this.totalMetros = new AutoNumeric(this.item.find('#total-metros')[0], autoNumericOptions); this.totalMetrosSel = new AutoNumeric(this.item.find('#metros-sel-total')[0], autoNumericOptions); this.totalPliegos = new AutoNumeric(this.item.find('#total-pliegos')[0], autoNumericPliegosOptions); + this.totalMaquinaPliegos = new AutoNumeric(this.item.find('#total-pliegos-maquina')[0], autoNumericPliegosOptions); this.totalPliegosSel = new AutoNumeric(this.item.find('#pliegos-sel-total')[0], autoNumericPliegosOptions); this.maquinaSelectFilter.init() @@ -133,7 +149,8 @@ class PlanningRotativa { }) this.papelGramajeTablePlanning.on('click', '.papel-gramaje-btn', this.filterPapelGramaje.bind(this)) this.papelPliegoTablePlanning.on('click', '.papel-pliego-btn', this.filterPapelGramajePlana.bind(this)) - + this.maquinaTablePlanning.on('click', '.maquina-planning-btn', this.filterMaquinaPlana.bind(this)) + //!AÑADIR MAQUINA this.papelImpresionFilter.onChange(() => { this.papelImpresionHeader.text(this.papelImpresionFilter.getText()) }) @@ -151,8 +168,8 @@ class PlanningRotativa { language: { url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json" }, - createdRow: (row,data,dataIndex) => { - this.getColorOtStatus(row,data) + createdRow: (row, data, dataIndex) => { + this.getColorOtStatus(row, data) }, columns: this.datatableColumns, ajax: '/produccion/ordentrabajo/planning/rotativa/datatable' @@ -168,13 +185,13 @@ class PlanningRotativa { url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json" }, columns: this.datatablePlanaColumns, - createdRow: (row,data,dataIndex) => { - this.getColorOtStatus(row,data) + createdRow: (row, data, dataIndex) => { + this.getColorOtStatus(row, data) }, ajax: { - url : '/produccion/ordentrabajo/planning/plana/datatable', - data : d => { - if(this.maquinaPadreSelectFilterPlana.getVal()){ + url: '/produccion/ordentrabajo/planning/plana/datatable', + data: d => { + if (this.maquinaPadreSelectFilterPlana.getVal()) { d.padre_id = this.maquinaPadreSelectFilterPlana.getVal() } } @@ -206,11 +223,23 @@ class PlanningRotativa { columns: this.papelPliegoDatatableColumns, ajax: '/produccion/ordentrabajo/planning/papel/plana/datatable' }); + this.maquinaPlanaDatatable = this.maquinaTablePlanning.DataTable({ + processing: true, + orderCellsTop: true, + dom: 'lrtip', + serverSide: true, + responsive: true, + pageLength: 10, + language: { + url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json" + }, + columns: this.maquinaPlanaDatatableColumns, + ajax: '/produccion/ordentrabajo/planning/maquina/plana/datatable' + }); /** * PLANNING ROTATIVA */ this.tablePlanningRot.on("keyup", ".planning-filter", (event) => { - console.log(this.datatablePlanningRot.column($(event.currentTarget).attr("name"))) let columnIndex = this.datatableColumns.findIndex((element) => element.data == $(event.currentTarget).attr("name")) this.datatablePlanningRot.column(columnIndex).search($(event.currentTarget).val()).draw() }) @@ -225,12 +254,11 @@ class PlanningRotativa { this.papelGramajeDatatable.on('draw', this.addTotalFooter.bind(this)) this.tablePlanningRot.on('change', ".metros-check", this.calcMetrosCheck.bind(this)) - this.tablePlanningRot.on("click",'.change-corte',this.toggleCorte.bind(this)) + this.tablePlanningRot.on("click", '.change-corte', this.toggleCorte.bind(this)) /** * PLANNING PLANA */ this.tablePlanningPlana.on("keyup", ".planning-filter", (event) => { - console.log(this.datatablePlanningRot.column($(event.currentTarget).attr("name"))) let columnIndex = this.datatablePlanaColumns.findIndex((element) => element.data == $(event.currentTarget).attr("name")) this.datatablePlanningPlana.column(columnIndex).search($(event.currentTarget).val()).draw() }) @@ -246,7 +274,7 @@ class PlanningRotativa { this.datatablePlanningPlana.ajax.reload(); }) this.papelPliegoDatatable.on('draw', this.addTotalFooterPliego.bind(this)) - + this.maquinaPlanaDatatable.on('draw', this.addTotalFooterMaquinaPlana.bind(this)) this.tablePlanningPlana.on('change', ".pliegos-check", this.calcPliegosCheck.bind(this)) } _renderBtnAction(d) { @@ -254,7 +282,6 @@ class PlanningRotativa { } _columnFiltering() { this.api().columns() - console.log(this.api().columns()) } filterPapelGramaje(event) { const papelImpresionId = $(event.currentTarget).data('id') @@ -264,6 +291,10 @@ class PlanningRotativa { const papelImpresionId = $(event.currentTarget).data('id') this.getPapelImpresionPlana(papelImpresionId) } + filterMaquinaPlana(event) { + const maquinaId = $(event.currentTarget).data('id') + this.getMaquinaPlana(maquinaId) + } getPapelImpresion(papelImpresionId) { let ajax = new Ajax('/configuracion/papelesimpresion/show/' + papelImpresionId, null, @@ -282,6 +313,15 @@ class PlanningRotativa { ) ajax.get() } + getMaquinaPlana(maquinaId) { + let ajax = new Ajax('/configuracion/maquinas/' + maquinaId, + null, + null, + this.getMaquinaPlanaSuccess.bind(this), + this.getMaquinaPlanaError.bind(this) + ) + ajax.get() + } getPapelImpresionSuccess(response) { this.papelImpresionFilter.setOption(response.id, response.nombre) this.tablePlanningRot.find('input[name=papel_gramaje]').val(response.gramaje).trigger("change") @@ -293,7 +333,18 @@ class PlanningRotativa { this.tablePlanningPlana.find('input[name=papel_gramaje]').val(response.gramaje).trigger("change") this.papelImpresionPlanaHeader.text(response.nombre) } + getMaquinaPlanaSuccess(response) { + if (response.is_padre != 0) { + this.maquinaSelectFilterPlana.setOption(response.id, response.nombre) + this.tablePlanningPlana.find('input[name=maquina_planning_nombre]').val(response.nombre).trigger("change") + } else { + this.maquinaPadreSelectFilterPlana.setOption(response.id, response.nombre) + this.tablePlanningPlana.find('input[name=lg_maquinas.padre_id]').val(response.nombre).trigger("change") + } + this.papelImpresionPlanaHeader.text(response.nombre) + } getPapelImpresionPlanaError(response) { } + getMaquinaPlanaError(response) { } formatSeconds(s) { const hours = Math.floor(s / 60 / 60) const minutes = Math.floor(s / 60 % 60) @@ -316,8 +367,14 @@ class PlanningRotativa { const pliegos = this.papelPliegoDatatable.column(4).data().map((e) => parseFloat(e)) $('#total-tiempo-pliego').text(this.formatSeconds(seconds)) this.totalPliegos.set(pliegos.reduce((a, b) => a + b, 0)) - - + } + addTotalFooterMaquinaPlana() { + const seconds = this.maquinaPlanaDatatable.column(4).data().reduce((a, b) => { + return parseFloat(a) + parseFloat(b) + }, 0) + const pliegos = this.maquinaPlanaDatatable.column(3).data().map((e) => parseFloat(e)) + $('#total-tiempo-pliego-maquina').text(this.formatSeconds(seconds)) + this.totalMaquinaPliegos.set(pliegos.reduce((a, b) => a + b, 0)) } calcMetrosCheck() { const metros_sel = this.datatablePlanningRot.rows((idx, data, node) => { @@ -334,15 +391,13 @@ class PlanningRotativa { return $(node).find('input[type="checkbox"]').prop('checked'); }).data().toArray().map((e) => parseFloat(e.tiempo_real_sum)) this.totalPliegosSel.set(metros_sel.reduce((a, b) => a + b, 0)) - const totalSeconds = tiempo_total_sel.reduce((a,b) => a+b,0) - console.log("Total seconds",totalSeconds); + const totalSeconds = tiempo_total_sel.reduce((a, b) => a + b, 0) this.tiempoPlanaTotal.text(this.formatSeconds(totalSeconds)) } renderCorteImage(data) { const tipo_corte = data.tipo_corte == "bobina" ? "cortadora_bobinas" : "guillotina"; - console.log(data.tipo_corte) return `
@@ -351,7 +406,7 @@ class PlanningRotativa { ` } - toggleCorte(event){ + toggleCorte(event) { let otId = $(event.currentTarget).data('id') let ajax = new Ajax("/produccion/ordentrabajo/planning/tarea/toggle/corte/" + otId, null, @@ -361,18 +416,18 @@ class PlanningRotativa { ) ajax.post() } - toggleCorteSuccess(response){ + toggleCorteSuccess(response) { this.datatablePlanningRot.ajax.reload() alertSuccess(response.message).fire() } - toggleCorteError(){ + toggleCorteError() { } - getColorOtStatus(row,data){ - let ajax = new Ajax("/produccion/ordentrabajo/color/"+data.otId,null,null, + getColorOtStatus(row, data) { + let ajax = new Ajax("/produccion/ordentrabajo/color/" + data.otId, null, null, (response) => { - $(row).css("border-left",`10px solid ${response.color}`) - $(row).css("border-right",`10px solid ${response.color}`) - },null + $(row).css("border-left", `10px solid ${response.color}`) + $(row).css("border-right", `10px solid ${response.color}`) + }, null ) ajax.get() }