From 41159d1588814d080eb822a49e6fd23dedd36176 Mon Sep 17 00:00:00 2001 From: amazuecos Date: Sat, 12 Apr 2025 23:53:28 +0200 Subject: [PATCH 1/4] select imposicion route --- ci4/app/Config/Routes.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index eb781603..baad50d9 100644 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -264,6 +264,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']); From ba9c4dc339777dc36748e8fcebce0c5893a26a0f Mon Sep 17 00:00:00 2001 From: amazuecos Date: Sat, 12 Apr 2025 23:53:48 +0200 Subject: [PATCH 2/4] imposiciones --- .../Configuracion/Imposiciones.php | 15 +- .../Controllers/Produccion/Ordentrabajo.php | 11 +- ci4/app/Entities/Configuracion/Imposicion.php | 9 + .../Entities/Configuracion/PapelImpresion.php | 13 + .../Produccion/OrdenTrabajoEntity.php | 14 + .../Produccion/OrdenTrabajoTareaEntity.php | 7 + .../Tarifas/TarifaEncuadernacionEntity.php | 8 + ci4/app/Language/es/Produccion.php | 12 +- .../Models/Configuracion/ImposicionModel.php | 49 ++- .../Models/OrdenTrabajo/OrdenTrabajoModel.php | 7 +- ci4/app/Services/ProductionService.php | 36 +- .../vuexy/components/tables/ot_task_table.php | 2 +- .../form/produccion/viewOrdenTrabajoList.php | 2 + .../Views/themes/vuexy/pdfs/orden_trabajo.php | 100 ++--- .../components/datatables/otDatatable.js | 11 +- .../assets/js/safekat/pages/pdf/otDownload.js | 20 +- .../assets/js/safekat/pages/produccion/ot.js | 65 +++- httpdocs/themes/vuexy/css/ot.css | 17 + httpdocs/themes/vuexy/css/pdf.ot copy.css | 348 ------------------ 19 files changed, 293 insertions(+), 453 deletions(-) create mode 100644 httpdocs/themes/vuexy/css/ot.css delete mode 100644 httpdocs/themes/vuexy/css/pdf.ot copy.css 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/Produccion/Ordentrabajo.php b/ci4/app/Controllers/Produccion/Ordentrabajo.php index 103befb3..ef39f38a 100755 --- a/ci4/app/Controllers/Produccion/Ordentrabajo.php +++ b/ci4/app/Controllers/Produccion/Ordentrabajo.php @@ -141,7 +141,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]) ->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 +156,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]) ->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 +171,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]) ->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 +186,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]) ->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 +232,8 @@ 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) @@ -296,7 +298,6 @@ class Ordentrabajo extends BaseController } } catch (\Throwable $th) { return $this->response->setJSON(["message" => "Portada error", "error" => $th->getMessage()])->setStatusCode(500); - } } public function planning_rotativa_datatable() 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/Produccion/OrdenTrabajoEntity.php b/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php index 67861987..e60a9671 100644 --- a/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php +++ b/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php @@ -134,4 +134,18 @@ class OrdenTrabajoEntity extends Entity { return $this->pedidoEsperaBy(); } + public function getPortadaPath(): ?string + { + helper('filesystem'); + $path = $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..946b3819 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,10 @@ class OrdenTrabajoTareaEntity extends Entity $m = model(PresupuestoAcabadosModel::class); return $m->find($this->attributes["presupuesto_linea_id"]); } + public function imposicion() : ?Imposicion + { + $m = model(ImposicionModel::class); + return $m->find($this->attributes["imposicion_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..603f21b3 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", @@ -79,6 +80,13 @@ 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" + ]; \ No newline at end of file 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/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/Services/ProductionService.php b/ci4/app/Services/ProductionService.php index 8c9286cd..0a325cf9 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; @@ -414,9 +415,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") @@ -657,39 +661,53 @@ 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() ]; } - 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() {} 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 @@ - + diff --git a/ci4/app/Views/themes/vuexy/form/produccion/viewOrdenTrabajoList.php b/ci4/app/Views/themes/vuexy/form/produccion/viewOrdenTrabajoList.php index 8fd39828..08de4ce3 100644 --- a/ci4/app/Views/themes/vuexy/form/produccion/viewOrdenTrabajoList.php +++ b/ci4/app/Views/themes/vuexy/form/produccion/viewOrdenTrabajoList.php @@ -52,6 +52,8 @@ section('css') ?> + + endSection() ?> section("additionalExternalJs") ?> diff --git a/ci4/app/Views/themes/vuexy/pdfs/orden_trabajo.php b/ci4/app/Views/themes/vuexy/pdfs/orden_trabajo.php index 753a17f5..9c8adc56 100644 --- a/ci4/app/Views/themes/vuexy/pdfs/orden_trabajo.php +++ b/ci4/app/Views/themes/vuexy/pdfs/orden_trabajo.php @@ -44,13 +44,13 @@ $settings = $session->get('settings');
- portada_path)): '/assets/img/portada_not_found.png' ?>" /> + portada_path)) : '/assets/img/portada_not_found.png' ?>" />
py-2 rounded border-1 border-secondary">
- fecha_encuadernado_at ? week_day_humanize(Time::createFromFormat("Y-m-d", $dates->fecha_encuadernado_at)->getDayOfWeek(), true) : "" ?> + fecha_encuadernado_at ? week_day_humanize(Time::createFromFormat("Y-m-d", $dates?->fecha_encuadernado_at)->getDayOfWeek(), true) : "" ?> Comercial: first_name . " " . $cliente->comercial()->last_name ?>
@@ -64,52 +64,52 @@ $settings = $session->get('settings');
-
"> - fecha_encuadernado_at ? Time::createFromFormat("Y-m-d", $dates->fecha_encuadernado_at)?->format("d/m/Y") : "" ?> -
-
- RF -
+
"> + fecha_encuadernado_at ? Time::createFromFormat("Y-m-d", $dates?->fecha_encuadernado_at)?->format("d/m/Y") : "" ?> +
+
+ tarifa()->code ?? "?" : "?" ?> +
- - - - - - - - - - - - - - - - - - - - - -
IN
PO
PL
EN
MA
+ + + + + + + + + + + + + + + + + + + + + +
IN
PO
PL
EN
MA
-
- BCLF 100 +
+ papel_impresion()->papel_code_ot ?>
0:3
- EM 300 + papel_impresion()->papel_code_ot ?>
- BRILLO + tarifa()->code : "" ?>
@@ -130,26 +130,26 @@ $settings = $session->get('settings');
- +
- - + - - + - + - +
Cliente + Cliente nombre ?>
Titulo + Titulo titulo ?>
ISBNISBN isbn ?>
CIFCIF cif ?>
@@ -187,7 +187,7 @@ $settings = $session->get('settings'); - +
Imposicion??full_name ?>
@@ -198,6 +198,18 @@ $settings = $session->get('settings');
IMP. INTERIOR
+ + + + + + + + + + + +
?? tirada ?> tipo ?> lomo_cubierta ?>
@@ -288,7 +300,7 @@ $settings = $session->get('settings'); - +
Máquina $q->nombre, $acabados[0]->maquinas())) ?> Operariousers()->plastificado_by?->getFullName() ?? null ?> users()?->plastificado_by?->getFullName() ?? null ?>
@@ -307,7 +319,7 @@ $settings = $session->get('settings'); - + diff --git a/httpdocs/assets/js/safekat/components/datatables/otDatatable.js b/httpdocs/assets/js/safekat/components/datatables/otDatatable.js index d5c2f089..d3e9dd80 100644 --- a/httpdocs/assets/js/safekat/components/datatables/otDatatable.js +++ b/httpdocs/assets/js/safekat/components/datatables/otDatatable.js @@ -14,11 +14,14 @@ class OrdenTrabajoDatatable { { data: 'cliente_nombre', searchable: false, sortable: false }, { data: 'presupuesto_titulo', searchable: false, sortable: false }, { data: 'ubicacion_nombre', searchable: false, sortable: false }, - { data: 'total_tirada', searchable: false, sortable: false ,render : (d) => `${d}`}, + { data: 'total_tirada', searchable: false, sortable: false, render: (d) => `${d}` }, { data: 'tipo_presupuesto_impresion', searchable: false, sortable: false }, { data: 'logo', searchable: false, sortable: false, render: (d, t) => { - return `logo-impresion` + return `
+ logo-impresion + ${d.imposicion ? `${d.imposicion ?? ""}` : ''} +
` } }, { @@ -50,7 +53,7 @@ class OrdenTrabajoDatatable { bottomStart: 'info', bottomEnd: 'paging' }, - columnDefs : [ + columnDefs: [ { className: 'dt-center', targets: '_all' }, ], serverSide: true, @@ -71,7 +74,7 @@ class OrdenTrabajoDatatable { bottomStart: 'info', bottomEnd: 'paging' }, - columnDefs : [ + columnDefs: [ { className: 'dt-center', targets: '_all' }, ], serverSide: true, diff --git a/httpdocs/assets/js/safekat/pages/pdf/otDownload.js b/httpdocs/assets/js/safekat/pages/pdf/otDownload.js index e350cdaf..d8eb9caa 100644 --- a/httpdocs/assets/js/safekat/pages/pdf/otDownload.js +++ b/httpdocs/assets/js/safekat/pages/pdf/otDownload.js @@ -1,12 +1,12 @@ $(() => { - console.log("PDF") - var opt = { - margin: 2, - filename: "PDF_OrdenTrabajo_" + $(".pdf-wrapper").data("id") + ".pdf", - image: { type: 'jpeg', quality: 1 }, - html2canvas: { scale: 3 }, - jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' } - }; - let elementToPdf = $('body')[0] - html2pdf().set(opt).from(elementToPdf).save() + // console.log("PDF") + // var opt = { + // margin: 2, + // filename: "PDF_OrdenTrabajo_" + $(".pdf-wrapper").data("id") + ".pdf", + // image: { type: 'jpeg', quality: 1 }, + // html2canvas: { scale: 3 }, + // jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' } + // }; + // let elementToPdf = $('body')[0] + // html2pdf().set(opt).from(elementToPdf).save() }) \ No newline at end of file diff --git a/httpdocs/assets/js/safekat/pages/produccion/ot.js b/httpdocs/assets/js/safekat/pages/produccion/ot.js index 029abab2..335483c9 100644 --- a/httpdocs/assets/js/safekat/pages/produccion/ot.js +++ b/httpdocs/assets/js/safekat/pages/produccion/ot.js @@ -26,7 +26,7 @@ class OrdenTrabajo { { data: 'nombre', searchable: true, sortable: true, width: "20%" }, { data: 'maquina_presupuesto_linea', searchable: true, sortable: true, width: "20%" }, { data: 'maquina_tarea', searchable: false, sortable: false, render: this._renderMaquinaSelectTable.bind(this), width: "20%" }, - // { data: 'imposicion_id', searchable: false, sortable: false }, + { data: 'imposicion', searchable: false, sortable: false, render: this._renderImposicionSelectTable.bind(this) }, { data: 'tiempo_estimado', searchable: false, sortable: false }, { data: 'tiempo_real', searchable: false, sortable: false }, { @@ -42,13 +42,13 @@ class OrdenTrabajo { nameId: "orden_trabajo_id", getUri: '/produccion/ordentrabajo/get_files', postUri: '/produccion/ordentrabajo/upload_files', - resourcePath : 'orden_trabajo/' + this.modelId + resourcePath: 'orden_trabajo/' + this.modelId } if ($(this.configUploadDropzone.domElement).length > 0) { this.fileUploadDropzone = new FileUploadDropzone(this.configUploadDropzone) } } - initDropFiles(){ + initDropFiles() { if ($(this.configUploadDropzone.domElement).length > 0) { this.fileUploadDropzone.init() } @@ -90,6 +90,7 @@ class OrdenTrabajo { eventTareas() { this.otForm.on("change", ".select-maquina-tarea-datatable", this.handleTareaChange.bind(this)) this.otForm.on("change", ".orden-tarea", this.handleTareaChange.bind(this)) + this.otForm.on("change", ".select-imposicion-tarea-datatable", this.handleTareaChange.bind(this)) this.otForm.on("click", ".increase-order", (event) => { const input_orden_tarea = $(event.currentTarget).parent().parent().find('.orden-tarea') let actual_value = parseInt(input_orden_tarea.val()) @@ -105,6 +106,7 @@ class OrdenTrabajo { } unbindEventTareas() { this.otForm.off("change", ".select-maquina-tarea-datatable") + this.otForm.off("change", ".select-imposicion-tarea-datatable") this.otForm.off("change", ".orden-tarea") this.otForm.off("click", ".increase-order") this.otForm.off("click", ".decrease-order") @@ -172,6 +174,14 @@ class OrdenTrabajo { ` + } + _renderImposicionSelectTable(d, t) { + + let render = `` + return render + } _renderActionCell(d, t) { @@ -204,6 +214,26 @@ class OrdenTrabajo { if (element.presupuesto_manipulado_id || element.is_corte) this.createSelectMaquinaManipulado(selectItem) if (element.presupuesto_preimpresion_id) this.createSelectMaquinaAll(selectItem) if (element.presupuesto_extra_id) this.createSelectMaquinaAll(selectItem) + if (this.summaryData.impresion_interior_bn) { + let isTareaImpresionInteriorBN = this.summaryData.impresion_interior_bn?.presupuesto_linea_id == element.presupuesto_linea_id + if (isTareaImpresionInteriorBN) { + let selectItemImposicion = this.item.find("#select-imposicion-tarea-" + element.id); + this.createSelectImposicion(selectItemImposicion) + } else { + let selectItemImposicion = this.item.find("#select-imposicion-tarea-" + element.id); + selectItemImposicion.addClass("d-none"); + } + } + if (this.summaryData.impresion_interior_color) { + let isTareaImpresionInteriorColor = this.summaryData.impresion_interior_color?.presupuesto_linea_id == element.presupuesto_linea_id + if (isTareaImpresionInteriorColor) { + let selectItemImposicion = this.item.find("#select-imposicion-tarea-" + element.id); + this.createSelectImposicion(selectItemImposicion) + } else { + let selectItemImposicion = this.item.find("#select-imposicion-tarea-" + element.id); + selectItemImposicion.addClass("d-none"); + } + } }); } catch (error) { } finally { @@ -262,6 +292,25 @@ class OrdenTrabajo { maquinaSelects.reset() } } + createSelectImposicion(selectItem) { + let imposicionId = selectItem.data("imposicion-id") + let imposicionSelect = new ClassSelect(selectItem, `/imposiciones/select`, "Seleccione una imposición", true); + + imposicionSelect.config.templateResult = (state) => { + let $state = $(` +
+ ${state.text} + ${state.desc ?? ''} +
`) + return $state; + } + imposicionSelect.init(); + if (imposicionId) { + imposicionSelect.setVal(imposicionId) + } else { + imposicionSelect.reset() + } + } @@ -294,7 +343,7 @@ class OrdenTrabajo { } handleSummaryError(error) { Notiflix.Block.remove('.section-block'); - } + } fillPreimpresionReview() { this.otForm.find("[name=fecha_entrega_warning]").prop("checked", this.summaryData.ot.fecha_entrega_warning) this.otForm.find("[name=fecha_entrega_warning_revised]").prop("checked", this.summaryData.ot.fecha_entrega_warning_revised) @@ -333,10 +382,10 @@ class OrdenTrabajo { this.espiral.setDate(this.summaryData.dates.fecha_impresion_at) this.embalaje.setDate(this.summaryData.dates.embalaje_at) this.envio.setDate(this.summaryData.dates.envio_at) - this.pedidoEnEsperaCheck.prop("checked",this.summaryData.ot.is_pedido_espera); - if(this.summaryData.ot.pedido_espera_by){ - this.pedidoEnEsperaBy.text([this.summaryData.ot.pedido_espera_by.first_name,this.summaryData.ot.pedido_espera_by.last_name].join(" ")) - }else{ + this.pedidoEnEsperaCheck.prop("checked", this.summaryData.ot.is_pedido_espera); + if (this.summaryData.ot.pedido_espera_by) { + this.pedidoEnEsperaBy.text([this.summaryData.ot.pedido_espera_by.first_name, this.summaryData.ot.pedido_espera_by.last_name].join(" ")) + } else { this.pedidoEnEsperaBy.text(""); } this.otEstado.val(this.summaryData.ot.estado) diff --git a/httpdocs/themes/vuexy/css/ot.css b/httpdocs/themes/vuexy/css/ot.css new file mode 100644 index 00000000..0cc848be --- /dev/null +++ b/httpdocs/themes/vuexy/css/ot.css @@ -0,0 +1,17 @@ +.imposicion-overlay-image +{ + position: absolute; + top: 75%; + left: 25%; + transform: translate(-10%, -10%); + background-color:rgb(255, 255, 255); + color: black; + font-size: 11px; + text-align: center; + border : 1px solid; + +} +.logo-container{ + position: relative; + display: inline-block; +} \ No newline at end of file diff --git a/httpdocs/themes/vuexy/css/pdf.ot copy.css b/httpdocs/themes/vuexy/css/pdf.ot copy.css deleted file mode 100644 index 1e75c6d8..00000000 --- a/httpdocs/themes/vuexy/css/pdf.ot copy.css +++ /dev/null @@ -1,348 +0,0 @@ -@page { - size: A4; - margin: 0; - } - @media print { - body,html { - width: 210mm; - height: 297mm; - max-width: 210mm; - max-height: 297mm; - print-color-adjust: exact; - } - /* ... the rest of the rules ... */ - } -html { - font-family: Arial, sans-serif; - width: 210mm; - height: 297mm; - max-width: 210mm; - font-size : 11px; - max-height: 297mm; - background-color: #f9f9f9; -} -body{ - border: 0px solid; - padding: 20px; - max-width: 210mm; - max-height: 297mm; - -} -.cubierta{ - color: #007bff; -} -.encuadernacion{ - color: green; -} -.impresion{ - color: #ff4000; -} -.container { - width: 100%; - width: 210mm; - height: 297mm; - background: #fff; - padding: 20px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); - border: 2px solid; - -} -.header { - display: flex; - justify-content: space-between; - align-items: center; -} -.cover{ - display: flex; - justify-content: start; - align-items: center; - gap: 10px; - margin-top: 10px; - margin-bottom: 10px; -} -.portada-info{ - display: flex; - flex-direction: column; - width: 100%; -} -.impresion-tipo-row{ - display: flex; - align-items: center; - justify-items: center; - justify-content: end; - width: 100%; - height: 5mm; - margin: 2px; -} -.portada-row{ - display: flex; - align-items: center; - justify-items: center; - justify-content: space-between; - background-color: #4ba0fccc; - width: 100%; - height: 5mm; - border: solid 2px; - margin: 2px; - border-color: black; - -} -.portada-row-2{ - display: flex; - align-items: center; - justify-items: center; - width: 100%; - height: 35mm; - margin: 2px; - border: 2px solid; - border-color: black; - -} -.portada{ - height: 40mm; -} -.presupuesto-title{ - color: #007bff; - font-size: medium; - line-height: 0; -} -.pl-2{ - padding-left: 0.5rem; -} -.pr-2{ - padding-right: 0.5rem; -} -.pt-2{ - padding-top: 0.5rem; -} -.flex-row{ - display: flex; - width: 100%; - justify-content: start; - align-items: flex-start; -} -.date{ - padding-left: 0.5rem; - padding-top: 0px; - width: 100%; - line-height: 0px; - stroke-width: 5px; - font-size: medium; -} -#presupuesto-section{ - width: 100%; -} -.flex-col{ - display: flex; - padding: 0; - flex-direction: column; -} -.cliente-title{ - color: red; - font-size: medium; - stroke-width: 10px; - line-height: 0px; -} - -.header .title { - font-size: 24px; - font-weight: bold; - color: #333; -} - -.section { - margin-top: 0.5rem; - border-top: 1px solid #ddd; - padding-top: 0.2rem; -} -.section-title { - font-weight: bold; - margin-bottom: 10px; -} -table { - width: 100%; - border-collapse: collapse; - margin-bottom: 5px; - font-size: 12px; -} -table th, table td { - border: 2px solid #000000; - text-align: center; -} -table th { - background-color: #f4f4f4; - font-weight: bold; -} -table td{ - font-weight: bold; -} -.comments { - color: #555; - font-style: italic; - margin-top: 0.2rem; -} -.comment-content { - line-height: 0; - width: 100%; - height: 50px; - border: solid; - border-width: 1px; -} -.footer { - text-align: center; - margin-top: 0.5rem; - - font-size: 14px; - color: #777; -} -.row-logo-impresion{ - text-align: center; -} -.portada-img{ - border: black; - border-style: solid; - border-width: 2px; - height: 40mm; - width: 100px; - max-width: 30mm; - border: 2px solid; - border-color: black; - border-radius: 5%; -} -.portada-text{ - color: white; -} - -.t-header{ - color: black; - width: 25%; -} -.t-cell{ - background-color: white; - color: black; - text-align: start; - padding-left: 0.2rem; -} -.t-row{ - font-size: 10px; -} -.esquema{ - display: flex; - justify-content:flex-end; - width: 100%; - justify-items: flex-end; - -} -.pagina-imposicion-outer-start{ - border-top: 2px solid; - border-left: 2px solid; - border-bottom: 2px solid; - width: 50px; - height: 100px; - display: flex; - align-items: center; - justify-content: center; -} -.pagina-imposicion-outer-end{ - border-top: 2px solid; - border-right: 2px solid; - border-bottom: 2px solid; - width: 50px; - height: 100px; - display: flex; - align-items: center; - justify-content: center; -} -.pagina-imposicion-outer{ - border-top: 2px solid; - border-bottom: 2px solid; - width: 50px; - height: 100px; - display: flex; - align-items: center; - justify-content: center; -} -.pagina-imposicion-inner{ - border: 2px solid; - font-size: 25px; - width: 40px; - height: 90px; - display: flex; - align-items: center; - justify-content: center; - -} -.square-wrapper{ - display: grid; - grid-template-columns: repeat(2,1fr); - margin-left: 5px; - -} -.square{ - width: 100px; - height: 50px; - font-size: 14px; - display: flex; - align-items: center; - justify-content: center; - font-weight: bold; -} -.cod{ - width: 150px; - height: 100px; - display: flex; - flex-direction: column; - background-color: orange; - margin-left : 20px; - color: white; - align-items: center; - justify-content: space-between; - font-weight: bold; -} -.cod-code{ - font-weight: bold; - color: white; -} -.esquema-imposicion-wrapper{ - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - margin-left: 2rem; - gap: 10px; -} -.imposicion{ - display: flex; - align-items: center; - justify-content: center; - width: 200px; -} -.imposicion td{ - font-size: large; -} -.cod-barras{ - width: 150px; - height: 80px; - text-align : center; - background-color: white; - align-content: center; -} -.cod-barras img { - padding : 1px; -} -.bg-white{ - background-color: white; - color: black; -} -.bg-red{ - background-color: red; - color: white; -} -.bg-gray{ - background-color: gray; - color:white -} -.bg-blue{ - background-color: blue; - color: white; -} From 08a91294b4f9c5c567e25b457068706a1a79f849 Mon Sep 17 00:00:00 2001 From: amazuecos Date: Sun, 13 Apr 2025 09:43:15 +0200 Subject: [PATCH 3/4] dates users ot --- ci4/app/Config/OrdenTrabajo.php | 42 ++++ .../Controllers/Produccion/Ordentrabajo.php | 1 + .../Produccion/OrdenTrabajoDateEntity.php | 78 ++------ .../Produccion/OrdenTrabajoUserEntity.php | 29 +-- ci4/app/Language/es/Produccion.php | 19 +- .../Models/OrdenTrabajo/OrdenTrabajoDate.php | 26 +-- .../Models/OrdenTrabajo/OrdenTrabajoUser.php | 29 +-- ci4/app/Services/ProductionService.php | 38 ++-- .../vuexy/form/produccion/ot/otProgress.php | 185 ++++++++++++------ 9 files changed, 278 insertions(+), 169 deletions(-) create mode 100644 ci4/app/Config/OrdenTrabajo.php diff --git a/ci4/app/Config/OrdenTrabajo.php b/ci4/app/Config/OrdenTrabajo.php new file mode 100644 index 00000000..763bad87 --- /dev/null +++ b/ci4/app/Config/OrdenTrabajo.php @@ -0,0 +1,42 @@ + "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", + //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 function __construct() + { + parent::__construct(); + } + +} diff --git a/ci4/app/Controllers/Produccion/Ordentrabajo.php b/ci4/app/Controllers/Produccion/Ordentrabajo.php index ef39f38a..54b9335d 100755 --- a/ci4/app/Controllers/Produccion/Ordentrabajo.php +++ b/ci4/app/Controllers/Produccion/Ordentrabajo.php @@ -131,6 +131,7 @@ class Ordentrabajo extends BaseController $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(); return view(static::$viewPath . $this->editRoute, $this->viewData); } diff --git a/ci4/app/Entities/Produccion/OrdenTrabajoDateEntity.php b/ci4/app/Entities/Produccion/OrdenTrabajoDateEntity.php index f6b5e79c..352e3ac8 100644 --- a/ci4/app/Entities/Produccion/OrdenTrabajoDateEntity.php +++ b/ci4/app/Entities/Produccion/OrdenTrabajoDateEntity.php @@ -2,34 +2,38 @@ 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, + //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 +41,11 @@ 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" ]; + + + } diff --git a/ci4/app/Entities/Produccion/OrdenTrabajoUserEntity.php b/ci4/app/Entities/Produccion/OrdenTrabajoUserEntity.php index c03df33a..4f516ecd 100644 --- a/ci4/app/Entities/Produccion/OrdenTrabajoUserEntity.php +++ b/ci4/app/Entities/Produccion/OrdenTrabajoUserEntity.php @@ -15,28 +15,35 @@ 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, + //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 +73,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])) { diff --git a/ci4/app/Language/es/Produccion.php b/ci4/app/Language/es/Produccion.php index 603f21b3..d9719aeb 100644 --- a/ci4/app/Language/es/Produccion.php +++ b/ci4/app/Language/es/Produccion.php @@ -57,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", @@ -86,7 +86,22 @@ return [ "size" => "Tamaño", "ejemplares" => "Ejemplares", "tipo" => "Tipo", - "lomo" => "Lomo" + "lomo" => "Lomo", + //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." + ] + ]; \ No newline at end of file diff --git a/ci4/app/Models/OrdenTrabajo/OrdenTrabajoDate.php b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoDate.php index d6a7d7c1..9feb110a 100644 --- a/ci4/app/Models/OrdenTrabajo/OrdenTrabajoDate.php +++ b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoDate.php @@ -17,25 +17,29 @@ 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", + //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; diff --git a/ci4/app/Models/OrdenTrabajo/OrdenTrabajoUser.php b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoUser.php index c1a232f5..3bc18711 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,35 @@ 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", + //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 +80,5 @@ class OrdenTrabajoUser extends Model protected $beforeDelete = []; protected $afterDelete = []; - } diff --git a/ci4/app/Services/ProductionService.php b/ci4/app/Services/ProductionService.php index 0a325cf9..eab9ef70 100644 --- a/ci4/app/Services/ProductionService.php +++ b/ci4/app/Services/ProductionService.php @@ -25,6 +25,7 @@ use CodeIgniter\Database\BaseResult; use CodeIgniter\Database\Exceptions\DatabaseException; use CodeIgniter\HTTP\Files\UploadedFile; use CodeIgniter\I18n\Time; +use Config\OrdenTrabajo; use Exception; /** @@ -46,22 +47,7 @@ class ProductionService extends BaseService 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; /** * Pedido Entity @@ -84,6 +70,7 @@ class ProductionService extends BaseService $this->otUser = model(OrdenTrabajoUser::class); $this->userModel = model(UserModel::class); $this->otFileModel = model(OrdenTrabajoFileModel::class); + $this->ordenTrabajoConfig = config('OrdenTrabajo'); } public function init(int $orden_trabajo_id): self { @@ -627,6 +614,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(), @@ -757,8 +745,8 @@ class ProductionService extends BaseService ->update($data); $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]; @@ -1034,4 +1022,18 @@ class ProductionService extends BaseService } 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; + } } diff --git a/ci4/app/Views/themes/vuexy/form/produccion/ot/otProgress.php b/ci4/app/Views/themes/vuexy/form/produccion/ot/otProgress.php index 380dfb68..e22dd511 100644 --- a/ci4/app/Views/themes/vuexy/form/produccion/ot/otProgress.php +++ b/ci4/app/Views/themes/vuexy/form/produccion/ot/otProgress.php @@ -21,69 +21,136 @@
- -
- - +
+ + +
+ + +
+
+ +
+ + +
+ +
+ +
+ + +
+ +
+ +
+ + +
+ +
+ +
+ + +
+ +
- -
- - +
+ +
+ + +
+ +
+ +
+ + +
+ +
+ +
+ + +
+ +
+ +
+ + +
+ +
+ +
+ + +
+ +
- -
- - +
+ + + +
+ + +
+ +
+ +
+ + +
+ +
- -
- - +
+ +
+ + +
+ +
+ +
+ + +
+ +
+ +
+ + +
+ +
+ +
+ + +
+ +
+ +
+ + +
+ +
+
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
-
From e9827c3557543db2c404e3827c06b65c7daa4b50 Mon Sep 17 00:00:00 2001 From: amazuecos Date: Mon, 14 Apr 2025 08:05:03 +0200 Subject: [PATCH 4/4] fechas pedido and imposiciones --- ci4/app/Config/OrdenTrabajo.php | 7 ++ ci4/app/Config/Routes.php | 2 + .../Controllers/Produccion/Ordentrabajo.php | 37 +++++-- ci4/app/Entities/Pedidos/PedidoEntity.php | 20 ++++ .../Presupuestos/PresupuestoLineaEntity.php | 4 + .../Produccion/OrdenTrabajoEntity.php | 4 +- .../Produccion/OrdenTrabajoTareaEntity.php | 6 +- ci4/app/Language/es/Produccion.php | 4 +- .../Models/OrdenTrabajo/OrdenTrabajoDate.php | 19 +--- ci4/app/Services/ProductionService.php | 93 +++++++++++++++-- .../vuexy/form/produccion/ot/otDates.php | 20 ++-- .../vuexy/form/produccion/ot/otHeader.php | 2 +- .../vuexy/form/produccion/ot/otProgress.php | 16 +-- .../Views/themes/vuexy/pdfs/orden_trabajo.php | 36 +++---- .../assets/js/safekat/pages/pdf/otDownload.js | 20 ++-- .../assets/js/safekat/pages/produccion/ot.js | 95 +++++++++++++----- httpdocs/themes/vuexy/css/pdf.ot.css | 36 +++++-- .../vuexy/img/safekat/presupuestos/cmyk.png | Bin 0 -> 1028 bytes 18 files changed, 315 insertions(+), 106 deletions(-) create mode 100644 httpdocs/themes/vuexy/img/safekat/presupuestos/cmyk.png diff --git a/ci4/app/Config/OrdenTrabajo.php b/ci4/app/Config/OrdenTrabajo.php index 763bad87..1d91e1d2 100644 --- a/ci4/app/Config/OrdenTrabajo.php +++ b/ci4/app/Config/OrdenTrabajo.php @@ -33,6 +33,13 @@ class OrdenTrabajo extends BaseConfig "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 function __construct() { diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index 36133af7..3f308c76 100644 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -735,6 +735,8 @@ $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'); diff --git a/ci4/app/Controllers/Produccion/Ordentrabajo.php b/ci4/app/Controllers/Produccion/Ordentrabajo.php index 54b9335d..5bbff500 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 @@ -132,6 +151,8 @@ class Ordentrabajo extends BaseController $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); } @@ -233,8 +254,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 ]) - + ->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) @@ -244,7 +264,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"]; @@ -252,6 +271,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]); @@ -259,7 +284,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) @@ -283,7 +308,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); 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/OrdenTrabajoEntity.php b/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php index e60a9671..0728d4b9 100644 --- a/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php +++ b/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php @@ -134,10 +134,10 @@ class OrdenTrabajoEntity extends Entity { return $this->pedidoEsperaBy(); } - public function getPortadaPath(): ?string + public function getFullPath(): ?string { helper('filesystem'); - $path = $this->attributes["portada_path"]; + $path = WRITEPATH . 'uploads/' . $this->attributes["portada_path"]; $portada_path = null; if($path){ if(file_exists($path)){ diff --git a/ci4/app/Entities/Produccion/OrdenTrabajoTareaEntity.php b/ci4/app/Entities/Produccion/OrdenTrabajoTareaEntity.php index 946b3819..883f76ad 100644 --- a/ci4/app/Entities/Produccion/OrdenTrabajoTareaEntity.php +++ b/ci4/app/Entities/Produccion/OrdenTrabajoTareaEntity.php @@ -110,7 +110,11 @@ class OrdenTrabajoTareaEntity extends Entity public function imposicion() : ?Imposicion { $m = model(ImposicionModel::class); - return $m->find($this->attributes["imposicion_id"]); + $imposicion = null; + if($this->attributes["imposicion_id"]){ + $imposicion = $m->find($this->attributes["imposicion_id"]); + } + return $imposicion; } } diff --git a/ci4/app/Language/es/Produccion.php b/ci4/app/Language/es/Produccion.php index d9719aeb..c8cb238b 100644 --- a/ci4/app/Language/es/Produccion.php +++ b/ci4/app/Language/es/Produccion.php @@ -99,7 +99,9 @@ return [ "errors" => [ - "date_not_exist" => "Esta fecha no existe en el modelo." + "date_not_exist" => "Esta fecha no existe en el modelo", + "attr_not_exist" => "El atributo {0,string} no pertenece al modelo Pedido" + ] diff --git a/ci4/app/Models/OrdenTrabajo/OrdenTrabajoDate.php b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoDate.php index 9feb110a..83f62c54 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 { @@ -107,22 +108,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/Services/ProductionService.php b/ci4/app/Services/ProductionService.php index eab9ef70..ade89a42 100644 --- a/ci4/app/Services/ProductionService.php +++ b/ci4/app/Services/ProductionService.php @@ -19,6 +19,7 @@ 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; @@ -43,6 +44,7 @@ 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; @@ -70,6 +72,7 @@ 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'); } public function init(int $orden_trabajo_id): self @@ -627,6 +630,7 @@ class ProductionService extends BaseService "tareas_encuadernacion" => $this->tareas_encuadernacion(), "tareas_preimpresion" => $this->tareas_preimpresion(), "tareas_impresion" => $this->tareas_impresion(), + "tiempo_procesamiento" => $this->getTiempoProcesamientoHHMM(), ]; return $summary; } @@ -650,7 +654,9 @@ class ProductionService extends BaseService "linea_cubierta" => $this->presupuesto->presupuestoLineaCubierta(), "peso_unidad" => $logistica_data["peso_unidad"], "peso_pedido" => $logistica_data["peso_pedido"], - "imposicion" => $this->getImposicionTareaImpresion() + "imposicion" => $this->getImposicionTareaImpresion(), + "tiempo_procesamiento" => $this->getTiempoProcesamientoHHMM(), + ]; } public function getImposicionTareaImpresion(): ?Imposicion @@ -658,10 +664,10 @@ class ProductionService extends BaseService $imposicion = null; $impresionInteriorBnImposicion = $this->getTareaImpresionInteriorBn()?->imposicion(); $impresionInteriorColorImposicion = $this->getTareaImpresionInteriorColor()?->imposicion(); - if($impresionInteriorBnImposicion){ + if ($impresionInteriorBnImposicion) { $imposicion = $impresionInteriorBnImposicion; } - if($impresionInteriorColorImposicion){ + if ($impresionInteriorColorImposicion) { $imposicion = $impresionInteriorColorImposicion; } return $imposicion; @@ -755,16 +761,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 *========================================================================**/ @@ -1022,18 +1057,60 @@ class ProductionService extends BaseService } return $status; } - public function userDates() : array + 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(); + $otUserEntity = $this->otUser->where("orden_trabajo_id", $this->ot->id)->first(); $userEntity = $otUserEntity->userBy($value); - if($userEntity){ + if ($userEntity) { $userDates[$key] = $userEntity->full_name; - }else{ + } 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; + } } diff --git a/ci4/app/Views/themes/vuexy/form/produccion/ot/otDates.php b/ci4/app/Views/themes/vuexy/form/produccion/ot/otDates.php index d569c1ec..c45bb0c8 100644 --- a/ci4/app/Views/themes/vuexy/form/produccion/ot/otDates.php +++ b/ci4/app/Views/themes/vuexy/form/produccion/ot/otDates.php @@ -15,27 +15,33 @@
- +
- + +
+
- + +
+
- + +
+
@@ -43,12 +49,13 @@
- + +
+
tarifa()->nombre ?> solapas ? "SI" : "NO" ?> hasSobrecubierta() ? "SI" : "NO" ?> pliegos_libro?>/pliegos_pedido?> __________ guardas ? "SI" : "NO" ?> retractilado ? "SI" : "NO" ?> marcapaginas ? "SI" : "NO" ?>
@@ -186,8 +186,8 @@ $settings = $session->get('settings');
- - + +
Imposicionfull_name ?>Imposicionfull_name ?? "" ?>
@@ -201,13 +201,13 @@ $settings = $session->get('settings'); - + - + - + - +
?? ancho ?>xalto ?> tirada ?> tirada ?> tipo ?> tipo ?> lomo_cubierta ?> lomo_cubierta,2,',','.') ?>
@@ -294,13 +294,13 @@ $settings = $session->get('settings');
- + - + - - - + + +
Plastificadotarifa()->nombre ?>tarifa()->nombre ?> UVI ?? ?? Máquina $q->nombre, $acabados[0]->maquinas())) ?> Operariousers()?->plastificado_by?->getFullName() ?? null ?> $q->nombre, $acabados[0]->maquinas())) ?> Operariousers()?->plastificado_by?->getFullName() ?? null ?>
@@ -372,7 +372,7 @@ $settings = $session->get('settings');
- © 2024 SAFEKAT. Todos los derechos reservados. + © 2024 SAFEKAT. Todos los derechos reservados.
diff --git a/httpdocs/assets/js/safekat/pages/pdf/otDownload.js b/httpdocs/assets/js/safekat/pages/pdf/otDownload.js index d8eb9caa..65f4aca3 100644 --- a/httpdocs/assets/js/safekat/pages/pdf/otDownload.js +++ b/httpdocs/assets/js/safekat/pages/pdf/otDownload.js @@ -1,12 +1,12 @@ $(() => { - // console.log("PDF") - // var opt = { - // margin: 2, - // filename: "PDF_OrdenTrabajo_" + $(".pdf-wrapper").data("id") + ".pdf", - // image: { type: 'jpeg', quality: 1 }, - // html2canvas: { scale: 3 }, - // jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' } - // }; - // let elementToPdf = $('body')[0] - // html2pdf().set(opt).from(elementToPdf).save() + console.log("PDF") + var opt = { + margin: 2, + filename: "PDF_OrdenTrabajo_" + $(".pdf-wrapper").data("id") + ".pdf", + image: { type: 'jpeg', quality: 1 }, + html2canvas: { scale: 4 }, + jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' } + }; + let elementToPdf = $('body')[0] + html2pdf().set(opt).from(elementToPdf).save() }) \ No newline at end of file diff --git a/httpdocs/assets/js/safekat/pages/produccion/ot.js b/httpdocs/assets/js/safekat/pages/produccion/ot.js index 335483c9..ac3c5307 100644 --- a/httpdocs/assets/js/safekat/pages/produccion/ot.js +++ b/httpdocs/assets/js/safekat/pages/produccion/ot.js @@ -1,7 +1,7 @@ import Ajax from "../../components/ajax.js" import ClassSelect from "../../components/select2.js"; import DatePicker from "../../components/datepicker.js"; -import { alertConfirmationDelete, alertSuccess } from "../../components/alerts/sweetAlert.js"; +import { alertConfirmAction, alertConfirmationDelete, alertSuccess } from "../../components/alerts/sweetAlert.js"; import Modal from "../../components/modal.js" import FileUploadDropzone from '../../components/forms/fileUploadDropzone.js'; class OrdenTrabajo { @@ -60,13 +60,7 @@ class OrdenTrabajo { dateFormat: "Y-m-d", allowInput: true, } - this.tiempoProcesamiento = new DatePicker(this.otForm.find("#ot-tiempo-procesamiento"), { - dateFormat: "H:i", - enableTime: true, - noCalendar: true, - time_24hr: true, - allowInput: true, - }) + this.tiempoProcesamiento = this.otForm.find("#ot-tiempo-procesamiento") this.fechaImpresion = new DatePicker(this.otForm.find("#ot-fecha-impresion"), option) this.fechaEncuadernado = new DatePicker(this.otForm.find("#ot-fecha-encuadernado"), option) this.fechaEntregaExterno = new DatePicker(this.otForm.find("#ot-fecha-entrega-externo"), option) @@ -78,6 +72,8 @@ class OrdenTrabajo { this.ferroOk = new DatePicker(this.otForm.find("#ot-ferro-ok"), option) this.plakeneTraslucido = new DatePicker(this.otForm.find("#ot-plakene-traslucido"), option) this.impresionColor = new DatePicker(this.otForm.find("#ot-impresion-color"), option) + this.impresionBN = new DatePicker(this.otForm.find("#ot-impresion-bn"), option) + this.portada = new DatePicker(this.otForm.find("#ot-portada"), option) this.plastificadoMate = new DatePicker(this.otForm.find("#ot-plastificado-mate"), option) this.prepGuillotina = new DatePicker(this.otForm.find("#ot-prep-guillotina"), option) @@ -85,6 +81,17 @@ class OrdenTrabajo { this.embalaje = new DatePicker(this.otForm.find("#ot-embalaje"), option) this.envio = new DatePicker(this.otForm.find("#ot-envio"), option) + //REVISION PREIMPRESION + this.preFormatoAt = new DatePicker(this.otForm.find("#ot-preformato-date"), option) + this.preLomoAt = new DatePicker(this.otForm.find("#ot-prelomo-date"), option) + this.preSolapaAt = new DatePicker(this.otForm.find("#ot-presolapa-date"), option) + this.preCodBarrasAt = new DatePicker(this.otForm.find("#ot-precodbarras-date"), option) + this.preImposicionAt = new DatePicker(this.otForm.find("#ot-preimposicion-date"), option) + + + + + } eventTareas() { @@ -119,7 +126,7 @@ class OrdenTrabajo { this.tareasTableItem.on("xhr.dt", this.unbindEventTareas.bind(this)) this.otForm.on("click", "#btn-upload-portada", this.handleUploadPortada.bind(this)) this.otForm.on("click", "#btn-delete-portada", this.handleDeletePortada.bind(this)) - this.otForm.on("click", "#btn-finalizar-orden-pedido", this.handleFinalizarPedido.bind(this)) + this.btnFinalizarPedido.on("click", this.handleFinalizarPedido.bind(this)) this.tareasTableItem.on("click", ".ot-tarea-btn-delete", this.handleTareaDeleteConfirmation.bind(this)) this.item.on("click", "#btn-reset-tareas", this.handleResetTareasDeleteConfirmation.bind(this)) this.otForm.on("click", ".ot-tarea-comment", this.handleNoteTarea.bind(this)) @@ -205,7 +212,6 @@ class OrdenTrabajo { } createSelectMaquinaTarea() { try { - console.log("Create selects") this.summaryData.tasks.forEach(element => { let selectItem = this.item.find("#select-maquina-tarea-" + element.id); if (element.presupuesto_linea_id && element.is_corte == false) this.createSelectMaquinaImpresion(selectItem) @@ -326,6 +332,8 @@ class OrdenTrabajo { try { this.summaryData = data this.otForm.off("change", ".ot-date") + this.otForm.off("change", ".ot-pedido") + this.otForm.off("change", ".ot-pedido-check") this.otForm.off("change", ".ot-preview") this.fillOtDetails() this.fillOtDates() @@ -335,6 +343,8 @@ class OrdenTrabajo { } finally { this.otForm.on("change", ".ot-date", this.handleDateChange.bind(this)) + this.otForm.on("change", ".ot-pedido", this.handlePedidoChange.bind(this)) + this.otForm.on("change", ".ot-pedido-check", this.handlePedidoCheckChange.bind(this)) this.otForm.on("change", ".ot-preview", this.handlePreimpresionReviewChange.bind(this)) Notiflix.Block.remove('.section-block'); @@ -354,28 +364,28 @@ class OrdenTrabajo { this.otForm.find("[name=revisar_codigo_barras]").prop("checked", this.summaryData.ot.revisar_codigo_barras) this.otForm.find("[name=realizar_imposicion]").prop("checked", this.summaryData.ot.realizar_imposicion) this.otForm.find("[name=enviar_impresion]").prop("checked", this.summaryData.ot.enviar_impresion) + this.otForm.find("[name=inaplazable]").prop("checked", this.summaryData.pedido.inaplazable) + } fillOtDetails() { const progreso = this.summaryData.ot.progreso - // this.otForm.find("#ot-progress-bar").attr('aria-valuenow', progreso).text(progreso + "%").css("width", progreso + "%") - // this.otForm.find("#ot-paginas").text(this.summaryData.presupuesto.paginas) - // this.otForm.find("#ot-tirada").text(this.summaryData.presupuesto.tirada) - // this.otForm.find("#ot-merma").text(this.summaryData.presupuesto.merma) + this.otForm.find("#ot-progress-bar").attr('aria-valuenow', progreso).text(progreso + "%").css("width", progreso + "%") } fillOtDates() { - this.fechaImpresion.setDate(this.summaryData.dates.fecha_impresion_at) - this.fechaEncuadernado.setDate(this.summaryData.dates.fecha_encuadernado_at) - // this.fechaEntregaExterno.setDate(this.summaryData.dates.fecha_entrega_externo_) - this.fechaEntregaReal.setDate(this.summaryData.dates.fecha_entrega_real_at) - this.fechaEntregaEstimada.setDate(this.summaryData.dates.fecha_entrega_at) + this.fechaImpresion.setDate(this.summaryData.pedido.fecha_impresion) + this.fechaEncuadernado.setDate(this.summaryData.pedido.fecha_encuadernado) + this.fechaEntregaExterno.setDate(this.summaryData.pedido.fecha_entrega_externo) + this.fechaEntregaReal.setDate(this.summaryData.pedido.fecha_entrega_real) + // this.fechaEntregaEstimada.setDate(this.summaryData.pedido.fecha_entrega_at) this.pendienteFerro.setDate(this.summaryData.dates.pendiente_ferro_at) this.ferroCliente.setDate(this.summaryData.dates.ferro_en_cliente_at) this.ferroOk.setDate(this.summaryData.dates.ferro_ok_at) // this.plakeneTraslucido.setDate(this.summaryData.dates.fecha_impresion_at) this.impresionColor.setDate(this.summaryData.dates.interior_color_at) + this.impresionBN.setDate(this.summaryData.dates.interior_bn_at) this.portada.setDate(this.summaryData.dates.cubierta_at) this.plastificadoMate.setDate(this.summaryData.dates.plastificado_at) this.prepGuillotina.setDate(this.summaryData.dates.corte_at) @@ -383,12 +393,19 @@ class OrdenTrabajo { this.embalaje.setDate(this.summaryData.dates.embalaje_at) this.envio.setDate(this.summaryData.dates.envio_at) this.pedidoEnEsperaCheck.prop("checked", this.summaryData.ot.is_pedido_espera); + this.tiempoProcesamiento.val(this.summaryData.tiempo_procesamiento); if (this.summaryData.ot.pedido_espera_by) { this.pedidoEnEsperaBy.text([this.summaryData.ot.pedido_espera_by.first_name, this.summaryData.ot.pedido_espera_by.last_name].join(" ")) } else { this.pedidoEnEsperaBy.text(""); } this.otEstado.val(this.summaryData.ot.estado) + this.preFormatoAt.setDate(this.summaryData.dates.pre_formato_at) + this.preLomoAt.setDate(this.summaryData.dates.pre_lomo_at) + this.preSolapaAt.setDate(this.summaryData.dates.pre_solapa_at) + this.preCodBarrasAt.setDate(this.summaryData.dates.pre_codbarras_at) + this.preImposicionAt.setDate(this.summaryData.dates.pre_imposicion_at) + } @@ -398,7 +415,6 @@ class OrdenTrabajo { const data = {} data[key] = $(event.currentTarget).val() data["orden_trabajo_tarea_id"] = $(event.currentTarget).data("id") - console.log(data); const ajax = new Ajax( "/produccion/ordentrabajo/update/tarea", data, @@ -428,7 +444,6 @@ class OrdenTrabajo { } handleTareaChangeError(error) { } handleOtComment(event) { - console.log($(event.currentTarget).val()) const ajax = new Ajax( "/produccion/ordentrabajo/update", { @@ -454,7 +469,6 @@ class OrdenTrabajo { data[key] = $(event.currentTarget).val() data["orden_trabajo_id"] = this.modelId data["name"] = key; - console.log(data) const ajax = new Ajax( "/produccion/ordentrabajo/update/date", data, @@ -475,6 +489,36 @@ class OrdenTrabajo { } } handleDateChangeError(errors) { } + handlePedidoChange(event) { + const key = $(event.currentTarget).attr("name") + const data = {} + const element = $(event.currentTarget); + data[key] = $(event.currentTarget).val() + data["orden_trabajo_id"] = this.modelId + data["name"] = key; + const ajax = new Ajax( + "/produccion/ordentrabajo/update/pedido/date", + data, + null, + this.handleDateChangeSuccess.bind(this, element), + this.handleDateChangeError.bind(this) + ) + ajax.post(); + } + handlePedidoCheckChange(event) { + const key = $(event.currentTarget).attr("name") + const data = {} + data[key] = $(event.currentTarget).is(":checked") ? 1 : 0 + data["orden_trabajo_id"] = this.modelId + const ajax = new Ajax( + "/produccion/ordentrabajo/update/pedido", + data, + null, + this.handlePreimpresionReviewChangeSuccess.bind(this), + this.handlePreimpresionReviewChangeError.bind(this) + ) + ajax.post(); + } handlePreimpresionReviewChange(event) { const key = $(event.currentTarget).attr("name") const data = {} @@ -583,7 +627,12 @@ class OrdenTrabajo { this.handleEstadoChangeSuccess.bind(this), this.handleEstadoChangeError.bind(this) ); - ajax.post() + alertConfirmAction("Esta acción marcará la orden de trabjao como FINALIZADA") + .then(result => { + if (result.isConfirmed) { + ajax.post() + } + }) } handleEstadoChangeSuccess(response) { popSuccessAlert(response.message) diff --git a/httpdocs/themes/vuexy/css/pdf.ot.css b/httpdocs/themes/vuexy/css/pdf.ot.css index 03236f49..db367ef9 100644 --- a/httpdocs/themes/vuexy/css/pdf.ot.css +++ b/httpdocs/themes/vuexy/css/pdf.ot.css @@ -35,11 +35,12 @@ body{ border: 2px solid; } .square{ - font-size: 14px; align-items: center; align-content : center; justify-content: center; font-weight: bold; + font-size : 20px; + } .esquema{ display: flex; @@ -126,18 +127,24 @@ body{ table { width: 100%; - border-collapse: collapse; margin-bottom: 5px; - font-size: 12px; + font-size: 10px; } -table th, table td { - border: 2px solid #000000; + + table td { text-align: center; } +table,th,td{ + border: 0.1px solid rgb(0, 0, 0); + border-collapse: collapse; +} + table th { background-color: #f4f4f4; font-weight: bold; color : black; + text-align: center; + } table td{ font-weight: bold; @@ -158,6 +165,23 @@ table td{ padding-left: 0.2rem; } .t-row{ - font-size: 10px; + font-size: 8px; width : 100%; +} +.bicolor{ + background: linear-gradient( to right, #00b5fc 0%, #00b5fc 45%, #000000 55%, #000000 100%); + color: white; +} +.cmyk{ + background-image: url('/themes/vuexy/img/safekat/presupuestos/cmyk.png') + background-size: 110px; + text-shadow: 0px 0px 1px black; + stroke:black; +} +.bn{ + background : black; + color: white; +} +.footer{ + font-size : 10px } \ No newline at end of file diff --git a/httpdocs/themes/vuexy/img/safekat/presupuestos/cmyk.png b/httpdocs/themes/vuexy/img/safekat/presupuestos/cmyk.png new file mode 100644 index 0000000000000000000000000000000000000000..436b4867b56ad743bb33cd67e3821600eb4de1e3 GIT binary patch literal 1028 zcmeAS@N?(olHy`uVBq!ia0y~yV4MJC|KMN)l85p)_yZ}<0*}aI1_r*vAk26?e?