From 52b3b1ae4d190d958559f1911592c85c40b16bdc Mon Sep 17 00:00:00 2001 From: amazuecos Date: Fri, 25 Apr 2025 07:40:20 +0200 Subject: [PATCH] maquinista view-basic --- ci4/app/Config/OrdenTrabajo.php | 2 + ci4/app/Config/Routes.php | 8 +- ci4/app/Config/Validation.php | 11 + .../Controllers/Produccion/Ordentrabajo.php | 84 ++++++-- ..._AddMaquinistaFieldsOrdenTrabajoTareas.php | 30 --- ...AddTableOrdenTrabajoTareaProgressDates.php | 66 ++++-- ...175400_AddClickColumnOrdenTrabajoTarea.php | 36 ++++ .../Produccion/OrdenTrabajoEntity.php | 10 + .../Produccion/OrdenTrabajoTareaEntity.php | 56 ++++- .../OrdenTrabajoTareaProgressDateEntity.php | 31 +++ ci4/app/Language/es/Produccion.php | 17 +- ci4/app/Models/Configuracion/MaquinaModel.php | 25 ++- .../Models/OrdenTrabajo/OrdenTrabajoModel.php | 3 - .../Models/OrdenTrabajo/OrdenTrabajoTarea.php | 4 +- .../OrdenTrabajoTareaProgressDate.php | 70 ++++++ ci4/app/Services/ProductionService.php | 88 +++++++- .../vuexy/components/cards/tarea_card.php | 37 +++- .../components/cards/tarea_card_actions.php | 64 ++++-- .../tables/maquinista_tarea_table.php | 7 +- .../maquinista/viewMaquinistaMaquinaList.php | 1 - .../maquinista/viewMaquinistaMaquinaTarea.php | 65 +++++- .../viewMaquinistaMaquinaTareas.php | 24 ++- .../vuexy/main/menus/maquinista_menu.php | 4 +- .../maquinista/maquinistaTareaList.js | 90 +++++++- .../maquinista/maquinistaTareaView.js | 199 +++++++++++++++++- .../configuracion/maquinista/viewTareaList.js | 4 +- .../configuracion/maquinista/viewTareaView.js | 2 + httpdocs/themes/vuexy/css/maquinista.css | 5 + 28 files changed, 911 insertions(+), 132 deletions(-) delete mode 100755 ci4/app/Database/Migrations/2025-04-22-094400_AddMaquinistaFieldsOrdenTrabajoTareas.php create mode 100644 ci4/app/Database/Migrations/2025-04-24-175400_AddClickColumnOrdenTrabajoTarea.php create mode 100755 ci4/app/Entities/Produccion/OrdenTrabajoTareaProgressDateEntity.php create mode 100644 ci4/app/Models/OrdenTrabajo/OrdenTrabajoTareaProgressDate.php diff --git a/ci4/app/Config/OrdenTrabajo.php b/ci4/app/Config/OrdenTrabajo.php index 35f58438..72233900 100755 --- a/ci4/app/Config/OrdenTrabajo.php +++ b/ci4/app/Config/OrdenTrabajo.php @@ -116,6 +116,8 @@ class OrdenTrabajo extends BaseConfig "default" => ["bg" => "white", "color" => "black"], ]; + + public function __construct() { parent::__construct(); diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index 110b81eb..4cc2a630 100755 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -743,6 +743,8 @@ $routes->group('produccion', ['namespace' => 'App\Controllers\Produccion'], func $routes->get('datatable_ferro_pendiente', 'Ordentrabajo::datatable_ferro_pendiente'); $routes->get('datatable_ferro_ok', 'Ordentrabajo::datatable_ferro_ok'); $routes->get('tareas/datatable/(:num)', 'Ordentrabajo::tareas_datatable/$1', ['as' => 'datatableTareasOrdenTrabajo']); + $routes->get("tarea/progress/(:num)","Ordentrabajo::get_orden_trabajo_progress_date/$1"); + /**====================== * UPDATES *========================**/ @@ -755,6 +757,8 @@ $routes->group('produccion', ['namespace' => 'App\Controllers\Produccion'], func $routes->post("upload/portada", 'Ordentrabajo::upload_orden_trabajo_portada'); $routes->delete("portada/(:num)", 'Ordentrabajo::delete_orden_trabajo_portada/$1'); $routes->get("color/(:num)", 'Ordentrabajo::get_orden_trabajo_color_status/$1'); + $routes->post("update/tarea/progress","Ordentrabajo::store_orden_trabajo_progress_date"); + $routes->delete("tarea/progress/(:num)","Ordentrabajo::delete_orden_trabajo_progress_date/$1"); /**====================== * FILES @@ -784,9 +788,9 @@ $routes->group('produccion', ['namespace' => 'App\Controllers\Produccion'], func $routes->group('maquinista', ['namespace' => 'App\Controllers\Produccion'], function ($routes) { $routes->get('maquinas/view', 'Ordentrabajo::maquinista_maquinas_view', ['as' => 'viewProduccionMaquinistaMaquinas']); $routes->get('maquinas/view/(:num)', 'Ordentrabajo::maquinista_maquina_tareas_list/$1', ['as' => 'viewProduccionMaquinaTareasList']); + $routes->get('maquinas/tareas/datatable/(:alpha)/(:num)', 'Ordentrabajo::maquinista_maquina_tareas_datatable/$1/$2', ['as' => 'viewMaquinistaMaquinaTareaDatatable']); + $routes->get('maquinas/view/tarea/(:num)', 'Ordentrabajo::maquinista_maquina_tarea_view/$1', ['as' => 'viewProduccionMaquinistaTareaView']); - - $routes->get('colas/view', 'Ordentrabajo::maquinista_colas_view', ['as' => 'viewProduccionMaquinistaColas']); }); }); diff --git a/ci4/app/Config/Validation.php b/ci4/app/Config/Validation.php index 982ce5c9..09717371 100755 --- a/ci4/app/Config/Validation.php +++ b/ci4/app/Config/Validation.php @@ -155,6 +155,17 @@ class Validation extends BaseConfig ], ]; + public array $orden_trabajo_tarea_progress_date = [ + + "ot_tarea_id" => [ + "rules" => "required|integer", + "label" => "tarea" + ], + "estado" => [ + "rules" => "required|in_list[P,I,S,D,F,E]", + "label" => "estado" + ] + ]; public array $orden_trabajo = [ "orden_trabajo_id" => [ "rules" => "required|integer", diff --git a/ci4/app/Controllers/Produccion/Ordentrabajo.php b/ci4/app/Controllers/Produccion/Ordentrabajo.php index a98abaed..1c08aee0 100755 --- a/ci4/app/Controllers/Produccion/Ordentrabajo.php +++ b/ci4/app/Controllers/Produccion/Ordentrabajo.php @@ -173,7 +173,7 @@ class Ordentrabajo extends BaseController $q = $this->otModel->getDatatableQuery()->where("ordenes_trabajo.estado", "F"); // return $this->response->setJSON($q->get()->getResultArray()); return DataTable::of($q) - ->add("logo", fn($q) => ["logo" => site_url($logo->get_logo_path($q->presupuesto_linea_tipo)), "imposicion" => $q->imposicion_name,"color" => $this->produccionService->init($q->id)->getOtColorStatus()]) + ->add("logo", fn($q) => ["logo" => site_url($logo->get_logo_path($q->presupuesto_linea_tipo)), "imposicion" => $q->imposicion_name, "color" => $this->produccionService->init($q->id)->getOtColorStatus()]) ->edit( "fecha_encuadernado_at", fn($q) => $q->fecha_encuadernado_at ? Time::createFromFormat("Y-m-d H:i:s", $q->fecha_encuadernado_at)->format("d/m/Y") : "" @@ -188,7 +188,7 @@ class Ordentrabajo extends BaseController $q = $this->otModel->getDatatableQuery()->whereIn("ordenes_trabajo.estado", ["I", "PM"]); // return $this->response->setJSON($q->get()->getResultArray()); return DataTable::of($q) - ->add("logo", fn($q) => ["logo" => site_url($logo->get_logo_path($q->presupuesto_linea_tipo)), "imposicion" => $q->imposicion_name,"color" => $this->produccionService->init($q->id)->getOtColorStatus()]) + ->add("logo", fn($q) => ["logo" => site_url($logo->get_logo_path($q->presupuesto_linea_tipo)), "imposicion" => $q->imposicion_name, "color" => $this->produccionService->init($q->id)->getOtColorStatus()]) ->edit( "fecha_encuadernado_at", fn($q) => $q->fecha_encuadernado_at ? Time::createFromFormat("Y-m-d H:i:s", $q->fecha_encuadernado_at)->format("d/m/Y") : "" @@ -203,7 +203,7 @@ class Ordentrabajo extends BaseController $q = $this->otModel->getDatatableQuery()->where("ferro_ok_at", null); // return $this->response->setJSON($q->get()->getResultArray()); return DataTable::of($q) - ->add("logo", fn($q) => ["logo" => site_url($logo->get_logo_path($q->presupuesto_linea_tipo)), "imposicion" => $q->imposicion_name,"color" => $this->produccionService->init($q->id)->getOtColorStatus()]) + ->add("logo", fn($q) => ["logo" => site_url($logo->get_logo_path($q->presupuesto_linea_tipo)), "imposicion" => $q->imposicion_name, "color" => $this->produccionService->init($q->id)->getOtColorStatus()]) ->edit( "fecha_encuadernado_at", fn($q) => $q->fecha_encuadernado_at ? Time::createFromFormat("Y-m-d H:i:s", $q->fecha_encuadernado_at)->format("d/m/Y") : "" @@ -218,7 +218,7 @@ class Ordentrabajo extends BaseController $q = $this->otModel->getDatatableQuery()->where("ferro_ok_at is NOT NULL", NULL, FALSE); // return $this->response->setJSON($q->get()->getResultArray()); return DataTable::of($q) - ->add("logo", fn($q) => ["logo" => site_url($logo->get_logo_path($q->presupuesto_linea_tipo)), "imposicion" => $q->imposicion_name,"color" => $this->produccionService->init($q->id)->getOtColorStatus()]) + ->add("logo", fn($q) => ["logo" => site_url($logo->get_logo_path($q->presupuesto_linea_tipo)), "imposicion" => $q->imposicion_name, "color" => $this->produccionService->init($q->id)->getOtColorStatus()]) ->edit( "fecha_encuadernado_at", fn($q) => $q->fecha_encuadernado_at ? Time::createFromFormat("Y-m-d H:i:s", $q->fecha_encuadernado_at)->format("d/m/Y") : "" @@ -357,7 +357,7 @@ class Ordentrabajo extends BaseController ->edit("tiempo_real_sum", fn($q) => $q->tiempo_real_sum) ->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("pliegos_check", fn($q) => $q->otId) - ->add("action", fn($q) => ["data" => $q ]) + ->add("action", fn($q) => ["data" => $q]) ->toJson(true); } public function select_maquina_planning_rot() @@ -451,16 +451,16 @@ class Ordentrabajo extends BaseController helper('file'); $barcode = $this->produccionService->init($orden_trabajo_id)->getFileBarCode(); return $this->response - ->setHeader('Content-Type', 'image/png') - ->setHeader('Content-Disposition', "attachment; filename=CodigoBarrasOT_{$orden_trabajo_id}.png") - ->setBody($barcode); + ->setHeader('Content-Type', 'image/png') + ->setHeader('Content-Disposition', "attachment; filename=CodigoBarrasOT_{$orden_trabajo_id}.png") + ->setBody($barcode); } public function maquinista_maquinas_view() { // Breadcrumbs $this->viewData['breadcrumb'] = [ - ['title' => lang("Produccion.maquinista.maquinas"), 'route' =>route_to("viewProduccionMaquinistaMaquinas"), 'active' => true], + ['title' => lang("Produccion.maquinista.maquinas"), 'route' => route_to("viewProduccionMaquinistaMaquinas"), 'active' => true], ]; $data = [ "impresion" => $this->maquinaModel->queryViewMaquinistaMaquinas('impresion')->get()->getResultArray(), @@ -469,28 +469,78 @@ class Ordentrabajo extends BaseController ]; $this->viewData["maquinas"] = $data; return view(static::$viewPath . '/maquinista/viewMaquinistaMaquinaList', $this->viewData); - } public function maquinista_maquina_tareas_list(int $maquina_id) { $maquina = $this->maquinaModel->find($maquina_id); $this->viewData['breadcrumb'] = [ - ['title' => lang("Produccion.maquinista.maquinas"), 'route' =>route_to("viewProduccionMaquinistaMaquinas"), 'active' => false], - ['title' => $maquina->nombre, 'route' =>route_to("viewProduccionMaquinistaMaquina",$maquina_id), 'active' => true], + ['title' => lang("Produccion.maquinista.maquinas"), 'route' => route_to("viewProduccionMaquinistaMaquinas"), 'active' => false], + ['title' => $maquina->nombre, 'route' => route_to("viewProduccionMaquinistaMaquina", $maquina_id), 'active' => true], ]; $this->viewData["maquinaEntity"] = $maquina; return view(static::$viewPath . '/maquinista/viewMaquinistaMaquinaTareas', $this->viewData); - } public function maquinista_maquina_tarea_view(int $orden_trabajo_tarea_id) { - + $otTareaEntity = $this->otTarea->find($orden_trabajo_tarea_id); + $this->viewData['ot_tarea'] = $otTareaEntity; + $this->viewData['ot'] = $otTareaEntity->orden_trabajo(); + $this->viewData['presupuesto'] = $this->viewData['ot']->presupuesto(); + $this->viewData['breadcrumb'] = [ + ['title' => lang("Produccion.maquinista.maquinas"), 'route' => route_to("viewProduccionMaquinistaMaquinas"), 'active' => false], + ['title' => $otTareaEntity->maquina_actual()->nombre, 'route' => route_to("viewProduccionMaquinaTareasList", $otTareaEntity?->maquina_actual()?->id), 'active' => true], + ['title' => $otTareaEntity->nombre, 'route' => route_to("viewProduccionMaquinistaTareaView", $otTareaEntity->id), 'active' => true] + + ]; + return view(static::$viewPath . '/maquinista/viewMaquinistaMaquinaTarea', $this->viewData); - } - public function maquinista_colas_view(){ + public function maquinista_colas_view() + { return view(static::$viewPath . '/maquinista/viewMaquinistaPlanningList', $this->viewData); - + } + public function maquinista_maquina_tareas_datatable(string $content , int $maquina_id) + { + $pm = $this->produccionService->getMaquinaImpresionTareasList($maquina_id); + if($content == 'today'){ + $pm->like('pedidos.fecha_impresion', Time::now()->format('Y-m-d')); + } + return DataTable::of($pm) + ->edit('fecha_impresion', fn($q) => $q->fecha_impresion ? Time::createFromFormat('Y-m-d H:i:s', $q->fecha_impresion)->format('d/m/Y') : '') + ->add('action', fn($q) => $this->produccionService->buttonActionDatatableTareaList($q->ot_tarea_id)) + ->toJson(true); } + + public function store_orden_trabajo_progress_date() + { + try { + $bodyData = $this->request->getPost(); + $validated = $this->validation->run($bodyData, "orden_trabajo_tarea_progress_date"); + // return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "data" => $this->validation->getValidated(),"errors" => $this->validation->getErrors()]); + if ($validated) { + $r = $this->produccionService->storeOrdenTrabajoTareaProgressDate($this->validation->getValidated()); + return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "status" => $r, "data" => $bodyData]); + } else { + return $this->response->setJSON(["errors" => $this->validation->getErrors()])->setStatusCode(400); + } + } catch (\Throwable $th) { + return $this->response->setJSON(["status" => false, "error" => $th->getMessage()])->setStatusCode(500); + } + } + public function delete_orden_trabajo_progress_date(int $orden_trabajo_tarea_id) + { + + $status = $this->produccionService->deleteOrdenTrabajoTareaProgressDates($orden_trabajo_tarea_id); + return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "status" => $status]); + } + public function get_orden_trabajo_progress_date(int $orden_trabajo_tarea_id) + { + $otTareaEntity = $this->otTarea->find($orden_trabajo_tarea_id); + $data = [ + "tiempo_trabajado" => float_seconds_to_hhmm_string($otTareaEntity->tiempo_trabajado()), + "progress_dates" => $otTareaEntity->progress_dates(), + ]; + return $this->response->setJSON($data); + } } diff --git a/ci4/app/Database/Migrations/2025-04-22-094400_AddMaquinistaFieldsOrdenTrabajoTareas.php b/ci4/app/Database/Migrations/2025-04-22-094400_AddMaquinistaFieldsOrdenTrabajoTareas.php deleted file mode 100755 index 9fd1e947..00000000 --- a/ci4/app/Database/Migrations/2025-04-22-094400_AddMaquinistaFieldsOrdenTrabajoTareas.php +++ /dev/null @@ -1,30 +0,0 @@ - [ - "type" => "ENUM", - "constraint" => ["P","I","D","F","E"], - "default" => "P", - "comment" => "(P)ENDING,(I)NIT,(D)ELAY,(F)INISHED,(E)RROR" - ] - ]; - public function up() - { - $this->forge->addColumn("orden_trabajo_tareas", $this->COLUMNS); - - } - - public function down() - { - $this->forge->dropColumn("orden_trabajo_tareas",array_keys($this->COLUMNS)); - - } -} diff --git a/ci4/app/Database/Migrations/2025-04-22-100000_AddTableOrdenTrabajoTareaProgressDates.php b/ci4/app/Database/Migrations/2025-04-22-100000_AddTableOrdenTrabajoTareaProgressDates.php index 4aee0256..8542ce00 100644 --- a/ci4/app/Database/Migrations/2025-04-22-100000_AddTableOrdenTrabajoTareaProgressDates.php +++ b/ci4/app/Database/Migrations/2025-04-22-100000_AddTableOrdenTrabajoTareaProgressDates.php @@ -2,7 +2,10 @@ namespace App\Database\Migrations; +use App\Models\OrdenTrabajo\OrdenTrabajoTarea; use CodeIgniter\Database\Migration; +use CodeIgniter\Database\RawSql; +use CodeIgniter\I18n\Time; class AddTableOrdenTrabajoTareaProgressDates extends Migration { @@ -13,36 +16,67 @@ class AddTableOrdenTrabajoTareaProgressDates extends Migration "unsigned" => true, "auto_increment" => true, ], - "init_at" => [ - "type" => "INT", - "unsigned" => "INT", - "comment" => "Timestamp task init" - ], - "end_at" => [ - "type" => "INT", - "unsigned" => "INT", - "comment" => "Timestamp task finish" - ], - "init_user_id" => [ + "ot_tarea_id" => [ "type" => "INT", "unsigned" => true, - "constraint" => 11 ], - "end_user_id" => [ + "action_at" => [ + "type" => "DATETIME", + "comment" => "Datetime task init" + ], + "action_user_id" => [ "type" => "INT", "unsigned" => true, - "constraint" => 11 + "constraint" => 11, + "null" => true, ], + "estado" => [ + "type" => "ENUM", + "constraint" => ["P", "I", "S", "D", "F", "E"], + "default" => "P", + "comment" => "(P)ENDING,(I)NIT,(S)TOPPED,(D)ELAY,(F)INISHED,(E)RROR" + ] ]; public function up() { $this->forge->addField($this->COLUMNS); + $currenttime = new RawSql('CURRENT_TIMESTAMP'); + $this->forge->addField([ + 'created_at' => [ + 'type' => 'TIMESTAMP', + 'default' => $currenttime, + ], + 'updated_at' => [ + 'type' => 'TIMESTAMP', + 'null' => true, + ], + 'deleted_at' => [ + 'type' => 'TIMESTAMP', + 'null' => true, + + ], + ]); $this->forge->addPrimaryKey('id'); + $this->forge->addForeignKey('ot_tarea_id', 'orden_trabajo_tareas', 'id'); + $this->forge->createTable("orden_trabajo_tarea_progress_dates"); + + $m = model(OrdenTrabajoTarea::class); + $tareas = $m->findAll(); + try { + foreach ($tareas as $key => $tarea) { + $this->db->table('orden_trabajo_tarea_progress_dates')->insert([ + "ot_tarea_id" => $tarea->id, + "action_at" => $tarea->created_at->format('Y-m-d H:i:s'), + "action_user_id" => $tarea?->orden_trabajo()?->user_created_id ?? null, + ]); + } + } catch (\Throwable $th) { + echo $th->getMessage(); + } } public function down() { - $this->forge->dropColumn("orden_trabajo_tareas",array_keys($this->COLUMNS)); - + $this->forge->dropTable("orden_trabajo_tarea_progress_dates"); } } diff --git a/ci4/app/Database/Migrations/2025-04-24-175400_AddClickColumnOrdenTrabajoTarea.php b/ci4/app/Database/Migrations/2025-04-24-175400_AddClickColumnOrdenTrabajoTarea.php new file mode 100644 index 00000000..a80e7131 --- /dev/null +++ b/ci4/app/Database/Migrations/2025-04-24-175400_AddClickColumnOrdenTrabajoTarea.php @@ -0,0 +1,36 @@ + [ + "type" => "INT", + "unsigned" => true, + "default" => 0, + "comment" => "Click iniciales de una tarea de impresion" + ], + "click_end" => [ + "type" => "INT", + "unsigned" => true, + "default" => 0, + "comment" => "Click finales de una tarea de impresion" + ], + ]; + public function up() + { + $this->forge->addColumn('orden_trabajo_tareas', $this->COLUMNS); + } + + public function down() + { + $this->forge->dropColumn('orden_trabajo_tareas', array_keys($this->COLUMNS)); + } +} diff --git a/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php b/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php index 55bcfc5b..5bc39032 100755 --- a/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php +++ b/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php @@ -3,6 +3,7 @@ namespace App\Entities\Produccion; use App\Entities\Pedidos\PedidoEntity; +use App\Entities\Presupuestos\PresupuestoEntity; use App\Entities\Usuarios\UserEntity; use App\Models\OrdenTrabajo\OrdenTrabajoDate; use App\Models\OrdenTrabajo\OrdenTrabajoFileModel; @@ -78,6 +79,15 @@ class OrdenTrabajoEntity extends Entity { $m = model(OrdenTrabajoTarea::class); return $m->where("orden_trabajo_id", $this->attributes["id"])->where("presupuesto_linea_id IS NOT NULL", NULL, FALSE)->findAll() ?? []; + } + /** + * Devuelve el presupuesto de la orden de trabajo + * + * @return PresupuestoEntity + */ + public function presupuesto(): ?PresupuestoEntity + { + return $this->pedido()->presupuesto(); } /** * Devuelve el pedido de la orden de trabajo diff --git a/ci4/app/Entities/Produccion/OrdenTrabajoTareaEntity.php b/ci4/app/Entities/Produccion/OrdenTrabajoTareaEntity.php index 883f76ad..b98f7640 100755 --- a/ci4/app/Entities/Produccion/OrdenTrabajoTareaEntity.php +++ b/ci4/app/Entities/Produccion/OrdenTrabajoTareaEntity.php @@ -10,10 +10,12 @@ use App\Entities\Presupuestos\PresupuestoManipuladosEntity; use App\Models\Configuracion\ImposicionModel; use App\Models\Configuracion\MaquinaModel; use App\Models\OrdenTrabajo\OrdenTrabajoModel; +use App\Models\OrdenTrabajo\OrdenTrabajoTareaProgressDate; use App\Models\Presupuestos\PresupuestoAcabadosModel; use App\Models\Presupuestos\PresupuestoLineaModel; use App\Models\Presupuestos\PresupuestoManipuladosModel; use CodeIgniter\Entity\Entity; +use CodeIgniter\I18n\Time; class OrdenTrabajoTareaEntity extends Entity { @@ -30,6 +32,8 @@ class OrdenTrabajoTareaEntity extends Entity "is_corte" => null, "tipo_corte" => null, "comment" => null, + "click_init" => null, + "click_end" => null, ]; protected $datamap = []; protected $dates = ['created_at', 'updated_at', 'deleted_at']; @@ -45,7 +49,9 @@ class OrdenTrabajoTareaEntity extends Entity "tiempo_real" => "?float", "is_corte" => "boolean", "tipo_corte" => "string", - "comment" => "?string" + "comment" => "?string", + "click_init" => "integer", + "click_end" => "integer", ]; /** @@ -53,7 +59,7 @@ class OrdenTrabajoTareaEntity extends Entity * * @return OrdenTrabajoEntity */ - public function orden_trabajo() : OrdenTrabajoEntity + public function orden_trabajo(): OrdenTrabajoEntity { $m = model(OrdenTrabajoModel::class); return $m->find($this->attributes["orden_trabajo_id"]); @@ -63,7 +69,7 @@ class OrdenTrabajoTareaEntity extends Entity * * @return self */ - public function withOrdenTrabajo() : self + public function withOrdenTrabajo(): self { $this->attributes["orden_trabajo"] = $this->orden_trabajo(); return $this; @@ -73,7 +79,7 @@ class OrdenTrabajoTareaEntity extends Entity * * @return Maquina */ - public function maquina_actual() : Maquina + public function maquina_actual(): Maquina { $m = model(MaquinaModel::class); return $m->find($this->attributes["maquina_id"]); @@ -83,7 +89,7 @@ class OrdenTrabajoTareaEntity extends Entity * * @return PresupuestoLineaEntity */ - public function presupuesto_linea() : PresupuestoLineaEntity + public function presupuesto_linea(): PresupuestoLineaEntity { $m = model(PresupuestoLineaModel::class); return $m->find($this->attributes["presupuesto_linea_id"]); @@ -93,28 +99,58 @@ class OrdenTrabajoTareaEntity extends Entity * * @return Maquina */ - public function maquina_presupuesto_linea() : Maquina + public function maquina_presupuesto_linea(): Maquina { return $this->presupuesto_linea()->maquina(); } - /** + /** * Devuelve el presupuesto acabado origen de esta tarea * * @return PresupuestoAcabadosEntity */ - public function presupuesto_acabado() : PresupuestoAcabadosEntity + public function presupuesto_acabado(): PresupuestoAcabadosEntity { $m = model(PresupuestoAcabadosModel::class); return $m->find($this->attributes["presupuesto_linea_id"]); } - public function imposicion() : ?Imposicion + public function imposicion(): ?Imposicion { $m = model(ImposicionModel::class); $imposicion = null; - if($this->attributes["imposicion_id"]){ + if ($this->attributes["imposicion_id"]) { $imposicion = $m->find($this->attributes["imposicion_id"]); } return $imposicion; } + public function progress_dates(): array + { + $m = model(OrdenTrabajoTareaProgressDate::class); + return $m->where('ot_tarea_id', $this->attributes["id"])->findAll() ?? []; + } + public function tiempo_trabajado() + { + $dates = $this->progress_dates(); + $intervals = []; + $init = []; + $end = []; + foreach ($dates as $key => $date) { + if ($date->estado == "I") { + if ($date->action_at) { + $init = Time::createFromFormat('Y-m-d H:i:s', $date->action_at); + } + } + if ($date->estado == "S" || $date->estado == "F") { + if ($date->action_at) { + $end = Time::createFromFormat('Y-m-d H:i:s', $date->action_at); + $intervals[] = $init->difference($end)->getSeconds(); + } + } + } + return array_sum($intervals); + } + public function getClickTarea(): int + { + return $this->attributes['click_end'] - $this->attributes['click_init']; + } } diff --git a/ci4/app/Entities/Produccion/OrdenTrabajoTareaProgressDateEntity.php b/ci4/app/Entities/Produccion/OrdenTrabajoTareaProgressDateEntity.php new file mode 100755 index 00000000..9523c8c3 --- /dev/null +++ b/ci4/app/Entities/Produccion/OrdenTrabajoTareaProgressDateEntity.php @@ -0,0 +1,31 @@ + null, + "action_at" => null, + "action_user_id" => null, + "estado" => null + ]; + protected $datamap = []; + protected $dates = ['created_at', 'updated_at', 'deleted_at','action_at']; + protected $casts = [ ]; + + /** + * Orden de trabajo de la tarea + * + * @return OrdenTrabajoEntity + */ + public function orden_trabajo_tarea() : OrdenTrabajoTareaEntity + { + $m = model(OrdenTrabajoTarea::class); + return $m->find($this->attributes["ot_tarea_id"]); + } + +} diff --git a/ci4/app/Language/es/Produccion.php b/ci4/app/Language/es/Produccion.php index a9f82a26..002e918c 100755 --- a/ci4/app/Language/es/Produccion.php +++ b/ci4/app/Language/es/Produccion.php @@ -4,6 +4,7 @@ return [ "datatable" => [ "pedido_id"=> "Pedido ID", "fecha_encuadernacion"=> "Fecha encuadernación", + "fecha_impresion"=> "Fecha impresión", "cliente"=> "Cliente", "titulo"=> "Título", "ubicacion"=> "Ubicación", @@ -36,6 +37,7 @@ return [ "task" => [ "order" => "Orden", "task" => "Tarea", + "estado" => "Estado", "note" => "Nota", "maquina_presupuesto" => "Máquina presupuesto", "maquina_actual" => "Máquina actual", @@ -127,6 +129,19 @@ return [ "maquinista" => [ "maquinas" => "Máquinas", "tareas_hoy" => "Tareas para HOY", - ] + "tareas_all" => "Todas", + "play_tarea" => "Continuar", + "play_pause" => "Pausar", + "play_stop" => "Aplazar", + "play_end" => "Finalizar", + "cancel" => "Cancelar", + + ], + 'duplicate_estado_tarea_progress' => "Último estado de la tarea repetido", + 'task_already_finished' => "La tarea se ha marcado como finalizada.", + 'print_label' => "Imprimir etiqueta", + 'click_init' => "Clicks al inicio", + 'click_end' => "Clicks al final", + ]; \ No newline at end of file diff --git a/ci4/app/Models/Configuracion/MaquinaModel.php b/ci4/app/Models/Configuracion/MaquinaModel.php index 4661bdf1..ff8f3dcd 100755 --- a/ci4/app/Models/Configuracion/MaquinaModel.php +++ b/ci4/app/Models/Configuracion/MaquinaModel.php @@ -404,12 +404,29 @@ class MaquinaModel extends \App\Models\BaseModel ->select([ 'lg_maquinas.id as maquinaId', 'lg_maquinas.nombre', - 'COUNT(orden_trabajo_tareas.id) as countTareas' + 'COUNT(tarea_progress.ot_tarea_id) as countTareas' ]) - ->join('orden_trabajo_tareas','orden_trabajo_tareas.maquina_id = lg_maquinas.id','left') + ->join('orden_trabajo_tareas', 'orden_trabajo_tareas.maquina_id = lg_maquinas.id', 'left') + ->join( + "(SELECT ot_tarea_id, estado,deleted_at + FROM orden_trabajo_tarea_progress_dates + WHERE (ot_tarea_id, created_at) IN ( + SELECT ot_tarea_id, MAX(created_at) + FROM orden_trabajo_tarea_progress_dates + WHERE estado = 'P' + GROUP BY ot_tarea_id + ) + ) as tarea_progress", + 'tarea_progress.ot_tarea_id = orden_trabajo_tareas.id', + 'left' + ) + ->join('ordenes_trabajo', 'ordenes_trabajo.id = orden_trabajo_tareas.orden_trabajo_id', 'left') + ->join('pedidos', 'pedidos.id = ordenes_trabajo.pedido_id', 'left') ->where('lg_maquinas.tipo', $maquina_tipo) - ->where('lg_maquinas.deleted_at',null) - ->groupBy('lg_maquinas.id'); + ->where('lg_maquinas.deleted_at', null) + ->where('tarea_progress.deleted_at', null) + ->groupBy('lg_maquinas.id') + ->orderBy('countTareas','DESC'); return $query; } diff --git a/ci4/app/Models/OrdenTrabajo/OrdenTrabajoModel.php b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoModel.php index 440b4cad..d7a1f37a 100755 --- a/ci4/app/Models/OrdenTrabajo/OrdenTrabajoModel.php +++ b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoModel.php @@ -103,8 +103,5 @@ class OrdenTrabajoModel extends Model return $q; } - public function updateMaquinas(OrdenTrabajoEntity $ot) - { - } } diff --git a/ci4/app/Models/OrdenTrabajo/OrdenTrabajoTarea.php b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoTarea.php index 1b40b699..0fb495c6 100755 --- a/ci4/app/Models/OrdenTrabajo/OrdenTrabajoTarea.php +++ b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoTarea.php @@ -30,7 +30,9 @@ class OrdenTrabajoTarea extends Model "tiempo_real", "is_corte", "tipo_corte", - "comment" + "comment", + "click_init", + "click_end" ]; protected bool $allowEmptyInserts = false; diff --git a/ci4/app/Models/OrdenTrabajo/OrdenTrabajoTareaProgressDate.php b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoTareaProgressDate.php new file mode 100644 index 00000000..00b09b7a --- /dev/null +++ b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoTareaProgressDate.php @@ -0,0 +1,70 @@ +find($data['data']['ot_tarea_id']); + if($ot_tarea){ + $tiempo_real = $ot_tarea->tiempo_trabajado(); + $m->update($data['data']['ot_tarea_id'],['tiempo_real' => $tiempo_real]); + } + + return $data; + } + +} diff --git a/ci4/app/Services/ProductionService.php b/ci4/app/Services/ProductionService.php index e59c4c8c..296d9f23 100755 --- a/ci4/app/Services/ProductionService.php +++ b/ci4/app/Services/ProductionService.php @@ -20,6 +20,7 @@ use App\Entities\Tarifas\Acabados\TarifaAcabadoEntity; use App\Models\Configuracion\ConfigVariableModel; use App\Models\Configuracion\MaquinaModel; use App\Models\OrdenTrabajo\OrdenTrabajoFileModel; +use App\Models\OrdenTrabajo\OrdenTrabajoTareaProgressDate; use App\Models\Pedidos\PedidoModel; use App\Models\Usuarios\UserModel; use CodeIgniter\Database\BaseBuilder; @@ -55,6 +56,7 @@ class ProductionService extends BaseService protected OrdenTrabajoUser $otUser; protected OrdenTrabajoEntity $ot; protected OrdenTrabajoFileModel $otFileModel; + protected OrdenTrabajoTareaProgressDate $otTareaProgressDate; protected PedidoModel $pedidoModel; protected UserModel $userModel; protected ConfigVariableModel $configVariableModel; @@ -172,6 +174,7 @@ class ProductionService extends BaseService $this->userModel = model(UserModel::class); $this->otFileModel = model(OrdenTrabajoFileModel::class); $this->pedidoModel = model(PedidoModel::class); + $this->otTareaProgressDate = model(OrdenTrabajoTareaProgressDate::class); $this->ordenTrabajoConfig = config('OrdenTrabajo'); $this->statusColor = $this->ordenTrabajoConfig->OT_COLORS["sin_imprimir"]; $this->configVariableModel = model(ConfigVariableModel::class); @@ -926,7 +929,38 @@ class ProductionService extends BaseService } return $this->otTarea->update($tarea_id, $data); } - + public function storeOrdenTrabajoTareaProgressDate($data): bool + { + $data["action_at"] = Time::now()->format('Y-m-d H:i:s'); + $data["action_user_id"] = auth()->user()->id; + $lastDate = $this->otTareaProgressDate->where('ot_tarea_id', $data['ot_tarea_id'])->orderBy('action_at', 'DESC')->first(); + if ($lastDate) { + if ($lastDate->estado == $data['estado']) { + throw new Exception(lang('Produccion.duplicate_estado_tarea_progress')); + } + if ($lastDate->estado == 'F') { + throw new Exception(lang('Produccion.task_already_finished')); + } + } + return $this->otTareaProgressDate->insert($data); + } + public function getTareaLastState($tarea_id) + { + $lastDate = $this->otTareaProgressDate->where('ot_tarea_id', $tarea_id)->orderBy('action_at', 'DESC')->first(); + return $lastDate->estado; + } + public function deleteOrdenTrabajoTareaProgressDates($orden_trabajo_tarea_id): bool + { + $response = false; + $data = ['ot_tarea_id' => $orden_trabajo_tarea_id, 'estado' => 'P']; + $data["action_at"] = Time::now()->format('Y-m-d H:i:s'); + $data["action_user_id"] = auth()->user()->id; + $status = $this->otTareaProgressDate->where('ot_tarea_id', $orden_trabajo_tarea_id)->delete(); + if ($status) { + $response = $this->storeOrdenTrabajoTareaProgressDate($data); + } + return $response; + } public function updateOrdenTrabajoDate($data) { $result = []; @@ -1620,4 +1654,56 @@ class ProductionService extends BaseService { return $this->ot->getBarCodeFile(); } + + public function getMaquinaImpresionTareasList(int $maquina_id) + { + + $q = $this->otModel->builder()->select([ + "ordenes_trabajo.id as otId", + "orden_trabajo_tareas.id as ot_tarea_id", + "pedidos.fecha_impresion", + "orden_trabajo_tareas.nombre as tareaName", + "presupuestos.titulo as presupuesto_titulo", + "orden_trabajo_tareas.maquina_id", + "lg_papel_impresion.nombre as papel_impresion", + "presupuesto_linea.gramaje as papel_gramaje", + "tarea_progress.estado as tareaEstado" + ]) + ->join("orden_trabajo_tareas", "orden_trabajo_tareas.orden_trabajo_id = ordenes_trabajo.id", "left") + // Obtener el ultimo estado de la tarea + ->join( + '(SELECT ot_tarea_id, estado + FROM orden_trabajo_tarea_progress_dates + WHERE (ot_tarea_id, created_at) IN ( + SELECT ot_tarea_id, MAX(created_at) + FROM orden_trabajo_tarea_progress_dates + GROUP BY ot_tarea_id + ) + ) as tarea_progress', + 'tarea_progress.ot_tarea_id = orden_trabajo_tareas.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("pedidos", "pedidos.id = ordenes_trabajo.pedido_id", "right") + ->join("lg_papel_formato", "lg_papel_formato.id = presupuestos.papel_formato_id", "left") + ->join("lg_maquinas", "lg_maquinas.id = orden_trabajo_tareas.maquina_id", "left") + ->join("lg_papel_impresion", "lg_papel_impresion.id = presupuesto_linea.papel_impresion_id", "left") + ->groupStart() + ->orWhere('orden_trabajo_tareas.maquina_id', $maquina_id) + ->orWhere('presupuesto_linea.maquina_id', $maquina_id) + ->groupEnd() + ->where('pedidos.fecha_impresion IS NOT NULL', null, false) + ->where("orden_trabajo_tareas.deleted_at", null) + ->where("tarea_progress.estado", 'P') + ->orderBy("pedidos.fecha_impresion", "ASC") + ->groupBy('orden_trabajo_tareas.nombre'); + + return $q; + } + public function buttonActionDatatableTareaList($id) + { + $url = route_to("viewProduccionMaquinistaTareaView", $id); + return ""; + } } diff --git a/ci4/app/Views/themes/vuexy/components/cards/tarea_card.php b/ci4/app/Views/themes/vuexy/components/cards/tarea_card.php index 8e4096dc..735f1d6f 100644 --- a/ci4/app/Views/themes/vuexy/components/cards/tarea_card.php +++ b/ci4/app/Views/themes/vuexy/components/cards/tarea_card.php @@ -6,21 +6,38 @@
-
-
-

OT ID

-

id ?>

+
+ +
+
+

OT ID

+

id ?>

+
+
+

Clicks presupuesto

+

presupuestoLineaImpresion()->rotativa_clicks_total ?>

+
+
-
- diff --git a/ci4/app/Views/themes/vuexy/components/cards/tarea_card_actions.php b/ci4/app/Views/themes/vuexy/components/cards/tarea_card_actions.php index a8db127c..8d4fd21b 100644 --- a/ci4/app/Views/themes/vuexy/components/cards/tarea_card_actions.php +++ b/ci4/app/Views/themes/vuexy/components/cards/tarea_card_actions.php @@ -1,18 +1,56 @@
-
-
-
-

Tirada

-

-
-
-
-
- - - - +
+
+ +
+
+ +
+ +
+

Tirada

+

total_tirada ?>

+
+
+

Clicks

+

click_tarea ?>

+
+
+ +
+
+

Tiempo estimado

+

tiempo_estimado) ?>

+
+
+

Tiempo real

+

+
+
+
+
+ + +
+
+ + +
+
+
+ +
+
+
+ + + + + + +
+
\ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/components/tables/maquinista_tarea_table.php b/ci4/app/Views/themes/vuexy/components/tables/maquinista_tarea_table.php index 23221b7b..e041de33 100755 --- a/ci4/app/Views/themes/vuexy/components/tables/maquinista_tarea_table.php +++ b/ci4/app/Views/themes/vuexy/components/tables/maquinista_tarea_table.php @@ -1,13 +1,15 @@ -
+
+ + - + @@ -15,4 +17,5 @@
+
\ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/form/produccion/maquinista/viewMaquinistaMaquinaList.php b/ci4/app/Views/themes/vuexy/form/produccion/maquinista/viewMaquinistaMaquinaList.php index ed629b75..2b668275 100644 --- a/ci4/app/Views/themes/vuexy/form/produccion/maquinista/viewMaquinistaMaquinaList.php +++ b/ci4/app/Views/themes/vuexy/form/produccion/maquinista/viewMaquinistaMaquinaList.php @@ -83,7 +83,6 @@ endSection() ?> section("additionalExternalJs") ?> - diff --git a/ci4/app/Views/themes/vuexy/form/produccion/maquinista/viewMaquinistaMaquinaTarea.php b/ci4/app/Views/themes/vuexy/form/produccion/maquinista/viewMaquinistaMaquinaTarea.php index eeb0949c..4567123b 100644 --- a/ci4/app/Views/themes/vuexy/form/produccion/maquinista/viewMaquinistaMaquinaTarea.php +++ b/ci4/app/Views/themes/vuexy/form/produccion/maquinista/viewMaquinistaMaquinaTarea.php @@ -5,31 +5,80 @@ extend('themes/vuexy/main/defaultlayout') ?> section('content'); ?> -
-
-
-
- +
+ + endSection() ?> section('css') ?> + + + + endSection() ?> section("additionalExternalJs") ?> - + + endSection() ?> \ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/form/produccion/maquinista/viewMaquinistaMaquinaTareas.php b/ci4/app/Views/themes/vuexy/form/produccion/maquinista/viewMaquinistaMaquinaTareas.php index b391edff..b326effd 100644 --- a/ci4/app/Views/themes/vuexy/form/produccion/maquinista/viewMaquinistaMaquinaTareas.php +++ b/ci4/app/Views/themes/vuexy/form/produccion/maquinista/viewMaquinistaMaquinaTareas.php @@ -5,19 +5,27 @@ extend('themes/vuexy/main/defaultlayout') ?> section('content'); ?> -
+ +
-
+
-
- -
- +
+
+ +
+ format('d/m/Y') ?> +
- +
@@ -31,7 +39,7 @@ endSection() ?> section("additionalExternalJs") ?> - + diff --git a/ci4/app/Views/themes/vuexy/main/menus/maquinista_menu.php b/ci4/app/Views/themes/vuexy/main/menus/maquinista_menu.php index d727a5fe..d7c3d81d 100755 --- a/ci4/app/Views/themes/vuexy/main/menus/maquinista_menu.php +++ b/ci4/app/Views/themes/vuexy/main/menus/maquinista_menu.php @@ -7,13 +7,13 @@ if (auth()->user()->inGroup('maquina')) { ?>