From 460cb0344f7219b03dd23b7cd4d65f6b03394599 Mon Sep 17 00:00:00 2001 From: amazuecos Date: Mon, 31 Mar 2025 09:05:03 +0200 Subject: [PATCH] toggle corte rotativa planning --- ci4/app/Config/Routes.php | 2 + .../Controllers/Produccion/Ordentrabajo.php | 16 ++- ...0000_AddColumnIsCorteOrdenTrabajoTarea.php | 51 ++++++++ .../Produccion/OrdenTrabajoTareaEntity.php | 4 + .../Maquinas/TarifaAcabadoMaquinaEntity.php | 2 +- .../Models/OrdenTrabajo/OrdenTrabajoTarea.php | 2 + ci4/app/Services/ProductionService.php | 122 +++++++++++------- .../produccion/ot/viewPlanningRotativa.php | 2 + .../assets/js/safekat/pages/produccion/ot.js | 4 +- .../planning_rotativa/planning_rotativa.js | 28 +++- 10 files changed, 174 insertions(+), 59 deletions(-) create mode 100644 ci4/app/Database/Migrations/2025-03-31-080000_AddColumnIsCorteOrdenTrabajoTarea.php diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index d26a269f..ce5b06bc 100644 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -1009,6 +1009,8 @@ $routes->group('produccion', ['namespace' => 'App\Controllers\Produccion'], func $routes->get('papel/plana/datatable', 'Ordentrabajo::papel_pliego_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 1fe96731..0fef800c 100755 --- a/ci4/app/Controllers/Produccion/Ordentrabajo.php +++ b/ci4/app/Controllers/Produccion/Ordentrabajo.php @@ -138,7 +138,7 @@ class Ordentrabajo extends BaseController ->add("logo", fn($q) => site_url($logo->get_logo_path($q->presupuesto_linea_tipo))) ->edit( "fecha_encuadernado_at", - fn($q) => Time::createFromFormat("Y-m-d", $q->fecha_encuadernado_at)->format("d/m/Y") + fn($q) => $q->fecha_encuadernado_at ? Time::createFromFormat("Y-m-d", $q->fecha_encuadernado_at)->format("d/m/Y") : "" ) ->add("action", fn($q) => $q->id) ->toJson(true); @@ -153,7 +153,7 @@ class Ordentrabajo extends BaseController ->add("logo", fn($q) => site_url($logo->get_logo_path($q->presupuesto_linea_tipo))) ->edit( "fecha_encuadernado_at", - fn($q) => Time::createFromFormat("Y-m-d", $q->fecha_encuadernado_at)->format("d/m/Y") + fn($q) => $q->fecha_encuadernado_at ? Time::createFromFormat("Y-m-d", $q->fecha_encuadernado_at)->format("d/m/Y") : "" ) ->add("action", fn($q) => $q->id) ->toJson(true); @@ -168,7 +168,7 @@ class Ordentrabajo extends BaseController ->add("logo", fn($q) => site_url($logo->get_logo_path($q->presupuesto_linea_tipo))) ->edit( "fecha_encuadernado_at", - fn($q) => Time::createFromFormat("Y-m-d", $q->fecha_encuadernado_at)->format("d/m/Y") + fn($q) =>$q->fecha_encuadernado_at ? Time::createFromFormat("Y-m-d", $q->fecha_encuadernado_at)->format("d/m/Y") : "" ) ->add("action", fn($q) => $q->id) ->toJson(true); @@ -183,7 +183,7 @@ class Ordentrabajo extends BaseController ->add("logo", fn($q) => site_url($logo->get_logo_path($q->presupuesto_linea_tipo))) ->edit( "fecha_encuadernado_at", - fn($q) => Time::createFromFormat("Y-m-d", $q->fecha_encuadernado_at)->format("d/m/Y") + fn($q) => $q->fecha_encuadernado_at ? Time::createFromFormat("Y-m-d", $q->fecha_encuadernado_at)->format("d/m/Y") : "" ) ->add("action", fn($q) => $q->id) ->toJson(true); @@ -289,8 +289,7 @@ class Ordentrabajo extends BaseController return DataTable::of($q) ->edit("fecha_entrega_real_at", fn($q) => $q->fecha_entrega_real_at ? Time::createFromFormat("Y-m-d", $q->fecha_entrega_real_at)->format("d/m/Y") : "") ->add("metros_check", fn($q) => $q->otId) - ->add("corte", fn($q) => $q->otId) - + ->add("corte", fn($q) => ["otId" => $q->otId,"tipo_corte" => $this->produccionService->ordenTrabajoTareaCorte($q->otId)]) ->add("action", fn($q) => $q) ->toJson(true); } @@ -323,5 +322,10 @@ class Ordentrabajo extends BaseController $result = $this->produccionService->querySelectPapelPlanningPlana($q); return $this->response->setJSON($result); } + public function tarea_toggle_corte($orden_trabajo_id) + { + $status = $this->produccionService->tareaUpdateMaquinaCorte($orden_trabajo_id); + return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "status" => $status ]); + } } diff --git a/ci4/app/Database/Migrations/2025-03-31-080000_AddColumnIsCorteOrdenTrabajoTarea.php b/ci4/app/Database/Migrations/2025-03-31-080000_AddColumnIsCorteOrdenTrabajoTarea.php new file mode 100644 index 00000000..2c0343c7 --- /dev/null +++ b/ci4/app/Database/Migrations/2025-03-31-080000_AddColumnIsCorteOrdenTrabajoTarea.php @@ -0,0 +1,51 @@ + [ + 'type' => 'TINYINT', + 'constraint' => 1, + 'null' => false, + 'default' => 0, + ], + 'tipo_corte' => [ + 'type' => 'ENUM', + 'constraint' => ['bobina','guillotina'], + 'default' => 'bobina', + ], + ]; + $this->forge->addColumn('orden_trabajo_tareas', $fields); + $m = model(OrdenTrabajoTarea::class); + $m->where('nombre','Corte')->set(['is_corte' => true,'tipo_corte' => 'bobina'])->update(); + $cvm = model(ConfigVariableModel::class); + $cvm->insert([ + "name" => "id_maquina_bobina_corte_ot_tarea", + "value" => 61, + "description" => "Id de máquina por defecto para corte en bobina rotativa. (Asignación máquina orden trabajo tarea)" + ]); + $cvm->insert([ + "name" => "id_maquina_guillotina_corte_ot_tarea", + "value" => 31, + "description" => "Id de máquina por defecto para corte guillotina rotativa. (Asignación máquina orden trabajo tarea)" + ]); + } + + public function down() + { + $this->forge->dropColumn('orden_trabajo_tareas', 'is_corte'); + $this->forge->dropColumn('orden_trabajo_tareas', 'tipo_corte'); + $cvm = model(ConfigVariableModel::class); + $cvm->whereIn('name',["id_maquina_bobina_corte_ot_tarea","id_maquina_guillotina_corte_ot_tarea"])->delete(purge:true); + + + } +} diff --git a/ci4/app/Entities/Produccion/OrdenTrabajoTareaEntity.php b/ci4/app/Entities/Produccion/OrdenTrabajoTareaEntity.php index c7826985..b11c9812 100644 --- a/ci4/app/Entities/Produccion/OrdenTrabajoTareaEntity.php +++ b/ci4/app/Entities/Produccion/OrdenTrabajoTareaEntity.php @@ -25,6 +25,8 @@ class OrdenTrabajoTareaEntity extends Entity "imposicion_id" => null, "tiempo_estimado" => null, "tiempo_real" => null, + "is_corte" => null, + "tipo_corte" => null, "comment" => null, ]; protected $datamap = []; @@ -39,6 +41,8 @@ class OrdenTrabajoTareaEntity extends Entity "imposicion_id" => "?integer", "tiempo_estimado" => "?float", "tiempo_real" => "?float", + "is_corte" => "boolean", + "tipo_corte" => "string", "comment" => "?string" ]; diff --git a/ci4/app/Entities/Tarifas/Maquinas/TarifaAcabadoMaquinaEntity.php b/ci4/app/Entities/Tarifas/Maquinas/TarifaAcabadoMaquinaEntity.php index 5da9b6da..a5b97709 100644 --- a/ci4/app/Entities/Tarifas/Maquinas/TarifaAcabadoMaquinaEntity.php +++ b/ci4/app/Entities/Tarifas/Maquinas/TarifaAcabadoMaquinaEntity.php @@ -1,8 +1,8 @@ orden_planning ?? 0; $ot_tareas["maquina_id"] = $p_linea_maquina->id; $ot_tareas["imposicion_id"] = null; - $ot_tareas["tiempo_estimado"] = $p_linea->horas_maquina*3600; - $ot_tareas["tiempo_real"] = $p_linea->horas_maquina*3600; //? Tiempo real se inserta manual? + $ot_tareas["tiempo_estimado"] = $p_linea->horas_maquina * 3600; + $ot_tareas["tiempo_real"] = $p_linea->horas_maquina * 3600; //? Tiempo real se inserta manual? $insert_query_result = $this->otTarea->insert($ot_tareas); $ot_tareas = []; $this->storeTareaCorte($p_linea); @@ -226,8 +228,10 @@ class ProductionService extends BaseService 'nombre' => 'Corte', 'maquina_id' => $this->defaultMaquinaCorte->id, 'orden' => $this->defaultMaquinaCorte->orden_planning, - 'tiempo_estimado' => $pLinea->rotativa_tiempo_corte*60, - 'tiempo_real' => $pLinea->rotativa_tiempo_corte*60 + 'tiempo_estimado' => $pLinea->rotativa_tiempo_corte * 60, + 'tiempo_real' => $pLinea->rotativa_tiempo_corte * 60, + 'is_corte' => true, + 'tipo_corte' => "bobina", ]); $otCorte = $this->otTarea->find($tareaId); } @@ -293,15 +297,15 @@ class ProductionService extends BaseService $p_linea_maquinas = $p_linea->maquinas(); $ot_tareas = []; if (count($p_linea_maquinas) > 0) { - $linea_maquina = $p_linea_maquinas[0]; //Se obtiene la primera máquina aunque tenga varias - $ot_tareas["orden_trabajo_id"] = $this->ot->id; - $ot_tareas["presupuesto_preimpresion_id"] = $p_linea->id; - $ot_tareas["nombre"] = $p_linea->tarifa()->nombre; - $ot_tareas["orden"] = $linea_maquina->orden_planning ?? 100; - $ot_tareas["maquina_id"] = $linea_maquina->id; - $ot_tareas["imposicion_id"] = null; - $this->otTarea->insert($ot_tareas); - $ot_tareas = []; + $linea_maquina = $p_linea_maquinas[0]; //Se obtiene la primera máquina aunque tenga varias + $ot_tareas["orden_trabajo_id"] = $this->ot->id; + $ot_tareas["presupuesto_preimpresion_id"] = $p_linea->id; + $ot_tareas["nombre"] = $p_linea->tarifa()->nombre; + $ot_tareas["orden"] = $linea_maquina->orden_planning ?? 100; + $ot_tareas["maquina_id"] = $linea_maquina->id; + $ot_tareas["imposicion_id"] = null; + $this->otTarea->insert($ot_tareas); + $ot_tareas = []; } else { $ot_tareas["orden_trabajo_id"] = $this->ot->id; $ot_tareas["presupuesto_preimpresion_id"] = $p_linea->id; @@ -319,15 +323,15 @@ class ProductionService extends BaseService $p_linea_maquinas = $p_linea->maquinas(); $ot_tareas = []; if (count($p_linea_maquinas) > 0) { - $linea_maquina = $p_linea_maquinas[0]; //Se obtiene la primera máquina aunque tenga varias - $ot_tareas["orden_trabajo_id"] = $this->ot->id; - $ot_tareas["presupuesto_encuadernado_id"] = $p_linea->id; - $ot_tareas["nombre"] = $p_linea->tarifa()->nombre; - $ot_tareas["orden"] = $linea_maquina->orden_planning ?? 110; - $ot_tareas["maquina_id"] = $linea_maquina->id; - $ot_tareas["imposicion_id"] = null; - $this->otTarea->insert($ot_tareas); - $ot_tareas = []; + $linea_maquina = $p_linea_maquinas[0]; //Se obtiene la primera máquina aunque tenga varias + $ot_tareas["orden_trabajo_id"] = $this->ot->id; + $ot_tareas["presupuesto_encuadernado_id"] = $p_linea->id; + $ot_tareas["nombre"] = $p_linea->tarifa()->nombre; + $ot_tareas["orden"] = $linea_maquina->orden_planning ?? 110; + $ot_tareas["maquina_id"] = $linea_maquina->id; + $ot_tareas["imposicion_id"] = null; + $this->otTarea->insert($ot_tareas); + $ot_tareas = []; } else { $ot_tareas["orden_trabajo_id"] = $this->ot->id; $ot_tareas["presupuesto_encuadernado_id"] = $p_linea->id; @@ -345,15 +349,15 @@ class ProductionService extends BaseService $p_linea_maquinas = $p_linea->maquinas(); $ot_tareas = []; if (count($p_linea_maquinas) > 0) { - $linea_maquina = $p_linea_maquinas[0]; //Se obtiene la primera máquina aunque tenga varias - $ot_tareas["orden_trabajo_id"] = $this->ot->id; - $ot_tareas["presupuesto_extra_id"] = $p_linea->id; - $ot_tareas["nombre"] = $p_linea->tarifa()->nombre; - $ot_tareas["orden"] = $linea_maquina->orden_planning ?? 0; - $ot_tareas["maquina_id"] = $linea_maquina->id; - $ot_tareas["imposicion_id"] = null; - $this->otTarea->insert($ot_tareas); - $ot_tareas = []; + $linea_maquina = $p_linea_maquinas[0]; //Se obtiene la primera máquina aunque tenga varias + $ot_tareas["orden_trabajo_id"] = $this->ot->id; + $ot_tareas["presupuesto_extra_id"] = $p_linea->id; + $ot_tareas["nombre"] = $p_linea->tarifa()->nombre; + $ot_tareas["orden"] = $linea_maquina->orden_planning ?? 0; + $ot_tareas["maquina_id"] = $linea_maquina->id; + $ot_tareas["imposicion_id"] = null; + $this->otTarea->insert($ot_tareas); + $ot_tareas = []; } else { $ot_tareas["orden_trabajo_id"] = $this->ot->id; $ot_tareas["presupuesto_extra_id"] = $p_linea->id; @@ -715,7 +719,7 @@ class ProductionService extends BaseService public function updateOrdenTrabajoTarea($tarea_id, $data): bool { - if(isset($data['maquina_id'])){ + if (isset($data['maquina_id'])) { $maquina = model(MaquinaModel::class)->find($data['maquina_id']); $data['orden'] = $maquina->orden_planning; } @@ -821,7 +825,8 @@ class ProductionService extends BaseService return ["title" => lang('ot.filter_by_task'), 'id' => $id]; } - public function querySelectMaquinaPlanningRotativa($q){ + public function querySelectMaquinaPlanningRotativa($q) + { $query = $this->otModel->builder()->select([ "orden_trabajo_tareas.maquina_id as id", "lg_maquinas.nombre as name", @@ -833,12 +838,13 @@ class ProductionService extends BaseService ->where('lg_maquinas.is_rotativa', true) ->where("orden_trabajo_tareas.deleted_at", null) ->orderBy("orden_trabajo_tareas.orden", "ASC"); - if($q){ - $query->like('lg_maquinas.nombre',$q); + if ($q) { + $query->like('lg_maquinas.nombre', $q); } return $query->get()->getResultArray(); } - public function querySelectMaquinaPlanningPlana($q){ + public function querySelectMaquinaPlanningPlana($q) + { $query = $this->otModel->builder()->select([ "orden_trabajo_tareas.maquina_id as id", "lg_maquinas.nombre as name", @@ -851,12 +857,13 @@ class ProductionService extends BaseService ->where('lg_maquinas.is_rotativa', false) ->where("orden_trabajo_tareas.deleted_at", null) ->orderBy("orden_trabajo_tareas.orden", "ASC"); - if($q){ - $query->like('lg_maquinas.nombre',$q); + if ($q) { + $query->like('lg_maquinas.nombre', $q); } return $query->get()->getResultArray(); } - public function querySelectPapelPlanningRot(string $q){ + public function querySelectPapelPlanningRot(string $q) + { $query = $this->otModel->builder()->select([ "lg_papel_impresion.id", "lg_papel_impresion.nombre as name", @@ -870,12 +877,13 @@ class ProductionService extends BaseService ->where("orden_trabajo_tareas.presupuesto_linea_id IS NOT NULL", NULL, FALSE) ->whereIn("presupuesto_linea.tipo", $this->TIPOS_ROTATIVA) ->groupBy('lg_papel_impresion.id'); - if($q){ - $query->like('lg_papel_impresion.nombre',$q); + if ($q) { + $query->like('lg_papel_impresion.nombre', $q); } return $query->get()->getResultArray(); } - public function querySelectPapelPlanningPlana($q){ + public function querySelectPapelPlanningPlana($q) + { $query = $this->otModel->builder()->select([ "lg_papel_impresion.id", "lg_papel_impresion.nombre as name", @@ -889,11 +897,33 @@ class ProductionService extends BaseService ->where("orden_trabajo_tareas.presupuesto_linea_id IS NOT NULL", NULL, FALSE) ->whereIn("presupuesto_linea.tipo", $this->TIPOS_PLANA) ->groupBy('lg_papel_impresion.id'); - if($q){ - $query->like('lg_papel_impresion.nombre',$q); + if ($q) { + $query->like('lg_papel_impresion.nombre', $q); } return $query->get()->getResultArray(); } - - + public function tareaUpdateMaquinaCorte($orden_trabajo_id): bool + { + $cvm = model(ConfigVariableModel::class); + $otTarea = $this->otTarea->where('orden_trabajo_id', $orden_trabajo_id)->where('is_corte', true)->first(); + $toggleCorte = "bobina"; + if ($otTarea->tipo_corte == "bobina") { + $maquina_id = $cvm->where('name', "id_maquina_guillotina_corte_ot_tarea")->first()["value"]; + $toggleCorte = "guillotina"; + } elseif ($otTarea->tipo_corte == "guillotina") { + $maquina_id = $cvm->where('name', "id_maquina_bobina_corte_ot_tarea")->first()["value"]; + $toggleCorte = "bobina"; + } else { + $maquina_id = null; + } + return $this->otTarea + ->where('orden_trabajo_id', $orden_trabajo_id) + ->where('is_corte', true) + ->set(["maquina_id" => $maquina_id, "tipo_corte" => $toggleCorte]) + ->update(); + } + public function ordenTrabajoTareaCorte(int $ot_id): ?string + { + return $this->otTarea->where('orden_trabajo_id', $ot_id)->where('is_corte', true)?->first()->tipo_corte ?? null; + } } 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 2c84a148..2c5f572c 100644 --- a/ci4/app/Views/themes/vuexy/form/produccion/ot/viewPlanningRotativa.php +++ b/ci4/app/Views/themes/vuexy/form/produccion/ot/viewPlanningRotativa.php @@ -119,11 +119,13 @@ section('css') ?> + endSection() ?> section("additionalExternalJs") ?> + endSection() ?> \ No newline at end of file diff --git a/httpdocs/assets/js/safekat/pages/produccion/ot.js b/httpdocs/assets/js/safekat/pages/produccion/ot.js index 5fb8fd8d..b5749639 100644 --- a/httpdocs/assets/js/safekat/pages/produccion/ot.js +++ b/httpdocs/assets/js/safekat/pages/produccion/ot.js @@ -176,10 +176,10 @@ class OrdenTrabajo { console.log("Create selects") this.summaryData.tasks.forEach(element => { let selectItem = this.item.find("#select-maquina-tarea-" + element.id); - if (element.presupuesto_linea_id) this.createSelectMaquinaImpresion(selectItem) + if (element.presupuesto_linea_id && element.is_corte == false) this.createSelectMaquinaImpresion(selectItem) if (element.presupuesto_acabado_id) this.createSelectMaquinaAcabado(selectItem) if (element.presupuesto_encuadernado_id) this.createSelectMaquinaEncuadernacion(selectItem) - if (element.presupuesto_manipulado_id) this.createSelectMaquinaManipulado(selectItem) + if (element.presupuesto_manipulado_id || element.is_corte) this.createSelectMaquinaManipulado(selectItem) if (element.presupuesto_preimpresion_id) this.createSelectMaquinaAll(selectItem) if (element.presupuesto_extra_id) this.createSelectMaquinaAll(selectItem) }); 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 e7a3f38d..4a31b98c 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 @@ -1,5 +1,6 @@ import ClassSelect from "../../../components/select2.js"; import Ajax from "../../../components/ajax.js"; +import { alertError, alertSuccess } from "../../../components/alerts/sweetAlert.js"; class PlanningRotativa { @@ -204,7 +205,7 @@ 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)) /** * PLANNING PLANA */ @@ -307,15 +308,34 @@ class PlanningRotativa { this.totalPliegosSel.set(metros_sel.reduce((a, b) => a + b, 0)) } - renderCorteImage() { + renderCorteImage(data) { + const tipo_corte = data.tipo_corte == "bobina" ? "cortadora_bobinas" : "guillotina"; + console.log(data.tipo_corte) return ` - +
- Guillotina + ${data.tipo_corte}
` } + toggleCorte(event){ + let otId = $(event.currentTarget).data('id') + let ajax = new Ajax("/produccion/ordentrabajo/planning/tarea/toggle/corte/" + otId, + null, + null, + this.toggleCorteSuccess.bind(this), + this.toggleCorteError.bind(this) + ) + ajax.post() + } + toggleCorteSuccess(response){ + this.datatablePlanningRot.ajax.reload() + alertSuccess(response.message).fire() + } + toggleCorteError(){ + } + }