-
+
+
diff --git a/ci4/app/Config/OrdenTrabajo.php b/ci4/app/Config/OrdenTrabajo.php new file mode 100644 index 00000000..2c9a9474 --- /dev/null +++ b/ci4/app/Config/OrdenTrabajo.php @@ -0,0 +1,68 @@ + "interior_bn_user_id", + "interior_color_at" => "interior_color_user_id", + "cubierta_at" => "cubierta_user_id", + //ACABADO + "plastificado_at" => "plastificado_user_id", + "encuadernacion_at" => "encuadernacion_user_id", + "corte_at" => "corte_user_id", + "preparacion_interiores_at" => "preparacion_interior_user_id", + "entrada_manipulado_at" => "entrada_manipulado_user_id", + "cosido_at" => "cosido_user_id", + "grapado_at" => "grapado_user_id", + "solapa_at" => "solapa_user_id", + "retractilado_at" => "retractilado_user_id", + "retractilado5_at" => "retractilado5_user_id", + "prototipo_at" => "prototipo_user_id", + "marcapaginas_at" => "marcapaginas_user_id", + //FERRO + "pendiente_ferro_at" => "pendiente_ferro_user_id", + "ferro_en_cliente_at" => "ferro_en_cliente_user_id", + "ferro_ok_at" => "ferro_ok_user_id", + //ENVIO + "embalaje_at" => "embalaje_user_id", + "envio_at" => "envio_user_id", + //PREIMPRESION + "pre_formato_at" => "pre_formato_user_id", + "pre_lomo_at" => "pre_lomo_user_id", + "pre_solapa_at" => "pre_solapa_user_id", + "pre_codbarras_at" => "pre_codbarras_user_id", + "pre_imposicion_at" => "pre_imposicion_user_id", + + ]; + public array $DATE_USER_MAPPING_PEDIDO = [ + "inaplazable" => "inaplazable_change_user_id", + "fecha_entrega_real" => "fecha_entrega_real_change_user_id", + "fecha_impresion" => "fecha_impresion_change_user_id", + "fecha_encuadernado" => "fecha_encuadernado_change_user_id", + "fecha_entrega_externo" => "fecha_entrega_externo_change_user_id", + ]; + public array $OT_COLORS = [ + "sin_imprimir" => "#FF6363", + "impreso_int" => "#AFDDFF", + "impreso_cub" => "#3A59D1", + "plastificado" => "#FFD63A", + "preparado" => "#FF0B55", + "solapa" => "#4F1C51", + "cosido" => "#FF0B55", + "grapado" => "#FEBA17", + "encuadernado" => "#FEBA17", + "corte" => "#67AE6E" + ]; + + public function __construct() + { + parent::__construct(); + } + +} diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index 8b6335a4..fb3beb7d 100644 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -153,6 +153,8 @@ $routes->group('imposiciones', ['namespace' => 'App\Controllers\Configuracion'], $routes->post('datatable', 'Imposiciones::datatable', ['as' => 'dataTableOfImposiciones']); $routes->post('allmenuitems', 'Imposiciones::allItemsSelect', ['as' => 'select2ItemsOfImposiciones']); $routes->post('menuitems', 'Imposiciones::menuItems', ['as' => 'menuItemsOfImposiciones']); + $routes->get('select', 'Imposiciones::selectImposicion', ['as' => 'selectImposicion']); + }); $routes->resource('imposiciones', ['namespace' => 'App\Controllers\Configuracion', 'controller' => 'Imposiciones', 'except' => 'show,new,create,update']); @@ -645,6 +647,8 @@ $routes->group('chat', ['namespace' => 'App\Controllers\Chat'], function ($route $routes->get('direct/client/users/select/presupuesto/(:num)', 'ChatController::get_presupuesto_client_users/$1/$2', ['as' => 'getPresupuestoClientUsers']); $routes->get('direct/client/users/select/pedido/(:num)', 'ChatController::get_pedido_client_users/$1/$2', ['as' => 'getPedidoClientUsers']); $routes->get('direct/client/users/select/factura/(:num)', 'ChatController::get_factura_client_users/$1/$2', ['as' => 'getFacturaClientUsers']); + $routes->get('direct/client/users/select/ot/(:num)', 'ChatController::get_orden_trabajo_client_users/$1/$2', ['as' => 'getOrdenTrabajoClientUsers']); + $routes->get('direct/users/(:num)', 'ChatController::get_chat_direct_users', ['as' => 'getChatDirectUsers']); $routes->post('direct/users/(:num)', 'ChatController::store_chat_direct_users/$1', ['as' => 'storeChatDirectUsers']); @@ -661,7 +665,10 @@ $routes->group('chat', ['namespace' => 'App\Controllers\Chat'], function ($route $routes->get('department/presupuesto/(:num)/(:num)', 'ChatController::get_chat_presupuesto/$1/$2', ['as' => 'getChatPresupuesto']); $routes->get('department/pedido/(:num)/(:num)', 'ChatController::get_chat_pedido/$1/$2', ['as' => 'getChatPedido']); $routes->get('department/factura/(:num)/(:num)', 'ChatController::get_chat_factura/$1/$2', ['as' => 'getChatFactura']); + $routes->get('department/ot/(:num)/(:num)', 'ChatController::get_chat_orden_trabajo/$1/$2', ['as' => 'getChatOrdenTrabajo']); $routes->get('department/users/presupuesto/(:num)/(:num)', 'ChatController::get_chat_department_presupuesto_users/$1/$2', ['as' => 'getPresupuestoChatDepartmentUsers']); + $routes->get('department/users/ot/(:num)/(:num)', 'ChatController::get_chat_department_orden_trabajo_users/$1/$2', ['as' => 'getOrdenTrabajoChatDepartmentUsers']); + $routes->get('department/datatable', 'ChatController::chat_department_datatable', ['as' => 'chatDepartmentDatatable']); $routes->get('department/edit/(:num)', 'ChatController::chat_department_edit/$1', ['as' => 'chatDepartmentEditView']); $routes->get('department/users/datatable/(:num)', 'ChatController::chat_department_user_datatable/$1', ['as' => 'chatDepartmentUsersDatatable']); @@ -733,10 +740,13 @@ $routes->group('produccion', ['namespace' => 'App\Controllers\Produccion'], func *========================**/ $routes->post("update/tarea", 'Ordentrabajo::update_orden_trabajo_tarea'); $routes->post("update/date", 'Ordentrabajo::update_orden_trabajo_date'); + $routes->post("update/pedido/date", 'Ordentrabajo::update_orden_trabajo_pedido_date'); + $routes->post("update/pedido", 'Ordentrabajo::update_orden_trabajo_pedido'); $routes->post("update/user", 'Ordentrabajo::update_orden_trabajo_user'); $routes->post("update", 'Ordentrabajo::update_orden_trabajo'); $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'); /**====================== * FILES diff --git a/ci4/app/Controllers/Chat/ChatController.php b/ci4/app/Controllers/Chat/ChatController.php index ba44d28e..71ee0d2d 100644 --- a/ci4/app/Controllers/Chat/ChatController.php +++ b/ci4/app/Controllers/Chat/ChatController.php @@ -11,6 +11,7 @@ use App\Models\ChatNotification; use App\Models\ChatUser; use App\Models\Clientes\ClienteModel; use App\Models\Facturas\FacturaModel; +use App\Models\OrdenTrabajo\OrdenTrabajoModel; use App\Models\Pedidos\PedidoModel; use App\Models\Presupuestos\PresupuestoModel; use App\Models\Usuarios\UserModel; @@ -132,6 +133,25 @@ class ChatController extends BaseController $data["chat"] = $chat; return $this->response->setJSON($data); } + public function get_chat_orden_trabajo(int $chat_department_id, int $orden_trabajo_id) + { + + $data = [ + "department" => $this->chatDeparmentModel->find($chat_department_id), + "chat" => null, + "messages" => null, + "count" => 0, + ]; + $chat = $this->chatModel->getChatOrdenTrabajo($chat_department_id, $orden_trabajo_id); + if ($chat) { + $data["messages"] = $this->chatMessageModel->get_chat_messages($chat->id); + $this->chatMessageModel->set_chat_department_messages_as_read($chat->id); + $this->chatModel->setAsViewedChatUserNotifications($chat->id, auth()->user()->id); + $data["count"] = count($data["messages"]); + } + $data["chat"] = $chat; + return $this->response->setJSON($data); + } public function get_chat_direct_view($chat_id) { $chat = $this->chatModel->find($chat_id); @@ -295,6 +315,11 @@ class ChatController extends BaseController $data = $this->chatDeparmentModel->find($chat_department_id)->withUsers($factura_id, 'factura'); return $this->response->setJSON($data); } + public function get_chat_department_orden_trabajo_users(int $chat_department_id, $orden_trabajo_id) + { + $data = $this->chatDeparmentModel->find($chat_department_id)->withUsers($orden_trabajo_id, 'ot'); + return $this->response->setJSON($data); + } public function get_chat_users_internal() { $query = $this->userModel->builder()->select( @@ -357,6 +382,15 @@ class ChatController extends BaseController $clienteContactos = $cm->querySelectClienteContacto($f->cliente_id,$this->request->getGet('q')); return $this->response->setJSON($clienteContactos); } + public function get_orden_trabajo_client_users(int $orden_trabajo_id) + { + $otm = model(OrdenTrabajoModel::class); + $ot = $otm->find($orden_trabajo_id); + $cm = model(ClienteModel::class); + $cliente = $ot->pedido()->cliente(); + $clienteContactos = $cm->querySelectClienteContacto($cliente->id,$this->request->getGet('q')); + return $this->response->setJSON($clienteContactos); + } public function store_hebra(string $model) { $auth_user = auth()->user(); diff --git a/ci4/app/Controllers/Configuracion/Imposiciones.php b/ci4/app/Controllers/Configuracion/Imposiciones.php index 9fabc2c1..58986982 100755 --- a/ci4/app/Controllers/Configuracion/Imposiciones.php +++ b/ci4/app/Controllers/Configuracion/Imposiciones.php @@ -1,4 +1,6 @@ -request->getPost()) : @@ -130,7 +132,7 @@ class Imposiciones extends \App\Controllers\BaseResourceController return $this->redirect2listView('sweet-error', $message); endif; - + if ($this->request->getPost()) : @@ -279,6 +281,9 @@ class Imposiciones extends \App\Controllers\BaseResourceController ]; return $orientacionOptions; } - - + public function selectImposicion() + { + $data = $this->model->querySelect($this->request->getGet('q')); + return $this->response->setJSON($data); + } } diff --git a/ci4/app/Controllers/Presupuestos/Presupuestoadmin.php b/ci4/app/Controllers/Presupuestos/Presupuestoadmin.php index 75ac450d..5039d115 100644 --- a/ci4/app/Controllers/Presupuestos/Presupuestoadmin.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestoadmin.php @@ -1595,7 +1595,7 @@ class Presupuestoadmin extends \App\Controllers\BaseResourceController $presupuestoServiciosExtraModel = model('App\Models\Presupuestos\PresupuestoServiciosExtraModel'); foreach ($presupuestoServiciosExtraModel->where('presupuesto_id', $presupuesto->id)->findAll() as $servicioExtra) { $servicioExtra->presupuesto_id = $new_id; - $presupuestoServiciosExtraModel->insert($preimpresion); + $presupuestoServiciosExtraModel->insert($servicioExtra); } $presupuestoDireccionesModel = model('App\Models\Presupuestos\PresupuestoDireccionesModel'); diff --git a/ci4/app/Controllers/Produccion/Ordentrabajo.php b/ci4/app/Controllers/Produccion/Ordentrabajo.php index 103befb3..41bd2391 100755 --- a/ci4/app/Controllers/Produccion/Ordentrabajo.php +++ b/ci4/app/Controllers/Produccion/Ordentrabajo.php @@ -118,7 +118,26 @@ class Ordentrabajo extends BaseController return $this->response->setJSON(["errors" => $this->validation->getErrors()])->setStatusCode(400); } } - + public function update_orden_trabajo_pedido_date() + { + try { + $bodyData = $this->request->getPost(); + $r = $this->produccionService->init($bodyData["orden_trabajo_id"])->updateOrdenTrabajoPedidoDate($bodyData); + return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "status" => $r["status"], "user" => $r["user"], "data" => $bodyData]); + } catch (\Throwable $th) { + return $this->response->setJSON(["errors" => $th->getMessage(), "status" => false])->setStatusCode(500); + } + } + public function update_orden_trabajo_pedido() + { + try { + $bodyData = $this->request->getPost(); + $r = $this->produccionService->init($bodyData["orden_trabajo_id"])->updateOrdenTrabajoPedido($bodyData); + return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "status" => $r, "data" => $bodyData]); + } catch (\Throwable $th) { + return $this->response->setJSON(["errors" => $th->getMessage(), "status" => false])->setStatusCode(500); + } + } public function edit($orden_trabajo_id) { // Breadcrumbs @@ -128,9 +147,14 @@ class Ordentrabajo extends BaseController ]; $this->viewData["modelId"] = $orden_trabajo_id; $this->produccionService->init($orden_trabajo_id); + $this->produccionService->reInsertOrdenTrabajoDates(); + $this->produccionService->reInsertOrdenTrabajoUsers(); $this->viewData["presupuesto"] = $this->produccionService->getPresupuesto(); $this->viewData["cliente"] = $this->produccionService->getCliente(); $this->viewData["ot"] = $this->produccionService->getOrdenTrabajo(); + $this->viewData["user_dates"] = $this->produccionService->userDates(); + $this->viewData["pedido_user_dates"] = $this->produccionService->pedidoUserDates(); + return view(static::$viewPath . $this->editRoute, $this->viewData); } @@ -141,7 +165,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) => site_url($logo->get_logo_path($q->presupuesto_linea_tipo))) + ->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", $q->fecha_encuadernado_at)->format("d/m/Y") : "" @@ -156,7 +180,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) => site_url($logo->get_logo_path($q->presupuesto_linea_tipo))) + ->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", $q->fecha_encuadernado_at)->format("d/m/Y") : "" @@ -171,7 +195,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) => site_url($logo->get_logo_path($q->presupuesto_linea_tipo))) + ->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", $q->fecha_encuadernado_at)->format("d/m/Y") : "" @@ -186,7 +210,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) => site_url($logo->get_logo_path($q->presupuesto_linea_tipo))) + ->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", $q->fecha_encuadernado_at)->format("d/m/Y") : "" @@ -232,6 +256,7 @@ class Ordentrabajo extends BaseController ->edit("tiempo_estimado", fn($q) => float_seconds_to_hhmm_string($q->tiempo_estimado)) ->edit("tiempo_real", fn($q) => float_seconds_to_hhmm_string($q->tiempo_real)) ->edit("maquina_tarea", fn($q) => ["id" => $q->id, "maquina_id" => $q->maquina_tarea, "maquina_name" => $q->maquina_nombre]) + ->add("imposicion", fn($q) => ["id" => $q->id, "imposicion_id" => $q->imposicion_id, "name" => $q->imposicion_name, "is_presupuesto_linea" => $q->presupuesto_linea_id ? true : false]) ->toJson(true); } public function get_pdf($orden_trabajo_id) @@ -241,7 +266,6 @@ class Ordentrabajo extends BaseController public function upload_orden_trabajo_portada() { try { - //code... $file = $this->request->getFile("portada_file"); $bodyData = $this->request->getPost(); $id = $bodyData["orden_trabajo_id"]; @@ -249,6 +273,12 @@ class Ordentrabajo extends BaseController $fullpath = null; if ($file->isValid() && !$file->hasMoved()) { $fullpath = $file->store('ordenes_trabajo_portadas'); + $otEntity = $this->otModel->find($id); + if ($otEntity->portada_path) { + if (file_exists($otEntity->full_path)) { + unlink($otEntity->full_path); + } + } $r = $this->otModel->update($id, ["portada_path" => $fullpath]); } return $this->response->setJSON(["message" => "Portada subida", "data" => $r]); @@ -256,7 +286,7 @@ class Ordentrabajo extends BaseController if ($fullpath) { delete_files($fullpath); } - return $this->response->setJSON(["message" => "Portada error", "error" => $th->getMessage()])->setStatusCode($th->getCode()); + return $this->response->setJSON(["message" => "Portada error", "error" => $th->getMessage()])->setStatusCode(500); } } public function delete_orden_trabajo_portada($orden_trabajo_id) @@ -280,7 +310,7 @@ class Ordentrabajo extends BaseController try { $ot = $this->otModel->find($orden_trabajo_id); if ($ot->portada_path) { - $filePath = WRITEPATH . 'uploads/' . $ot->portada_path; + $filePath = $ot->full_path; if (file_exists($filePath)) { $mimeType = mime_content_type($filePath); @@ -296,31 +326,30 @@ class Ordentrabajo extends BaseController } } catch (\Throwable $th) { return $this->response->setJSON(["message" => "Portada error", "error" => $th->getMessage()])->setStatusCode(500); - } } public function planning_rotativa_datatable() { - $q = $this->produccionService->planningRotativaQueryDatatable(); - return DataTable::of($q) + $query = $this->produccionService->planningRotativaQueryDatatable(); + return DataTable::of($query) ->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) => ["otId" => $q->otId, "tipo_corte" => $this->produccionService->ordenTrabajoTareaCorte($q->otId)]) - ->add("action", fn($q) => $q) + ->add("action", fn($q) => ["data" => $q]) ->toJson(true); } public function planning_plana_datatable() { - $q = $this->produccionService->planningPlanaQueryDatatable(); + $query = $this->produccionService->planningPlanaQueryDatatable(); $padreId = $this->request->getGet('padre_id'); if ($padreId) { - $q->where('lg_maquinas.padre_id', $padreId); + $query->where('lg_maquinas.padre_id', $padreId); } - return DataTable::of($q) + return DataTable::of($query) ->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) => $q) + ->add("action", fn($q) => ["data" => $q ]) ->toJson(true); } public function select_maquina_planning_rot() @@ -404,4 +433,9 @@ class Ordentrabajo extends BaseController ); } } + public function get_orden_trabajo_color_status(int $orden_trabajo_id) + { + $color = $this->produccionService->init($orden_trabajo_id)->getOtColorStatus(); + return $this->response->setJSON(["color" => $color]); + } } diff --git a/ci4/app/Database/Migrations/2025-04-11-180001_AddUserIdFechaEntregaPedido copy.php b/ci4/app/Database/Migrations/2025-04-11-180001_AddUserIdFechaEntregaPedido.php similarity index 100% rename from ci4/app/Database/Migrations/2025-04-11-180001_AddUserIdFechaEntregaPedido copy.php rename to ci4/app/Database/Migrations/2025-04-11-180001_AddUserIdFechaEntregaPedido.php diff --git a/ci4/app/Database/Migrations/2025-04-14-204500_UpdateDateFieldsOrdenTrabajoDates.php b/ci4/app/Database/Migrations/2025-04-14-204500_UpdateDateFieldsOrdenTrabajoDates.php new file mode 100644 index 00000000..b6d5e06f --- /dev/null +++ b/ci4/app/Database/Migrations/2025-04-14-204500_UpdateDateFieldsOrdenTrabajoDates.php @@ -0,0 +1,101 @@ + [ + "type" => "DATE", + "null" => true, + ], + "solapa_at" => [ + "type" => "DATE", + "null" => true, + ], + "grapado_at" => [ + "type" => "DATE", + "null" => true, + ], + "retractilado_at" => [ + "type" => "DATE", + "null" => true, + ], + "retractilado5_at" => [ + "type" => "DATE", + "null" => true, + ], + "prototipo_at" => [ + "type" => "DATE", + "null" => true, + ], + "marcapaginas_at" => [ + "type" => "DATE", + "null" => true, + ], + ]; + protected array $USERS = [ + "cosido_user_id" => [ + "type" => "INT", + "unsigned" => true, + "constraint" => 10, + "null" => true, + ], + "solapa_user_id" => [ + "type" => "INT", + "unsigned" => true, + "constraint" => 10, + "null" => true, + ], + "grapado_user_id" => [ + "type" => "INT", + "unsigned" => true, + "constraint" => 10, + "null" => true, + ], + "retractilado_user_id" => [ + "type" => "INT", + "unsigned" => true, + "constraint" => 10, + "null" => true, + ], + "retractilado5_user_id" => [ + "type" => "INT", + "unsigned" => true, + "constraint" => 10, + "null" => true, + ], + "prototipo_user_id" => [ + "type" => "INT", + "unsigned" => true, + "constraint" => 10, + "null" => true, + ], + "marcapaginas_user_id" => [ + "type" => "INT", + "unsigned" => true, + "constraint" => 10, + "null" => true, + ], + ]; + + public function up() + { + $this->forge->addColumn("orden_trabajo_dates", $this->DATES); + $this->forge->addColumn("orden_trabajo_users", $this->USERS); + foreach ($this->USERS as $key => $value) { + $this->forge->addForeignKey([$key],"users",["id"]); + } + } + + public function down() + { + $this->forge->dropColumn("orden_trabajo_dates", array_keys($this->DATES)); + $this->forge->dropColumn("orden_trabajo_users", array_keys($this->USERS)); + + + } +} diff --git a/ci4/app/Database/Migrations/2025-04-14-235200_AddFkOrdenTrabajoChatDepartment.php b/ci4/app/Database/Migrations/2025-04-14-235200_AddFkOrdenTrabajoChatDepartment.php new file mode 100644 index 00000000..3c86d242 --- /dev/null +++ b/ci4/app/Database/Migrations/2025-04-14-235200_AddFkOrdenTrabajoChatDepartment.php @@ -0,0 +1,40 @@ + [ + "type" => "INT", + "constraint" => 10, + "unsigned" => true, + "null" => true + ], + ]; + + + public function up() + { + $this->forge->addColumn("chats", $this->COLUMNS); + $this->forge->addColumn("chat_department_users", $this->COLUMNS); + $this->forge->addForeignKey('orden_trabajo_id', 'ordenes_trabajo', 'id'); + $this->forge->processIndexes('chats'); + $this->forge->addForeignKey('orden_trabajo_id', 'ordenes_trabajo', 'id'); + $this->forge->processIndexes('chat_department_users'); + + + + + } + + public function down() + { + $this->forge->dropColumn("chats", ["orden_trabajo_id"]); + $this->forge->dropColumn("chat_department_users", ["orden_trabajo_id"]); + + } +} diff --git a/ci4/app/Entities/Chat/ChatDepartmentEntity.php b/ci4/app/Entities/Chat/ChatDepartmentEntity.php index 5017c310..ba3a1049 100644 --- a/ci4/app/Entities/Chat/ChatDepartmentEntity.php +++ b/ci4/app/Entities/Chat/ChatDepartmentEntity.php @@ -36,7 +36,9 @@ class ChatDepartmentEntity extends Entity $chatDepartmentUsers = $m->where('chat_department_id',$this->attributes['id']) ->where('pedido_id',null) ->where('factura_id',null) - ->where('presupuesto_id',null)->findAll(); + ->where('presupuesto_id',null) + ->where('orden_trabajo_id',null) + ->findAll(); return $chatDepartmentUsers; } /** @@ -62,6 +64,9 @@ class ChatDepartmentEntity extends Entity case 'factura': $m->where('pedido_id',$modelFkId); break; + case 'ot': + $m->where('orden_trabajo_id',$modelFkId); + break; default: break; } diff --git a/ci4/app/Entities/Chat/ChatDepartmentUserEntity.php b/ci4/app/Entities/Chat/ChatDepartmentUserEntity.php index c261f568..047070f4 100644 --- a/ci4/app/Entities/Chat/ChatDepartmentUserEntity.php +++ b/ci4/app/Entities/Chat/ChatDepartmentUserEntity.php @@ -20,6 +20,7 @@ class ChatDepartmentUserEntity extends Entity "pedido_id" => null, "factura_id" => null, "presupuesto_id" => null, + "orden_trabajo_id" => null, ]; @@ -29,6 +30,7 @@ class ChatDepartmentUserEntity extends Entity "pedido_id" => "?integer", "factura_id" => "?integer", "presupuesto_id" => "?integer", + "orden_trabajo_id" => "?integer", ]; public function user() : ?UserEntity diff --git a/ci4/app/Entities/Chat/ChatEntity.php b/ci4/app/Entities/Chat/ChatEntity.php index 1669f3cd..2bae32de 100644 --- a/ci4/app/Entities/Chat/ChatEntity.php +++ b/ci4/app/Entities/Chat/ChatEntity.php @@ -5,11 +5,13 @@ namespace App\Entities\Chat; use App\Entities\Facturas\FacturaEntity; use App\Entities\Pedidos\PedidoEntity; use App\Entities\Presupuestos\PresupuestoEntity; +use App\Entities\Produccion\OrdenTrabajoEntity; use App\Entities\Usuarios\UserEntity; use App\Models\Chat\ChatDeparmentModel; use App\Models\Chat\ChatMessageModel; use App\Models\ChatUser; use App\Models\Facturas\FacturaModel; +use App\Models\OrdenTrabajo\OrdenTrabajoModel; use App\Models\Pedidos\PedidoModel; use App\Models\Presupuestos\PresupuestoModel; use App\Models\Usuarios\UserModel; @@ -25,6 +27,7 @@ class ChatEntity extends Entity "pedido_id" => null, "presupuesto_id" => null, "factura_id" => null, + "orden_trabajo_id" => null, "title" => null ]; @@ -34,6 +37,7 @@ class ChatEntity extends Entity "pedido_id" => "?integer", "presupuesto_id" => "?integer", "factura_id" => "?integer", + "orden_trabajo_id" => "?integer", "title" => "string" ]; @@ -71,6 +75,11 @@ class ChatEntity extends Entity $m = model(FacturaEntity::class); return $m->find($this->attributes['factura_id']); } + public function orden_trabajo(): ?OrdenTrabajoEntity + { + $m = model(OrdenTrabajoModel::class); + return $m->find($this->attributes['orden_trabajo_id']); + } public function messages(): ?array { $m = model(ChatMessageModel::class); @@ -100,12 +109,14 @@ class ChatEntity extends Entity $models = [ "presupuesto_id" => model(PresupuestoModel::class), "pedido_id" => model(PedidoModel::class), - "factura_id" => model(FacturaModel::class) + "factura_id" => model(FacturaModel::class), + "orden_trabajo_id" => model(OrdenTrabajoModel::class), ]; $fks = [ "presupuesto_id" => $this->attributes["presupuesto_id"], "pedido_id" => $this->attributes["pedido_id"], "factura_id" => $this->attributes["factura_id"], + "orden_trabajo_id" => $this->attributes["orden_trabajo"], ]; foreach ($fks as $key => $fk) { if ($fk) { @@ -123,6 +134,7 @@ class ChatEntity extends Entity "presupuesto" => $this->attributes["presupuesto_id"], "pedido" => $this->attributes["pedido_id"], "factura" => $this->attributes["factura_id"], + "ot" => $this->attributes["orden_trabajo_id"], ]; foreach ($fks as $key => $fk) { if ($fk) { diff --git a/ci4/app/Entities/Configuracion/Imposicion.php b/ci4/app/Entities/Configuracion/Imposicion.php index 0acdc41c..fcb0ddaa 100755 --- a/ci4/app/Entities/Configuracion/Imposicion.php +++ b/ci4/app/Entities/Configuracion/Imposicion.php @@ -19,4 +19,13 @@ class Imposicion extends \CodeIgniter\Entity\Entity "alto" => "int", "unidades" => "?int", ]; + + public function getFullName() : string + { + $ancho_x_alto = $this->attributes["ancho"] ."x". $this->attributes["alto"]; + $unidades = $this->attributes["unidades"] ?? ""; + $orientacion = $this->attributes["orientacion"] ?? ""; + return implode("_",[$ancho_x_alto,$unidades,$orientacion]); + + } } diff --git a/ci4/app/Entities/Configuracion/PapelImpresion.php b/ci4/app/Entities/Configuracion/PapelImpresion.php index d977764c..617a3ec7 100755 --- a/ci4/app/Entities/Configuracion/PapelImpresion.php +++ b/ci4/app/Entities/Configuracion/PapelImpresion.php @@ -2,9 +2,11 @@ namespace App\Entities\Configuracion; use App\Models\Configuracion\MaquinasPapelesImpresionModel; +use App\Models\Configuracion\PapelGenericoModel; use App\Models\Configuracion\PapelImpresionMargenModel; use App\Models\Configuracion\PapelImpresionTipologiaModel; use CodeIgniter\Entity; +use CodeIgniter\Model; class PapelImpresion extends \CodeIgniter\Entity\Entity { @@ -68,4 +70,15 @@ class PapelImpresion extends \CodeIgniter\Entity\Entity $m = model(PapelImpresionMargenModel::class); return $m->asArray()->where('papel_impresion_id',$this->attributes["id"])->findAll(); } + public function papel_generico() : ?PapelGenerico + { + $m = model(PapelGenericoModel::class); + return $m->find($this->attributes["papel_generico_id"]); + } + public function getPapelCodeOt() : ?string + { + $code_ot = $this->papel_generico()->code_ot; + $gramaje = $this->attributes["gramaje"]; + return implode(" ",[$code_ot,$gramaje]); + } } diff --git a/ci4/app/Entities/Pedidos/PedidoEntity.php b/ci4/app/Entities/Pedidos/PedidoEntity.php index 61c40e25..18c55903 100644 --- a/ci4/app/Entities/Pedidos/PedidoEntity.php +++ b/ci4/app/Entities/Pedidos/PedidoEntity.php @@ -6,9 +6,11 @@ use App\Entities\Produccion\OrdenTrabajoEntity; use App\Models\OrdenTrabajo\OrdenTrabajoModel; use App\Entities\Clientes\ClienteEntity; use App\Entities\Configuracion\UbicacionesEntity; +use App\Entities\Usuarios\UserEntity; use App\Models\Clientes\ClienteModel; use App\Models\Pedidos\PedidoLineaModel; use App\Models\Presupuestos\PresupuestoModel; +use App\Models\Usuarios\UserModel; use CodeIgniter\Entity; class PedidoEntity extends \CodeIgniter\Entity\Entity @@ -40,6 +42,12 @@ class PedidoEntity extends \CodeIgniter\Entity\Entity protected $casts = [ "total_precio" => "float", "total_tirada" => "float", + "inaplazable" => "bool", + "fecha_entrega_real_change_user_id" => "?integer", + "fecha_impresion_change_user_id" => "?integer", + "fecha_encuadernado_change_user_id" => "?integer", + "fecha_entrega_change_externo_user_id" => "?integer", + "inaplazable_change_user_id" => "?integer", ]; /** * Devuelve la entidad `PedidoEntity` con sus relaciones @@ -91,4 +99,16 @@ class PedidoEntity extends \CodeIgniter\Entity\Entity $pre = $pm->find($pedido_linea->presupuesto_id); return $m->find($pre->cliente_id); } + public function userBy(string $key): ?UserEntity + { + $user = null; + if (isset($this->attributes[$key])) { + + if ($this->attributes[$key]) { + $m = model(UserModel::class); + $user = $m->find($this->attributes[$key]); + } + } + return $user; + } } diff --git a/ci4/app/Entities/Presupuestos/PresupuestoLineaEntity.php b/ci4/app/Entities/Presupuestos/PresupuestoLineaEntity.php index 247a12ec..3fa722b7 100755 --- a/ci4/app/Entities/Presupuestos/PresupuestoLineaEntity.php +++ b/ci4/app/Entities/Presupuestos/PresupuestoLineaEntity.php @@ -225,4 +225,8 @@ class PresupuestoLineaEntity extends \CodeIgniter\Entity\Entity { return in_array($this->attributes['tipo'],['lp_rot_color','lp_rot_bn']); } + public function isColor():bool { + return in_array($this->attributes['tipo'],['lp_color','lp_colorhq','lp_rot_color']); + + } } diff --git a/ci4/app/Entities/Produccion/OrdenTrabajoDateEntity.php b/ci4/app/Entities/Produccion/OrdenTrabajoDateEntity.php index f6b5e79c..e106c57c 100644 --- a/ci4/app/Entities/Produccion/OrdenTrabajoDateEntity.php +++ b/ci4/app/Entities/Produccion/OrdenTrabajoDateEntity.php @@ -2,34 +2,45 @@ namespace App\Entities\Produccion; +use App\Models\Usuarios\UserModel; use CodeIgniter\Entity\Entity; +use Exception; class OrdenTrabajoDateEntity extends Entity { protected $attributes = [ "orden_trabajo_id" => null, "fecha_entrada_at" => null, - "fecha_entrega_change_at" => null, - "fecha_entrega_real_at" => null, - "fecha_entrega_real_warning" => null, - "fecha_impresion_at" => null, - "fecha_encuadernado_at" => null, - "fecha_externo_at" => null, - "fecha_entrega_warning" => null, - "fecha_entrega_warning_revised" => null, - "pendiente_ferro_at" => null, - "ferro_en_cliente_at" => null, - "ferro_ok_at" => null, + //IMPRESION "interior_bn_at" => null, "interior_color_at" => null, - "preparacion_interiores_at" => null, "cubierta_at" => null, + //ACABADO "plastificado_at" => null, "encuadernacion_at" => null, "corte_at" => null, + "preparacion_interiores_at" => null, + "entrada_manipulado_at" => null, + "cosido_at" => null, + "solapa_at" => null, + "grapado_at" => null, + "retractilado_at"=> null, + "retractilado5_at"=> null, + "prototipo_at"=> null, + "marcapaginas_at"=> null, + //FERRO + "pendiente_ferro_at" => null, + "ferro_en_cliente_at" => null, + "ferro_ok_at" => null, + //ENVIO "embalaje_at" => null, "envio_at" => null, - "entrada_manipulado_at" => null + //PREIMPRESION + "pre_formato_at" => null, + "pre_lomo_at" => null, + "pre_solapa_at" => null, + "pre_codbarras_at" => null, + "pre_imposicion_at" => null, ]; protected $datamap = []; @@ -37,51 +48,52 @@ class OrdenTrabajoDateEntity extends Entity 'created_at', 'updated_at', 'deleted_at', - // 'fecha_entrega_at', - // 'fecha_entrega_change_at', - // 'fecha_entrega_real_at', - // 'fecha_entrega_real_warning', - // 'fecha_impresion_at', - // 'fecha_encuadernado_at', - // 'fecha_externo_at', - // 'fecha_entrega_warning', - // 'fecha_entrega_warning_revised', - // 'pendiente_ferro_at', - // 'ferro_en_cliente_at', - // 'ferro_ok_at', - // 'interior_bn_at', - // 'interior_color_at', - // 'preparacion_interiores_at', - // 'cubierta_at', - // 'plastificado_at', - // 'encuadernacion_at', - // 'corte_at', - // 'embalaje_at', - // 'envio_at', - // 'entrada_manipulado_at' - ]; - protected $casts = [ - // "fecha_entrada_at" => "?datetime", - // "fecha_entrega_change_at" => "?datetime", - // "fecha_entrega_real_at" => "?datetime", - // "fecha_entrega_real_warning" => "?bool", - // "fecha_impresion_at" => "?datetime", - // "fecha_encuadernado_at" => "?datetime", - // "fecha_externo_at" => "?datetime", - // "fecha_entrega_warning" => "?bool", - // "fecha_entrega_warning_revised" => "?bool", - // "pendiente_ferro_at" => "?datetime", - // "ferro_en_cliente_at" => "?datetime", - // "ferro_ok_at" => "?datetime", - // "interior_bn_at" => "?datetime", - // "interior_color_at" => "?datetime", - // "preparacion_interiores_at" => "?datetime", - // "cubierta_at" => "?datetime", - // "plastificado_at" => "?datetime", - // "encuadernacion_at" => "?datetime", - // "corte_at" => "?datetime", - // "embalaje_at" => "?datetime", - // "envio_at" => "?datetime", - // "entrada_manipulado_at" => "?datetime" + ]; + protected $casts = []; + + public function sinImprimirStatus(): bool + { + return !( + $this->attributes['interior_bn_at'] == null + && $this->attributes['interior_color_at'] == null + && $this->attributes['cubierta_at'] == null + ); + } + public function impresionInteriorStatus():bool + { + return $this->attributes['interior_bn_at']|| $this->attributes['interior_color_at']; + } + public function impresionCubiertaStatus():bool + { + return $this->attributes['cubierta_at'] != null; + } + public function plastificadoStatus():bool + { + return $this->attributes['plastificado_at'] != null; + } + public function encuadernadoStatus():bool + { + return $this->attributes['encuadernacion_at'] != null; + } + public function preparacionInterioresStatus():bool + { + return $this->attributes['preparacion_interiores_at'] != null; + } + public function corteStatus():bool + { + return $this->attributes['corte_at'] != null; + } + public function cosidoStatus():bool + { + return $this->attributes['cosido_at'] != null; + } + public function grapadoStatus():bool + { + return $this->attributes['grapado_at'] != null; + } + public function solapaStatus():bool + { + return $this->attributes['solapa_at'] != null; + } } diff --git a/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php b/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php index 67861987..3ac4e474 100644 --- a/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php +++ b/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php @@ -21,21 +21,21 @@ class OrdenTrabajoEntity extends Entity "pedido_id" => null, "user_created_id" => null, "user_updated_id" => null, - "fecha_entrega_warning" => false, - "fecha_entrega_warning_revised" => false, + "fecha_entrega_warning" => null, + "fecha_entrega_warning_revised" => null, "total_tirada" => null, "total_precio" => null, "tipo_entrada" => "out", "progreso" => 0.00, "estado" => "I", "comentarios" => null, - "revisar_formato" => false, - "revisar_lomo" => false, - "revisar_solapa" => false, - "revisar_isbn" => false, - "revisar_codigo_barras" => false, - "realizar_imposicion" => false, - "enviar_impresion" => false, + "revisar_formato" => null, + "revisar_lomo" => null, + "revisar_solapa" => null, + "revisar_isbn" => null, + "revisar_codigo_barras" => null, + "realizar_imposicion" => null, + "enviar_impresion" => null, "portada_path" => null, "is_pedido_espera" => null, "pedido_espera_by" => null, @@ -87,12 +87,12 @@ class OrdenTrabajoEntity extends Entity public function dates(): ?OrdenTrabajoDateEntity { $m = model(OrdenTrabajoDate::class); - return $m->where('orden_trabajo_id',$this->attributes["id"])->first(); + return $m->where('orden_trabajo_id', $this->attributes["id"])->first(); } public function users(): ?OrdenTrabajoUserEntity { $m = model(OrdenTrabajoUser::class); - return $m->where('orden_trabajo_id',$this->attributes["id"])->first(); + return $m->where('orden_trabajo_id', $this->attributes["id"])->first(); } /** @@ -109,24 +109,24 @@ class OrdenTrabajoEntity extends Entity $this->attributes["dates"] = $ot_dates->fill($data); return $this; } - public function getBarCode() : string + public function getBarCode(): string { $barcode = new TypeCode128(); $renderer = new PngRenderer(); $barcodeData = $barcode->getBarcode($this->pedido()->presupuesto()->id); - return base64_encode($renderer->render($barcodeData,200, 50)); + return base64_encode($renderer->render($barcodeData, 200, 50)); } - public function files() : array + public function files(): array { $m = model(OrdenTrabajoFileModel::class); - return $m->where('orden_trabajo_id',$this->attributes['id'])->findAll() ?? []; + return $m->where('orden_trabajo_id', $this->attributes['id'])->findAll() ?? []; } - public function pedidoEsperaBy() : ?UserEntity + public function pedidoEsperaBy(): ?UserEntity { $m = model(UserModel::class); - if($this->attributes['pedido_espera_by']){ + if ($this->attributes['pedido_espera_by']) { return $m->findById($this->attributes['pedido_espera_by']); - }else{ + } else { return null; } } @@ -134,4 +134,18 @@ class OrdenTrabajoEntity extends Entity { return $this->pedidoEsperaBy(); } + public function getFullPath(): ?string + { + helper('filesystem'); + $path = WRITEPATH . 'uploads/' . $this->attributes["portada_path"]; + $portada_path = null; + if ($path) { + if (file_exists($path)) { + $portada_path = $path; + } else { + $portada_path = null; + } + } + return $portada_path; + } } diff --git a/ci4/app/Entities/Produccion/OrdenTrabajoTareaEntity.php b/ci4/app/Entities/Produccion/OrdenTrabajoTareaEntity.php index b11c9812..883f76ad 100644 --- a/ci4/app/Entities/Produccion/OrdenTrabajoTareaEntity.php +++ b/ci4/app/Entities/Produccion/OrdenTrabajoTareaEntity.php @@ -2,10 +2,12 @@ namespace App\Entities\Produccion; +use App\Entities\Configuracion\Imposicion; use App\Entities\Configuracion\Maquina; use App\Entities\Presupuestos\PresupuestoAcabadosEntity; use App\Entities\Presupuestos\PresupuestoLineaEntity; use App\Entities\Presupuestos\PresupuestoManipuladosEntity; +use App\Models\Configuracion\ImposicionModel; use App\Models\Configuracion\MaquinaModel; use App\Models\OrdenTrabajo\OrdenTrabajoModel; use App\Models\Presupuestos\PresupuestoAcabadosModel; @@ -105,5 +107,14 @@ class OrdenTrabajoTareaEntity extends Entity $m = model(PresupuestoAcabadosModel::class); return $m->find($this->attributes["presupuesto_linea_id"]); } + public function imposicion() : ?Imposicion + { + $m = model(ImposicionModel::class); + $imposicion = null; + if($this->attributes["imposicion_id"]){ + $imposicion = $m->find($this->attributes["imposicion_id"]); + } + return $imposicion; + } } diff --git a/ci4/app/Entities/Produccion/OrdenTrabajoUserEntity.php b/ci4/app/Entities/Produccion/OrdenTrabajoUserEntity.php index c03df33a..57356b8b 100644 --- a/ci4/app/Entities/Produccion/OrdenTrabajoUserEntity.php +++ b/ci4/app/Entities/Produccion/OrdenTrabajoUserEntity.php @@ -15,28 +15,42 @@ class OrdenTrabajoUserEntity extends Entity "orden_trabajo_id" => null, "user_created_id" => null, "user_update_id" => null, - "inaplazable_revised_change_user_id" => null, - "ferro_disponible_hecho_user_id" => null, - "ferro_disponible_ok_user_id" => null, - "ferro_entregado_user_id" => null, - "pendiente_ferro_user_id" => null, - "ferro_en_cliente_user_id" => null, - "ferro_ok_user_id" => null, + //IMPRESION "interior_bn_user_id" => null, "interior_color_user_id" => null, - "preparacion_interior_user_id" => null, "cubierta_user_id" => null, + //ACABADO "plastificado_user_id" => null, "encuadernacion_user_id" => null, "corte_user_id" => null, - "embalaje_user_id" => null, + "preparacion_interior_user_id" => null, "entrada_manipulado_user_id" => null, + "cosido_user_id" => null, + "solapa_user_id" => null, + "grapado_user_id" => null, + "retractilado_user_id" => null, + "retractilado5_user_id" => null, + "prototipo_user_id" => null, + "marcapaginas_user_id" => null, + //FERRO + "pendiente_ferro_user_id" => null, + "ferro_en_cliente_user_id" => null, + "ferro_ok_user_id" => null, + //ENVIO + "embalaje_user_id" => null, + "envio_user_id" => null, + //PREIMPRESION "pre_formato_user_id" => null, "pre_lomo_user_id" => null, "pre_solapa_user_id" => null, "pre_codbarras_user_id" => null, "pre_imposicion_user_id" => null, - "pre_imprimir_user_id" => null + //UNUSED + "inaplazable_revised_change_user_id" => null, //!DELETE + "ferro_disponible_hecho_user_id" => null, //!DELETE + "ferro_entregado_user_id" => null, //!DELETE + "pre_imprimir_user_id" => null, //!DELETE + "ferro_disponible_ok_user_id" => null, //!DELETE ]; // protected array $casts = [ // "orden_trabajo_id" => "integer", @@ -66,7 +80,7 @@ class OrdenTrabajoUserEntity extends Entity // "pre_imprimir_user_id" => "?integer" // ]; - protected function userBy(string $key): ?UserEntity + public function userBy(string $key): ?UserEntity { $user = null; if (isset($this->attributes[$key])) { @@ -78,7 +92,7 @@ class OrdenTrabajoUserEntity extends Entity } return $user; } - public function getPlastificadoBy() : ?UserEntity + public function getPlastificadoBy(): ?UserEntity { return $this->userBy('plastificado_user_id'); } diff --git a/ci4/app/Entities/Tarifas/TarifaEncuadernacionEntity.php b/ci4/app/Entities/Tarifas/TarifaEncuadernacionEntity.php index b8d01575..608ebf37 100755 --- a/ci4/app/Entities/Tarifas/TarifaEncuadernacionEntity.php +++ b/ci4/app/Entities/Tarifas/TarifaEncuadernacionEntity.php @@ -33,6 +33,14 @@ class TarifaEncuadernacionEntity extends \CodeIgniter\Entity\Entity "user_updated_id" => "int", "is_deleted" => "int", ]; + + public function getNameInitials(): string + { + $words = explode(" ",$this->attributes["nombre"]); + $words_initial = array_map(fn($w) => substr(strtoupper($w),0,1),$words); + return implode("",$words_initial); + } + } diff --git a/ci4/app/Language/es/Produccion.php b/ci4/app/Language/es/Produccion.php index 98e81d76..e5b622b0 100644 --- a/ci4/app/Language/es/Produccion.php +++ b/ci4/app/Language/es/Produccion.php @@ -39,7 +39,8 @@ return [ "maquina_presupuesto" => "Máquina presupuesto", "maquina_actual" => "Máquina actual", "tiempo_estimado" => "Tiempo estimado", - "tiempo" => "Tiempo" + "tiempo" => "Tiempo", + "imposicion" => "Imposición" ], "finalizadas" => "Finalizadas", "pendiente_ferro" => "Ferro pendiente", @@ -56,7 +57,7 @@ return [ "fecha_entrega_estimada" => "Fecha entrega estimada", "formato" => "Formato", "paginas" => "Páginas", - "guillotina" => "Guillotina", + "guillotina" => "Guillotina/Corte", "tirada" => "Tirada", "merma" => "Merma", "pendiente_ferro" => "Pendiente ferro", @@ -79,6 +80,39 @@ return [ "solapa" => "Solapa", "papel_gramajes" => "Papel y gramajes", "estado" => "Estado", - "pedido_espera" => "Pedido en espera" + "pedido_espera" => "Pedido en espera", + "imposicion_no_label" => "Sin etiqueta", + "pliegos_de" => "pliegos de", + "size" => "Tamaño", + "ejemplares" => "Ejemplares", + "tipo" => "Tipo", + "lomo" => "Lomo", + + "cosido" => "Cosido", + "grapado" => "Grapado", + "solapa" => "Solapas", + "retractilado" => "Retractilado", + "retractilado5" => "Retractilado 5", + "prototipo" => "Prototipo", + "marcapaginas" => "Marcapáginas", + //IMPRESION + "impresion_bn" => "Impresión BN", + "cubierta" => "Cubierta/Portada", + //PREIMPRESION + "pre_formato" => "Revisión formato", + "pre_lomo" => "Revisión lomo", + "pre_solapa" => "Revisión solapa", + "pre_codbarras" => "Revisión código barras", + "pre_imposicion" => "Revisión imposición", + + + + "errors" => [ + "date_not_exist" => "Esta fecha no existe en el modelo", + "attr_not_exist" => "El atributo {0,string} no pertenece al modelo Pedido" + + ] + + ]; \ No newline at end of file diff --git a/ci4/app/Models/Chat/ChatDeparmentModel.php b/ci4/app/Models/Chat/ChatDeparmentModel.php index c5d81c87..efe215b8 100644 --- a/ci4/app/Models/Chat/ChatDeparmentModel.php +++ b/ci4/app/Models/Chat/ChatDeparmentModel.php @@ -136,6 +136,7 @@ class ChatDeparmentModel extends Model ->where('chat_department_users.presupuesto_id',null) ->where('chat_department_users.pedido_id',null) ->where('chat_department_users.factura_id',null) + ->where('chat_department_users.orden_trabajo_id',null) ->get(); return $result->getResultObject() ?: []; @@ -161,6 +162,13 @@ class ChatDeparmentModel extends Model ->get()->getResultObject(); return $result; } + public function getChatDeparmentOrdenTrabajoUsers(int $chat_deparment_id, int $orden_trabajo_id) + { + $result = $this->getChatDeparmentUserQuery($chat_deparment_id) + ->where('chat_department_users.orden_trabajo_id', $orden_trabajo_id) + ->get()->getResultObject(); + return $result; + } public function getDisplay(int $chat_deparment_id): string { return $this->find($chat_deparment_id)->display; diff --git a/ci4/app/Models/Chat/ChatDeparmentUserModel.php b/ci4/app/Models/Chat/ChatDeparmentUserModel.php index 1afdca85..b311e11e 100644 --- a/ci4/app/Models/Chat/ChatDeparmentUserModel.php +++ b/ci4/app/Models/Chat/ChatDeparmentUserModel.php @@ -19,7 +19,9 @@ class ChatDeparmentUserModel extends Model "user_id", "pedido_id", "factura_id", - "presupuesto_id" + "presupuesto_id", + "orden_trabajo_id", + ]; protected bool $allowEmptyInserts = false; diff --git a/ci4/app/Models/Chat/ChatModel.php b/ci4/app/Models/Chat/ChatModel.php index 88bbad19..5ac10631 100644 --- a/ci4/app/Models/Chat/ChatModel.php +++ b/ci4/app/Models/Chat/ChatModel.php @@ -6,11 +6,13 @@ use App\Entities\Chat\ChatEntity; use App\Models\ChatNotification; use App\Models\ChatUser; use App\Models\Facturas\FacturaModel; +use App\Models\OrdenTrabajo\OrdenTrabajoModel; use App\Models\Pedidos\PedidoModel; use App\Models\Presupuestos\PresupuestoModel; use App\Models\Usuarios\UserModel; use CodeIgniter\Model; use CodeIgniter\Database\BaseBuilder; +use Config\OrdenTrabajo; class ChatModel extends Model { @@ -25,6 +27,7 @@ class ChatModel extends Model "chat_department_id", "presupuesto_id", "factura_id", + "orden_trabajo_id", "title" ]; @@ -86,6 +89,10 @@ class ChatModel extends Model { return $this->builder()->where("factura_id", $factura_id)->where("chat_department_id", $chat_department_id)->get()->getFirstRow(); } + public function getChatOrdenTrabajo(int $chat_department_id, int $orden_trabajo_id) + { + return $this->builder()->where("orden_trabajo_id", $orden_trabajo_id)->where("chat_department_id", $chat_department_id)->get()->getFirstRow(); + } public function createChatPresupuesto(int $chat_department_id, int $presupuesto_id): int { @@ -123,6 +130,17 @@ class ChatModel extends Model "chat_department_id" => $chat_department_id ]); } + public function createChatOrdenTrabajo(int $chat_department_id, int $orden_trabajo_id): int + { + $model = model(OrdenTrabajoModel::class); + $chatDeparmentModel = model(ChatDeparmentModel::class); + $ot = $model->find($orden_trabajo_id); + return $this->insert([ + "title" => "[OT]".$ot->id . "[" . $chatDeparmentModel->getDisplay($chat_department_id) . "]", + "orden_trabajo_id" => $orden_trabajo_id, + "chat_department_id" => $chat_department_id + ]); + } public function createChatSingle(): int { return $this->insert(["chat_department_id" => null]); @@ -323,6 +341,7 @@ class ChatModel extends Model "chats.pedido_id as pedidoId", "chats.presupuesto_id as presupuestoId", "chats.factura_id as facturaId", + "chats.orden_trabajo_id as ordenTrabajoId", "chats.title as chatDisplay", "COUNT(chat_notifications.id) as unreadMessages" ]) @@ -363,6 +382,13 @@ class ChatModel extends Model $row->title = $row->facturaId; $rows_new[] = $row; } + elseif ($row->ordenTrabajoId) { + // $row->model = $facturaModel->find($row->facturaId); + $row->uri = "/chat/ot/" . $row->ordenTrabajoId . "#accordionChatOrdenTrabajo"; + $row->avatar = "OT"; + $row->title = $row->ordenTrabajoId; + $rows_new[] = $row; + } } return $rows_new; } @@ -374,6 +400,7 @@ class ChatModel extends Model "chats.chat_department_id as chatDepartmentId", "chats.pedido_id as pedidoId", "chats.presupuesto_id as presupuestoId", + "chats.orden_trabajo_id as ordenTrabajoId", "chats.factura_id as facturaId", "chats.title as chatDisplay", "COUNT(chat_messages.id) as unreadMessages" @@ -413,6 +440,13 @@ class ChatModel extends Model $row->title = $row->facturaId; $rows_new[] = $row; } + elseif ($row->ordenTrabajoId) { + $row->uri = "/produccion/ordentrabajo/edit/" . $row->ordenTrabajoId . "#accordionChatOrdenTrabajo"; + $row->avatar = "OT"; + $row->chatDisplay .= "[INTERNAL]"; + $row->title = $row->ordenTrabajoId; + $rows_new[] = $row; + } } return $rows_new; } @@ -433,6 +467,7 @@ class ChatModel extends Model ->where("chats.chat_department_id", null) ->where("chats.pedido_id", null) ->where("chats.factura_id", null) + ->where("chats.orden_trabajo_id", null) ->where("chat_notifications.viewed", false) ->where("chat_notifications.user_id", auth()->user()->id); $rows = $q->get()->getResultObject(); @@ -513,6 +548,27 @@ class ChatModel extends Model $data["users"] = $this->getChatUsers($chat_id); return $data; } + public function getChatInternalHebraOrdenTrabajo($chat_id, $orden_trabajo_id) + { + $data = []; + $query = $this->builder()->select([ + "chats.id as chatId", + "chat_messages.message", + "users.username as senderUserName", + "chat_messages.created_at", + "CONCAT(users.first_name,' ',users.last_name) as senderFullName", + ]) + ->join("chat_messages", "chat_messages.chat_id = chats.id", "left") + ->join("users", "users.id = chat_messages.sender_id", "left") + ->where("chats.id", $chat_id) + ->where("chats.orden_trabajo_id", $orden_trabajo_id); + $data["chatId"] = $chat_id; + $data["messages"] = $query->get()->getResultObject(); + $data["chatTitle"] = "OT" . "[" . $orden_trabajo_id . "] - "; + $data["chatTitle"] .= $this->find($chat_id)->title; + $data["users"] = $this->getChatUsers($chat_id); + return $data; + } public function getChatUsers(int $chat_id) { $query = $this->builder()->select([ @@ -557,6 +613,17 @@ class ChatModel extends Model } return $data; } + public function getOrdenTrabajoHebras($orden_trabajo_id): array + { + $data = []; + $chats = $this->builder()->select("chats.id as chatId") + ->where("chats.chat_department_id", null) + ->where("chats.orden_trabajo_id", $orden_trabajo_id)->get()->getResultObject(); + foreach ($chats as $chat) { + $data[$chat->chatId] = $this->getChatInternalHebraOrdenTrabajo($chat->chatId, $orden_trabajo_id); + } + return $data; + } public function countUnreadMessagePresupuesto(int $presupuesto_id): int|string { return $this->builder()->select() @@ -586,6 +653,15 @@ class ChatModel extends Model ->where("chat_notifications.viewed", false) ->where("chat_notifications.user_id", auth()->user()->id)->countAllResults(); } + public function countUnreadMessageOrdenTrabajo($orden_trabajo_id): int|string + { + return $this->builder()->select() + ->join("chat_messages", "chat_messages.chat_id = chats.id", "left") + ->join("chat_notifications", "chat_notifications.chat_message_id = chat_messages.id", "left") + ->where("chats.orden_trabajo_id", $orden_trabajo_id) + ->where("chat_notifications.viewed", false) + ->where("chat_notifications.user_id", auth()->user()->id)->countAllResults(); + } public function countUnreadMessageDirectos(int $chat_id): int|string { return $this->builder()->select() @@ -606,6 +682,7 @@ class ChatModel extends Model ->where("chats.presupuesto_id", null) ->where("chats.pedido_id", null) ->where("chats.factura_id", null) + ->where("chats.orden_trabajo_id", null) ->where("chats.id", $chat_id) ->where("chat_messages.receiver_id", auth()->user()->id)->get()->getFirstRow(); $userModel = model(UserModel::class); @@ -837,6 +914,36 @@ class ChatModel extends Model } return $query->groupBy('chatMessageId'); } + public function getQueryDatatableMessageOrdenTrabajo(int $user_id): BaseBuilder + { + $query = $this->builder() + ->select([ + "chats.id", + "cm.id as chatMessageId", + "u.id as userId", + "cm.message", + "chats.created_at", + " + ( + SELECT cm2.updated_at + FROM chat_messages cm2 + WHERE cm2.chat_id = chats.id + ORDER BY cm2.updated_at DESC LIMIT 1 + ) as updated_at", + "CONCAT(u.first_name,' ',u.last_name) as creator", + "chats.title", + ]) + ->join("chat_messages cm", "chats.id = cm.chat_id", "left") + ->join("users u", "u.id = cm.sender_id", 'left') + ->join("ordenes_trabajo", "ordenes_trabajo.id = chats.orden_trabajo_id", "left") + ->where("chats.orden_trabajo_id is NOT NULL", NULL, FALSE); + + if (auth()->user()->inGroup("cliente-administrador","cliente")) { + $query->where('facturas.cliente_id', auth()->user()->cliente_id) + ->where("chats.chat_department_id is NOT NULL", NULL, FALSE); + } + return $query->groupBy('chatMessageId'); + } public function createNewDirectChat(string $title, string $message, array $users) { $chatMessageModel = model(ChatMessageModel::class); diff --git a/ci4/app/Models/Clientes/ClientePlantillaPreciosLineasModel.php b/ci4/app/Models/Clientes/ClientePlantillaPreciosLineasModel.php index c15bbad2..c66ab4c5 100755 --- a/ci4/app/Models/Clientes/ClientePlantillaPreciosLineasModel.php +++ b/ci4/app/Models/Clientes/ClientePlantillaPreciosLineasModel.php @@ -151,7 +151,7 @@ class ClientePlantillaPreciosLineasModel extends \App\Models\BaseModel $builder->join("users t2", "t1.user_updated_id = t2.id", "left"); - $builder->where('t1.deleted_at', 0); + $builder->where('t1.deleted_at', null); $builder->where('t1.plantilla_id', $plantilla_id); if (empty($search)) diff --git a/ci4/app/Models/Clientes/ClientePreciosModel.php b/ci4/app/Models/Clientes/ClientePreciosModel.php index 17693fd2..9a1c25bc 100755 --- a/ci4/app/Models/Clientes/ClientePreciosModel.php +++ b/ci4/app/Models/Clientes/ClientePreciosModel.php @@ -388,7 +388,7 @@ class ClientePreciosModel extends \App\Models\BaseModel $builder->join("users t2", "t1.user_updated_id = t2.id", "left"); - $builder->where('t1.deleted_at', 0); + $builder->where('t1.deleted_at', null); $builder->where('t1.cliente_id', $cliente_id); if (empty($search)) diff --git a/ci4/app/Models/Configuracion/ImposicionModel.php b/ci4/app/Models/Configuracion/ImposicionModel.php index e9473566..b21def73 100755 --- a/ci4/app/Models/Configuracion/ImposicionModel.php +++ b/ci4/app/Models/Configuracion/ImposicionModel.php @@ -1,4 +1,5 @@ groupStart() - ->like("t1.id", $search) - ->orlike("t1.ancho", $search) - ->orLike("t1.alto", $search) - ->orLike("t1.unidades", $search) - ->orLike("t1.orientacion", $search) - ->orLike("t1.maquina", $search) - ->orLike("t1.etiqueta", $search) - ->orlike("t1.id", $search) - ->orLike("t1.ancho", $search) - ->orLike("t1.alto", $search) - ->orLike("t1.unidades", $search) - ->orLike("t1.orientacion", $search) - ->orLike("t1.maquina", $search) - ->orLike("t1.etiqueta", $search) - ->groupEnd(); + ->groupStart() + ->like("t1.id", $search) + ->orlike("t1.ancho", $search) + ->orLike("t1.alto", $search) + ->orLike("t1.unidades", $search) + ->orLike("t1.orientacion", $search) + ->orLike("t1.maquina", $search) + ->orLike("t1.etiqueta", $search) + ->orlike("t1.id", $search) + ->orLike("t1.ancho", $search) + ->orLike("t1.alto", $search) + ->orLike("t1.unidades", $search) + ->orLike("t1.orientacion", $search) + ->orLike("t1.maquina", $search) + ->orLike("t1.etiqueta", $search) + ->groupEnd(); + } + + public function querySelect(?string $q) + { + $query = $this->builder()->select([ + "id", + "CONCAT(lg_imposiciones.ancho,'x',lg_imposiciones.alto,'_',COALESCE(lg_imposiciones.unidades,'NULL'),'_',COALESCE(lg_imposiciones.orientacion,'NULL')) as name", + "COALESCE(lg_imposiciones.etiqueta,'" . lang("Produccion.imposicion_no_label") . "') as description" + ]); + if ($q) { + $query->orLike("CONCAT(lg_imposiciones.ancho,'x',lg_imposiciones.alto)", $q); + $query->orLike("lg_imposiciones.etiqueta", $q); + } + return $query + ->orderBy('id', 'ASC') + ->get()->getResultArray(); } } diff --git a/ci4/app/Models/OrdenTrabajo/OrdenTrabajoDate.php b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoDate.php index d6a7d7c1..555f6415 100644 --- a/ci4/app/Models/OrdenTrabajo/OrdenTrabajoDate.php +++ b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoDate.php @@ -5,6 +5,7 @@ namespace App\Models\OrdenTrabajo; use App\Entities\Produccion\OrdenTrabajoDateEntity; use CodeIgniter\Database\MySQLi\Builder; use CodeIgniter\Model; +use Config\OrdenTrabajo; class OrdenTrabajoDate extends Model { @@ -17,25 +18,36 @@ class OrdenTrabajoDate extends Model protected $allowedFields = [ "orden_trabajo_id", "fecha_entrada_at", - "fecha_entrega_at", - "fecha_entrega_real_at", - "fecha_entrega_change_at", - "fecha_impresion_at", - "fecha_encuadernado_at", - "fecha_externo_at", - "pendiente_ferro_at", - "ferro_en_cliente_at", - "ferro_ok_at", + //IMPRESION "interior_bn_at", "interior_color_at", - "preparacion_interiores_at", "cubierta_at", + //ACABADO "plastificado_at", "encuadernacion_at", "corte_at", + "preparacion_interiores_at", + "entrada_manipulado_at", + "cosido_at", + "solapa_at", + "grapado_at", + "retractilado_at", + "retractilado5_at", + "prototipo_at", + "marcapaginas_at", + //FERRO + "pendiente_ferro_at", + "ferro_en_cliente_at", + "ferro_ok_at", + //ENVIO "embalaje_at", "envio_at", - "entrada_manipulado_at" + //PREIMPRESION + "pre_formato_at", + "pre_lomo_at", + "pre_solapa_at", + "pre_codbarras_at", + "pre_imposicion_at" ]; protected bool $allowEmptyInserts = false; @@ -103,22 +115,8 @@ class OrdenTrabajoDate extends Model return $data; } public function updateUserDateMap($orden_trabajo_id,$data){ - $mapping = [ - "fecha_encuadernado_at" => "encuadernacion_user_id", - // "fecha_externo_at" => "null", - "fecha_impresion_at" => null, - "pendiente_ferro_at" => "pendiente_ferro_user_id", - "ferro_en_cliente_at" => "ferro_en_cliente_user_id", - "ferro_ok_at" => "ferro_ok_user_id", - "interior_bn_at" => "interior_bn_user_id", - "interior_color_at" => "interior_color_user_id", - "preparacion_interiores_at" => "preparacion_interior_user_id", - "cubierta_at" => "cubierta_user_id", - "plastificado_at" => "plastificado_user_id", - "corte_at" => "corte_user_id", - "embalaje_at" => "embalaje_user_id", - "entrada_manipulado_at" => "entrada_manipulado_user_id" - ]; + $ordenTrabajoConfig = new OrdenTrabajo(); + $mapping = $ordenTrabajoConfig->DATE_USER_MAPPING; $otUser = model(OrdenTrabajoUser::class); $auth_user_id = auth()->user()->id; foreach ($data as $key => $value) { diff --git a/ci4/app/Models/OrdenTrabajo/OrdenTrabajoModel.php b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoModel.php index 713a925f..2554d37f 100644 --- a/ci4/app/Models/OrdenTrabajo/OrdenTrabajoModel.php +++ b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoModel.php @@ -82,7 +82,9 @@ class OrdenTrabajoModel extends Model "tipos_presupuestos.codigo as tipo_presupuesto_impresion", "ordenes_trabajo.progreso", "presupuesto_linea.tipo as presupuesto_linea_tipo", - "orden_trabajo_dates.ferro_ok_at" + "orden_trabajo_dates.ferro_ok_at", + "CONCAT(lg_imposiciones.ancho,'x',lg_imposiciones.alto,'_',COALESCE(lg_imposiciones.unidades,'NULL'),'_',COALESCE(lg_imposiciones.orientacion,'NULL')) as imposicion_name" + ]) ->join("orden_trabajo_dates","orden_trabajo_dates.orden_trabajo_id = ordenes_trabajo.id","left") ->join("pedidos","pedidos.id = ordenes_trabajo.pedido_id","left") @@ -92,6 +94,9 @@ class OrdenTrabajoModel extends Model ->join("clientes","clientes.id = presupuestos.cliente_id","left") ->join("tipos_presupuestos","presupuestos.tipo_impresion_id = tipos_presupuestos.id","left") ->join("ubicaciones","ubicaciones.id = pedidos_linea.ubicacion_id","left") + ->join("orden_trabajo_tareas","orden_trabajo_tareas.orden_trabajo_id = ordenes_trabajo.id","left") + ->join("lg_imposiciones","lg_imposiciones.id = orden_trabajo_tareas.imposicion_id","left") + ->whereIn("presupuesto_linea.tipo",["lp_bn","lp_bnhq","lp_rot_bn","lp_color","lp_colorhq","lp_rot_color"]) ->where("ordenes_trabajo.deleted_at",null) ->groupBy("ordenes_trabajo.id"); diff --git a/ci4/app/Models/OrdenTrabajo/OrdenTrabajoUser.php b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoUser.php index c1a232f5..df4d0541 100644 --- a/ci4/app/Models/OrdenTrabajo/OrdenTrabajoUser.php +++ b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoUser.php @@ -3,6 +3,7 @@ namespace App\Models\OrdenTrabajo; use App\Entities\Produccion\OrdenTrabajoUserEntity; +use App\Models\Usuarios\UserModel; use CodeIgniter\Database\MySQLi\Builder; use CodeIgniter\Model; @@ -18,28 +19,42 @@ class OrdenTrabajoUser extends Model "orden_trabajo_id", "user_created_id", "user_update_id", - "inaplazable_revised_change_user_id", - "ferro_disponible_hecho_user_id", - "ferro_disponible_ok_user_id", - "ferro_entregado_user_id", - "pendiente_ferro_user_id", - "ferro_en_cliente_user_id", - "ferro_ok_user_id", + //IMPRESION "interior_bn_user_id", "interior_color_user_id", - "preparacion_interior_user_id", "cubierta_user_id", + //ACABADO "plastificado_user_id", "encuadernacion_user_id", "corte_user_id", - "embalaje_user_id", + "preparacion_interior_user_id", "entrada_manipulado_user_id", + "cosido_user_id", + "solapa_user_id", + "grapado_user_id", + "retractilado_user_id", + "retractilado5_user_id", + "prototipo_user_id", + "marcapaginas_user_id", + //FERRO + "pendiente_ferro_user_id", + "ferro_en_cliente_user_id", + "ferro_ok_user_id", + //ENVIO + "embalaje_user_id", + "envio_user_id", + //PREIMPRESION "pre_formato_user_id", "pre_lomo_user_id", "pre_solapa_user_id", "pre_codbarras_user_id", "pre_imposicion_user_id", - "pre_imprimir_user_id" + //UNUSED + "inaplazable_revised_change_user_id",//!DELETE + "ferro_disponible_hecho_user_id",//!DELETE + "ferro_entregado_user_id",//!DELETE + "pre_imprimir_user_id", //!DELETE + "ferro_disponible_ok_user_id", //!DELETE ]; protected bool $allowEmptyInserts = false; @@ -72,6 +87,5 @@ class OrdenTrabajoUser extends Model protected $beforeDelete = []; protected $afterDelete = []; - } diff --git a/ci4/app/Services/ChatService.php b/ci4/app/Services/ChatService.php index 9b0a002d..cf651ef6 100644 --- a/ci4/app/Services/ChatService.php +++ b/ci4/app/Services/ChatService.php @@ -40,6 +40,7 @@ class ChatService extends BaseService "presupuesto" => "presupuesto_id", "pedido" => "pedido_id", "factura" => "factura_id", + "ot" => "orden_trabajo_id" ]; protected array $modelClassMap; public function __construct() @@ -122,6 +123,9 @@ class ChatService extends BaseService case 'factura': $r = $this->chatModel->createChatFactura($chatDepartmentId, $modelId); break; + case 'ot': + $r = $this->chatModel->createChatOrdenTrabajo($chatDepartmentId, $modelId); + break; default: break; } diff --git a/ci4/app/Services/ProductionService.php b/ci4/app/Services/ProductionService.php index 8c9286cd..74d96614 100644 --- a/ci4/app/Services/ProductionService.php +++ b/ci4/app/Services/ProductionService.php @@ -3,6 +3,7 @@ namespace App\Services; use App\Entities\Clientes\ClienteEntity; +use App\Entities\Configuracion\Imposicion; use App\Entities\Pedidos\PedidoEntity; use App\Entities\Presupuestos\PresupuestoEntity; use App\Entities\Presupuestos\PresupuestoLineaEntity; @@ -18,12 +19,14 @@ use App\Entities\Produccion\OrdenTrabajoTareaEntity; use App\Models\Configuracion\ConfigVariableModel; use App\Models\Configuracion\MaquinaModel; use App\Models\OrdenTrabajo\OrdenTrabajoFileModel; +use App\Models\Pedidos\PedidoModel; use App\Models\Usuarios\UserModel; use CodeIgniter\Database\BaseBuilder; use CodeIgniter\Database\BaseResult; use CodeIgniter\Database\Exceptions\DatabaseException; use CodeIgniter\HTTP\Files\UploadedFile; use CodeIgniter\I18n\Time; +use Config\OrdenTrabajo; use Exception; /** @@ -41,26 +44,13 @@ class ProductionService extends BaseService protected OrdenTrabajoUser $otUser; protected OrdenTrabajoEntity $ot; protected OrdenTrabajoFileModel $otFileModel; + protected PedidoModel $pedidoModel; protected UserModel $userModel; protected string $defaultMaquinaCorteName = 'HT-1000'; protected MaquinaEntity $defaultMaquinaCorte; protected MaquinaModel $maquinaModel; - protected array $MAPPING_DATE_USER = [ - "fecha_encuadernado_at" => "encuadernacion_user_id", - // "fecha_externo_at" => "null", - "fecha_impresion_at" => null, - "pendiente_ferro_at" => "pendiente_ferro_user_id", - "ferro_en_cliente_at" => "ferro_en_cliente_user_id", - "ferro_ok_at" => "ferro_ok_user_id", - "interior_bn_at" => "interior_bn_user_id", - "interior_color_at" => "interior_color_user_id", - "preparacion_interiores_at" => "preparacion_interior_user_id", - "cubierta_at" => "cubierta_user_id", - "plastificado_at" => "plastificado_user_id", - "corte_at" => "corte_user_id", - "embalaje_at" => "embalaje_user_id", - "entrada_manipulado_at" => "entrada_manipulado_user_id" - ]; + protected OrdenTrabajo $ordenTrabajoConfig; + public string $statusColor; /** * Pedido Entity @@ -83,16 +73,25 @@ class ProductionService extends BaseService $this->otUser = model(OrdenTrabajoUser::class); $this->userModel = model(UserModel::class); $this->otFileModel = model(OrdenTrabajoFileModel::class); + $this->pedidoModel = model(PedidoModel::class); + $this->ordenTrabajoConfig = config('OrdenTrabajo'); + $this->statusColor = $this->ordenTrabajoConfig->OT_COLORS["sin_imprimir"]; } public function init(int $orden_trabajo_id): self { - $this->maquinaModel = model(MaquinaModel::class); - $this->otModel = model(OrdenTrabajoModel::class); - $this->ot = $this->otModel->find($orden_trabajo_id); - $pedido = $this->ot->pedido(); - $this->setPedido($pedido); - $this->defaultMaquinaCorte = $this->maquinaModel->where('nombre', $this->defaultMaquinaCorteName)->first(); - return $this; + try { + //code... + $this->maquinaModel = model(MaquinaModel::class); + $this->otModel = model(OrdenTrabajoModel::class); + $this->ot = $this->otModel->find($orden_trabajo_id); + $pedido = $this->ot->pedido(); + $this->setPedido($pedido); + $this->defaultMaquinaCorte = $this->maquinaModel->where('nombre', $this->defaultMaquinaCorteName)->first(); + $this->statusColor = $this->ordenTrabajoConfig->OT_COLORS["sin_imprimir"]; + return $this; + } catch (\Throwable $th) { + throw $th; + } } /** * Establece el pedido sobre el que se va a trabajar @@ -141,10 +140,10 @@ class ProductionService extends BaseService ]; $id = $this->otModel->insert($data); $this->init($id); - $this->updatePedidoEspera(); $this->storeOrdenTrabajoUsers(); $this->storeOrdenTrabajoDates(); $this->storeAllTareas(); + $this->updatePedidoEspera(); return $this->ot; } @@ -177,6 +176,24 @@ class ProductionService extends BaseService "orden_trabajo_id" => $this->ot->id, ]); } + public function reInsertOrdenTrabajoUsers(): int|bool|string + { + $status = false; + if($this->otUser->where('orden_trabajo_id',$this->ot->id)->countAllResults() == 0) + { + $status = $this->storeOrdenTrabajoUsers(); + } + return $status; + } + public function reInsertOrdenTrabajoDates(): int|bool|string + { + $status = false; + if($this->otDate->where('orden_trabajo_id',$this->ot->id)->countAllResults() == 0) + { + $status = $this->storeOrdenTrabajoDates(); + } + return $status; + } protected function storeAllTareas() { $this->storeOrdenTrabajoTareas(); @@ -414,9 +431,12 @@ class ProductionService extends BaseService "orden_trabajo_tareas.maquina_id as maquina_tarea", "lg_maquinas.nombre as maquina_nombre", "lg_imposiciones.id as imposicion_id", + "CONCAT(lg_imposiciones.ancho,'x',lg_imposiciones.alto,'_',COALESCE(lg_imposiciones.unidades,'NULL'),'_',COALESCE(lg_imposiciones.orientacion,'NULL'),'_',COALESCE(lg_imposiciones.etiqueta,'')) as imposicion_name", "orden_trabajo_tareas.tiempo_estimado", "orden_trabajo_tareas.tiempo_real", "orden_trabajo_tareas.comment", + "orden_trabajo_tareas.presupuesto_linea_id", + "presupuesto_linea.tipo", ]) ->join("orden_trabajo_tareas", "orden_trabajo_tareas.orden_trabajo_id = ordenes_trabajo.id", "left") @@ -623,6 +643,7 @@ class ProductionService extends BaseService "pedido" => $this->pedido, "presupuesto" => $this->presupuesto, "dates" => $this->ot->dates(), + "user_dates" => $this->userDates(), "tasks" => $this->ot->tareas(), "acabados" => $this->presupuesto->acabados(), "preimpresiones" => $this->presupuesto->preimpresiones(), @@ -635,6 +656,8 @@ class ProductionService extends BaseService "tareas_encuadernacion" => $this->tareas_encuadernacion(), "tareas_preimpresion" => $this->tareas_preimpresion(), "tareas_impresion" => $this->tareas_impresion(), + "tiempo_procesamiento" => $this->getTiempoProcesamientoHHMM(), + "statusColor" => $this->getOtColorStatus(), ]; return $summary; } @@ -657,39 +680,55 @@ class ProductionService extends BaseService "linea_impresion" => $this->presupuesto->presupuestoLineaImpresion(), "linea_cubierta" => $this->presupuesto->presupuestoLineaCubierta(), "peso_unidad" => $logistica_data["peso_unidad"], - "peso_pedido" => $logistica_data["peso_pedido"] + "peso_pedido" => $logistica_data["peso_pedido"], + "imposicion" => $this->getImposicionTareaImpresion(), + "tiempo_procesamiento" => $this->getTiempoProcesamientoHHMM(), + ]; } - public function getTareaImpresionSobreCubierta(): array + public function getImposicionTareaImpresion(): ?Imposicion + { + $imposicion = null; + $impresionInteriorBnImposicion = $this->getTareaImpresionInteriorBn()?->imposicion(); + $impresionInteriorColorImposicion = $this->getTareaImpresionInteriorColor()?->imposicion(); + if ($impresionInteriorBnImposicion) { + $imposicion = $impresionInteriorBnImposicion; + } + if ($impresionInteriorColorImposicion) { + $imposicion = $impresionInteriorColorImposicion; + } + return $imposicion; + } + public function getTareaImpresionSobreCubierta(): ?OrdenTrabajoTareaEntity { $q = $this->otTarea->select('orden_trabajo_tareas.*') ->join("presupuesto_linea", "presupuesto_linea.id = orden_trabajo_tareas.presupuesto_linea_id", "left") ->where("orden_trabajo_tareas.orden_trabajo_id", $this->ot->id) - ->whereIn("presupuesto_linea.tipo", ["lp_sobrecubierta"])->findAll(); + ->whereIn("presupuesto_linea.tipo", ["lp_sobrecubierta"])->first(); return $q; } - public function getTareaImpresionCubierta(): array + public function getTareaImpresionCubierta(): ?OrdenTrabajoTareaEntity { $q = $this->otTarea->select('orden_trabajo_tareas.*') ->join("presupuesto_linea", "presupuesto_linea.id = orden_trabajo_tareas.presupuesto_linea_id", "left") ->where("orden_trabajo_tareas.orden_trabajo_id", $this->ot->id) - ->whereIn("presupuesto_linea.tipo", ["lp_cubierta"])->findAll(); + ->whereIn("presupuesto_linea.tipo", ["lp_cubierta"])->first(); return $q; } - public function getTareaImpresionInteriorBn(): array + public function getTareaImpresionInteriorBn(): ?OrdenTrabajoTareaEntity { $q = $this->otTarea->select('orden_trabajo_tareas.*') ->join("presupuesto_linea", "presupuesto_linea.id = orden_trabajo_tareas.presupuesto_linea_id", "left") ->where("orden_trabajo_tareas.orden_trabajo_id", $this->ot->id) - ->whereIn("presupuesto_linea.tipo", ["lp_rot_bn", "lp_bn", "lp_bnhq"])->findAll(); + ->whereIn("presupuesto_linea.tipo", ["lp_rot_bn", "lp_bn", "lp_bnhq"])->first(); return $q; } - public function getTareaImpresionInteriorColor(): array + public function getTareaImpresionInteriorColor(): ?OrdenTrabajoTareaEntity { $q = $this->otTarea->select('orden_trabajo_tareas.*') ->join("presupuesto_linea", "presupuesto_linea.id = orden_trabajo_tareas.presupuesto_linea_id", "left") ->where("orden_trabajo_tareas.orden_trabajo_id", $this->ot->id) - ->whereIn("presupuesto_linea.tipo", ["lp_rot_color", "lp_color", "lp_colorhq"])->findAll(); + ->whereIn("presupuesto_linea.tipo", ["lp_rot_color", "lp_color", "lp_colorhq"])->first(); return $q; } public function getPresupuestoLineaImpresion() {} @@ -735,12 +774,12 @@ class ProductionService extends BaseService { $result = []; $otDate = $this->otDate->where('orden_trabajo_id', $this->ot->id) - ->set([$data['name'] => $data[$data['name']]]) - ->update($data); + ->set($data['name'],$data[$data['name']]) + ->update(); $this->otDate->updateUserDateMap($this->ot->id, $data); $ot_users = $this->ot->users(); - if (isset($this->MAPPING_DATE_USER[$data["name"]])) { - $user_id = $ot_users->{$this->MAPPING_DATE_USER[$data["name"]]}; + if (isset($this->ordenTrabajoConfig->DATE_USER_MAPPING[$data["name"]])) { + $user_id = $ot_users->{$this->ordenTrabajoConfig->DATE_USER_MAPPING[$data["name"]]}; $user = $this->userModel->find($user_id); if ($user_id) { $result = ["user" => null, "status" => false]; @@ -749,16 +788,45 @@ class ProductionService extends BaseService } else { $result = ["user" => null, "status" => false]; } + $this->updateProgress(); return $result; } + public function updateOrdenTrabajoPedidoDate($data): array + { + $status = false; + $user = auth()->user(); + $row = []; + $pedidoDatesUser = $this->ordenTrabajoConfig->DATE_USER_MAPPING_PEDIDO; + $attrPedido = $data["name"]; + if (isset($pedidoDatesUser[$attrPedido])) { + $row[$attrPedido] = Time::createFromFormat("Y-m-d", $data[$attrPedido])->format('Y-m-d 00:00:00'); + $attrUserPedido = $pedidoDatesUser[$attrPedido]; + $row[$attrUserPedido] = $user->id; + $status = $this->pedidoModel->update($this->pedido->id, $row); + $this->updateProgress(); + } else { + throw new Exception(lang('Produccion.errors.attr_not_exist', [$attrPedido])); + } + return [ + "user" => $user, + "status" => $status + ]; + } public function updateOrdenTrabajo($data): bool { - if(isset($data["is_pedido_espera"])){ + if (isset($data["is_pedido_espera"])) { $data["pedido_espera_by"] = auth()->user()->id; } return $this->otModel->update($this->ot->id, $data); } + public function updateOrdenTrabajoPedido($data) + { + if (isset($data["inaplazable"])) { + $data[$this->ordenTrabajoConfig->DATE_USER_MAPPING_PEDIDO["inaplazable"]] = auth()->user()->id; + } + return $this->pedidoModel->update($this->pedido->id, $data); + } /**======================================================================== * RELATION METHODS *========================================================================**/ @@ -1012,8 +1080,143 @@ class ProductionService extends BaseService $status = false; $presupuestoFiles = $this->presupuesto->files(); if (count($presupuestoFiles) == 0) { - $status = $this->otModel->update($this->ot->id, ['pedido_espera' => true]); + $status = $this->otModel->update($this->ot->id, ['is_pedido_espera' => true]); } return $status; } + public function userDates(): array + { + $userDates = []; + foreach ($this->ordenTrabajoConfig->DATE_USER_MAPPING as $key => $value) { + $otUserEntity = $this->otUser->where("orden_trabajo_id", $this->ot->id)->first(); + $userEntity = $otUserEntity->userBy($value); + if ($userEntity) { + $userDates[$key] = $userEntity->full_name; + } else { + $userDates[$key] = null; + } + } + return $userDates; + } + public function pedidoUserDates(): array + { + $pedidoUserDates = []; + foreach ($this->ordenTrabajoConfig->DATE_USER_MAPPING_PEDIDO as $key => $value) { + $userEntity = $this->pedido->userBy($value); + if ($userEntity) { + $pedidoUserDates[$key] = $userEntity->full_name; + } else { + $pedidoUserDates[$key] = null; + } + } + return $pedidoUserDates; + } + public function getTiempoProcesamientoHHMM(): string + { + $time_tareas_seconds = array_map(fn($q) => $q->tiempo_estimado ?? 0, $this->ot->tareas()); + $seconds = array_sum($time_tareas_seconds); + return float_seconds_to_hhmm_string($seconds); + } + public function updateProgress(): bool + { + $userDates = $this->ordenTrabajoConfig->DATE_USER_MAPPING; + $pedidoUserDates = $this->ordenTrabajoConfig->DATE_USER_MAPPING_PEDIDO; + + $fill_dates = 0; + $status = false; + $total = count($userDates) + count($pedidoUserDates); + if ($this->ot->estado != "F") { + foreach ($userDates as $key => $value) { + if ($this->ot->dates()->{$key} != null) $fill_dates++; + } + foreach ($pedidoUserDates as $key => $value) { + if ($this->pedido->{$key} != null) $fill_dates++; + } + + $progreso = (float) $fill_dates / $total * 100; + $status = $this->otModel->update($this->ot->id, ["progreso" => round($progreso, 2)]); + } else { + $status = $this->otModel->update($this->ot->id, ["progreso" => 100]); + } + return $status; + } + public function getOtColorStatus(): string + { + if($this->ot->dates()){ + $this->updateColor(); + } + return $this->statusColor; + } + protected function otSinImprimirColor() + { + if ($this->ot->dates()->sinImprimirStatus()) { + $this->statusColor = $this->ordenTrabajoConfig->OT_COLORS["sin_imprimir"]; + }; + } + protected function otImpresionIntColor() + { + if ($this->ot->dates()->impresionInteriorStatus()) { + $this->statusColor = $this->ordenTrabajoConfig->OT_COLORS["impreso_int"]; + }; + } + protected function otImpresionCubiertaColor() + { + if ($this->ot->dates()->impresionCubiertaStatus()) { + $this->statusColor = $this->ordenTrabajoConfig->OT_COLORS["impreso_cub"]; + }; + } + protected function otPlastificadoColor() + { + if ($this->ot->dates()->plastificadoStatus()) { + $this->statusColor = $this->ordenTrabajoConfig->OT_COLORS["plastificado"]; + }; + } + protected function otSolapaColor() + { + if ($this->ot->dates()->solapaStatus()) { + $this->statusColor = $this->ordenTrabajoConfig->OT_COLORS["solapa"]; + }; + } + protected function otEncuadernadoColor() + { + if ($this->ot->dates()->encuadernadoStatus()) { + $this->statusColor = $this->ordenTrabajoConfig->OT_COLORS["encuadernado"]; + }; + } + protected function otPreparadoColor() + { + if ($this->ot->dates()->preparacionInterioresStatus()) { + $this->statusColor = $this->ordenTrabajoConfig->OT_COLORS["preparado"]; + }; + } + protected function otCorteColor() + { + if ($this->ot->dates()->corteStatus()) { + $this->statusColor = $this->ordenTrabajoConfig->OT_COLORS["corte"]; + }; + } + protected function otCosidoColor() + { + if ($this->ot->dates()->cosidoStatus()) { + $this->statusColor = $this->ordenTrabajoConfig->OT_COLORS["cosido"]; + }; + } + protected function otGrapadoColor() + { + if ($this->ot->dates()->grapadoStatus()) { + $this->statusColor = $this->ordenTrabajoConfig->OT_COLORS["grapado"]; + }; + } + protected function updateColor(){ + $this->otSinImprimirColor(); + $this->otImpresionIntColor(); + $this->otCosidoColor(); + $this->otImpresionCubiertaColor(); + $this->otPlastificadoColor(); + $this->otSolapaColor(); + $this->otPreparadoColor(); + $this->otGrapadoColor(); + $this->otEncuadernadoColor(); + $this->otCorteColor(); + } } diff --git a/ci4/app/Views/themes/vuexy/components/chat_internal_orden_trabajo.php b/ci4/app/Views/themes/vuexy/components/chat_internal_orden_trabajo.php new file mode 100644 index 00000000..5fd73e23 --- /dev/null +++ b/ci4/app/Views/themes/vuexy/components/chat_internal_orden_trabajo.php @@ -0,0 +1,41 @@ +
| = lang('Produccion.datatable.pedido_id') ?> | diff --git a/ci4/app/Views/themes/vuexy/components/tables/ot_task_table.php b/ci4/app/Views/themes/vuexy/components/tables/ot_task_table.php index cc9e048c..60dc55d3 100644 --- a/ci4/app/Views/themes/vuexy/components/tables/ot_task_table.php +++ b/ci4/app/Views/themes/vuexy/components/tables/ot_task_table.php @@ -7,7 +7,7 @@= lang('Produccion.task.task') ?> | = lang('Produccion.task.maquina_presupuesto') ?> | = lang('Produccion.task.maquina_actual') ?> | - += lang('Produccion.task.imposicion') ?> | = lang('Produccion.task.tiempo_estimado') ?> | = lang('Produccion.task.tiempo') ?> | diff --git a/ci4/app/Views/themes/vuexy/form/facturas/_facturaLineasItems.php b/ci4/app/Views/themes/vuexy/form/facturas/_facturaLineasItems.php index 9cd3136e..00412097 100644 --- a/ci4/app/Views/themes/vuexy/form/facturas/_facturaLineasItems.php +++ b/ci4/app/Views/themes/vuexy/form/facturas/_facturaLineasItems.php @@ -35,9 +35,15 @@ | |||
|---|---|---|---|---|---|---|---|---|---|---|
| I.V.A.: | -+ | |||||||||
| IVA (4%): | ++ | + | + | |||||||
| IVA (21%): | +||||||||||