63 Commits

Author SHA1 Message Date
5138681718 feat/ot-datatable-news 2025-05-02 07:56:28 +02:00
9283059f9d Merge branch 'fix/entrega_taller_bubok' into 'main'
corregido

See merge request jjimenez/safekat!763
2025-05-01 07:08:36 +00:00
b75278f449 corregido 2025-05-01 09:08:14 +02:00
3fb944ff97 Merge branch 'mod/importador_bubok' into 'main'
añadido ajuste de precio, url en comentarios y crear pedido y ot

See merge request jjimenez/safekat!762
2025-05-01 06:59:59 +00:00
c7250cb8fd añadido ajuste de precio, url en comentarios y crear pedido y ot 2025-05-01 08:59:34 +02:00
7a9b2af8a6 Merge branch 'feat/ot-new-features' into 'main'
Features:

See merge request jjimenez/safekat!761
2025-05-01 04:16:42 +00:00
cf5a42de8d Merge branch 'main' into feat/ot-new-features 2025-05-01 06:15:26 +02:00
a259d76e5e ot new features 2025-05-01 06:02:22 +02:00
f696153d74 Merge branch 'fix/pliegos_presupuesto' into 'main'
terminado

See merge request jjimenez/safekat!760
2025-04-30 18:24:13 +00:00
9181905233 terminado 2025-04-30 20:23:45 +02:00
0ec7dff479 Merge branch 'feat/importador_bubok' into 'main'
Primera version del importador de Bubok

See merge request jjimenez/safekat!759
2025-04-30 13:39:21 +00:00
b0fb0f18fb Primera version del importador de Bubok 2025-04-30 15:36:33 +02:00
cf4c4df80a Features:
- Prototipo PDF
 - Ferro PDF
 - Ferro OK fecha cambiado a Ferro/Prototipo OK
 - Comentarios para orden,impresion,cubierta,encuadernacion y logistica
 - Migración para comentarios
 - Tarifas acabado migraciones con campos para identificar mejor si es plastificado,plakene,retractilado y el tipo de cada uno
2025-04-30 09:23:37 +02:00
36c9227586 fix pdf tables encuadernacion. Add tarifa acabado configuration for ots 2025-04-30 01:25:24 +02:00
4e9dfb51c7 Merge branch 'fix/descuento_con_ajuste' into 'main'
arreglado

See merge request jjimenez/safekat!757
2025-04-29 18:03:58 +00:00
5aab9a33ac arreglado 2025-04-29 20:03:02 +02:00
ea762a09c0 Merge branch 'fix/confirmar_presupuesto_ajustado' into 'main'
corregido

See merge request jjimenez/safekat!756
2025-04-29 17:56:28 +00:00
21014d029f corregido 2025-04-29 19:56:08 +02:00
9c31f2bbc5 Merge branch 'add/configuracion_cliente_cambios_importador_catalogo' into 'main'
terminado

See merge request jjimenez/safekat!755
2025-04-29 17:33:59 +00:00
b288ca498c terminado 2025-04-29 19:30:35 +02:00
96a6845c0c Merge branch 'feat/importador_rama_2' into 'main'
Feat/importador rama 2

See merge request jjimenez/safekat!754
2025-04-29 15:10:55 +00:00
eed5c0994e Importador rama con ajuste del precio 2025-04-29 17:09:19 +02:00
e2ab42cd84 Arreglado bug impresora de tickets (logistica) 2025-04-29 17:01:16 +02:00
7da76af866 Primera version del importador RAMA 2025-04-29 15:42:50 +02:00
bf1e66d746 Corregido bug en API imprimelibros 2025-04-29 12:40:35 +02:00
adccc414be Merge branch 'fix/bugs-ot' into 'main'
Fix/bugs ot

See merge request jjimenez/safekat!752
2025-04-28 06:13:50 +00:00
95fa192cb9 remove ? from orden_trabajo pdf 2025-04-28 08:12:22 +02:00
9310d2dabd delete class text-center from div.card otTask 2025-04-28 08:06:44 +02:00
3abf45ca6e tiempo real tarea empty when created 2025-04-28 08:00:39 +02:00
6ea22066c2 Merge branch 'feat/festivos-calendar' into 'main'
Feat/festivos calendar

See merge request jjimenez/safekat!751
2025-04-28 00:11:16 +00:00
bf21a336b1 Merge branch 'main' into feat/festivos-calendar 2025-04-28 02:10:52 +02:00
d1e5731d1d create POD dates pedido 2025-04-28 02:03:40 +02:00
029757bb40 add calendar festivos 2025-04-28 00:42:15 +02:00
bb4c9690b9 Merge branch 'feat/importador_rama' into 'main'
Feat/importador rama

See merge request jjimenez/safekat!750
2025-04-27 20:01:26 +00:00
6d45a950df Trabajando JS 2025-04-27 22:00:52 +02:00
6f8890a8b1 Merge branch 'main' into 'feat/importador_rama'
Main

See merge request jjimenez/safekat!749
2025-04-27 18:56:08 +00:00
c093c01c00 Merge branch 'main' into feat/festivos-calendar 2025-04-27 19:30:31 +02:00
a4532a7ff6 Merge branch 'fix/filter-datatable-ot' into 'main'
Fix/filter datatable ot

See merge request jjimenez/safekat!748
2025-04-27 17:27:30 +00:00
31a12ff343 try catch getTiempoProcesamientoHHMM 2025-04-27 19:26:02 +02:00
1d6f5fe53e default table encuadernacion 2025-04-27 19:24:11 +02:00
0b767c63e9 fix filter ferro 2025-04-27 19:13:06 +02:00
e464652fe2 festivo entity model 2025-04-27 19:01:23 +02:00
dd20f2a20e Merge branch 'maquinista-change-user' into 'main'
Maquinista change user

See merge request jjimenez/safekat!747
2025-04-27 16:54:35 +00:00
97554bffc9 add maquinista change user session 2025-04-27 18:53:24 +02:00
73e9e941ed Merge branch 'main' into maquinista-change-user 2025-04-27 12:25:09 +02:00
05720cf1ce Merge branch 'fix/migrate' into 'main'
fix migrate class name

See merge request jjimenez/safekat!746
2025-04-27 10:20:33 +00:00
04e9e3ee6f fix migrate class name 2025-04-27 12:18:20 +02:00
9804a6a927 change user session 2025-04-27 12:17:31 +02:00
3402e67fb2 Merge branch 'add/envio_ferros' into 'main'
Add/envio ferros

See merge request jjimenez/safekat!745
2025-04-27 10:14:05 +00:00
b1932e6f85 terminado envio de ferros 2025-04-27 12:12:52 +02:00
13ae70236e Merge branch 'feat/sk-44' into 'main'
Feat/sk 44

See merge request jjimenez/safekat!744
2025-04-27 09:00:23 +00:00
a0b5f3b4df trabajando en envio de ferros 2025-04-27 09:51:52 +02:00
0e444295e3 trabajando en el formulario envio de ferros 2025-04-27 09:51:04 +02:00
ae7707057a Cambiando titulo pagina 2025-04-27 09:17:46 +02:00
ff115f4f20 Configurando logica de captacion del Excel 2025-04-27 09:16:15 +02:00
ae456c8890 Implementado script principal 2025-04-27 00:00:58 +02:00
e8958dc893 Implementado menu lateral 2025-04-26 23:23:04 +02:00
b0ac132e59 Arreglado bug en archivo de migrate del catalogo 2025-04-26 23:05:15 +02:00
b50e564641 Desplegando arcihvos iniciales 2025-04-26 21:32:22 +02:00
894770d6ce Merge branch 'feat/importador_rama' of https://git.imnavajas.es/jjimenez/safekat into feat/importador_rama 2025-04-26 21:25:18 +02:00
367c7c2ea8 Merge branch 'main' into 'feat/importador_rama'
Main

See merge request jjimenez/safekat!743
2025-04-26 19:24:58 +00:00
9375b9b624 Añadiendo idiomas 2025-04-26 21:22:39 +02:00
033184cfa2 Iniciando herramienta de importacion desde catalogo 2025-04-26 16:52:59 +02:00
344 changed files with 44275 additions and 1787 deletions

View File

@ -12,8 +12,14 @@ class OrdenTrabajo extends BaseConfig
"interior_bn_at" => "interior_bn_user_id", "interior_bn_at" => "interior_bn_user_id",
"interior_color_at" => "interior_color_user_id", "interior_color_at" => "interior_color_user_id",
"cubierta_at" => "cubierta_user_id", "cubierta_at" => "cubierta_user_id",
"sobrecubierta_at" => "sobrecubierta_user_id",
"guarda_at" => "guarda_user_id",
//ACABADO //ACABADO
"plastificado_at" => "plastificado_user_id", "plastificado_at" => "plastificado_user_id",
"plakene_at" => "plakene_user_id",
"retractilado_at" => "retractilado_user_id",
"estampado_at" => "estampado_user_id",
"uvi_at" => "uvi_user_id",
"encuadernacion_at" => "encuadernacion_user_id", "encuadernacion_at" => "encuadernacion_user_id",
"corte_at" => "corte_user_id", "corte_at" => "corte_user_id",
"preparacion_interiores_at" => "preparacion_interior_user_id", "preparacion_interiores_at" => "preparacion_interior_user_id",
@ -21,7 +27,6 @@ class OrdenTrabajo extends BaseConfig
"cosido_at" => "cosido_user_id", "cosido_at" => "cosido_user_id",
"grapado_at" => "grapado_user_id", "grapado_at" => "grapado_user_id",
"solapa_at" => "solapa_user_id", "solapa_at" => "solapa_user_id",
"retractilado_at" => "retractilado_user_id",
"retractilado5_at" => "retractilado5_user_id", "retractilado5_at" => "retractilado5_user_id",
"prototipo_at" => "prototipo_user_id", "prototipo_at" => "prototipo_user_id",
"marcapaginas_at" => "marcapaginas_user_id", "marcapaginas_at" => "marcapaginas_user_id",
@ -100,9 +105,9 @@ class OrdenTrabajo extends BaseConfig
]; ];
public array $OT_PLASTIFICADO_COLOR = public array $OT_PLASTIFICADO_COLOR =
[ [
"BRIL" => ["bg" => "#00B0F0", "color" => "white"], "BRILLO" => ["bg" => "#00B0F0", "color" => "white"],
"MATE" => ["bg" => "#FF0000", "color" => "white"], "MATE" => ["bg" => "#FF0000", "color" => "white"],
"SOFT_TOUCH" => ["bg" => "#00B050", "color" => "white"], "SOFT" => ["bg" => "#00B050", "color" => "white"],
"SANDY" => ["bg" => "#782170", "color" => "white"], "SANDY" => ["bg" => "#782170", "color" => "white"],
"ANTIRAYADO" => ["bg" => "#E97132", "color" => "white"], "ANTIRAYADO" => ["bg" => "#E97132", "color" => "white"],
"GOFRADO" => ["bg" => "#FFFF00", "color" => "black"], "GOFRADO" => ["bg" => "#FFFF00", "color" => "black"],
@ -116,7 +121,14 @@ class OrdenTrabajo extends BaseConfig
"default" => ["bg" => "white", "color" => "black"], "default" => ["bg" => "white", "color" => "black"],
]; ];
public array $OT_TAREA_STATUS_COLOR = [
"P" => '#FFD63A',
"F" => '#67AE6E',
"S" => '#EB5B00',
"I" => '#3A59D1',
"E" => '#FF0B55',
"D" => '#FFA725',
];
public function __construct() public function __construct()
{ {

Binary file not shown.

View File

@ -40,6 +40,8 @@ foreach (glob(APPPATH . 'Config/Routes/*Routes.php') as $routeFile) {
$routes->group('users', ['namespace' => 'App\Controllers\Configuracion'], function ($routes) { $routes->group('users', ['namespace' => 'App\Controllers\Configuracion'], function ($routes) {
$routes->get('', 'Users::index', ['as' => 'userList']); $routes->get('', 'Users::index', ['as' => 'userList']);
$routes->get('maquinista/change/user','Users::index_maquinista_change_user',['as' => 'maquinistaUserChangeList']);
$routes->get('maquinista/change/session/(:num)','Users::change_user_session/$1',['as' => 'maquinistaChangeUserSession']);
$routes->get('list', 'Users::index', ['as' => 'userList2']); $routes->get('list', 'Users::index', ['as' => 'userList2']);
$routes->get('add', 'Users::add', ['as' => 'newUser']); $routes->get('add', 'Users::add', ['as' => 'newUser']);
$routes->post('add', 'Users::add', ['as' => 'createUser']); $routes->post('add', 'Users::add', ['as' => 'createUser']);
@ -642,6 +644,7 @@ $routes->group('messages', ['namespace' => 'App\Controllers\Chat'], function ($r
$routes->get('datatable/presupuesto', 'ChatController::datatable_presupuesto_messages', ['as' => 'getDatatablePresupuestoMessages']); $routes->get('datatable/presupuesto', 'ChatController::datatable_presupuesto_messages', ['as' => 'getDatatablePresupuestoMessages']);
$routes->get('datatable/pedido', 'ChatController::datatable_pedido_messages', ['as' => 'getDatatablePedidoMessages']); $routes->get('datatable/pedido', 'ChatController::datatable_pedido_messages', ['as' => 'getDatatablePedidoMessages']);
$routes->get('datatable/factura', 'ChatController::datatable_factura_messages', ['as' => 'getDatatableFacturaMessages']); $routes->get('datatable/factura', 'ChatController::datatable_factura_messages', ['as' => 'getDatatableFacturaMessages']);
$routes->get('datatable/ots', 'ChatController::datatable_ot_messages', ['as' => 'getDatatableOtMessages']);
$routes->post('direct', 'ChatController::store_new_direct_message', ['as' => 'storeNewDirectMessage']); $routes->post('direct', 'ChatController::store_new_direct_message', ['as' => 'storeNewDirectMessage']);
$routes->post('direct/client', 'ChatController::store_new_direct_message_client', ['as' => 'storeNewDirectMessageClient']); $routes->post('direct/client', 'ChatController::store_new_direct_message_client', ['as' => 'storeNewDirectMessageClient']);
@ -652,6 +655,8 @@ $routes->group('chat', ['namespace' => 'App\Controllers\Chat'], function ($route
$routes->get('presupuesto/(:num)', 'ChatController::get_chat_presupuesto_view/$1', ['as' => 'getChatPresupuestoView']); $routes->get('presupuesto/(:num)', 'ChatController::get_chat_presupuesto_view/$1', ['as' => 'getChatPresupuestoView']);
$routes->get('pedido/(:num)', 'ChatController::get_chat_pedido_view/$1', ['as' => 'getChatPedidoView']); $routes->get('pedido/(:num)', 'ChatController::get_chat_pedido_view/$1', ['as' => 'getChatPedidoView']);
$routes->get('factura/(:num)', 'ChatController::get_chat_factura_view/$1', ['as' => 'getChatFacturaView']); $routes->get('factura/(:num)', 'ChatController::get_chat_factura_view/$1', ['as' => 'getChatFacturaView']);
$routes->get('ot/(:num)', 'ChatController::get_chat_ot_view/$1', ['as' => 'getChatOtView']);
$routes->get('direct/conversation/(:num)', 'ChatController::get_chat_direct/$1', ['as' => 'getChatDirect']); $routes->get('direct/conversation/(:num)', 'ChatController::get_chat_direct/$1', ['as' => 'getChatDirect']);
$routes->get('direct/users/select/(:num)', 'ChatController::get_chat_direct_select_users/$1', ['as' => 'getChatDirectSelectUsers']); $routes->get('direct/users/select/(:num)', 'ChatController::get_chat_direct_select_users/$1', ['as' => 'getChatDirectSelectUsers']);
@ -746,9 +751,14 @@ $routes->group('produccion', ['namespace' => 'App\Controllers\Produccion'], func
$routes->get('datatable_pendientes', 'Ordentrabajo::datatable_pendientes'); $routes->get('datatable_pendientes', 'Ordentrabajo::datatable_pendientes');
$routes->get('datatable_ferro_pendiente', 'Ordentrabajo::datatable_ferro_pendiente'); $routes->get('datatable_ferro_pendiente', 'Ordentrabajo::datatable_ferro_pendiente');
$routes->get('datatable_ferro_ok', 'Ordentrabajo::datatable_ferro_ok'); $routes->get('datatable_ferro_ok', 'Ordentrabajo::datatable_ferro_ok');
$routes->get('datatable_news', 'Ordentrabajo::datatable_news');
$routes->get('datatable_prod', 'Ordentrabajo::datatable_prod');
$routes->get('datatable_waiting', 'Ordentrabajo::datatable_waiting');
$routes->get('datatable_revision_com', 'Ordentrabajo::datatable_revision_com');
$routes->get('tareas/datatable/(:num)', 'Ordentrabajo::tareas_datatable/$1', ['as' => 'datatableTareasOrdenTrabajo']); $routes->get('tareas/datatable/(:num)', 'Ordentrabajo::tareas_datatable/$1', ['as' => 'datatableTareasOrdenTrabajo']);
$routes->get("tarea/progress/(:num)", "Ordentrabajo::get_orden_trabajo_progress_date/$1"); $routes->get("tarea/progress/(:num)", "Ordentrabajo::get_orden_trabajo_progress_date/$1");
$routes->get('tarea/(:num)', 'Ordentrabajo::find_tarea/$1'); $routes->get('tarea/(:num)', 'Ordentrabajo::find_tarea/$1');
$routes->get('tarea/dates/(:num)','Ordentrabajo::get_orden_trabajo_tareas_dates/$1');
/**====================== /**======================
* UPDATES * UPDATES
*========================**/ *========================**/
@ -757,6 +767,7 @@ $routes->group('produccion', ['namespace' => 'App\Controllers\Produccion'], func
$routes->post("reset/date", 'Ordentrabajo::reset_orden_trabajo_date'); $routes->post("reset/date", 'Ordentrabajo::reset_orden_trabajo_date');
$routes->post("update/pedido/date", 'Ordentrabajo::update_orden_trabajo_pedido_date'); $routes->post("update/pedido/date", 'Ordentrabajo::update_orden_trabajo_pedido_date');
$routes->post("reset/pedido/date", 'Ordentrabajo::reset_orden_trabajo_pedido_date'); $routes->post("reset/pedido/date", 'Ordentrabajo::reset_orden_trabajo_pedido_date');
$routes->post("update/pod/pedido/date/(:num)",'Ordentrabajo::update_pod_pedido_dates/$1');
$routes->post("update/pedido", 'Ordentrabajo::update_orden_trabajo_pedido'); $routes->post("update/pedido", 'Ordentrabajo::update_orden_trabajo_pedido');
$routes->post("update/user", 'Ordentrabajo::update_orden_trabajo_user'); $routes->post("update/user", 'Ordentrabajo::update_orden_trabajo_user');
$routes->post("update", 'Ordentrabajo::update_orden_trabajo'); $routes->post("update", 'Ordentrabajo::update_orden_trabajo');
@ -765,6 +776,7 @@ $routes->group('produccion', ['namespace' => 'App\Controllers\Produccion'], func
$routes->get("color/(:num)", 'Ordentrabajo::get_orden_trabajo_color_status/$1'); $routes->get("color/(:num)", 'Ordentrabajo::get_orden_trabajo_color_status/$1');
$routes->post("update/tarea/progress", "Ordentrabajo::store_orden_trabajo_progress_date"); $routes->post("update/tarea/progress", "Ordentrabajo::store_orden_trabajo_progress_date");
$routes->post("update/tarea/pliegos", "Ordentrabajo::update_orden_trabajo_pliegos"); $routes->post("update/tarea/pliegos", "Ordentrabajo::update_orden_trabajo_pliegos");
$routes->post("update/tarea/proveedor", "Ordentrabajo::update_presupuesto_tarea_proveedor");
$routes->delete("tarea/progress/(:num)", "Ordentrabajo::delete_orden_trabajo_progress_date/$1"); $routes->delete("tarea/progress/(:num)", "Ordentrabajo::delete_orden_trabajo_progress_date/$1");
/**====================== /**======================
@ -777,6 +789,8 @@ $routes->group('produccion', ['namespace' => 'App\Controllers\Produccion'], func
* PDF * PDF
*========================**/ *========================**/
$routes->get('pdf/(:num)', 'Ordentrabajo::get_pdf/$1'); $routes->get('pdf/(:num)', 'Ordentrabajo::get_pdf/$1');
$routes->get('pdf/ferro/(:num)', 'Ordentrabajo::get_ferro_pdf/$1');
$routes->get('pdf/prototipo/(:num)', 'Ordentrabajo::get_prototipo_pdf/$1');
$routes->get('portada/(:num)', 'Ordentrabajo::get_portada_img/$1'); $routes->get('portada/(:num)', 'Ordentrabajo::get_portada_img/$1');
$routes->group('planning', ['namespace' => 'App\Controllers\Produccion'], function ($routes) { $routes->group('planning', ['namespace' => 'App\Controllers\Produccion'], function ($routes) {
$routes->get('select/maquina/rotativa', 'Ordentrabajo::select_maquina_planning_rot'); $routes->get('select/maquina/rotativa', 'Ordentrabajo::select_maquina_planning_rot');
@ -807,6 +821,7 @@ $routes->group('logistica', ['namespace' => 'App\Controllers\Logistica'], functi
$routes->get('print/label/test', 'LogisticaController::print_test_label'); $routes->get('print/label/test', 'LogisticaController::print_test_label');
$routes->get('panel', 'LogisticaController::panel', ['as' => 'LogisticaPanel']); $routes->get('panel', 'LogisticaController::panel', ['as' => 'LogisticaPanel']);
$routes->get('envios', 'LogisticaController::gestionEnvios', ['as' => 'gestionEnvios']); $routes->get('envios', 'LogisticaController::gestionEnvios', ['as' => 'gestionEnvios']);
$routes->get('enviosFerros', 'LogisticaController::gestionEnviosFerros', ['as' => 'gestionEnviosFerros']);
$routes->get('datatableEnvios', 'LogisticaController::datatable_envios'); $routes->get('datatableEnvios', 'LogisticaController::datatable_envios');
$routes->get('datatableLineasEnvios/(:num)', 'LogisticaController::datatable_enviosEdit/$1'); $routes->get('datatableLineasEnvios/(:num)', 'LogisticaController::datatable_enviosEdit/$1');
$routes->get('envio/(:num)', 'LogisticaController::editEnvio/$1'); $routes->get('envio/(:num)', 'LogisticaController::editEnvio/$1');
@ -821,6 +836,7 @@ $routes->group('logistica', ['namespace' => 'App\Controllers\Logistica'], functi
$routes->post('updateProveedorEnvio', 'LogisticaController::updateProveedorEnvio'); $routes->post('updateProveedorEnvio', 'LogisticaController::updateProveedorEnvio');
$routes->post('finalizarEnvio', 'LogisticaController::finalizarEnvio'); $routes->post('finalizarEnvio', 'LogisticaController::finalizarEnvio');
$routes->post('generateEnvio', 'LogisticaController::generarEnvio'); $routes->post('generateEnvio', 'LogisticaController::generarEnvio');
$routes->post('generateEnvioFerro', 'LogisticaController::generarEnvioFerro');
$routes->get('selectForNewEnvio', 'LogisticaController::findForNewEnvio'); $routes->get('selectForNewEnvio', 'LogisticaController::findForNewEnvio');
$routes->get('selectDireccionForEnvio', 'LogisticaController::selectDireccionForEnvio'); $routes->get('selectDireccionForEnvio', 'LogisticaController::selectDireccionForEnvio');
$routes->post('imprimirEtiquetas', 'LogisticaController::imprimirEtiquetas'); $routes->post('imprimirEtiquetas', 'LogisticaController::imprimirEtiquetas');

View File

@ -53,7 +53,6 @@ $routes->group('configuracion', ['namespace' => 'App\Controllers\Configuracion']
$routes->post('duplicate/(:num)', 'Papelesimpresion::duplicate/$1', ['as' => 'duplicatePapelImpresion']); $routes->post('duplicate/(:num)', 'Papelesimpresion::duplicate/$1', ['as' => 'duplicatePapelImpresion']);
$routes->get('select', 'Papelesimpresion::papel_impresion_select', ['as' => 'papelImpresionSelect']); $routes->get('select', 'Papelesimpresion::papel_impresion_select', ['as' => 'papelImpresionSelect']);
$routes->get('show/(:num)', 'Papelesimpresion::papel_impresion_find/$1', ['as' => 'showPapelImpresion']); $routes->get('show/(:num)', 'Papelesimpresion::papel_impresion_find/$1', ['as' => 'showPapelImpresion']);
}); });
/* Maquinas */ /* Maquinas */
@ -149,5 +148,15 @@ $routes->group('configuracion', ['namespace' => 'App\Controllers\Configuracion']
$routes->group("messages", ["namespace" => 'App\Controllers\Chat'], function ($routes) { $routes->group("messages", ["namespace" => 'App\Controllers\Chat'], function ($routes) {
$routes->get('', 'ChatController::config_view', ['as' => 'configMessagesIndex']); $routes->get('', 'ChatController::config_view', ['as' => 'configMessagesIndex']);
}); });
});
/* Festivos */
$routes->group("festivos", ["namespace" => 'App\Controllers\Configuracion'], function ($routes) {
$routes->get('', 'FestivoController::index', ['as' => 'festivosList']);
$routes->post('', 'FestivoController::store_festivo_date', ['as' => 'storeFestivoDate']);
$routes->delete('(:num)', 'FestivoController::delete_festivo_date/$1', ['as' => 'deleteFestivoDate']);
$routes->get('all', 'FestivoController::find_all', ['as' => 'getFindAllFestivos']);
});
});

View File

@ -0,0 +1,38 @@
<?php
use CodeIgniter\Router\RouteCollection;
/** @var RouteCollection $routes */
/* Rutas para tarifas */
$routes->group('importador', ['namespace' => 'App\Controllers\Importadores'], function ($routes) {
/* Desde Catalogo */
$routes->group('catalogo', ['namespace' => 'App\Controllers\Importadores'], function ($routes) {
/**======================
* Tool
*========================**/
$routes->get('', 'ImportadorCatalogo::index', ['as' => 'importadorCatalogoTool']);
/**======================
* AJAX
*========================**/
$routes->post('validar-fila', 'ImportadorCatalogo::validarFila');
$routes->post('importar-fila', 'ImportadorCatalogo::importarFila');
});
/* Desde Cliente Bubok */
$routes->group('bubok', ['namespace' => 'App\Controllers\Importadores'], function ($routes) {
/**======================
* Tool
*========================**/
$routes->get('', 'ImportadorBubok::index', ['as' => 'importadorBubokTool']);
/**======================
* AJAX
*========================**/
$routes->post('importar-fila', 'ImportadorBubok::importarFila');
});
});

View File

@ -184,4 +184,15 @@ class Validation extends BaseConfig
"label" => "maquina", "label" => "maquina",
], ],
]; ];
public array $proveedor_tarea =
[
"proveedor_id" => [
"rules" => "required|integer",
"label" => "Proveedor",
],
"orden_trabajo_tarea_id" => [
"rules" => "required|integer",
"label" => "Tarea",
],
];
} }

View File

@ -5,21 +5,12 @@ namespace App\Controllers\API;
use App\Controllers\Presupuestos\Presupuestocliente; use App\Controllers\Presupuestos\Presupuestocliente;
use CodeIgniter\RESTful\ResourceController; use CodeIgniter\RESTful\ResourceController;
use CodeIgniter\API\ResponseTrait; use CodeIgniter\API\ResponseTrait;
use App\Models\API\ItemModel;
class ImprimelibrosApi extends ResourceController class ImprimelibrosApi extends ResourceController
{ {
use ResponseTrait; use ResponseTrait;
public function index()
{
$model = new ItemModel();
$data = $model->findAll();
return $this->respond($data);
}
public function calcular() public function calcular()
{ {

View File

@ -1,2 +0,0 @@
Portada Id Cliente Título Edición Autor Archivo ISBN EAN Páginas Acciones
Lo que hay que listar

View File

@ -222,6 +222,25 @@ class ChatController extends BaseController
return view(static::$viewPath . 'messageChatInternal', $this->viewData); return view(static::$viewPath . 'messageChatInternal', $this->viewData);
} }
} }
public function get_chat_ot_view($chat_id)
{
$chat = $this->chatModel->find($chat_id);
$this->viewData['breadcrumb'] = [
['title' => lang("Chat.chat"), 'route' => route_to("mensajeriaView"), 'active' => false],
['title' => $chat->title, 'route' => 'javascript:void(0);', 'active' => true]
];
$this->viewData["modelId"] = $chat->orden_trabajo_id;
$this->viewData["type"] = "ot";
$auth_user = auth()->user();
$this->chatModel->setAsViewedChatUserNotifications($chat_id, $auth_user->id);
$this->chatModel->setAsUnviewedChatUserMessages($chat_id, $auth_user->id);
if ($chat->chat_department_id) {
return view(static::$viewPath . 'messageChatFactura', $this->viewData);
} else {
return view(static::$viewPath . 'messageChatInternal', $this->viewData);
}
}
public function get_chat(int $chat_id) public function get_chat(int $chat_id)
{ {
@ -502,6 +521,23 @@ class ChatController extends BaseController
->toJson(true); ->toJson(true);
} }
public function datatable_ot_messages()
{
$auth_user_id = auth()->user()->id;
$isAdmin = auth()->user()->inGroup('admin');
$query = $this->chatModel->getQueryDatatableMessageOrdenTrabajo($auth_user_id);
return DataTable::of($query)
->edit('created_at', fn($q) => $q->created_at ? Time::createFromFormat('Y-m-d H:i:s', $q->created_at)->format("d/m/Y H:i") : "")
->edit('updated_at', fn($q) => $q->updated_at ? Time::createFromFormat('Y-m-d H:i:s', $q->updated_at)->format("d/m/Y H:i") : "")
->edit("creator",fn($q) => $q->userId == $auth_user_id ? '<span class="badge text-bg-success w-100">'.lang("App.me").'</span>' : $q->creator)
->add("viewed", fn($q) => $this->chatModel->isMessageChatViewed($q->chatMessageId))
->add("action", fn($q) => ["type" => "ot", "modelId" => $q->id, "isAdmin" => $isAdmin,"chatMessageId" => $q->chatMessageId, "lang" => [
"view_chat" => lang('Chat.view_chat'),
"view_by_alt_message" => lang('Chat.view_by_alt_message')
]])
->toJson(true);
}
public function get_notifications_not_viewed_from_message(int $chat_message_id) public function get_notifications_not_viewed_from_message(int $chat_message_id)
{ {
$unviewedNotifications = $this->chatModel->getUsersNotificationNotViewedFromChat($chat_message_id); $unviewedNotifications = $this->chatModel->getUsersNotificationNotViewedFromChat($chat_message_id);

View File

@ -0,0 +1,103 @@
<?php
namespace App\Controllers\Configuracion;
use App\Controllers\BaseController;
use App\Controllers\BaseResourceController;
use App\Entities\Configuracion\FestivoEntity;
use App\Models\Collection;
use App\Entities\Configuracion\Imposicion;
use App\Models\Configuracion\FestivoModel;
use App\Models\Configuracion\ImposicionEsquemaModel;
use App\Models\Configuracion\ImposicionModel;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Validation\Validation;
use Hermawan\DataTables\DataTable;
use Psr\Log\LoggerInterface;
class FestivoController extends BaseController
{
protected $modelName = FestivoModel::class;
protected FestivoModel $model;
protected static $controllerSlug = 'festivos';
protected $format = 'json';
protected string $viewPath = 'themes/vuexy/form/configuracion/festivos/';
protected $indexRoute = 'festivoList';
protected array $viewData = [];
protected Validation $validation;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
$this->viewData['pageTitle'] = lang('Festivos.moduleTitle');
$this->viewData['usingSweetAlert'] = true;
$this->model = model($this->modelName);
$this->validation = service("validation");
parent::initController($request, $response, $logger);
}
public function index()
{
return view($this->viewPath . $this->indexRoute);
}
public function store_festivo_date()
{
$bodyData = $this->request->getPost();
$date = $bodyData['date'];
$count = $this->model->where('date',$date)->countAllResults();
if ($count) {
$status = $this->model->where('date', $date)->delete(purge: true);
return $this->response->setJSON([
"message" => lang("App.user_alert_delete"),
"status" => $status,
]);
} else {
$status = $this->model->insert($bodyData);
if ($status) {
$festivoEntity = $this->model->find($status);
return $this->response->setJSON([
"message" => lang("App.global_alert_save_success"),
"status" => $status,
"data" => $festivoEntity
]);
} else {
return $this->response->setJSON([
"message" => lang("App.global_alert_save_error"),
"errors" => $this->model->errors(),
"status" => true
])->setStatusCode(400);
}
}
}
public function delete_festivo_date($id)
{
$status = $this->model->delete($id, true);
if ($status) {
return $this->response->setJSON([
"message" => lang("App.user_alert_delete"),
"status" => $status,
]);
} else {
return $this->response->setJSON([
"message" => lang("App.global_alert_save_error"),
"errors" => $this->model->errors(),
"status" => true
])->setStatusCode(400);
}
}
public function find_all()
{
$festivos = $this->model->findAll();
return $this->response->setJSON([
"message" => lang("App.global_alert_fetch_success"),
"status" => true,
"data" => $festivos
]);
}
}

View File

@ -1,4 +1,6 @@
<?php namespace App\Controllers\Configuracion; <?php
namespace App\Controllers\Configuracion;
use App\Entities\Usuarios\UserEntity; use App\Entities\Usuarios\UserEntity;
use App\Models\Chat\ChatDeparmentModel; use App\Models\Chat\ChatDeparmentModel;
@ -54,7 +56,6 @@ class Users extends \App\Controllers\GoBaseController
]; ];
parent::initController($request, $response, $logger); parent::initController($request, $response, $logger);
} }
public function index() public function index()
@ -118,11 +119,10 @@ class Users extends \App\Controllers\GoBaseController
} // Email is not unique! } // Email is not unique!
else { else {
$this->viewData['errorMessage'] = "El correo '". $sanitizedData['email'] ."' ya está registrado en el sistema"; $this->viewData['errorMessage'] = "El correo '" . $sanitizedData['email'] . "' ya está registrado en el sistema";
$this->session->setFlashdata('formErrors', $this->model->errors()); $this->session->setFlashdata('formErrors', $this->model->errors());
$successfulResult = false; // Hacked $successfulResult = false; // Hacked
} }
} catch (\Exception $e) { } catch (\Exception $e) {
$noException = false; $noException = false;
$this->viewData['errorMessage'] = $e->getMessage(); $this->viewData['errorMessage'] = $e->getMessage();
@ -234,7 +234,6 @@ class Users extends \App\Controllers\GoBaseController
} else { } else {
$successfulResult = $this->model->skipValidation(true)->update($id, $sanitizedData); $successfulResult = $this->model->skipValidation(true)->update($id, $sanitizedData);
} }
} catch (\Exception $e) { } catch (\Exception $e) {
$noException = false; $noException = false;
$this->dealWithException($e); $this->dealWithException($e);
@ -319,8 +318,6 @@ class Users extends \App\Controllers\GoBaseController
$message = "Usuario eliminado correctamente"; $message = "Usuario eliminado correctamente";
return $this->redirect2listView('successMessage', $message); return $this->redirect2listView('successMessage', $message);
} // end function delete(...) } // end function delete(...)
@ -374,9 +371,10 @@ class Users extends \App\Controllers\GoBaseController
} }
} }
public function datatable(){ public function datatable()
{
if($this->request->isAJAX()){ if ($this->request->isAJAX()) {
$reqData = $this->request->getPost(); $reqData = $this->request->getPost();
if (!isset($reqData['draw']) || !isset($reqData['columns'])) { if (!isset($reqData['draw']) || !isset($reqData['columns'])) {
@ -405,7 +403,6 @@ class Users extends \App\Controllers\GoBaseController
$this->model->getResource([])->countAllResults(), $this->model->getResource([])->countAllResults(),
$this->model->getResource($searchValues)->countAllResults() $this->model->getResource($searchValues)->countAllResults()
)); ));
} else { } else {
return $this->failUnauthorized('Invalid request', 403); return $this->failUnauthorized('Invalid request', 403);
} }
@ -447,4 +444,27 @@ class Users extends \App\Controllers\GoBaseController
return $data; return $data;
} }
public function index_maquinista_change_user()
{
$this->viewData['breadcrumb'] = [
['title' => lang("App.menu_change_session"), 'route' => route_to('maquinistaUserChangeList'), 'active' => true]
];
$maquinistas = [];
$users = auth()->getProvider()->whereNotIn('id',[auth()->user()->id])->findAll();
foreach ($users as $key => $user) {
if ($user->inGroup('maquina') && !$user->inGroup('admin', 'comercial', 'cliente-editor', 'cliente-admin')) {
$maquinistas[] = $user;
}
}
$this->viewData['maquinistas'] = $maquinistas;
return view('/themes/vuexy/form/produccion/maquinista/viewMaquinistaCambioUserList.php', $this->viewData);
}
public function change_user_session(int $user_id)
{
// Check the credentials
$user = auth()->getProvider()->findById($user_id);
auth()->logout();
auth()->login($user);
return redirect("home");
}
} }

View File

@ -0,0 +1,396 @@
<?php
namespace App\Controllers\Importadores;
use App\Controllers\BaseResourceController;
use App\Controllers\Presupuestos\Presupuestocliente;
use App\Services\PresupuestoService;
class ImportadorBubok extends BaseResourceController
{
protected $format = 'json';
protected static $singularObjectName = 'Importador';
protected static $singularObjectNameCc = 'ImportadorBubok';
protected static $pluralObjectName = 'Importadores';
protected static $pluralObjectNameCc = 'importadores';
protected static $controllerSlug = 'importador';
protected static $viewPath = 'themes/vuexy/form/importador/bubok/';
protected $indexRoute = 'ImportadorBubokTool';
public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger)
{
$this->viewData['pageTitle'] = lang('Importador.listingPage');
$this->viewData['usingSweetAlert'] = true;
// Breadcrumbs (IMN)
$this->viewData['breadcrumb'] = [
['title' => lang("App.menu_importadores"), 'route' => "javascript:void(0);", 'active' => false],
['title' => lang("App.menu_importadores_bubok"), 'route' => route_to('importadorBubokTool'), 'active' => true]
];
parent::initController($request, $response, $logger);
}
public function index()
{
$viewData = [
'pageSubTitle' => lang('Basic.global.ManageAllRecords', [lang('Importador.importadorCatalogoTitle')]),
];
$viewData = array_merge($this->viewData, $viewData); // merge any possible values from the parent controller class
return view(static::$viewPath . 'viewImportadorBubokTool', $viewData);
}
public function importarFila()
{
$json = $this->request->getJSON();
// Validación mínima de datos comunes
$pedido = $json->pedido ?? null;
if (!$pedido || !isset($pedido->orderNumber)) {
return $this->respond([
'status' => 400,
'message' => 'Datos comunes del pedido ausentes o inválidos.'
]);
}
// Validación mínima de existencia del producto en la linea
if (!$json || !isset($json->producto)) {
return $this->respond([
'status' => 400,
'message' => 'Producto no proporcionado o inválido.'
]);
}
$producto = $json->producto;
// 1. Datos básicos:
// Referencia del cliente
$orderNumber = $pedido->orderNumber ?? null;
$productId = $producto->id ?? null;
if (is_null($orderNumber) || is_null($productId)) {
return $this->respond([
'status' => 400,
'message' => 'Número de orden o ID del producto no reconocidos.'
]);
}
$refCliente = "$orderNumber - $productId";
// Titulo
$titulo = $producto->title ?? null;
if (is_null($titulo)) {
return $this->respond([
'status' => 400,
'message' => 'Título del libro no reconocido.'
]);
}
// Validación de páginas y tirada
$paginas = isset($producto->body->pages) ? (int) $producto->body->pages : 0;
$tirada = isset($producto->amount) ? (int) $producto->amount : 0;
if ($paginas <= 0 || $tirada <= 0) {
$errores = [];
if ($paginas <= 0) {
$errores[] = 'Número de páginas inválido.';
}
if ($tirada <= 0) {
$errores[] = 'Tirada inválida.';
}
return $this->respond([
'status' => 400,
'message' => implode(' ', $errores)
]);
}
// Ancho y alto
$ancho = null;
$alto = null;
foreach ($producto->size as $key => $val) {
if ($val == 1) {
// ejemplo: size170x235
$size = str_replace('size', '', $key);
[$ancho, $alto] = explode('x', $size);
$ancho = (int) $ancho;
$alto = (int) $alto;
break;
}
}
if (!$ancho || !$alto) {
return $this->respond([
'status' => 400,
'message' => 'Tamaño del libro no reconocido.'
]);
}
/*$numGuardaPages = 4;
$hasGuarda = !empty($producto->cover->guarda);
if ($hasGuarda)
$paginas += $numGuardaPages;*/
// 2. Interior: color o negro
// Determinar tipo de impresión interior
$interiorTipo = null;
if (isset($producto->body->color->CMYK) && $producto->body->color->CMYK == '1') {
$interiorTipo = 'color';
} elseif (isset($producto->body->color->Monochrome) && $producto->body->color->Monochrome == '1') {
$interiorTipo = 'negro';
} elseif (isset($producto->body->color->Semicolor) && $producto->body->color->Semicolor == '1') {
return $this->respond([
'status' => 400,
'message' => 'Tipo de impresión "Semicolor" no soportado.'
]);
}
if (is_null($interiorTipo)) {
return $this->respond([
'status' => 400,
'message' => 'No se pudo determinar si el interior es en color o blanco y negro.'
]);
}
// Determinar tipo de papel interior
$papelInteriorId = null;
if (isset($producto->body->paperColor->white) && $producto->body->paperColor->white == '1') {
$papelInteriorId = 3; // Offset blanco 'OFF1'
} elseif (isset($producto->body->paperColor->cream) && $producto->body->paperColor->cream == '1') {
$papelInteriorId = 4; // Offset ahuesado 'OFF2'
} else {
return $this->respond([
'status' => 400,
'message' => 'Tipo de papel interior no definido.'
]);
}
// Determinar el gramaje del papel
$gramajePapelInterior = null;
foreach ($producto->body->paperWeight as $key => $val) {
if ($val == 1) {
$gramajePapelInterior = (int) str_replace(['weight', 'gr'], '', $key);
break;
}
}
if (!$gramajePapelInterior) {
return $this->respond([
'status' => 400,
'message' => 'Gramaje del papel no válido.'
]);
}
// 3. Encuadernación
// Tapa dura
$tapaDura = isset($producto->cover->type->tapadura) && $producto->cover->type->tapadura == '1';
// Solapas
$solapas = isset($producto->cover->type->consolapas) && $producto->cover->type->consolapas == '1';
// Doble cara (a veces se activa con tapa dura) una cara => 2; dos caras => 4
$doscara = false;
// Tipo de encuadernado
$encuadernadoId = null;
if (isset($producto->cover->coverType->SoftCover) && $producto->cover->coverType->SoftCover == '1') {
if ($tapaDura) {
$encuadernadoId = 1; // Libro fresado tapa dura
$doscara = true;
} else {
$encuadernadoId = 2; // Libro fresado tapa blanda
}
} elseif (isset($producto->cover->coverType->SaddleStitch) && $producto->cover->coverType->SaddleStitch == '1') {
if ($tapaDura) {
$encuadernadoId = 3; // Libro cosido tapa dura
$doscara = true;
} else {
$encuadernadoId = $solapas ? 20 : 4; // Libro cosido tapa blanda (solapas) : (sin solapas)
}
} elseif (isset($producto->cover->coverType->CoilBinding) && $producto->cover->coverType->CoilBinding == '1') {
if ($tapaDura) {
$encuadernadoId = 5; // Libro espiral tapa dura
$doscara = true;
} else {
$encuadernadoId = 6; // Libro espiral tapa blanda
}
}
if (!$encuadernadoId) {
return $this->respond([
'status' => 400,
'message' => 'Tipo de encuadernación no identificado.'
]);
}
// Determinar el acabado de la cubierta
$acabadoId = null;
if (isset($producto->cover->acabado->brillo) && $producto->cover->acabado->brillo == '1') {
$acabadoId = 1; // Plastificado brillo 1/c
} elseif (isset($producto->cover->acabado->mate) && $producto->cover->acabado->mate == '1') {
$acabadoId = 2; // Plastificado mate 1/c
} else {
return $this->respond([
'status' => 400,
'message' => 'Tipo de acabado de cubierta no definido.'
]);
}
// 4. ENVÍO: recuperamos la primera dirección del cliente BUBOK (ID 40)
$clienteDireccionModel = model('App\Models\Clientes\ClienteDireccionesModel');
$direccionCliente = $clienteDireccionModel
->where('cliente_id', 40)
->orderBy('id', 'asc')
->first();
if (!$direccionCliente) {
return $this->respond([
'status' => 400,
'message' => 'El cliente Bubok no tiene direcciones asociadas.'
]);
}
$direcciones = [
[
'direccion' => [
'id' => (int) $direccionCliente->id,
'cliente_id' => (int) $direccionCliente->cliente_id,
'cliente_nombre' => $direccionCliente->clienteNombre,
'att' => $direccionCliente->persona_contacto ?? '',
'alias' => $direccionCliente->alias ?? '',
'email' => $direccionCliente->email ?? '',
'direccion' => $direccionCliente->direccion,
'pais_id' => (int) $direccionCliente->pais_id,
'pais' => $direccionCliente->paisNombre,
'municipio' => $direccionCliente->municipio,
'provincia' => $direccionCliente->provincia,
'cp' => $direccionCliente->cp,
'telefono' => $direccionCliente->telefono,
],
'unidades' => $tirada,
'entregaPalets' => false
]
];
// Generamos el objeto a importar
$dataToImport = [
'selectedTirada' => $tirada,
'datosCabecera' => [
'titulo' => $titulo,
'autor' => null,
'isbn' => null,
'coleccion' => null,
'referenciaCliente' => $refCliente
],
'tirada' => [$tirada],
'tamanio' => [
'ancho' => $ancho,
'alto' => $alto
],
'tipo' => '',
'tipo_presupuesto_id' => $encuadernadoId,
'clienteId' => 40, // BUBOK ID
'isColor' => ($interiorTipo === 'color') ? 1 : 0,
'isHq' => 0,
'paginas' => $paginas,
'paginasColor' => ($interiorTipo === 'color') ? $paginas : 0,
'paginasCuadernillo' => 32,
'interior' => [
'papelInterior' => $papelInteriorId,
'gramajeInterior' => $gramajePapelInterior
],
'cubierta' => [
'papelCubierta' => 2, // 'EST2'
'carasCubierta' => $doscara ? 2 : 4,
'gramajeCubierta' => in_array($encuadernadoId, [1, 3]) ? 150 : 300, // 150 gramos para "fresado tapa dura" y "cosido tapa dura"
'solapas' => !empty($producto->cover->type->consolapas) ? 80 : 0,
'acabado' => $acabadoId,
'cabezada' => 'WHI',
'lomoRedondo' => 0
],
'guardas' => [],
'sobrecubierta' => [],
'faja' => null,
'entrega_taller' => 1,
//'direcciones' => $direcciones, las direcciones que aparecen no se añaden, ya que la recogida la hacen ellos con su empresa de mensajeria
'ivaReducido' => 1,
];
/*return $this->respond([
'status' => 400,
'message' => $dataToImport
]);*/
// 5. Guardar
try {
$presupuestocliente = new Presupuestocliente();
$response = $presupuestocliente->guardar($dataToImport);
// Guardar la URL de la portada y el cuerpo en los comentarios del presupuesto
$presupuestoModel = model('App\Models\Presupuestos\PresupuestoModel');
$presupuestoModel->update($response['sk_id'], [
'comentarios_safekat' => 'URL COVER: ' . $producto->cover->file . "\nURL BODY: " . $producto->body->file,
]);
// Ajuste del precio
$precio_compra = $json->producto->prices->unitPrice ?? null;
if ($precio_compra != null && $precio_compra > 0) {
$respuesta_ajuste = PresupuestoService::ajustarPresupuesto(
$response['sk_id'],
$precio_compra,
$tirada,
null,
true
);
if ($respuesta_ajuste['warning'] == true) {
$response['price_warning'] = [
'new_precio_unidad' => $respuesta_ajuste['new_precio_unidad'],
'new_total' => $respuesta_ajuste['new_total'],
];
}
}
// confirmar y crear pedido y ot
$presupuestoModel->confirmarPresupuesto($response['sk_id']);
PresupuestoService::crearPedido($response['sk_id']);
if (!isset($response['sk_id'])) {
return $this->respond([
'status' => 400,
'error' => 'Missing sk_id',
'message' => 'No se pudo crear el presupuesto.'
], 400);
}
return $this->respond([
'status' => 200,
'data' => [
'sk_id' => $response['sk_id'],
'sk_url' => $response['sk_url'] ?? null
]
]);
} catch (\Throwable $e) {
return $this->respond([
'status' => 500,
'error' => 'Server error',
'message' => 'Error inesperado',
'debug' => $e->getMessage()
]);
}
}
}

View File

@ -0,0 +1,322 @@
<?php
namespace App\Controllers\Importadores;
use App\Controllers\BaseResourceController;
use App\Entities\Catalogo\CatalogoLibroEntity;
use App\Models\Catalogo\CatalogoLibroModel;
use App\Controllers\Presupuestos\Presupuestocliente;
use App\Services\PresupuestoService;
class ImportadorCatalogo extends BaseResourceController
{
protected $modelName = CatalogoLibroModel::class;
protected $format = 'json';
protected static $singularObjectName = 'Importador';
protected static $singularObjectNameCc = 'ImportadorCatalogo';
protected static $pluralObjectName = 'Importadores';
protected static $pluralObjectNameCc = 'importadores';
protected static $controllerSlug = 'importador';
protected static $viewPath = 'themes/vuexy/form/importador/catalogo/';
protected $indexRoute = 'ImportadorCatalogoTool';
public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger)
{
$this->viewData['pageTitle'] = lang('Importador.listingPage');
$this->viewData['usingSweetAlert'] = true;
// Breadcrumbs (IMN)
$this->viewData['breadcrumb'] = [
['title' => lang("App.menu_importadores"), 'route' => "javascript:void(0);", 'active' => false],
['title' => lang("App.menu_importadores_catalogo"), 'route' => route_to('importadorCatalogoTool'), 'active' => true]
];
parent::initController($request, $response, $logger);
}
public function index()
{
$viewData = [
'pageSubTitle' => lang('Basic.global.ManageAllRecords', [lang('Importador.importadorCatalogoTitle')]),
];
$viewData = array_merge($this->viewData, $viewData); // merge any possible values from the parent controller class
return view(static::$viewPath . 'viewImportadorCatalogoTool', $viewData);
}
public function validarFila()
{
$json = $this->request->getJSON();
if (!$json || !isset($json->fila[0])) {
return $this->response->setJSON([
'apto' => false,
'reason' => 'Datos inválidos'
]);
}
$input = trim($json->fila[0]); // Asumimos que 'input' es el primer campo de la fila
if (empty($input)) {
return $this->response->setJSON([
'apto' => false,
'reason' => 'ISBN no proporiconado'
]);
}
$catalogoModel = new CatalogoLibroModel();
// 1. Buscar por ISBN exacto
$libroPorIsbn = $catalogoModel->where('isbn', $input)->first();
if ($libroPorIsbn) {
return $this->response->setJSON([
'apto' => true
]);
}
// 2. Buscar por EAN sin guiones
$eanLimpio = str_replace('-', '', $input);
$libroPorEan = $catalogoModel->where('REPLACE(ean, "-", "")', $eanLimpio)->first();
if ($libroPorEan) {
return $this->response->setJSON([
'apto' => true
]);
}
// No encontrado
return $this->response->setJSON([
'apto' => false,
'reason' => 'No encontrado en catálogo'
]);
}
public function importarFila()
{
$json = $this->request->getJSON();
if (!$json || !isset($json->fila[0])) {
return $this->response->setJSON([
'success' => false,
'message' => 'Datos inválidos.'
]);
}
// Mapear cada columna a una variable
$isbn = isset($json->fila[0]) ? trim($json->fila[0]) : null;
$refCliente = isset($json->fila[1]) ? trim($json->fila[1]) : null;
//$descripcion = isset($json->fila[2]) ? trim($json->fila[2]) : null;
$tirada = isset($json->fila[3]) ? (float) $json->fila[3] : null;
$precio_compra = isset($json->fila[4]) ? (float) $json->fila[4] : null;
if (empty($isbn)) {
return $this->response->setJSON([
'success' => false,
'message' => 'Input vacío o no proporcionado.'
]);
}
$catalogoModel = new CatalogoLibroModel();
// 1. Buscar por ISBN exacto
$libro = $catalogoModel->where('isbn', $isbn)->first();
// 2. Si no, buscar por EAN sin guiones
if (!$libro) {
$eanLimpio = str_replace('-', '', $isbn);
$libro = $catalogoModel->where('REPLACE(ean, "-", "")', $eanLimpio)->first();
}
if (!$libro) {
return $this->response->setJSON([
'success' => false,
'message' => 'No se encontró el libro en el catálogo.'
]);
}
// Aquí ya tenemos el libro correcto.
// Ahora se prepara la "inserción" o el "registro" a importar
// Variables intermedias
$colorPaginas = (int) ($libro->color_paginas ?? 0);
$negroPaginas = (int) ($libro->negro_paginas ?? 0);
$papelInteriorDiferente = ($colorPaginas > 0 && $negroPaginas > 0) ? 1 : 0;
// --- Interior (lo que cambiamos ahora)
if ($papelInteriorDiferente) {
// Mixto: páginas en negro + color
$interior = [
'papelInterior' => [
'negro' => $libro->negro_papel_id,
'color' => $libro->color_papel_id,
],
'gramajeInterior' => [
'negro' => $libro->negro_gramaje,
'color' => $libro->color_gramaje,
]
];
} else {
// SOLO un tipo: negro O color
$colorPaginas = (int) ($libro->color_paginas ?? 0);
$negroPaginas = (int) ($libro->negro_paginas ?? 0);
if ($colorPaginas > 0 && $negroPaginas == 0) {
// Libro completamente en color
$interior = [
'papelInterior' => $libro->color_papel_id,
'gramajeInterior' => $libro->color_gramaje,
];
} else {
// Libro completamente en blanco y negro
$interior = [
'papelInterior' => $libro->negro_papel_id,
'gramajeInterior' => $libro->negro_gramaje,
];
}
}
// Sobrecubierta
$sobrecubierta = [];
if (!is_null($libro->sobrecubierta_paginas)) {
$sobrecubierta['papel'] = $libro->sobrecubierta_papel_id;
$sobrecubierta['gramaje'] = $libro->sobrecubierta_gramaje;
$sobrecubierta['solapas'] = $libro->sobrecubierta_solapas;
$sobrecubierta['acabado'] = $libro->sobrecubierta_acabado_id;
}
$dataToImport = [
'selectedTirada' => $tirada,
'datosCabecera' => [
'titulo' => $libro->titulo,
'autor' => $libro->autor,
'isbn' => $isbn,
'coleccion' => $libro->coleccion,
'referenciaCliente' => $refCliente
],
'tirada' => array_values(array_filter([
$tirada,
null,
null,
null,
])),
'tamanio' => [
'ancho' => $libro->ancho,
'alto' => $libro->alto
],
'tipo' => "",
'tipo_presupuesto_id' => $libro->encuadernacion_id,
'clienteId' => 251,
'isColor' => (in_array(strtolower($libro->tipo_impresion), ['color', 'colorhq']) ? 1 : 0),
'isHq' => (in_array(strtolower($libro->tipo_impresion), ['negrohq', 'colorhq']) ? 1 : 0),
'paginas' => $libro->paginas,
'paginasColor' => $colorPaginas,
'papelInteriorDiferente' => $papelInteriorDiferente,
'paginasCuadernillo' => 32,
'interior' => $interior,
'cubierta' => [
'papelCubierta' => $libro->cubierta_papel_id,
'gramajeCubierta' => $libro->cubierta_gramaje,
'solapas' => $libro->cubierta_ancho_solapas,
'acabado' => $libro->cubierta_acabado_id,
'cabezada' => 'WHI',
'lomoRedondo' => 0
],
'ivaReducido' => 1,
'guardas' => [],
'sobrecubierta' => $sobrecubierta,
//'faja' => null,
'entrega_taller' => 1,
];
/*return $this->response->setJSON([
'success' => true,
'message' => 'Libro encontrado y preparado para importar.',
'data' => $dataToImport
]);*/
// Procedemos a intentar guardar el presupuesto
// Instancia de presupuesto cliente
$presupuestocliente = new Presupuestocliente();
try {
$response = $presupuestocliente->guardar($dataToImport);
// DEBUG LINE
//return $this->respond($response);
if (!isset($response['sk_id'])) {
return $this->respond([
'status' => 400,
'error' => 'Missing sk_id',
'message' => 'El identificador sk_id es requerido pero no se recibió.'
], 400);
}
$response = [
'status' => 200,
'error' => null,
'data' => [
'sk_id' => $response['sk_id'],
'sk_url' => $response['sk_url'] ?? null
]
];
// Ajuste del precio a RAMA
$respuesta_ajuste = PresupuestoService::ajustarPresupuesto(
$response['data']['sk_id'],
$precio_compra,
$tirada,
null,
true
);
if ($respuesta_ajuste['warning'] == true) {
$response['price_warning'] = [
'new_precio_unidad' => $respuesta_ajuste['new_precio_unidad'],
'new_total' => $respuesta_ajuste['new_total'],
];
}
// confirmar y crear pedido y ot
model('App\Models\Presupuestos\PresupuestoModel')->confirmarPresupuesto($response['data']['sk_id']);
PresupuestoService::crearPedido($response['data']['sk_id']);
return $this->respond($response);
} catch (\Exception $e) {
return $this->respond([
'status' => 500,
'error' => 'Server error',
'message' => 'Error inesperado durante el procesado',
'debug' => $e->getMessage()
]);
}
}
}

View File

@ -62,6 +62,22 @@ class LogisticaController extends BaseController
'currentModule' => static::$controllerSlug, 'currentModule' => static::$controllerSlug,
'boxTitle' => lang('Logistica.gestionEnvios'), 'boxTitle' => lang('Logistica.gestionEnvios'),
'usingServerSideDataTable' => true, 'usingServerSideDataTable' => true,
'tipo_envio' => 'estandar',
];
$viewData = array_merge($this->viewData, $viewData); // merge any possible values from the parent controller class
return view(static::$viewPath . 'viewLogisticaSelectEnvios', $viewData);
}
public function gestionEnviosFerros()
{
$viewData = [
'currentModule' => static::$controllerSlug,
'boxTitle' => lang('Logistica.envioFerros'),
'usingServerSideDataTable' => true,
'tipo_envio' => 'ferro_prototipo',
]; ];
$viewData = array_merge($this->viewData, $viewData); // merge any possible values from the parent controller class $viewData = array_merge($this->viewData, $viewData); // merge any possible values from the parent controller class
@ -85,7 +101,14 @@ class LogisticaController extends BaseController
{ {
if ($this->request->isAJAX()) { if ($this->request->isAJAX()) {
$query = LogisticaService::findForNewEnvio();
$tipo_envio = $this->request->getGet('tipo_envio') ?? 'estandar';
if($tipo_envio == 'ferro_prototipo'){
$query = LogisticaService::findForNewEnvioFerro();
} else {
$query = LogisticaService::findForNewEnvio();
}
if ($this->request->getGet("q")) { if ($this->request->getGet("q")) {
$query->groupStart() $query->groupStart()
->orLike("id", $this->request->getGet("q")) ->orLike("id", $this->request->getGet("q"))
@ -105,12 +128,12 @@ class LogisticaController extends BaseController
public function selectDireccionForEnvio(){ public function selectDireccionForEnvio(){
if ($this->request->isAJAX()) { if ($this->request->isAJAX()) {
$pedido_id = $this->request->getGet('pedido_id'); $ot = $this->request->getGet('ot_id');
if($pedido_id == null || $pedido_id == 0){ if($ot == null || $ot == 0){
return []; return [];
} }
$searchVal = $this->request->getGet("q") ?? ""; $searchVal = $this->request->getGet("q") ?? "";
$result = LogisticaService::findDireccionesNewEnvio($pedido_id, $searchVal); $result = LogisticaService::findDireccionesNewEnvio($ot, $searchVal);
return $this->response->setJSON($result); return $this->response->setJSON($result);
} else { } else {
@ -124,9 +147,22 @@ class LogisticaController extends BaseController
{ {
if ($this->request->isAJAX()) { if ($this->request->isAJAX()) {
$pedido_id = $this->request->getPost('pedido_id'); $ot_id = $this->request->getPost('ot_id');
$direccion = $this->request->getPost('direccion'); $direccion = $this->request->getPost('direccion') ?? "";
$result = LogisticaService::generateEnvio($pedido_id, $direccion); $result = LogisticaService::generateEnvio($ot_id, $direccion);
return $this->response->setJSON($result);
} else {
return $this->failUnauthorized('Invalid request', 403);
}
}
public function generarEnvioFerro()
{
if ($this->request->isAJAX()) {
$ot_id = $this->request->getPost('ot_id');
$result = LogisticaService::generateEnvioFerro($ot_id);
return $this->response->setJSON($result); return $this->response->setJSON($result);
} else { } else {
return $this->failUnauthorized('Invalid request', 403); return $this->failUnauthorized('Invalid request', 403);
@ -172,7 +208,7 @@ class LogisticaController extends BaseController
} }
$modelImpresora = model('App\Models\Configuracion\ImpresoraEtiquetaModel'); $modelImpresora = model('App\Models\Configuracion\ImpresoraEtiquetaModel');
$impresora = $modelImpresora->select('id, name') $impresora = $modelImpresora->select('id, name, ip, port, user, pass')
->where('deleted_at', null) ->where('deleted_at', null)
->where('id', $printer_id) ->where('id', $printer_id)
->orderBy('name', 'asc') ->orderBy('name', 'asc')
@ -233,9 +269,10 @@ class LogisticaController extends BaseController
{ {
$otsFilter = $this->request->getGetPost('otsFilter'); $otsFilter = $this->request->getGetPost('otsFilter');
$tipo_envio = $this->request->getGetPost('tipo_envio') ?? 'estandar';
$model = model('App\Models\Logistica\EnvioModel'); $model = model('App\Models\Logistica\EnvioModel');
$q = $model->getDatatableQuery(); $q = $model->getDatatableQuery($tipo_envio);
if (!empty($otsFilter)) { if (!empty($otsFilter)) {
$q->groupStart(); $q->groupStart();
@ -370,7 +407,7 @@ class LogisticaController extends BaseController
)->edit( )->edit(
"unidadesEnvio", "unidadesEnvio",
function ($row, $meta) { function ($row, $meta) {
if($row->finalizado == 1){ if($row->finalizado == 1 || $row->tipo_envio == 'ferro_prototipo'){
return $row->unidadesEnvio; return $row->unidadesEnvio;
} }
return '<input type="number" class="form-control input-lineas input-unidades text-center" return '<input type="number" class="form-control input-lineas input-unidades text-center"

View File

@ -993,6 +993,8 @@ class Presupuestoadmin extends \App\Controllers\BaseResourceController
$reqData = $this->request->getPost(); $reqData = $this->request->getPost();
$calcular_merma = $reqData['calcular_merma'] ?? 0;
$type = $reqData['type'] ?? null; $type = $reqData['type'] ?? null;
// por defecto, se deja cosido tapa blanda por ahora JJO // por defecto, se deja cosido tapa blanda por ahora JJO
$tipo_impresion_id = $reqData['tipo_impresion_id'] ?? 4; $tipo_impresion_id = $reqData['tipo_impresion_id'] ?? 4;
@ -1071,8 +1073,27 @@ class Presupuestoadmin extends \App\Controllers\BaseResourceController
'a_favor_fibra' => $a_favor_fibra 'a_favor_fibra' => $a_favor_fibra
); );
$resourceData = PresupuestoService::obtenerComparadorPlana($input_data); $resourceData = PresupuestoService::obtenerComparadorPlana($input_data);
if($calcular_merma == 1 && count($resourceData) > 0 &&
count($resourceData[0]['fields']) >0 && $resourceData[0]['fields']['num_formas'] > 0) {
usort($resourceData, function ($a, $b) {
return $b['fields']['total_impresion'] <=> $a['fields']['total_impresion'];
});
$num_formas = [];
$formas_linea = $datosPedido->isCosido ? intval($resourceData[0]['fields']['num_formas']['value']) / 2 :
intval($resourceData[0]['fields']['num_formas']['value']);
array_push($num_formas, $formas_linea);
$POD = $this->getPOD();
$datosPedido->merma = PresupuestoService::calcular_merma($datosPedido->tirada,$POD, $num_formas);
$resourceData = PresupuestoService::obtenerComparadorPlana($input_data);
}
} else if ($type == 'interior_rot') { } else if ($type == 'interior_rot') {
$paginas = (object) array( $paginas = (object) array(
@ -1105,6 +1126,24 @@ class Presupuestoadmin extends \App\Controllers\BaseResourceController
$resourceData = PresupuestoService::obtenerComparadorRotativa($input_data); $resourceData = PresupuestoService::obtenerComparadorRotativa($input_data);
if($calcular_merma == 1 && count($resourceData) > 0 &&
count($resourceData[0]['fields']) >0 && $resourceData[0]['fields']['num_formas'] > 0) {
usort($resourceData, function ($a, $b) {
return $b['fields']['total_impresion'] <=> $a['fields']['total_impresion'];
});
$num_formas = [];
$formas_linea = $datosPedido->isCosido ? intval($resourceData[0]['fields']['num_formas']['value']) / 2 :
intval($resourceData[0]['fields']['num_formas']['value']);
array_push($num_formas, $formas_linea);
$POD = $this->getPOD();
$datosPedido->merma = PresupuestoService::calcular_merma($datosPedido->tirada,$POD, $num_formas);
$resourceData = PresupuestoService::obtenerComparadorRotativa($input_data);
}
} else if ($type == 'cubierta' || $type == 'sobrecubierta' || $type == 'faja') { } else if ($type == 'cubierta' || $type == 'sobrecubierta' || $type == 'faja') {
$datosPedido->solapas = $reqData['solapas']; $datosPedido->solapas = $reqData['solapas'];

View File

@ -323,17 +323,23 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$datosPedido = (object) array( $datosPedido = (object) array(
'paginas' => $paginas, 'paginas' => $paginas,
'tirada' => $tirada[0], 'tirada' => $tirada[0],
'merma' => $this->calcular_merma($tirada[0], $POD), 'merma' => PresupuestoService::calcular_merma($tirada[0], $POD),
'ancho' => intval($tamanio['ancho']) ?? 100000, 'ancho' => intval($tamanio['ancho']) ?? 100000,
'alto' => intval($tamanio['alto']) ?? 100000, 'alto' => intval($tamanio['alto']) ?? 100000,
'isCosido' => $is_cosido, 'isCosido' => $is_cosido,
'a_favor_fibra' => 1, 'a_favor_fibra' => 1,
); );
$cliente_model = model(('App\Models\Clientes\ClienteModel'));
$cliente = $cliente_model->find($cliente_id);
// Para POD siempre es HQ // Para POD siempre es HQ
if ($tirada[0] <= $POD) { if ($tirada[0] <= $POD && !$cliente->forzar_rotativa_pod) {
$isHq = true; $isHq = true;
} }
$forzarRotativa = false;
if ($tirada[0] <= $POD && $cliente->forzar_rotativa_pod) {
$forzarRotativa = true;
}
$input_data = array( $input_data = array(
'uso' => 'interior', 'uso' => 'interior',
@ -346,7 +352,8 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
'cliente_id' => $cliente_id, 'cliente_id' => $cliente_id,
'paginas_color' => $paginas_color, 'paginas_color' => $paginas_color,
'excluirRotativa' => $excluirRotativa, 'excluirRotativa' => $excluirRotativa,
'papelInteriorDiferente' => $papelInteriorDiferente 'papelInteriorDiferente' => $papelInteriorDiferente,
'forzarRotativa' => $forzarRotativa,
); );
$interior = PresupuestoClienteService::obtenerInterior($input_data); $interior = PresupuestoClienteService::obtenerInterior($input_data);
@ -460,6 +467,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$id = $reqData['id'] ?? 0; $id = $reqData['id'] ?? 0;
$cliente_id = $reqData['clienteId'] ?? -1; $cliente_id = $reqData['clienteId'] ?? -1;
$noEnvioBase = model('App\Models\Clientes\ClienteModel')->find($cliente_id)->no_envio_base ?? false;
$tirada = $reqData['tirada'] ?? 0; $tirada = $reqData['tirada'] ?? 0;
$selectedTirada = $reqData['selectedTirada'] ?? -1; $selectedTirada = $reqData['selectedTirada'] ?? -1;
@ -609,6 +617,10 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
} else { } else {
$coste = floatval($coste_direccion->coste); $coste = floatval($coste_direccion->coste);
$margen = $coste * (intval($coste_direccion->margen) / 100.0); $margen = $coste * (intval($coste_direccion->margen) / 100.0);
if ($noEnvioBase) {
$coste = 0.0;
$margen = 0.0;
}
$return_data['eb'][$i] = round($coste + $margen, 2); $return_data['eb'][$i] = round($coste + $margen, 2);
} }
} }
@ -739,17 +751,23 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$datosPedido = (object) array( $datosPedido = (object) array(
'paginas' => $paginas, 'paginas' => $paginas,
'tirada' => $tirada[0], 'tirada' => $tirada[0],
'merma' => $tirada[0] > $POD ? $this->calcular_merma($tirada[0], $POD) : 0, 'merma' => $tirada[0] > $POD ? PresupuestoService::calcular_merma($tirada[0], $POD) : 0,
'ancho' => intval($tamanio['ancho']) ?? 100000, 'ancho' => intval($tamanio['ancho']) ?? 100000,
'alto' => intval($tamanio['alto']) ?? 100000, 'alto' => intval($tamanio['alto']) ?? 100000,
'isCosido' => $is_cosido, 'isCosido' => $is_cosido,
'a_favor_fibra' => 1, 'a_favor_fibra' => 1,
); );
$cliente_model = model(('App\Models\Clientes\ClienteModel'));
$cliente = $cliente_model->find($cliente_id);
// Para POD siempre es HQ // Para POD siempre es HQ
if ($tirada[0] <= $POD) { if ($tirada[0] <= $POD && !$cliente->forzar_rotativa_pod) {
$isHq = true; $isHq = true;
} }
$forzarRotativa = false;
if ($tirada[0] <= $POD && $cliente->forzar_rotativa_pod) {
$forzarRotativa = true;
}
$input_data = array( $input_data = array(
'uso' => 'interior', 'uso' => 'interior',
@ -762,7 +780,8 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
'cliente_id' => $cliente_id, 'cliente_id' => $cliente_id,
'paginas_color' => $paginas_color, 'paginas_color' => $paginas_color,
'excluirRotativa' => $excluirRotativa, 'excluirRotativa' => $excluirRotativa,
'papelInteriorDiferente' => $papelInteriorDiferente 'papelInteriorDiferente' => $papelInteriorDiferente,
'forzarRotativa' => $forzarRotativa,
); );
$interior = PresupuestoClienteService::obtenerInterior($input_data); $interior = PresupuestoClienteService::obtenerInterior($input_data);
@ -1126,6 +1145,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$peso_libro = $resultado_presupuesto['peso'][array_search($selected_tirada, $tirada)]; $peso_libro = $resultado_presupuesto['peso'][array_search($selected_tirada, $tirada)];
// calculo del envio base (tirada_maxima) // calculo del envio base (tirada_maxima)
$noEnvioBase = model('App\Models\Clientes\ClienteModel')->find($cliente_id)->no_envio_base ?? false;
$resultado_presupuesto['eb'] = []; $resultado_presupuesto['eb'] = [];
$datos_presupuesto['envio_base'] = 0; $datos_presupuesto['envio_base'] = 0;
for ($i = 0; $i < count($tirada); $i++) { for ($i = 0; $i < count($tirada); $i++) {
@ -1139,6 +1159,10 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
); );
if (intval($selected_tirada) == intval($tirada[$i])) { if (intval($selected_tirada) == intval($tirada[$i])) {
if ($noEnvioBase) {
$coste_direccion->coste = 0.0;
$coste_direccion->margen = 0.0;
}
$datos_presupuesto['envio_base'] = round($coste_direccion->coste * (1 + $coste_direccion->margen / 100.0), 2); $datos_presupuesto['envio_base'] = round($coste_direccion->coste * (1 + $coste_direccion->margen / 100.0), 2);
} }
@ -1160,6 +1184,10 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
]; ];
return $resultado_presupuesto; return $resultado_presupuesto;
} else { } else {
if ($noEnvioBase) {
$coste_direccion->coste = 0.0;
$coste_direccion->margen = 0.0;
}
$resultado_presupuesto['eb'][$i] = round($coste_direccion->coste, 2); $resultado_presupuesto['eb'][$i] = round($coste_direccion->coste, 2);
$resultado_presupuesto['eb_margen'][$i] = round($coste_direccion->margen, 2); $resultado_presupuesto['eb_margen'][$i] = round($coste_direccion->margen, 2);
} }
@ -1177,7 +1205,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$coste_envio = 0.0; $coste_envio = 0.0;
$coste_envio += ($resultado_presupuesto['eb'][$i] / $tirada[$i]); $coste_envio += ($resultado_presupuesto['eb'][$i] / $tirada[$i]);
$resultado_presupuesto['info']['totales'][$i]['envio_base_margen'] = $resultado_presupuesto['info']['totales'][$i]['envio_base_margen'] =
floatval($resultado_presupuesto['eb'][$i])*(floatval($resultado_presupuesto['eb_margen'][$i])/100.0); floatval($resultado_presupuesto['eb'][$i]) * (floatval($resultado_presupuesto['eb_margen'][$i]) / 100.0);
$resultado_presupuesto['info']['totales'][$i]['envio_base_coste'] = $resultado_presupuesto['eb'][$i]; $resultado_presupuesto['info']['totales'][$i]['envio_base_coste'] = $resultado_presupuesto['eb'][$i];
$resultado_presupuesto['precio_u'][$i] = round(floatval($resultado_presupuesto['precio_u'][$i]) + $coste_envio, 4); $resultado_presupuesto['precio_u'][$i] = round(floatval($resultado_presupuesto['precio_u'][$i]) + $coste_envio, 4);
@ -1312,7 +1340,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$datos_presupuesto['entrega_taller'] = $reqData['entrega_taller'] ?? 0; $datos_presupuesto['entrega_taller'] = $reqData['entrega_taller'] ?? 0;
$resultado_presupuesto['info']['merma'] = $this->calcular_merma($selected_tirada, $POD); $resultado_presupuesto['info']['merma'] = PresupuestoService::calcular_merma($selected_tirada, $POD);
$datos_presupuesto['faja'] = $faja; $datos_presupuesto['faja'] = $faja;
@ -1357,7 +1385,11 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
foreach ($serviciosAcabado as $service) { foreach ($serviciosAcabado as $service) {
$model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel');
$servicio = $model->getPrecioTarifa( $servicio = $model->getPrecioTarifa(
intval($service), intval($selected_tirada)+$resultado_presupuesto['info']['merma'], -1, $POD); intval($service),
intval($selected_tirada) + $resultado_presupuesto['info']['merma'],
-1,
$POD
);
if (count($servicio) > 0) { if (count($servicio) > 0) {
if ($servicio[0]->total > 0) { if ($servicio[0]->total > 0) {
@ -1376,7 +1408,10 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel');
$servicio = $model->getPrecioTarifa( $servicio = $model->getPrecioTarifa(
intval($service), intval($service),
intval($selected_tirada) + $resultado_presupuesto['info']['merma'], -1, $POD); intval($selected_tirada) + $resultado_presupuesto['info']['merma'],
-1,
$POD
);
if (count($servicio) > 0) { if (count($servicio) > 0) {
if ($servicio[0]->total > 0) { if ($servicio[0]->total > 0) {
@ -1394,7 +1429,10 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel');
$servicio = $model->getPrecioTarifa( $servicio = $model->getPrecioTarifa(
intval($service), intval($service),
intval($selected_tirada) + $resultado_presupuesto['info']['merma'], -1, $POD); intval($selected_tirada) + $resultado_presupuesto['info']['merma'],
-1,
$POD
);
if (count($servicio) > 0) { if (count($servicio) > 0) {
if ($servicio[0]->total > 0) { if ($servicio[0]->total > 0) {
@ -1407,7 +1445,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$tarifa_id = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_lomo_redondo')->value; $tarifa_id = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_lomo_redondo')->value;
$serv_lomo = PresupuestoCLienteService::getServiciosManipulado([ $serv_lomo = PresupuestoCLienteService::getServiciosManipulado([
'tarifa_id' => intval($tarifa_id), 'tarifa_id' => intval($tarifa_id),
'tirada' => $selected_tirada+$resultado_presupuesto['info']['merma'], 'tirada' => $selected_tirada + $resultado_presupuesto['info']['merma'],
'POD' => $POD, 'POD' => $POD,
])[0]; ])[0];
@ -2029,7 +2067,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$datosPedido = (object) array( $datosPedido = (object) array(
'paginas' => $paginas, 'paginas' => $paginas,
'tirada' => $tirada[$t], 'tirada' => $tirada[$t],
'merma' => $this->calcular_merma($tirada[$t], $POD), 'merma' => PresupuestoService::calcular_merma($tirada[$t], $POD),
'ancho' => intval($tamanio['ancho']) ?? 100000, 'ancho' => intval($tamanio['ancho']) ?? 100000,
'alto' => intval($tamanio['alto']) ?? 100000, 'alto' => intval($tamanio['alto']) ?? 100000,
'isCosido' => $is_cosido, 'isCosido' => $is_cosido,
@ -2039,10 +2077,16 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$info['merma'] = $datosPedido->merma; $info['merma'] = $datosPedido->merma;
} }
$cliente_model = model(('App\Models\Clientes\ClienteModel'));
$cliente = $cliente_model->find($cliente_id);
// Para POD siempre es HQ // Para POD siempre es HQ
if ($tirada[$t] <= $POD) { if ($tirada[$t] <= $POD && !$cliente->forzar_rotativa_pod) {
$isHq = true; $isHq = true;
} }
$forzarRotativa = false;
if ($tirada[$t] <= $POD && $cliente->forzar_rotativa_pod) {
$forzarRotativa = true;
}
$input_data = array( $input_data = array(
'uso' => 'interior', 'uso' => 'interior',
@ -2055,7 +2099,8 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
'cliente_id' => $cliente_id, 'cliente_id' => $cliente_id,
'paginas_color' => $paginas_color, 'paginas_color' => $paginas_color,
'excluirRotativa' => $excluirRotativa, 'excluirRotativa' => $excluirRotativa,
'papelInteriorDiferente' => $papelInteriorDiferente 'papelInteriorDiferente' => $papelInteriorDiferente,
'forzarRotativa' => $forzarRotativa,
); );
$interior = PresupuestoClienteService::obtenerInterior($input_data); $interior = PresupuestoClienteService::obtenerInterior($input_data);
@ -2107,7 +2152,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
array_push($num_formas, $formas_linea); array_push($num_formas, $formas_linea);
} }
} }
$input_data['datosPedido']->merma = $this->calcular_merma($tirada[$t], $POD, $num_formas); $input_data['datosPedido']->merma = PresupuestoService::calcular_merma($tirada[$t], $POD, $num_formas);
if ($extra_info) { if ($extra_info) {
$info['merma'] = max($info['merma'], $input_data['datosPedido']->merma); $info['merma'] = max($info['merma'], $input_data['datosPedido']->merma);
} }
@ -3142,31 +3187,6 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
} }
} }
protected function calcular_merma($tirada, $POD, $formas_lineas_interior = [])
{
$merma = 0;
if ($tirada > $POD) {
$merma = $tirada * 0.1;
} else {
$merma_lineas = [];
foreach ($formas_lineas_interior as $formas_linea) {
if ($formas_linea > $tirada)
array_push($merma_lineas, $formas_linea - $tirada);
else
array_push($merma_lineas, $tirada % $formas_linea);
}
if (count($merma_lineas) > 0)
$merma = max($merma_lineas);
}
return round($merma, 0);
}
protected function getPapelFormatoListItems($selId = null) protected function getPapelFormatoListItems($selId = null)
{ {
$papelFormatoModel = model('App\Models\Configuracion\PapelFormatoModel'); $papelFormatoModel = model('App\Models\Configuracion\PapelFormatoModel');

View File

@ -54,6 +54,7 @@ class Presupuestodirecciones extends \App\Controllers\BaseResourceController
$proveedor = $reqData['proveedor'] ?? ""; $proveedor = $reqData['proveedor'] ?? "";
$proveedor_id = $reqData['proveedor_id'] ?? ""; $proveedor_id = $reqData['proveedor_id'] ?? "";
$entregaPieCalle = $reqData['entregaPieCalle'] ?? 0; $entregaPieCalle = $reqData['entregaPieCalle'] ?? 0;
$is_ferro_prototipo = $reqData['is_ferro_prototipo'] ?? 0;
$data = [ $data = [
"presupuesto_id" => $presupuesto_id, "presupuesto_id" => $presupuesto_id,
@ -73,6 +74,7 @@ class Presupuestodirecciones extends \App\Controllers\BaseResourceController
"proveedor" => $proveedor, "proveedor" => $proveedor,
"proveedor_id" => $proveedor_id, "proveedor_id" => $proveedor_id,
"entregaPieCalle" => $entregaPieCalle, "entregaPieCalle" => $entregaPieCalle,
"is_ferro_prototipo" => $is_ferro_prototipo
]; ];
$response = $this->model->insert($data); $response = $this->model->insert($data);

View File

@ -3,6 +3,7 @@
namespace App\Controllers\Produccion; namespace App\Controllers\Produccion;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Models\Compras\ProveedorModel;
use App\Models\Configuracion\MaquinaModel; use App\Models\Configuracion\MaquinaModel;
use App\Models\OrdenTrabajo\OrdenTrabajoModel; use App\Models\OrdenTrabajo\OrdenTrabajoModel;
use App\Models\OrdenTrabajo\OrdenTrabajoTarea; use App\Models\OrdenTrabajo\OrdenTrabajoTarea;
@ -28,6 +29,7 @@ class Ordentrabajo extends BaseController
protected OrdenTrabajoModel $otModel; protected OrdenTrabajoModel $otModel;
protected OrdenTrabajoUser $otUserModel; protected OrdenTrabajoUser $otUserModel;
protected OrdenTrabajoTarea $otTarea; protected OrdenTrabajoTarea $otTarea;
protected ProveedorModel $proveedorModel;
protected MaquinaModel $maquinaModel; protected MaquinaModel $maquinaModel;
protected UserModel $userModel; protected UserModel $userModel;
protected Validation $validation; protected Validation $validation;
@ -45,6 +47,7 @@ class Ordentrabajo extends BaseController
$this->produccionService = new ProductionService(); $this->produccionService = new ProductionService();
$this->otTarea = model(OrdenTrabajoTarea::class); $this->otTarea = model(OrdenTrabajoTarea::class);
$this->maquinaModel = model(MaquinaModel::class); $this->maquinaModel = model(MaquinaModel::class);
$this->proveedorModel = model(ProveedorModel::class);
$this->validation = service("validation"); $this->validation = service("validation");
helper("time"); helper("time");
parent::initController($request, $response, $logger); parent::initController($request, $response, $logger);
@ -105,11 +108,11 @@ class Ordentrabajo extends BaseController
public function update_orden_trabajo_tarea() public function update_orden_trabajo_tarea()
{ {
$bodyData = $this->request->getPost(); $bodyData = $this->request->getPost();
return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "data" => $bodyData]);
$validated = $this->validation->run($bodyData, "orden_trabajo_tarea"); $validated = $this->validation->run($bodyData, "orden_trabajo_tarea");
if ($validated) { if ($validated) {
$r = $this->produccionService->updateOrdenTrabajoTarea($bodyData["orden_trabajo_tarea_id"], $bodyData); $r = $this->produccionService->updateOrdenTrabajoTarea($bodyData["orden_trabajo_tarea_id"], $bodyData);
return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "status" => $r, "data" => $bodyData]); $tareaEntity = $this->otTarea->find($bodyData["orden_trabajo_tarea_id"]);
return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "status" => $r, "data" => $tareaEntity]);
} else { } else {
return $this->response->setJSON(["errors" => $this->validation->getErrors()])->setStatusCode(400); return $this->response->setJSON(["errors" => $this->validation->getErrors()])->setStatusCode(400);
} }
@ -138,6 +141,18 @@ class Ordentrabajo extends BaseController
return $this->response->setJSON(["errors" => $this->validation->getErrors()])->setStatusCode(400); return $this->response->setJSON(["errors" => $this->validation->getErrors()])->setStatusCode(400);
} }
} }
public function update_presupuesto_tarea_proveedor(){
$bodyData = $this->request->getPost();
$validated = $this->validation->run($bodyData, "proveedor_tarea");
if ($validated) {
$validatedData = $this->validation->getValidated();
$r = $this->produccionService->updateProveedorLinea($validatedData['orden_trabajo_tarea_id'], $validatedData['proveedor_id']);
return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "status" => $r]);
} else {
return $this->response->setJSON(["errors" => $this->validation->getErrors()])->setStatusCode(400);
}
}
public function reset_orden_trabajo_date() public function reset_orden_trabajo_date()
{ {
$bodyData = $this->request->getPost(); $bodyData = $this->request->getPost();
@ -242,7 +257,7 @@ class Ordentrabajo extends BaseController
{ {
$logo = config(LogoImpresion::class); $logo = config(LogoImpresion::class);
$q = $this->otModel->getDatatableQuery()->where("ferro_ok_at", null); $q = $this->otModel->getDatatableQuery()->where('presupuestos.ferro',1)->where("ferro_ok_at", null);
// return $this->response->setJSON($q->get()->getResultArray()); // return $this->response->setJSON($q->get()->getResultArray());
return DataTable::of($q) return DataTable::of($q)
->add("logo", fn($q) => ["logo" => site_url($logo->get_logo_path($q->presupuesto_linea_tipo)), "imposicion" => $q->imposicion_name, "color" => $this->produccionService->init($q->id)->getOtColorStatus()]) ->add("logo", fn($q) => ["logo" => site_url($logo->get_logo_path($q->presupuesto_linea_tipo)), "imposicion" => $q->imposicion_name, "color" => $this->produccionService->init($q->id)->getOtColorStatus()])
@ -257,7 +272,7 @@ class Ordentrabajo extends BaseController
{ {
$logo = config(LogoImpresion::class); $logo = config(LogoImpresion::class);
$q = $this->otModel->getDatatableQuery()->where("ferro_ok_at is NOT NULL", NULL, FALSE); $q = $this->otModel->getDatatableQuery()->where('presupuestos.ferro',1)->where("ferro_ok_at is NOT NULL", NULL, FALSE);
// return $this->response->setJSON($q->get()->getResultArray()); // return $this->response->setJSON($q->get()->getResultArray());
return DataTable::of($q) return DataTable::of($q)
->add("logo", fn($q) => ["logo" => site_url($logo->get_logo_path($q->presupuesto_linea_tipo)), "imposicion" => $q->imposicion_name, "color" => $this->produccionService->init($q->id)->getOtColorStatus()]) ->add("logo", fn($q) => ["logo" => site_url($logo->get_logo_path($q->presupuesto_linea_tipo)), "imposicion" => $q->imposicion_name, "color" => $this->produccionService->init($q->id)->getOtColorStatus()])
@ -268,6 +283,62 @@ class Ordentrabajo extends BaseController
->add("action", fn($q) => $q->id) ->add("action", fn($q) => $q->id)
->toJson(true); ->toJson(true);
} }
public function datatable_news()
{
$logo = config(LogoImpresion::class);
$q = $this->otModel->getDatatableQuery();
return DataTable::of($q)
->add("logo", fn($q) => ["logo" => site_url($logo->get_logo_path($q->presupuesto_linea_tipo)), "imposicion" => $q->imposicion_name, "color" => $this->produccionService->init($q->id)->getOtColorStatus()])
->edit(
"fecha_encuadernado_at",
fn($q) => $q->fecha_encuadernado_at ? Time::createFromFormat("Y-m-d H:i:s", $q->fecha_encuadernado_at)->format("d/m/Y") : ""
)
->add("action", fn($q) => $q->id)
->toJson(true);
}
public function datatable_prod()
{
$logo = config(LogoImpresion::class);
$q = $this->otModel->getDatatableQuery()->where('presupuestos.ferro',1)->where("ferro_ok_at is NOT NULL", NULL, FALSE);
return DataTable::of($q)
->add("logo", fn($q) => ["logo" => site_url($logo->get_logo_path($q->presupuesto_linea_tipo)), "imposicion" => $q->imposicion_name, "color" => $this->produccionService->init($q->id)->getOtColorStatus()])
->edit(
"fecha_encuadernado_at",
fn($q) => $q->fecha_encuadernado_at ? Time::createFromFormat("Y-m-d H:i:s", $q->fecha_encuadernado_at)->format("d/m/Y") : ""
)
->add("action", fn($q) => $q->id)
->toJson(true);
}
public function datatable_waiting()
{
$logo = config(LogoImpresion::class);
$q = $this->otModel->getDatatableQuery()->where('ordenes_trabajo.is_pedido_espera',1);
return DataTable::of($q)
->add("logo", fn($q) => ["logo" => site_url($logo->get_logo_path($q->presupuesto_linea_tipo)), "imposicion" => $q->imposicion_name, "color" => $this->produccionService->init($q->id)->getOtColorStatus()])
->edit(
"fecha_encuadernado_at",
fn($q) => $q->fecha_encuadernado_at ? Time::createFromFormat("Y-m-d H:i:s", $q->fecha_encuadernado_at)->format("d/m/Y") : ""
)
->add("action", fn($q) => $q->id)
->toJson(true);
}
public function datatable_revision_com()
{
$logo = config(LogoImpresion::class);
$q = $this->otModel->getDatatableQuery()->where('presupuestos.ferro',1)->where("ferro_ok_at is NOT NULL", NULL, FALSE);
return DataTable::of($q)
->add("logo", fn($q) => ["logo" => site_url($logo->get_logo_path($q->presupuesto_linea_tipo)), "imposicion" => $q->imposicion_name, "color" => $this->produccionService->init($q->id)->getOtColorStatus()])
->edit(
"fecha_encuadernado_at",
fn($q) => $q->fecha_encuadernado_at ? Time::createFromFormat("Y-m-d H:i:s", $q->fecha_encuadernado_at)->format("d/m/Y") : ""
)
->add("action", fn($q) => $q->id)
->toJson(true);
}
public function papel_gramaje_datatable() public function papel_gramaje_datatable()
{ {
@ -305,6 +376,7 @@ class Ordentrabajo extends BaseController
->edit("orden", fn($q) => ["id" => $q->id, "orden" => $q->orden]) ->edit("orden", fn($q) => ["id" => $q->id, "orden" => $q->orden])
->edit("tiempo_estimado", fn($q) => float_seconds_to_hhmm_string($q->tiempo_estimado)) ->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("tiempo_real", fn($q) => float_seconds_to_hhmm_string($q->tiempo_real))
->add("proveedor", fn($q) => $this->produccionService->getProveedorTarea($q->id))
->edit("maquina_tarea", fn($q) => ["id" => $q->id, "maquina_id" => $q->maquina_tarea, "maquina_name" => $q->maquina_nombre]) ->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); ->toJson(true);
@ -313,6 +385,14 @@ class Ordentrabajo extends BaseController
{ {
return $this->produccionService->init($orden_trabajo_id)->getPdf(); return $this->produccionService->init($orden_trabajo_id)->getPdf();
} }
public function get_ferro_pdf($orden_trabajo_id)
{
return $this->produccionService->init($orden_trabajo_id)->getFerroPdf();
}
public function get_prototipo_pdf($orden_trabajo_id)
{
return $this->produccionService->init($orden_trabajo_id)->getPrototipoPdf();
}
public function upload_orden_trabajo_portada() public function upload_orden_trabajo_portada()
{ {
try { try {
@ -561,8 +641,15 @@ class Ordentrabajo extends BaseController
$validated = $this->validation->run($bodyData, "orden_trabajo_tarea_progress_date"); $validated = $this->validation->run($bodyData, "orden_trabajo_tarea_progress_date");
// return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "data" => $this->validation->getValidated(),"errors" => $this->validation->getErrors()]); // return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "data" => $this->validation->getValidated(),"errors" => $this->validation->getErrors()]);
if ($validated) { if ($validated) {
$r = $this->produccionService->storeOrdenTrabajoTareaProgressDate($this->validation->getValidated()); $validatedData = $this->validation->getValidated();
return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "status" => $r, "data" => $bodyData]); $r = $this->produccionService->storeOrdenTrabajoTareaProgressDate($validatedData);
$otTareaEntity = $this->otTarea->find($validatedData['ot_tarea_id']);
$data = [
"tiempo_trabajado" => float_seconds_to_hhmm_string($otTareaEntity->tiempo_trabajado()),
"tarea" => $otTareaEntity,
"estado" => $validatedData['estado'],
];
return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "status" => $r, "data" => $data]);
} else { } else {
return $this->response->setJSON(["errors" => $this->validation->getErrors()])->setStatusCode(400); return $this->response->setJSON(["errors" => $this->validation->getErrors()])->setStatusCode(400);
} }
@ -572,7 +659,6 @@ class Ordentrabajo extends BaseController
} }
public function delete_orden_trabajo_progress_date(int $orden_trabajo_tarea_id) public function delete_orden_trabajo_progress_date(int $orden_trabajo_tarea_id)
{ {
$status = $this->produccionService->deleteOrdenTrabajoTareaProgressDates($orden_trabajo_tarea_id); $status = $this->produccionService->deleteOrdenTrabajoTareaProgressDates($orden_trabajo_tarea_id);
return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "status" => $status]); return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "status" => $status]);
} }
@ -585,4 +671,22 @@ class Ordentrabajo extends BaseController
]; ];
return $this->response->setJSON($data); return $this->response->setJSON($data);
} }
public function update_pod_pedido_dates($orden_trabajo_id)
{
$this->produccionService->init($orden_trabajo_id);
if($this->produccionService->isPOD){
$status = $this->produccionService->updatePodDates();
return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "status" => $status, "data" => $this->produccionService->getPedido()]);
}else{
return $this->response->setJSON(["message" => lang("App.global_alert_save_success"), "status" => false, "data" => $this->produccionService->getPedido()]);
}
}
public function get_orden_trabajo_tareas_dates($orden_trabajo_id)
{
$data = $this->produccionService->init($orden_trabajo_id)->getOrdenTrabajoTareaDates();
return $this->response->setJSON(["data" => $data ]);
}
} }

View File

@ -11,69 +11,78 @@ class CreateCatalogoLibros extends Migration
$this->db->query('SET foreign_key_checks = 0'); $this->db->query('SET foreign_key_checks = 0');
$this->forge->addField([ $this->forge->addField([
'id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'auto_increment' => true], 'id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'auto_increment' => true],
'cliente_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true], 'cliente_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true],
'proveedor_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true], 'proveedor_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true],
'user_created_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'default' => 1], 'user_created_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'default' => 1],
'user_update_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'default' => 1], 'user_update_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'default' => 1],
'cubierta_archivo' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true], 'cubierta_archivo' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true],
'cubierta_url' => ['type' => 'VARCHAR', 'constraint' => 500, 'null' => true], 'cubierta_url' => ['type' => 'VARCHAR', 'constraint' => 500, 'null' => true],
'ancho' => ['type' => 'DOUBLE', 'constraint' => '8,2'], 'ancho' => ['type' => 'DOUBLE', 'constraint' => '8,2'],
'alto' => ['type' => 'DOUBLE', 'constraint' => '8,2'], 'alto' => ['type' => 'DOUBLE', 'constraint' => '8,2'],
'peso' => ['type' => 'DOUBLE', 'constraint' => '8,2', 'null' => true], 'peso' => ['type' => 'DOUBLE', 'constraint' => '8,2', 'null' => true],
'titulo' => ['type' => 'VARCHAR', 'constraint' => 300], 'titulo' => ['type' => 'VARCHAR', 'constraint' => 300],
'autor' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true], 'autor' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true],
'autor_entidad' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true], 'autor_entidad' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true],
'traductor' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true], 'traductor' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true],
'ilustrador' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true], 'ilustrador' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true],
'idioma' => ['type' => 'VARCHAR', 'constraint' => 3, 'default' => 'spa'], 'idioma' => ['type' => 'VARCHAR', 'constraint' => 3, 'default' => 'spa'],
'num_edic' => ['type' => 'INT', 'default' => 1, 'null' => true], 'num_edic' => ['type' => 'INT', 'default' => 1, 'null' => true],
'fecha_disponibilidad' => ['type' => 'DATE', 'null' => true], 'fecha_disponibilidad' => ['type' => 'DATE', 'null' => true],
'fecha_public' => ['type' => 'DATE', 'null' => true], 'fecha_public' => ['type' => 'DATE', 'null' => true],
'num_fotos' => ['type' => 'INT', 'default' => 0], 'num_fotos' => ['type' => 'INT', 'default' => 0],
'num_ilustr' => ['type' => 'INT', 'default' => 0], 'num_ilustr' => ['type' => 'INT', 'default' => 0],
'num_ilustr_color' => ['type' => 'INT', 'default' => 0], 'num_ilustr_color' => ['type' => 'INT', 'default' => 0],
'num_ilustr_bn' => ['type' => 'INT', 'default' => 0], 'num_ilustr_bn' => ['type' => 'INT', 'default' => 0],
'coleccion' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true], 'coleccion' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true],
'isk' => ['type' => 'VARCHAR', 'constraint' => 64, 'null' => true], 'isk' => ['type' => 'VARCHAR', 'constraint' => 64, 'null' => true],
'isbn' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true], 'isbn' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true],
'ean' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true], 'ean' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true],
'editorial' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true], 'editorial' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true],
'resumen' => ['type' => 'TEXT', 'null' => true], 'resumen' => ['type' => 'TEXT', 'null' => true],
'resumen_breve' => ['type' => 'TEXT', 'null' => true], 'resumen_breve' => ['type' => 'TEXT', 'null' => true],
'sello' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true], 'sello' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true],
'paginas' => ['type' => 'INT'], 'paginas' => ['type' => 'INT'],
'tipo_impresion' => ['type' => 'ENUM', 'constraint' => ['negro','negrohq','color','colorhq'], 'null' => true], 'tipo_impresion' => ['type' => 'ENUM', 'constraint' => ['negro', 'negrohq', 'color', 'colorhq'], 'null' => true],
'comentarios' => ['type' => 'TEXT', 'null' => true], 'comentarios' => ['type' => 'TEXT', 'null' => true],
'negro_paginas' => ['type' => 'INT', 'null' => true], 'negro_paginas' => ['type' => 'INT', 'null' => true],
'negro_papel_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true], 'negro_papel_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true],
'negro_gramaje' => ['type' => 'DOUBLE', 'null' => true], 'negro_gramaje' => ['type' => 'DOUBLE', 'null' => true],
'negro_pod_papel_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true], 'negro_pod_papel_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true],
'negro_pod_gramaje' => ['type' => 'DOUBLE', 'null' => true], 'negro_pod_gramaje' => ['type' => 'DOUBLE', 'null' => true],
'color_paginas' => ['type' => 'INT', 'null' => true], 'color_paginas' => ['type' => 'INT', 'null' => true],
'color_papel_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true], 'color_papel_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true],
'color_gramaje' => ['type' => 'DOUBLE', 'null' => true], 'color_gramaje' => ['type' => 'DOUBLE', 'null' => true],
'color_pod_papel_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true], 'color_pod_papel_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true],
'color_pod_gramaje' => ['type' => 'DOUBLE', 'null' => true], 'color_pod_gramaje' => ['type' => 'DOUBLE', 'null' => true],
'cubierta_paginas' => ['type' => 'INT', 'null' => true], 'cubierta_paginas' => ['type' => 'INT', 'null' => true],
'cubierta_papel_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true], 'cubierta_papel_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true],
'cubierta_gramaje' => ['type' => 'DOUBLE', 'null' => true], 'cubierta_gramaje' => ['type' => 'DOUBLE', 'null' => true],
'cubierta_acabado_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true], 'cubierta_acabado_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true],
'cubierta_ancho_solapas' => ['type' => 'DOUBLE', 'constraint' => '8,2', 'default' => 0.00, 'unsigned' => true], 'cubierta_ancho_solapas' => ['type' => 'DOUBLE', 'constraint' => '8,2', 'default' => 0.00, 'unsigned' => true],
'cubierta_pod_papel_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true], 'cubierta_pod_papel_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true],
'cubierta_pod_gramaje' => ['type' => 'DOUBLE', 'null' => true], 'cubierta_pod_gramaje' => ['type' => 'DOUBLE', 'null' => true],
'sobrecubierta_paginas' => ['type' => 'INT', 'null' => true], 'sobrecubierta_paginas' => ['type' => 'INT', 'null' => true],
'sobrecubierta_papel_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true], 'sobrecubierta_papel_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true],
'sobrecubierta_gramaje' => ['type' => 'DOUBLE', 'null' => true], 'sobrecubierta_gramaje' => ['type' => 'DOUBLE', 'null' => true],
'sobrecubierta_acabado_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true], 'sobrecubierta_acabado_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true],
'sobrecubierta_ancho_solapas' => ['type' => 'DOUBLE', 'constraint' => '8,2', 'default' => 0.00, 'unsigned' => true], 'sobrecubierta_ancho_solapas' => ['type' => 'DOUBLE', 'constraint' => '8,2', 'default' => 0.00, 'unsigned' => true],
'sobrecubierta_pod_papel_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true], 'sobrecubierta_pod_papel_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true],
'sobrecubierta_pod_gramaje' => ['type' => 'DOUBLE', 'null' => true], 'sobrecubierta_pod_gramaje' => ['type' => 'DOUBLE', 'null' => true],
'encuadernacion_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true], 'encuadernacion_id' => ['type' => 'INT', 'constraint' => 10, 'unsigned' => true, 'null' => true],
'ubicacion' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true], 'ubicacion' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => true],
'created_at' => ['type' => 'TIMESTAMP', 'default' => 'CURRENT_TIMESTAMP'], 'created_at' => [
'updated_at' => ['type' => 'TIMESTAMP', 'null' => true], 'type' => 'TIMESTAMP',
'deleted_at' => ['type' => 'TIMESTAMP', 'null' => true], 'default' => new \CodeIgniter\Database\RawSql('CURRENT_TIMESTAMP'),
],
'updated_at' => [
'type' => 'TIMESTAMP',
'null' => true,
],
'deleted_at' => [
'type' => 'TIMESTAMP',
'null' => true,
],
]); ]);
$this->forge->addKey('id', true); $this->forge->addKey('id', true);

View File

@ -7,30 +7,24 @@ use CodeIgniter\Database\Migration;
use CodeIgniter\Database\RawSql; use CodeIgniter\Database\RawSql;
use CodeIgniter\I18n\Time; use CodeIgniter\I18n\Time;
class AddClickColumnOrdenTrabajoTarea extends Migration class AddFerroProtoPresupuestoDirecciones extends Migration
{ {
protected array $COLUMNS = [ protected array $COLUMNS = [
"click_init" => [ "is_ferro_prototipo" => [
"type" => "INT", "type" => "TINYINT",
"unsigned" => true, "unsigned" => true,
"default" => 0, "default" => 0,
"comment" => "Click iniciales de una tarea de impresion" "comment" => "Indica si es una direccion para el prototipo o ferro",
],
"click_end" => [
"type" => "INT",
"unsigned" => true,
"default" => 0,
"comment" => "Click finales de una tarea de impresion"
], ],
]; ];
public function up() public function up()
{ {
$this->forge->addColumn('orden_trabajo_tareas', $this->COLUMNS); $this->forge->addColumn('presupuesto_direcciones', $this->COLUMNS);
} }
public function down() public function down()
{ {
$this->forge->dropColumn('orden_trabajo_tareas', array_keys($this->COLUMNS)); $this->forge->dropColumn('presupuesto_direcciones', array_keys($this->COLUMNS));
} }
} }

View File

@ -0,0 +1,30 @@
<?php
namespace App\Database\Migrations;
use App\Models\OrdenTrabajo\OrdenTrabajoTarea;
use CodeIgniter\Database\Migration;
use CodeIgniter\Database\RawSql;
use CodeIgniter\I18n\Time;
class AddTipoEnvioEnvios extends Migration
{
protected array $COLUMNS = [
"tipo_envio" => [
"type" => "enum",
"constraint" => ['estandar', 'ferro_prototipo'],
"default" => 'estandar',
"comment" => "Indica el tipo de envio",
],
];
public function up()
{
$this->forge->addColumn('envios', $this->COLUMNS);
}
public function down()
{
$this->forge->dropColumn('envios', array_keys($this->COLUMNS));
}
}

View File

@ -4,7 +4,7 @@ namespace App\Database\Migrations;
use CodeIgniter\Database\Migration; use CodeIgniter\Database\Migration;
class AddPliegoColumnOrdenTrabajoTarea extends Migration class AlterFkOrdenTrabajoTareaProgressDates extends Migration
{ {

View File

@ -0,0 +1,49 @@
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\RawSql;
use CodeIgniter\Database\Migration;
class CreateTableFestivos extends Migration
{
protected array $COLUMNS = [
"id" => [
"type" => "INT",
"unsigned" => true,
"auto_increment" => true
],
"date" => [
"type" => "DATE",
"unique" => true,
],
];
public function up()
{
$this->forge->addField($this->COLUMNS);
$currenttime = new RawSql("CURRENT_TIMESTAMP");
$this->forge->addField([
"created_at" => [
"type" => "TIMESTAMP",
"default" => $currenttime,
],
"updated_at" => [
"type" => "TIMESTAMP",
"null" => true,
],
"deleted_at" => [
"type" => "TIMESTAMP",
"null" => true,
],
]);
$this->forge->addPrimaryKey('id');
$this->forge->createTable("festivos", true);
}
public function down()
{
//
$this->forge->dropTable("festivos", true);
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\RawSql;
use CodeIgniter\Database\Migration;
class AddClienteNoBasePODnoHQ extends Migration
{
protected array $COLUMNS = [
"no_envio_base" => [
"type" => "TINYINT",
"default" => 0,
],
"forzar_rotativa_pod" => [
"type" => "TINYINT",
"default" => 0,
],
];
public function up()
{
$this->forge->addColumn('clientes', $this->COLUMNS);
}
public function down()
{
//
$this->forge->dropColumn('clientes', array_keys($this->COLUMNS));
}
}

View File

@ -0,0 +1,68 @@
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class AlterTarifasAcabadoAddBoleanColumns extends Migration
{
protected array $COLUMNS = [
'plastificado' => [
'type' => 'BOOLEAN',
'default' => false,
],
'plakene' => [
'type' => 'BOOLEAN',
'default' => false,
],
'rectractilado' => [
'type' => 'BOOLEAN',
'default' => false,
],
'estampado' => [
'type' => 'BOOLEAN',
'default' => false,
],
'uvi' => [
'type' => 'BOOLEAN',
'default' => false,
],
'plastificado_tipo' => [
'type' => 'ENUM',
'constraint' => ['BRILLO','MATE','SANDY','GOFRADO','SOFT','ANTIRAYADO'],
'null' => true,
],
'plakene_tipo' => [
'type' => 'ENUM',
'constraint' => ['TRASLUCIDO','MATE','NEGRO'],
'null' => true,
],
'rectractilado_tipo' => [
'type' => 'ENUM',
'constraint' => ['1','3','5'],
'null' => true,
],
'estampado_tipo' => [
'type' => 'ENUM',
'constraint' => ['ORO','PLATA','COBRE','BRONCE'],
'null' => true,
],
'uvi_tipo' => [
'type' => 'ENUM',
'constraint' => ['2D','3D','BRAILLE'],
'null' => true,
]
];
public function up()
{
$this->forge->addColumn('lg_tarifa_acabado',$this->COLUMNS);
}
public function down()
{
$this->forge->dropColumn('lg_tarifa_acabado',array_keys($this->COLUMNS));
}
}

View File

@ -0,0 +1,43 @@
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class AlterOrdenesTrabajoAddCommentColumns extends Migration
{
protected array $COLUMNS = [
'comment_interior' => [
'type' => 'LONGTEXT',
'null' => true
],
'comment_cubierta' => [
'type' => 'LONGTEXT',
'null' => true
],
'comment_encuadernacion' => [
'type' => 'LONGTEXT',
'null' => true
],
'comment_logistica' => [
'type' => 'LONGTEXT',
'null' => true
],
"info_solapa_guillotina" => [
'type' => 'LONGTEXT',
'null' => true
]
];
public function up()
{
$this->forge->addColumn('ordenes_trabajo',$this->COLUMNS);
}
public function down()
{
$this->forge->dropColumn('ordenes_trabajo',array_keys($this->COLUMNS));
}
}

View File

@ -0,0 +1,82 @@
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
use CodeIgniter\Database\RawSql;
class AddOrdenTrabajoDatesManipuladoImpresion extends Migration
{
protected array $DATES = [
"sobrecubierta_at" => [
"type" => "DATE",
"null" => true,
],
"guarda_at" => [
"type" => "DATE",
"null" => true,
],
"plakene_at" => [
"type" => "DATE",
"null" => true,
],
"estampado_at" => [
"type" => "DATE",
"null" => true,
],
"uvi_at" => [
"type" => "DATE",
"null" => true,
],
];
protected array $USERS = [
"sobrecubierta_user_id" => [
"type" => "INT",
"unsigned" => true,
"constraint" => 10,
"null" => true,
],
"guarda_user_id" => [
"type" => "INT",
"unsigned" => true,
"constraint" => 10,
"null" => true,
],
"plakene_user_id" => [
"type" => "INT",
"unsigned" => true,
"constraint" => 10,
"null" => true,
],
"estampado_user_id" => [
"type" => "INT",
"unsigned" => true,
"constraint" => 10,
"null" => true,
],
"uvi_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));
}
}

View File

@ -0,0 +1,43 @@
<?php
namespace App\Database\Seeds;
use App\Models\Configuracion\ConfigVariableModel;
use App\Models\Configuracion\MaquinaTareaModel;
use CodeIgniter\Database\Seeder;
class PedidoPodSeeder extends Seeder
{
public function run()
{
$m = model(ConfigVariableModel::class);
$data = [
[
"name" => "pod_impresion_dias_tras_confirmacion",
"value" => 1,
"description" => "Días a los que se establece la fecha de impresion en pedido tras confirmación"
],
[
"name" => "pod_encuadernacion_dias_tras_confirmacion",
"value" => 2,
"description" => "Días a los que se establece la fecha de encuadernación en pedido tras confirmación"
],
[
"name" => "pod_entrega_real_dias_tras_confirmacion",
"value" => 5,
"description" => "Días a los que se establece la fecha entrega real en pedido tras confirmación"
],
[
"name" => "pod_embalaje_dias_tras_confirmacion",
"value" => 4,
"description" => "Días a los que se establece la fecha de encuadernación en pedido tras confirmación"
],
];
foreach ($data as $key => $row) {
if($m->getVariable($row['name']) == null)
{
$m->insert($row);
}
}
}
}

View File

@ -1,7 +1,9 @@
<?php <?php
namespace App\Entities\Cliente; namespace App\Entities\Clientes;
use CodeIgniter\Entity; use CodeIgniter\Entity;
use App\Models\Clientes\ClienteModel;
use App\Models\Configuracion\PaisModel;
class ClienteDireccionesEntity extends \CodeIgniter\Entity\Entity class ClienteDireccionesEntity extends \CodeIgniter\Entity\Entity
{ {
@ -23,4 +25,29 @@ class ClienteDireccionesEntity extends \CodeIgniter\Entity\Entity
"pais_id" => "int", "pais_id" => "int",
"cp" => "int", "cp" => "int",
]; ];
public function getClienteNombre(): ?string
{
if (!$this->cliente_id) {
return null;
}
$clienteModel = model(ClienteModel::class);
$cliente = $clienteModel->find($this->cliente_id);
return $cliente ? $cliente->nombre : null;
}
public function getPaisNombre(): ?string
{
if (!$this->pais_id) {
return null;
}
$paisModel = model(PaisModel::class);
$pais = $paisModel->find($this->pais_id);
return $pais ? $pais->nombre : null;
}
} }

View File

@ -48,6 +48,8 @@ class ClienteEntity extends \CodeIgniter\Entity\Entity
"updated_at" => null, "updated_at" => null,
"user_created_id" => 1, "user_created_id" => 1,
"user_update_id" => 1, "user_update_id" => 1,
"no_envio_base" => 0,
"forzar_rotativa_pod" => 0,
]; ];
protected $casts = [ protected $casts = [
"comunidad_autonoma_id" => "?int", "comunidad_autonoma_id" => "?int",
@ -70,6 +72,8 @@ class ClienteEntity extends \CodeIgniter\Entity\Entity
"is_deleted" => "int", "is_deleted" => "int",
"user_created_id" => "int", "user_created_id" => "int",
"user_update_id" => "int", "user_update_id" => "int",
"no_envio_base" => "boolean",
"forzar_rotativa_pod" => "boolean",
]; ];
public function comercial() : ?UserEntity public function comercial() : ?UserEntity

View File

@ -0,0 +1,14 @@
<?php
namespace App\Entities\Configuracion;
use CodeIgniter\Entity\Entity;
class FestivoEntity extends Entity
{
protected $attributes = [
"id" => null,
"date" => null,
];
protected $casts = [];
}

View File

@ -31,5 +31,6 @@ class EnvioEntity extends Entity
'created_at' => 'datetime', 'created_at' => 'datetime',
'updated_at' => 'datetime', 'updated_at' => 'datetime',
'cajas' => 'int', 'cajas' => 'int',
'tipo_envio' => 'string',
]; ];
} }

View File

@ -1,7 +1,9 @@
<?php <?php
namespace App\Entities\Presupuestos; namespace App\Entities\Presupuestos;
use App\Entities\Compras\ProveedorEntity;
use App\Entities\Tarifas\Acabados\TarifaAcabadoEntity; use App\Entities\Tarifas\Acabados\TarifaAcabadoEntity;
use App\Models\Compras\ProveedorModel;
use App\Models\Configuracion\MaquinaModel; use App\Models\Configuracion\MaquinaModel;
use App\Models\Tarifas\Acabados\TarifaAcabadoModel; use App\Models\Tarifas\Acabados\TarifaAcabadoModel;
use App\Models\Tarifas\Maquinas\TarifaAcabadoMaquinaModel; use App\Models\Tarifas\Maquinas\TarifaAcabadoMaquinaModel;
@ -54,5 +56,13 @@ class PresupuestoAcabadosEntity extends \CodeIgniter\Entity\Entity
$m = model(TarifaAcabadoModel::class); $m = model(TarifaAcabadoModel::class);
return $m->find($this->attributes["tarifa_acabado_id"]); return $m->find($this->attributes["tarifa_acabado_id"]);
} }
public function proveedor(): ?ProveedorEntity
{
$proveedor = null;
$m = model(ProveedorModel::class);
if ($this->attributes["proveedor_id"]) {
$proveedor = $m->find($this->attributes["proveedor_id"]);
}
return $proveedor;
}
} }

View File

@ -25,6 +25,7 @@ class PresupuestoDireccionesEntity extends \CodeIgniter\Entity\Entity
"proveedor_id" => null, "proveedor_id" => null,
"margen" => null, "margen" => null,
"entregaPieCalle" => null, "entregaPieCalle" => null,
"is_ferro_prototipo" => null,
]; ];
protected $casts = [ protected $casts = [
"presupuesto_id" => "int", "presupuesto_id" => "int",
@ -38,6 +39,7 @@ class PresupuestoDireccionesEntity extends \CodeIgniter\Entity\Entity
"margen" => "float", "margen" => "float",
"proveedor_id" => "int", "proveedor_id" => "int",
"entregaPieCalle" => "int", "entregaPieCalle" => "int",
"is_ferro_prototipo" => "int",
]; ];
} }

View File

@ -1,7 +1,10 @@
<?php <?php
namespace App\Entities\Presupuestos; namespace App\Entities\Presupuestos;
use App\Entities\Compras\ProveedorEntity;
use App\Entities\Tarifas\TarifaEncuadernacionEntity; use App\Entities\Tarifas\TarifaEncuadernacionEntity;
use App\Models\Compras\ProveedorModel;
use App\Models\Configuracion\MaquinaModel; use App\Models\Configuracion\MaquinaModel;
use App\Models\Tarifas\Maquinas\TarifaEncuadernacionMaquinaModel; use App\Models\Tarifas\Maquinas\TarifaEncuadernacionMaquinaModel;
use App\Models\Tarifas\TarifaEncuadernacionModel; use App\Models\Tarifas\TarifaEncuadernacionModel;
@ -32,10 +35,10 @@ class PresupuestoEncuadernacionesEntity extends \CodeIgniter\Entity\Entity
"precio_total" => "float", "precio_total" => "float",
"margen" => "float", "margen" => "float",
]; ];
public function maquinas() : array public function maquinas(): array
{ {
$m = model(TarifaEncuadernacionMaquinaModel::class); $m = model(TarifaEncuadernacionMaquinaModel::class);
$tarifa_maquinas = $m->where("tarifa_encuadernacion_id",$this->attributes["tarifa_encuadernado_id"])->findAll(); $tarifa_maquinas = $m->where("tarifa_encuadernacion_id", $this->attributes["tarifa_encuadernado_id"])->findAll();
$maquinaModel = model(MaquinaModel::class); $maquinaModel = model(MaquinaModel::class);
$maquinas = []; $maquinas = [];
foreach ($tarifa_maquinas as $key => $tarifa_maquina) { foreach ($tarifa_maquinas as $key => $tarifa_maquina) {
@ -43,9 +46,18 @@ class PresupuestoEncuadernacionesEntity extends \CodeIgniter\Entity\Entity
} }
return $maquinas; return $maquinas;
} }
public function tarifa() : TarifaEncuadernacionEntity public function tarifa(): TarifaEncuadernacionEntity
{ {
$m = model(TarifaEncuadernacionModel::class); $m = model(TarifaEncuadernacionModel::class);
return $m->find($this->attributes["tarifa_encuadernado_id"]); return $m->find($this->attributes["tarifa_encuadernado_id"]);
} }
public function proveedor(): ?ProveedorEntity
{
$proveedor = null;
$m = model(ProveedorModel::class);
if ($this->attributes["proveedor_id"]) {
$proveedor = $m->find($this->attributes["proveedor_id"]);
}
return $proveedor;
}
} }

View File

@ -210,35 +210,35 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity
$q = $model->where('presupuesto_id', $this->attributes["id"])->findAll(); $q = $model->where('presupuesto_id', $this->attributes["id"])->findAll();
return $q ?? [];
}
/**
* Obtiene las lineas de presupuesto del actual presupuesto
*
* @return ?PresupuestoLineaEntity
*/
public function presupuestoLineaImpresion(): ?PresupuestoLineaEntity
{
$model = model(PresupuestoLineaModel::class);
$q = $model->where('presupuesto_id', $this->attributes["id"])->whereIn("tipo", ["lp_rot_bn", "lp_rot_color", "lp_color", "lp_colorhq", "lp_bn", "lp_bnhq"])->first();
return $q; return $q;
} }
/** /**
* Obtiene las lineas de presupuesto del actual presupuesto * Obtiene las lineas de presupuesto del actual presupuesto
* *
* @return PresupuestoLineaEntity * @return PresupuestoLineaEntity
*/ */
public function presupuestoLineaImpresion(): PresupuestoLineaEntity public function presupuestoLineaCubierta(): ?PresupuestoLineaEntity
{ {
$model = model(PresupuestoLineaModel::class); $model = model(PresupuestoLineaModel::class);
$q = $model->where('presupuesto_id', $this->attributes["id"])->whereIn("tipo",["lp_rot_bn","lp_rot_color","lp_color","lp_colorhq","lp_bn","lp_bnhq"])->first(); $q = $model->where('presupuesto_id', $this->attributes["id"])->whereIn("tipo", ["lp_cubierta"])->first();
return $q; return $q;
} }
/** /**
* Obtiene las lineas de presupuesto del actual presupuesto
*
* @return PresupuestoLineaEntity
*/
public function presupuestoLineaCubierta(): PresupuestoLineaEntity
{
$model = model(PresupuestoLineaModel::class);
$q = $model->where('presupuesto_id', $this->attributes["id"])->whereIn("tipo",["lp_cubierta"])->first();
return $q;
}
/**
* Obtiene las lineas de presupuesto del actual presupuesto * Obtiene las lineas de presupuesto del actual presupuesto
* *
* @return PresupuestoLineaEntity * @return PresupuestoLineaEntity
@ -247,51 +247,64 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity
{ {
$model = model(PresupuestoLineaModel::class); $model = model(PresupuestoLineaModel::class);
$q = $model->where('presupuesto_id', $this->attributes["id"])->whereIn("tipo",["lp_sobrecubierta"])->first(); $q = $model->where('presupuesto_id', $this->attributes["id"])->whereIn("tipo", ["lp_sobrecubierta"])->first();
return $q; return $q;
} }
public function hasSobrecubierta() : bool public function presupuestoLineaGuarda(): ?PresupuestoLineaEntity
{
$model = model(PresupuestoLineaModel::class);
$q = $model->where('presupuesto_id', $this->attributes["id"])->whereIn("tipo", ["lp_guardas"])->first();
return $q;
}
public function hasSobrecubierta(): bool
{ {
$hasSobrecubierta = false; $hasSobrecubierta = false;
$model = model(PresupuestoLineaModel::class); $model = model(PresupuestoLineaModel::class);
$q = $model->where('presupuesto_id', $this->attributes["id"])->whereIn("tipo",["lp_sobrecubierta"])->countAllResults(); $q = $model->where('presupuesto_id', $this->attributes["id"])->whereIn("tipo", ["lp_sobrecubierta"])->countAllResults();
if($q > 0){ if ($q > 0) {
$hasSobrecubierta = true; $hasSobrecubierta = true;
} }
return $hasSobrecubierta; return $hasSobrecubierta;
} }
public function cliente() : ClienteEntity public function cliente(): ?ClienteEntity
{ {
$m = model(ClienteModel::class); $m = model(ClienteModel::class);
return $m->find($this->attributes["cliente_id"]); if ($this->attributes['cliente_id']) {
return $m->find($this->attributes["cliente_id"]);
} else {
return null;
}
} }
public function encuadernaciones(): array public function encuadernaciones(): array
{ {
$m = model(PresupuestoEncuadernacionesModel::class); $m = model(PresupuestoEncuadernacionesModel::class);
return $m->where("presupuesto_id",$this->attributes["id"])->findAll(); return $m->where("presupuesto_id", $this->attributes["id"])->findAll();
} }
public function acabados(): array public function acabados(): array
{ {
$m = model(PresupuestoAcabadosModel::class); $m = model(PresupuestoAcabadosModel::class);
return $m->where("presupuesto_id",$this->attributes["id"])->findAll(); return $m->where("presupuesto_id", $this->attributes["id"])->findAll();
} }
public function preimpresiones(): array public function preimpresiones(): array
{ {
$m = model(PresupuestoPreimpresionesModel::class); $m = model(PresupuestoPreimpresionesModel::class);
return $m->where("presupuesto_id",$this->attributes["id"])->findAll(); return $m->where("presupuesto_id", $this->attributes["id"])->findAll();
} }
public function manipulados(): array public function manipulados(): array
{ {
$m = model(PresupuestoManipuladosModel::class); $m = model(PresupuestoManipuladosModel::class);
return $m->where("presupuesto_id",$this->attributes["id"])->findAll(); return $m->where("presupuesto_id", $this->attributes["id"])->findAll();
} }
public function extras(): array public function extras(): array
{ {
$m = model(PresupuestoServiciosExtraModel::class); $m = model(PresupuestoServiciosExtraModel::class);
return $m->where("presupuesto_id",$this->attributes["id"])->findAll(); return $m->where("presupuesto_id", $this->attributes["id"])->findAll();
} }
public function papel_formato() : PapelFormatoEntity public function papel_formato(): PapelFormatoEntity
{ {
$m = model(PapelFormatoModel::class); $m = model(PapelFormatoModel::class);
return $m->find($this->attributes["papel_formato_id"]); return $m->find($this->attributes["papel_formato_id"]);
@ -299,18 +312,16 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity
public function files(): array public function files(): array
{ {
$m = model(PresupuestoFicheroModel::class); $m = model(PresupuestoFicheroModel::class);
$files = $m->where('presupuesto_id',$this->attributes['id'])->findAll(); $files = $m->where('presupuesto_id', $this->attributes['id'])->findAll();
return $files ?? []; return $files ?? [];
} }
public function tipo_presupuesto() : ?TipoPresupuestoEntity public function tipo_presupuesto(): ?TipoPresupuestoEntity
{ {
$tipo_presupuesto = null; $tipo_presupuesto = null;
$m = model(TipoPresupuestoModel::class); $m = model(TipoPresupuestoModel::class);
if($this->attributes["tipo_impresion_id"]){ if ($this->attributes["tipo_impresion_id"]) {
$tipo_presupuesto = $m->find($this->attributes['tipo_impresion_id']); $tipo_presupuesto = $m->find($this->attributes['tipo_impresion_id']);
} }
return $tipo_presupuesto; return $tipo_presupuesto;
} }
} }

View File

@ -222,6 +222,7 @@ class PresupuestoLineaEntity extends \CodeIgniter\Entity\Entity
return $nombre; return $nombre;
} }
public function isGuarda(): bool public function isGuarda(): bool
{ {
return in_array($this->attributes["tipo"], ["lp_guardas"]); return in_array($this->attributes["tipo"], ["lp_guardas"]);

View File

@ -15,8 +15,15 @@ class OrdenTrabajoDateEntity extends Entity
"interior_bn_at" => null, "interior_bn_at" => null,
"interior_color_at" => null, "interior_color_at" => null,
"cubierta_at" => null, "cubierta_at" => null,
"sobrecubierta_at" => null, //TODO
"guarda_at" => null, //TODO
//ACABADO //ACABADO
"plastificado_at" => null, "plastificado_at" => null,
"plakene_at" => null, //TODO
"retractilado_at"=> null,
"estampado_at" => null, //TODO
"uvi_at" => null, //TODO
//MANIPULADO
"encuadernacion_at" => null, "encuadernacion_at" => null,
"corte_at" => null, "corte_at" => null,
"preparacion_interiores_at" => null, "preparacion_interiores_at" => null,
@ -24,9 +31,8 @@ class OrdenTrabajoDateEntity extends Entity
"cosido_at" => null, "cosido_at" => null,
"solapa_at" => null, "solapa_at" => null,
"grapado_at" => null, "grapado_at" => null,
"retractilado_at"=> null, "retractilado5_at"=> null, // !DELETE
"retractilado5_at"=> null, "prototipo_at"=> null, // !DELETE
"prototipo_at"=> null,
"marcapaginas_at"=> null, "marcapaginas_at"=> null,
"espiral_at"=> null, "espiral_at"=> null,
//FERRO //FERRO

View File

@ -30,6 +30,11 @@ class OrdenTrabajoEntity extends Entity
"progreso" => 0.00, "progreso" => 0.00,
"estado" => "I", "estado" => "I",
"comentarios" => null, "comentarios" => null,
"comment_interior" => null,
"comment_cubierta" => null,
"comment_encuadernacion" => null,
"comment_logistica" => null,
"info_solapa_guillotina" => null,
"revisar_formato" => null, "revisar_formato" => null,
"revisar_lomo" => null, "revisar_lomo" => null,
"revisar_solapa" => null, "revisar_solapa" => null,
@ -52,7 +57,12 @@ class OrdenTrabajoEntity extends Entity
"tipo_entrada" => "string", "tipo_entrada" => "string",
"progreso" => "float", "progreso" => "float",
"estado" => "string", "estado" => "string",
"comentarios" => "string", "comentarios" => "?string",
"comment_interior" => "?string",
"comment_cubierta" => "?string",
"comment_encuadernacion" => "?string",
"comment_logistica" => "?string",
"info_solapa_guillotina" => "?string",
"revisar_formato" => "bool", "revisar_formato" => "bool",
"revisar_lomo" => "bool", "revisar_lomo" => "bool",
"revisar_solapa" => "bool", "revisar_solapa" => "bool",
@ -80,7 +90,22 @@ class OrdenTrabajoEntity extends Entity
$m = model(OrdenTrabajoTarea::class); $m = model(OrdenTrabajoTarea::class);
return $m->where("orden_trabajo_id", $this->attributes["id"])->where("presupuesto_linea_id IS NOT NULL", NULL, FALSE)->findAll() ?? []; return $m->where("orden_trabajo_id", $this->attributes["id"])->where("presupuesto_linea_id IS NOT NULL", NULL, FALSE)->findAll() ?? [];
} }
/** public function tareas_acabado(): array
{
$m = model(OrdenTrabajoTarea::class);
return $m->where("orden_trabajo_id", $this->attributes["id"])->where("presupuesto_acabado_id IS NOT NULL", NULL, FALSE)->findAll() ?? [];
}
public function tareas_encuadernado(): array
{
$m = model(OrdenTrabajoTarea::class);
return $m->where("orden_trabajo_id", $this->attributes["id"])->where("presupuesto_encuadernado_id IS NOT NULL", NULL, FALSE)->findAll() ?? [];
}
public function tareas_manipulado(): array
{
$m = model(OrdenTrabajoTarea::class);
return $m->where("orden_trabajo_id", $this->attributes["id"])->where("presupuesto_manipulado_id IS NOT NULL", NULL, FALSE)->findAll() ?? [];
}
/**
* Devuelve el presupuesto de la orden de trabajo * Devuelve el presupuesto de la orden de trabajo
* *
* @return PresupuestoEntity * @return PresupuestoEntity
@ -183,4 +208,5 @@ class OrdenTrabajoEntity extends Entity
]; ];
return $estados[$this->attributes["estado"]]; return $estados[$this->attributes["estado"]];
} }
} }

View File

@ -5,6 +5,7 @@ namespace App\Entities\Produccion;
use App\Entities\Configuracion\Imposicion; use App\Entities\Configuracion\Imposicion;
use App\Entities\Configuracion\Maquina; use App\Entities\Configuracion\Maquina;
use App\Entities\Presupuestos\PresupuestoAcabadosEntity; use App\Entities\Presupuestos\PresupuestoAcabadosEntity;
use App\Entities\Presupuestos\PresupuestoEncuadernacionesEntity;
use App\Entities\Presupuestos\PresupuestoLineaEntity; use App\Entities\Presupuestos\PresupuestoLineaEntity;
use App\Entities\Presupuestos\PresupuestoManipuladosEntity; use App\Entities\Presupuestos\PresupuestoManipuladosEntity;
use App\Models\Configuracion\ImposicionModel; use App\Models\Configuracion\ImposicionModel;
@ -12,6 +13,7 @@ use App\Models\Configuracion\MaquinaModel;
use App\Models\OrdenTrabajo\OrdenTrabajoModel; use App\Models\OrdenTrabajo\OrdenTrabajoModel;
use App\Models\OrdenTrabajo\OrdenTrabajoTareaProgressDate; use App\Models\OrdenTrabajo\OrdenTrabajoTareaProgressDate;
use App\Models\Presupuestos\PresupuestoAcabadosModel; use App\Models\Presupuestos\PresupuestoAcabadosModel;
use App\Models\Presupuestos\PresupuestoEncuadernacionesModel;
use App\Models\Presupuestos\PresupuestoLineaModel; use App\Models\Presupuestos\PresupuestoLineaModel;
use App\Models\Presupuestos\PresupuestoManipuladosModel; use App\Models\Presupuestos\PresupuestoManipuladosModel;
use CodeIgniter\Entity\Entity; use CodeIgniter\Entity\Entity;
@ -23,6 +25,11 @@ class OrdenTrabajoTareaEntity extends Entity
"id" => null, "id" => null,
"orden_trabajo_id" => null, "orden_trabajo_id" => null,
"presupuesto_linea_id" => null, "presupuesto_linea_id" => null,
"presupuesto_acabado_id" => null,
"presupuesto_preimpresion_id" => null,
"presupuesto_encuadernado_id" => null,
"presupuesto_extra_id" => null,
"presupuesto_manipulado_id" => null,
"nombre" => null, "nombre" => null,
"orden" => null, "orden" => null,
"maquina_id" => null, "maquina_id" => null,
@ -96,10 +103,15 @@ class OrdenTrabajoTareaEntity extends Entity
* *
* @return PresupuestoLineaEntity * @return PresupuestoLineaEntity
*/ */
public function presupuesto_linea(): PresupuestoLineaEntity public function presupuesto_linea(): ?PresupuestoLineaEntity
{ {
$presupuesto_linea = null;
$m = model(PresupuestoLineaModel::class); $m = model(PresupuestoLineaModel::class);
return $m->find($this->attributes["presupuesto_linea_id"]); if ($this->attributes['presupuesto_linea_id']) {
$presupuesto_linea = $m->find($this->attributes["presupuesto_linea_id"]);
}
return $presupuesto_linea;
} }
/** /**
* Devuelve la maquina original del presupuesto linea * Devuelve la maquina original del presupuesto linea
@ -108,17 +120,35 @@ class OrdenTrabajoTareaEntity extends Entity
*/ */
public function maquina_presupuesto_linea(): Maquina public function maquina_presupuesto_linea(): Maquina
{ {
return $this->presupuesto_linea()->maquina(); return $this->presupuesto_linea()?->maquina();
} }
/** /**
* Devuelve el presupuesto acabado origen de esta tarea * Devuelve el presupuesto acabado origen de esta tarea
* *
* @return PresupuestoAcabadosEntity * @return PresupuestoAcabadosEntity
*/ */
public function presupuesto_acabado(): PresupuestoAcabadosEntity public function presupuesto_acabado(): ?PresupuestoAcabadosEntity
{ {
$presupuesto_acabado = null;
$m = model(PresupuestoAcabadosModel::class); $m = model(PresupuestoAcabadosModel::class);
return $m->find($this->attributes["presupuesto_linea_id"]); if ($this->attributes["presupuesto_acabado_id"]) {
$presupuesto_acabado = $m->find($this->attributes["presupuesto_acabado_id"]);
}
return $presupuesto_acabado;
}
/**
* Devuelve el presupuesto enducadernacion origen de esta tarea
*
* @return PresupuestoEncuadernacionesEntity
*/
public function presupuesto_encuadernacion(): ?PresupuestoEncuadernacionesEntity
{
$presupuesto_encuadernacion = null;
$m = model(PresupuestoEncuadernacionesModel::class);
if ($this->attributes["presupuesto_encuadernado_id"]) {
$presupuesto_encuadernacion = $m->find($this->attributes["presupuesto_encuadernado_id"]);
}
return $presupuesto_encuadernacion;
} }
/** /**
* Devuelve el presupuesto acabado origen de esta tarea * Devuelve el presupuesto acabado origen de esta tarea
@ -148,12 +178,18 @@ class OrdenTrabajoTareaEntity extends Entity
$m = model(OrdenTrabajoTareaProgressDate::class); $m = model(OrdenTrabajoTareaProgressDate::class);
return $m->where('ot_tarea_id', $this->attributes["id"])->findAll() ?? []; return $m->where('ot_tarea_id', $this->attributes["id"])->findAll() ?? [];
} }
public function lastState() : ?OrdenTrabajoTareaProgressDateEntity
{
$m = model(OrdenTrabajoTareaProgressDate::class);
$progressDates = $m->where('ot_tarea_id', $this->attributes["id"])->orderBy('action_at', 'DESC')->first();
return $progressDates;
}
public function tiempo_trabajado() public function tiempo_trabajado()
{ {
$dates = $this->progress_dates(); $dates = $this->progress_dates();
$intervals = []; $intervals = [];
$init = []; $init = null;
$end = []; $end = null;
foreach ($dates as $key => $date) { foreach ($dates as $key => $date) {
if ($date->estado == "I") { if ($date->estado == "I") {
if ($date->action_at) { if ($date->action_at) {
@ -161,7 +197,7 @@ class OrdenTrabajoTareaEntity extends Entity
} }
} }
if ($date->estado == "S" || $date->estado == "F") { if ($date->estado == "S" || $date->estado == "F") {
if ($date->action_at) { if ($date->action_at && $init) {
$end = Time::createFromFormat('Y-m-d H:i:s', $date->action_at); $end = Time::createFromFormat('Y-m-d H:i:s', $date->action_at);
$intervals[] = $init->difference($end)->getSeconds(); $intervals[] = $init->difference($end)->getSeconds();
} }
@ -182,4 +218,24 @@ class OrdenTrabajoTareaEntity extends Entity
} }
return $isTareaCosido; return $isTareaCosido;
} }
public function isImpresion() : bool
{
return $this->attributes['presupuesto_linea_id'] != null;
}
public function isAcabado() : bool
{
return $this->attributes['presupuesto_acabado_id'] != null;
}
public function isManipulado() : bool
{
return $this->attributes['presupuesto_manipulado_id'] != null;
}
public function isEncuadernado() : bool
{
return $this->attributes['presupuesto_encuadernado_id'] != null;
}
public function isCorte() : bool
{
return $this->attributes['is_corte'];
}
} }

View File

@ -19,8 +19,13 @@ class OrdenTrabajoUserEntity extends Entity
"interior_bn_user_id" => null, "interior_bn_user_id" => null,
"interior_color_user_id" => null, "interior_color_user_id" => null,
"cubierta_user_id" => null, "cubierta_user_id" => null,
"sobrecubierta_user_id" => null,
"guarda_user_id" => null,
//ACABADO //ACABADO
"plastificado_user_id" => null, "plastificado_user_id" => null,
"plakene_user_id" => null,
"estampado_user_id" => null,
"uvi_user_id" => null,
"encuadernacion_user_id" => null, "encuadernacion_user_id" => null,
"corte_user_id" => null, "corte_user_id" => null,
"preparacion_interior_user_id" => null, "preparacion_interior_user_id" => null,

View File

@ -24,6 +24,16 @@ class TarifaAcabadoEntity extends \CodeIgniter\Entity\Entity
"deleted_at" => null, "deleted_at" => null,
"created_at" => null, "created_at" => null,
"updated_at" => null, "updated_at" => null,
'plastificado' => null,
'plakene' => null,
'rectractilado' => null,
'estampado' => null,
'uvi' => null,
'plastificado_tipo' => null,
'plakene_tipo' => null,
'rectractilado_tipo' => null,
'estampado_tipo' => null,
'uvi_tipo' => null,
]; ];
protected $casts = [ protected $casts = [
"precio_min" => "float", "precio_min" => "float",
@ -33,6 +43,16 @@ class TarifaAcabadoEntity extends \CodeIgniter\Entity\Entity
"user_created_id" => "int", "user_created_id" => "int",
"user_updated_id" => "int", "user_updated_id" => "int",
"is_deleted" => "int", "is_deleted" => "int",
'plastificado' => 'boolean',
'plakene' => 'boolean',
'rectractilado' => 'boolean',
'estampado' => 'boolean',
'uvi' => 'boolean',
'plastificado_tipo' => '?string',
'plakene_tipo' => '?string',
'rectractilado_tipo' => '?string',
'estampado_tipo' => '?string',
'uvi_tipo' => '?string',
]; ];
/** /**
* Devuelve las maquinas asociadas a esta tarifa de acabado * Devuelve las maquinas asociadas a esta tarifa de acabado
@ -48,6 +68,7 @@ class TarifaAcabadoEntity extends \CodeIgniter\Entity\Entity
public function isUVI(): bool public function isUVI(): bool
{ {
return in_array($this->attributes["code"],["R3D","R2D"]); return $this->attributes['uvi'];
} }
} }

View File

@ -676,6 +676,7 @@ return [
"menu_tarifacliente" => "Fees", "menu_tarifacliente" => "Fees",
"menu_configuration" => "Settings", "menu_configuration" => "Settings",
"menu_config_holidays" => "Holidays",
"menu_calendario" => "Calendar", "menu_calendario" => "Calendar",
"menu_paises" => "Countries", "menu_paises" => "Countries",
"menu_correo" => "Mail", "menu_correo" => "Mail",
@ -699,7 +700,7 @@ return [
"menu_digitalizacion" => "Digitalisation", "menu_digitalizacion" => "Digitalisation",
"menu_importacion" => "Import", "menu_importadores" => "Import",
"menu_catalogo" => "Catalogue", "menu_catalogo" => "Catalogue",
"menu_catalogo_libros" => "Books", "menu_catalogo_libros" => "Books",
@ -761,6 +762,7 @@ return [
"menu_tarifaimpresion" => "Printing", "menu_tarifaimpresion" => "Printing",
"menu_users" => "Users", "menu_users" => "Users",
"menu_change_session" => "Seleccionar turno",
"menu_permission_group" => "Roles and permissions", "menu_permission_group" => "Roles and permissions",
"menu_registration" => "Registration", "menu_registration" => "Registration",

View File

@ -0,0 +1,7 @@
<?php
return [
'date' => 'Date',
'moduleTitle' => 'Holidays'
];

View File

@ -690,6 +690,7 @@ return [
"menu_configuration" => "Configuración", "menu_configuration" => "Configuración",
"menu_variables" => "Variables sistema", "menu_variables" => "Variables sistema",
"menu_config_messages" => "Mensajería", "menu_config_messages" => "Mensajería",
"menu_config_holidays" => "Festivos",
"menu_error_presupuesto" => "Errores presupuesto", "menu_error_presupuesto" => "Errores presupuesto",
"menu_calendario" => "Calendario", "menu_calendario" => "Calendario",
"menu_paises" => "Paises", "menu_paises" => "Paises",
@ -719,7 +720,9 @@ return [
"menu_digitalizacion" => "Digitalización", "menu_digitalizacion" => "Digitalización",
"menu_importacion" => "Importación", "menu_importadores" => "Importadores",
"menu_importadores_catalogo" => "Desde catálogo",
"menu_importadores_bubok" => "Bubok",
"menu_catalogo" => "Catálogo", "menu_catalogo" => "Catálogo",
"menu_catalogo_libros" => "Libros", "menu_catalogo_libros" => "Libros",

View File

@ -46,6 +46,8 @@ return [
'userCreatedId' => 'User Created ID', 'userCreatedId' => 'User Created ID',
'userUpdateId' => 'User Update ID', 'userUpdateId' => 'User Update ID',
'vencimiento' => 'Vencimiento', 'vencimiento' => 'Vencimiento',
'removeEnvioBase' => 'No añadir Envio Base',
'forzarRotativaPod' => 'Forzar rotativa en POD',
'direccionesEnvio' => 'Direcciones de Envío', 'direccionesEnvio' => 'Direcciones de Envío',

View File

@ -0,0 +1,7 @@
<?php
return [
'date' => 'Fecha',
'moduleTitle' => 'Festivos'
];

View File

@ -0,0 +1,82 @@
<?php
return [
'moduleTitle' => 'Importadores',
'importadorCatalogoTitle' => 'Importador RA-MA Ediciones S.L.',
'importadorBubokTitle' => 'Importador BUBOK Publishing S.L.',
'catalogo' => 'catálogo',
'input' => 'ISBN',
'descripcion' => 'Título',
'idlinea' => 'Ref. cliente',
'cnt_pedida' => 'Unidades',
'precio_compra' => 'Precio Compra',
'importar' => 'Importar',
'subirArchivoRama' => 'Cargar Excel proporcionado por RA-MA',
'subirArchivoBubok' => 'Cargar XML proporcionado por BUBOK',
'libro' => 'libro',
'id' => 'ID',
'clienteId' => 'Cliente',
'cliente' => 'Cliente',
'userCreatedId' => 'Usuario Creador',
'userUpdateId' => 'Usuario Actualizador',
'portada' => 'Portada',
'ancho' => 'Ancho',
'alto' => 'Alto',
'peso' => 'Peso',
'titulo' => 'Título',
'autor' => 'Autor',
'autorEntidad' => 'Entidad del Autor',
'traductor' => 'Traductor',
'ilustrador' => 'Ilustrador',
'idioma' => 'Idioma',
'numEdic' => 'Número de Edición',
'edicion' => 'Edición',
'fechaDisponibilidad' => 'Fecha de Disponibilidad',
'fechaPublic' => 'Fecha de Publicación',
'numFotos' => 'Número de Fotos',
'numIlustr' => 'Número de Ilustraciones',
'numIlustrColor' => 'Ilustraciones a Color',
'numIlustrBn' => 'Ilustraciones en Blanco y Negro',
'coleccion' => 'Colección',
'isbn' => 'ISBN',
'ean' => 'EAN',
'editorial' => 'Editorial',
'resumen' => 'Resumen',
'resumenBreve' => 'Resumen Breve',
'sello' => 'Sello',
'paginas' => 'Páginas',
'tipoImpresion' => 'Tipo de Impresión',
'seleccionarTipoImpresion' => 'Seleccionar tipo de impresión',
'solapasAncho' => 'Ancho de Solapas',
'cubiertasAncho' => 'Ancho de Cubiertas',
'comentarios' => 'Comentarios',
'negroPaginas' => 'Páginas Negras',
'negroPapel' => 'Papel Negro',
'negroGramaje' => 'Gramaje Negro',
'colorPaginas' => 'Páginas a Color',
'colorPapel' => 'Papel a Color',
'colorGramaje' => 'Gramaje Color',
'portadaPaginas' => 'Páginas de Portada',
'portadaPapel' => 'Papel de Portada',
'portadaGramaje' => 'Gramaje Portada',
'portadaAcabado' => 'Acabado Portada',
'cubiertaPaginas' => 'Páginas de Cubierta',
'cubiertaPapel' => 'Papel de Cubierta',
'cubiertaGramaje' => 'Gramaje Cubierta',
'cubiertaAcabado' => 'Acabado Cubierta',
'encuardenacion' => 'Encuadernación',
'ubicacion' => 'Ubicación',
'createdAt' => 'Fecha de Creación',
'updatedAt' => 'Fecha de Actualización',
'deletedAt' => 'Fecha de Eliminación',
'catalogoLibro' => 'Libro',
'catalogoLibroList' => 'Lista de Libros',
'datosGenerales' => 'Datos generales del libro',
'otrosDatosLibro' => 'Otros datos del libro',
'configuracionLibro' => 'Configuración del libro',
'ficherosLibro' => 'Ficheros',
'created_by_at' => 'Creado:',
'updated_by_at' => 'Actualizado:',
];

View File

@ -1,15 +1,25 @@
<?php <?php
return [ return [
"navs" => [
'finalizadas' => 'Finalizadas',
'pendientes' => 'Pendientes',
'pendientes_ferro' => 'Ferro pendiente',
'ferro_ok' => 'Ferro/Prototipo OK',
'news' => 'Nuevas',
'waiting' => 'En espera',
'revision_com' => 'Revisión comercial',
'prod' => 'Producción'
],
"datatable" => [ "datatable" => [
"pedido_id"=> "Pedido ID", "pedido_id" => "Pedido ID",
"fecha_encuadernacion"=> "Fecha encuadernación", "fecha_encuadernacion" => "Fecha encuadernación",
"fecha_impresion"=> "Fecha impresión", "fecha_impresion" => "Fecha impresión",
"cliente"=> "Cliente", "cliente" => "Cliente",
"titulo"=> "Título", "titulo" => "Título",
"ubicacion"=> "Ubicación", "ubicacion" => "Ubicación",
"tirada"=> "Tirada", "tirada" => "Tirada",
"impresion"=> "Impresión", "impresion" => "Impresión",
"fecha_entrega_at" => "Fecha entrega prevista", "fecha_entrega_at" => "Fecha entrega prevista",
"maquina" => "Máquina", "maquina" => "Máquina",
"ancho" => "Ancho", "ancho" => "Ancho",
@ -31,8 +41,6 @@ return [
"pliegos" => "Pliegos", "pliegos" => "Pliegos",
"pliegos_libro" => "Pliegos", "pliegos_libro" => "Pliegos",
"fecha" => "fecha" "fecha" => "fecha"
], ],
"task" => [ "task" => [
"order" => "Orden", "order" => "Orden",
@ -43,12 +51,13 @@ return [
"maquina_actual" => "Máquina actual", "maquina_actual" => "Máquina actual",
"tiempo_estimado" => "Tiempo estimado", "tiempo_estimado" => "Tiempo estimado",
"tiempo" => "Tiempo", "tiempo" => "Tiempo",
"proveedor" => "Proveedor",
"imposicion" => "Imposición" "imposicion" => "Imposición"
], ],
"finalizadas" => "Finalizadas", "finalizadas" => "Finalizadas",
"pendiente_ferro" => "Ferro pendiente", "pendiente_ferro" => "Ferro pendiente",
"pendientes" => "Pendientes", "pendientes" => "Pendientes",
"ferro_ok" => "Ferro ok", "ferro_ok" => "Ferro/Prototipo ok",
"envio" => "Envío", "envio" => "Envío",
"ferro" => "Ferro", "ferro" => "Ferro",
"ot" => "Orden trabajo", "ot" => "Orden trabajo",
@ -70,6 +79,7 @@ return [
"portada" => "portada", "portada" => "portada",
"plakene_traslucido" => "Plakene traslúcido", "plakene_traslucido" => "Plakene traslúcido",
"plastificado_mate" => "Plastificado mate", "plastificado_mate" => "Plastificado mate",
"plastificado" => "Plastificado",
"espiral" => "Espiral", "espiral" => "Espiral",
"embalaje" => "Embalaje", "embalaje" => "Embalaje",
"tiempo_consumido" => "Tiempo consumido", "tiempo_consumido" => "Tiempo consumido",
@ -80,6 +90,7 @@ return [
"preview_pdf" => "Previsualizar PDF", "preview_pdf" => "Previsualizar PDF",
"imprimir_codigo_safekat" => "Imprimir código SAFEKAT", "imprimir_codigo_safekat" => "Imprimir código SAFEKAT",
"imprimir_ferro" => "Imprimir ferro", "imprimir_ferro" => "Imprimir ferro",
"imprimir_prototipo" => "Prototipo",
"planning_rotativa" => "Planificación rotativa", "planning_rotativa" => "Planificación rotativa",
"planning_plana" => "Planificación plana", "planning_plana" => "Planificación plana",
"solapa" => "Solapa", "solapa" => "Solapa",
@ -97,12 +108,16 @@ return [
"grapado" => "Grapado", "grapado" => "Grapado",
"solapa" => "Solapas", "solapa" => "Solapas",
"retractilado" => "Retractilado", "retractilado" => "Retractilado",
"manipulado" => "Entrada manipulado",
"retractilado5" => "Retractilado 5", "retractilado5" => "Retractilado 5",
"prototipo" => "Prototipo", "prototipo" => "Prototipo",
"marcapaginas" => "Marcapáginas", "marcapaginas" => "Marcapáginas",
//IMPRESION //IMPRESION
"impresion_bn" => "Impresión BN", "impresion_bn" => "Impresión BN",
"cubierta" => "Cubierta/Portada", "cubierta" => "Cubierta/Portada",
"guarda" => "Guarda",
"encuadernacion" => "Encuadernación",
//PREIMPRESION //PREIMPRESION
"pre_formato" => "Revisión formato", "pre_formato" => "Revisión formato",
"pre_lomo" => "Revisión lomo", "pre_lomo" => "Revisión lomo",
@ -132,6 +147,7 @@ return [
"maquinas" => "Máquinas", "maquinas" => "Máquinas",
"tareas_hoy" => "Tareas para HOY", "tareas_hoy" => "Tareas para HOY",
"tareas_all" => "Todas", "tareas_all" => "Todas",
"tareas_delay" => "Aplazadas",
"play_tarea" => "Continuar", "play_tarea" => "Continuar",
"play_pause" => "Pausar", "play_pause" => "Pausar",
"play_stop" => "Aplazar", "play_stop" => "Aplazar",
@ -139,11 +155,24 @@ return [
"cancel" => "Cancelar", "cancel" => "Cancelar",
], ],
'tarea_estados' => [
'P' => 'Pendiente',
'I' => 'Iniciada',
'F' => 'Finalizada',
'S' => 'Pausada',
'D' => 'Aplazada',
'E' => 'Error'
],
'duplicate_estado_tarea_progress' => "Último estado de la tarea repetido", 'duplicate_estado_tarea_progress' => "Último estado de la tarea repetido",
'task_already_finished' => "La tarea se ha marcado como finalizada.", 'task_already_finished' => "La tarea se ha marcado como finalizada.",
'print_label' => "Imprimir etiqueta", 'print_label' => "Imprimir etiqueta",
'click_init' => "Clicks al inicio", 'click_init' => "Clicks al inicio",
'click_end' => "Clicks al final", 'click_end' => "Clicks al final",
"comentarios" => "Comentarios",
"comentariosOt" => "Comentarios orden",
"comentariosImpresionInterior" => "Comentarios interior",
"comentariosCubierta" => "Comentarios cubierta",
"comentariosEncuadernacion" => "Comentarios encuadernación",
"comentariosLogistica" => "Comentarios logística",
"info_solapa_guillotina" => "Datos solapa y preparación guillotina",
]; ];

View File

@ -67,6 +67,12 @@ return [
'vencimientosPermission' => 'Vencimientos', 'vencimientosPermission' => 'Vencimientos',
"ticketsSection" => "Tickets", "ticketsSection" => "Tickets",
'produccionSection' => 'Producción', 'produccionSection' => 'Producción',
'catalogoSection' => 'Catálogo',
'importadoresSection' => 'Importadores',
'catalogoPermission' => 'Desde catálogo',
'bubokPermission' => 'Bubok',
'validation' => [ 'validation' => [
'id' => [ 'id' => [

View File

@ -61,6 +61,8 @@ class ClienteModel extends \App\Models\BaseModel
"comentarios", "comentarios",
"user_created_id", "user_created_id",
"user_update_id", "user_update_id",
"no_envio_base",
"forzar_rotativa_pod",
]; ];
protected $returnType = ClienteEntity::class; protected $returnType = ClienteEntity::class;
protected $useSoftDeletes = true; protected $useSoftDeletes = true;

View File

@ -214,4 +214,12 @@ class ProveedorModel extends \App\Models\BaseModel
return $builder->get()->getResultObject(); return $builder->get()->getResultObject();
} }
public function querySelect(?string $q)
{
$query = $this->builder()->select(['id','nombre as name']);
if($q){
$query->like('nombre',$q);
}
return $query;
}
} }

View File

@ -0,0 +1,72 @@
<?php
namespace App\Models\Configuracion;
use App\Entities\Configuracion\FestivoEntity;
use App\Models\BaseModel;
class FestivoModel extends BaseModel
{
protected $table = "festivos";
protected $primaryKey = 'id';
protected $allowedFields = ["date"];
protected $returnType = FestivoEntity::class;
protected $useAutoIncrement = true;
protected $useSoftDeletes = true;
protected $protectFields = true;
protected bool $allowEmptyInserts = false;
protected bool $updateOnlyChanged = true;
protected array $casts = [];
protected array $castHandlers = [];
// Dates
protected $useTimestamps = true;
protected $dateFormat = 'datetime';
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
protected $deletedField = 'deleted_at';
// Validation
protected $skipValidation = false;
protected $cleanValidationRules = true;
// Callbacks
protected $allowCallbacks = true;
protected $beforeInsert = [];
protected $afterInsert = [];
protected $beforeUpdate = [];
protected $afterUpdate = [];
protected $beforeFind = [];
protected $afterFind = [];
protected $beforeDelete = [];
protected $afterDelete = [];
protected $validationRules = [
"date" => [
"label" => "Festivos.date",
"rules" => "required|valid_date[Y-m-d]",
],
];
protected $validationMessages = [
"date" => [
"valid_date" => "Validation.valid_date",
],
];
public function isFestivo($date)
{
return $this->where('date',$date)->countAllResults() > 0 ? true : false;
}
}

View File

@ -427,6 +427,9 @@ class MaquinaModel extends \App\Models\BaseModel
->where('tarea_progress.deleted_at', null) ->where('tarea_progress.deleted_at', null)
->groupBy('lg_maquinas.id') ->groupBy('lg_maquinas.id')
->orderBy('countTareas','DESC'); ->orderBy('countTareas','DESC');
if($maquina_tipo == "impresion"){
$query->where('orden_trabajo_tareas.is_corte',0);
}
return $query; return $query;
} }

View File

@ -37,7 +37,7 @@ class EnvioLineaModel extends Model
->select( ->select(
"t1.id, t1.pedido_id as pedido, t3.id as presupuesto, "t1.id, t1.pedido_id as pedido, t3.id as presupuesto,
t3.titulo as titulo, t1.unidades_envio as unidadesEnvio, t1.unidades_envio as unidadesEnvioRaw, t3.titulo as titulo, t1.unidades_envio as unidadesEnvio, t1.unidades_envio as unidadesEnvioRaw,
t1.unidades_total as unidadesTotal, t1.unidades_total as unidadesTotal, t2.tipo_envio as tipo_envio,
IFNULL(( IFNULL((
SELECT SUM(t_sub.unidades_envio) SELECT SUM(t_sub.unidades_envio)
FROM envios_lineas t_sub FROM envios_lineas t_sub

View File

@ -32,13 +32,14 @@ class EnvioModel extends Model
'created_at', 'created_at',
'updated_at', 'updated_at',
'cajas', 'cajas',
'tipo_envio',
]; ];
protected $useTimestamps = true; protected $useTimestamps = true;
protected $createdField = 'created_at'; protected $createdField = 'created_at';
protected $updatedField = 'updated_at'; protected $updatedField = 'updated_at';
public function getDatatableQuery(): BaseBuilder public function getDatatableQuery($tipo_envio = "estandar"): BaseBuilder
{ {
$builder = $this->db $builder = $this->db
->table($this->table . " t1") ->table($this->table . " t1")
@ -51,6 +52,24 @@ class EnvioModel extends Model
$builder->join("lg_paises t3", "t3.id = t1.pais_id", "left"); $builder->join("lg_paises t3", "t3.id = t1.pais_id", "left");
$builder->join("pedidos t4", "t4.id = t2.pedido_id", "left"); $builder->join("pedidos t4", "t4.id = t2.pedido_id", "left");
$builder->join('ordenes_trabajo t5', 't5.pedido_id = t4.id'); $builder->join('ordenes_trabajo t5', 't5.pedido_id = t4.id');
$builder->where("t1.tipo_envio", $tipo_envio);
$builder->groupBy("t1.id");
return $builder;
}
public function getDatatableQueryFerroPrototipo(): BaseBuilder
{
$builder = $this->db
->table($this->table . " t1")
->select(
"t1.id, GROUP_CONCAT(DISTINCT t5.id) AS ots,
t1.att, t1.direccion, t1.ciudad, t3.nombre as pais, t1.cp, t1.email, t1.telefono, t1.finalizado"
);
$builder->join("lg_paises t3", "t3.id = t1.pais_id", "left");
$builder->join("pedidos t4", "t4.id = t2.pedido_id", "left");
$builder->join('ordenes_trabajo t5', 't5.pedido_id = t4.id');
$builder->whereIn("t1.tipo_envio", ["estandar"]);
$builder->groupBy("t1.id"); $builder->groupBy("t1.id");
return $builder; return $builder;

View File

@ -22,8 +22,14 @@ class OrdenTrabajoDate extends Model
"interior_bn_at", "interior_bn_at",
"interior_color_at", "interior_color_at",
"cubierta_at", "cubierta_at",
"sobrecubierta_at", //TODO
"guarda_at", //TODO
//ACABADO //ACABADO
"plastificado_at", "plastificado_at",
"plakene_at", //TODO
"retractilado_at",
"estampado_at", //TODO
"uvi_at", //TODO
"encuadernacion_at", "encuadernacion_at",
"corte_at", "corte_at",
"preparacion_interiores_at", "preparacion_interiores_at",
@ -31,7 +37,6 @@ class OrdenTrabajoDate extends Model
"cosido_at", "cosido_at",
"solapa_at", "solapa_at",
"grapado_at", "grapado_at",
"retractilado_at",
"retractilado5_at", "retractilado5_at",
"prototipo_at", "prototipo_at",
"marcapaginas_at", "marcapaginas_at",

View File

@ -25,6 +25,11 @@ class OrdenTrabajoModel extends Model
"progreso", "progreso",
"estado", "estado",
"comentarios", "comentarios",
"comment_interior",
"comment_cubierta",
"comment_encuadernacion",
"comment_logistica",
"info_solapa_guillotina",
"revisar_formato", "revisar_formato",
"revisar_lomo", "revisar_lomo",
"revisar_solapa", "revisar_solapa",

View File

@ -23,11 +23,18 @@ class OrdenTrabajoUser extends Model
"interior_bn_user_id", "interior_bn_user_id",
"interior_color_user_id", "interior_color_user_id",
"cubierta_user_id", "cubierta_user_id",
"sobrecubierta_user_id",
"guarda_user_id",
//ACABADO //ACABADO
"plastificado_user_id", "plastificado_user_id",
"plakene_user_id",
"retractilado_user_id",
"estampado_user_id",
"uvi_user_id",
//ENCUADERNADO
"encuadernacion_user_id", "encuadernacion_user_id",
"corte_user_id",
"preparacion_interior_user_id", "preparacion_interior_user_id",
"corte_user_id",
"entrada_manipulado_user_id", "entrada_manipulado_user_id",
"cosido_user_id", "cosido_user_id",
"solapa_user_id", "solapa_user_id",

View File

@ -45,6 +45,7 @@ class PresupuestoDireccionesModel extends \App\Models\BaseModel
"proveedor_id", "proveedor_id",
"proveedor", "proveedor",
"entregaPieCalle", "entregaPieCalle",
"is_ferro_prototipo"
]; ];
protected $returnType = "App\Entities\Presupuestos\PresupuestoDireccionesEntity"; protected $returnType = "App\Entities\Presupuestos\PresupuestoDireccionesEntity";
@ -69,7 +70,8 @@ class PresupuestoDireccionesModel extends \App\Models\BaseModel
t1.email AS email, t1.direccion AS direccion, t1.pais_id AS pais_id, t2.nombre AS pais, t1.email AS email, t1.direccion AS direccion, t1.pais_id AS pais_id, t2.nombre AS pais,
t1.municipio AS municipio, t1.provincia AS provincia, t1.cp AS cp, t1.telefono AS telefono, t1.municipio AS municipio, t1.provincia AS provincia, t1.cp AS cp, t1.telefono AS telefono,
t1.peso AS peso, t1.cantidad AS cantidad, t1.precio AS precio, t1.margen AS margen, t1.peso AS peso, t1.cantidad AS cantidad, t1.precio AS precio, t1.margen AS margen,
t1.proveedor_id AS proveedor_id, t1.proveedor AS proveedor, t1.entregaPieCalle AS entregaPieCalle" t1.proveedor_id AS proveedor_id, t1.proveedor AS proveedor, t1.entregaPieCalle AS entregaPieCalle,
t1.is_ferro_prototipo AS is_ferro_prototipo"
); );
$builder->where('t1.presupuesto_id', $presupuesto_id); $builder->where('t1.presupuesto_id', $presupuesto_id);

View File

@ -1,4 +1,5 @@
<?php <?php
namespace App\Models\Tarifas\Acabados; namespace App\Models\Tarifas\Acabados;
class TarifaAcabadoModel extends \App\Models\BaseModel class TarifaAcabadoModel extends \App\Models\BaseModel
@ -33,6 +34,16 @@ class TarifaAcabadoModel extends \App\Models\BaseModel
"is_deleted", "is_deleted",
"user_created_id", "user_created_id",
"user_updated_id", "user_updated_id",
'plastificado',
'plakene',
'rectractilado',
'estampado',
'uvi',
'plastificado_tipo',
'plakene_tipo',
'rectractilado_tipo',
'estampado_tipo',
'uvi_tipo'
]; ];
protected $returnType = 'App\Entities\Tarifas\Acabados\TarifaAcabadoEntity'; protected $returnType = 'App\Entities\Tarifas\Acabados\TarifaAcabadoEntity';
@ -96,9 +107,9 @@ class TarifaAcabadoModel extends \App\Models\BaseModel
return empty($search) return empty($search)
? $builder ? $builder
: $builder : $builder
->groupStart() ->groupStart()
->like("t1.nombre", $search) ->like("t1.nombre", $search)
->groupEnd(); ->groupEnd();
} }
public function getServiciosAcabadoSelector() public function getServiciosAcabadoSelector()

View File

@ -9,7 +9,7 @@ class EmailService
public function send(string $subject, string $body, $recipient): bool public function send(string $subject, string $body, $recipient): bool
{ {
$skEnv = env('sk_environment', 'production'); // fallback a producción si no está definido $skEnv = env('SK_ENVIRONMENT', 'production'); // fallback a producción si no está definido
// Si no estamos en producción, forzar el destinatario a uno fijo // Si no estamos en producción, forzar el destinatario a uno fijo
if ($skEnv !== 'production') { if ($skEnv !== 'production') {

View File

@ -94,6 +94,7 @@ class LogisticaService
WHERE el.pedido_id = p.id WHERE el.pedido_id = p.id
AND el.presupuesto_id = pr.id AND el.presupuesto_id = pr.id
AND e.finalizado = 1 AND e.finalizado = 1
AND e.tipo_envio = 'estandar'
) AS unidades_enviadas, ) AS unidades_enviadas,
pd.cantidad AS cantidad pd.cantidad AS cantidad
") ")
@ -115,7 +116,47 @@ class LogisticaService
return $builder; return $builder;
} }
public static function findDireccionesNewEnvio($pedido_id, $searchVal = "") public static function findForNewEnvioFerro()
{
$db = \Config\Database::connect();
// 3. Subconsulta principal
$subBuilder = $db->table('pedidos_linea pl')
->select("
ot.id AS id,
CONCAT('[', ot.id, '] - ', pr.titulo) AS name,
p.id as pedido_id,
pr.id as presupuesto_id
")
->join('pedidos p', 'p.id = pl.pedido_id')
->join('presupuestos pr', 'pr.id = pl.presupuesto_id')
->join('presupuesto_direcciones pd', 'pd.presupuesto_id = pr.id')
->join('ordenes_trabajo ot', 'ot.pedido_id = p.id')
->join('orden_trabajo_dates ot_dates', 'ot_dates.orden_trabajo_id = ot.id')
->whereIn('p.estado', ['finalizado', 'produccion'])
->where('ot_dates.pendiente_ferro_at IS NOT NULL')
->where('pd.is_ferro_prototipo', 1)
->groupBy('pl.id');
// 4. Envolver y filtrar por unidades pendientes
$builder = $db->table("({$subBuilder->getCompiledSelect(false)}) AS sub");
$builder->select('id, name');
$builder->orderBy('name', 'ASC');
$builder->where("
NOT EXISTS (
SELECT 1
FROM envios e
INNER JOIN envios_lineas le ON le.envio_id = e.id
WHERE e.tipo_envio = 'ferro_prototipo'
AND (le.pedido_id = sub.pedido_id OR le.presupuesto_id = sub.presupuesto_id)
)
", null, false);
return $builder;
}
public static function findDireccionesNewEnvio($ot_id, $searchVal = "")
{ {
$direcciones = []; $direcciones = [];
@ -126,7 +167,9 @@ class LogisticaService
->join('presupuestos pr', 'pr.id=presupuesto_direcciones.presupuesto_id') ->join('presupuestos pr', 'pr.id=presupuesto_direcciones.presupuesto_id')
->join('pedidos_linea pl', 'pl.presupuesto_id = pr.id') ->join('pedidos_linea pl', 'pl.presupuesto_id = pr.id')
->join('pedidos p', 'pl.pedido_id=p.id') ->join('pedidos p', 'pl.pedido_id=p.id')
->where('p.id', $pedido_id); ->join('ordenes_trabajo ot', 'ot.pedido_id = p.id')
->where('ot.id', $ot_id)
->where("presupuesto_direcciones.is_ferro_prototipo", 0);
if ($searchVal != "") { if ($searchVal != "") {
$dirs = $dirs->groupStart() $dirs = $dirs->groupStart()
->Like("id", $searchVal) ->Like("id", $searchVal)
@ -138,10 +181,13 @@ class LogisticaService
$unidades_en_direccion = $modelEnvioLineasModel->select('SUM(envios_lineas.unidades_envio) as unidades_enviadas, $unidades_en_direccion = $modelEnvioLineasModel->select('SUM(envios_lineas.unidades_envio) as unidades_enviadas,
envios_lineas.unidades_total') envios_lineas.unidades_total')
->join('envios', 'envios.id = envios_lineas.envio_id') ->join('envios', 'envios.id = envios_lineas.envio_id')
->where('pedido_id', $pedido_id) ->join('pedidos_linea', 'pedidos_linea.pedido_id = envios_lineas.pedido_id')
->join('pedidos', 'pedidos.id = pedidos_linea.pedido_id')
->join('ordenes_trabajo', 'ordenes_trabajo.pedido_id = pedidos.id')
->where('ordenes_trabajo.id', $ot_id)
->where('envios.direccion', $direccion->direccion) ->where('envios.direccion', $direccion->direccion)
->where('envios.finalizado', 1) ->where('envios.finalizado', 1)
->groupBy('pedido_id')->get()->getResult(); ->groupBy('ordenes_trabajo.pedido_id')->get()->getResult();
if (count($unidades_en_direccion) == 0 || $unidades_en_direccion[0]->unidades_enviadas < $unidades_en_direccion[0]->unidades_total) { if (count($unidades_en_direccion) == 0 || $unidades_en_direccion[0]->unidades_enviadas < $unidades_en_direccion[0]->unidades_total) {
array_push( array_push(
$direcciones, $direcciones,
@ -196,6 +242,7 @@ class LogisticaService
->join('pedidos p', 'p.id = pl.pedido_id') ->join('pedidos p', 'p.id = pl.pedido_id')
->join('presupuestos pr', 'pr.id = pl.presupuesto_id') ->join('presupuestos pr', 'pr.id = pl.presupuesto_id')
->join('presupuesto_direcciones pd', 'pd.presupuesto_id = pr.id') ->join('presupuesto_direcciones pd', 'pd.presupuesto_id = pr.id')
->where('pd.is_ferro_prototipo', 0)
->where('p.id', $pedido_id) ->where('p.id', $pedido_id)
->whereIn('p.estado', ['finalizado', 'produccion']) ->whereIn('p.estado', ['finalizado', 'produccion'])
->where("TRIM(LOWER(pd.direccion)) = '$direccionNormalizada'", null, false) ->where("TRIM(LOWER(pd.direccion)) = '$direccionNormalizada'", null, false)
@ -242,7 +289,7 @@ class LogisticaService
public static function generateEnvio($pedido_id, $direccion = null) public static function generateEnvio($ot_id, $direccion = null)
{ {
$presupuestoDireccionesModel = model('App\Models\Presupuestos\PresupuestoDireccionesModel'); $presupuestoDireccionesModel = model('App\Models\Presupuestos\PresupuestoDireccionesModel');
$direccionNormalizada = strtolower(trim($direccion)); $direccionNormalizada = strtolower(trim($direccion));
@ -259,6 +306,7 @@ class LogisticaService
presupuesto_direcciones.pais_id, presupuesto_direcciones.pais_id,
presupuesto_direcciones.cantidad as cantidad_total, presupuesto_direcciones.cantidad as cantidad_total,
presupuestos.cliente_id as cliente_id, presupuestos.cliente_id as cliente_id,
ordenes_trabajo.pedido_id as pedido_id,
( (
presupuesto_direcciones.cantidad - IFNULL(( presupuesto_direcciones.cantidad - IFNULL((
@ -275,7 +323,9 @@ class LogisticaService
->join('pedidos_linea', 'pedidos_linea.presupuesto_id = presupuesto_direcciones.presupuesto_id') ->join('pedidos_linea', 'pedidos_linea.presupuesto_id = presupuesto_direcciones.presupuesto_id')
->join('pedidos', 'pedidos.id = pedidos_linea.pedido_id') ->join('pedidos', 'pedidos.id = pedidos_linea.pedido_id')
->join('presupuestos', 'pedidos_linea.presupuesto_id = presupuestos.id') ->join('presupuestos', 'pedidos_linea.presupuesto_id = presupuestos.id')
->where('pedidos.id', $pedido_id) ->join('ordenes_trabajo', 'ordenes_trabajo.pedido_id = pedidos.id')
->where('ordenes_trabajo.id', $ot_id)
->where('presupuesto_direcciones.is_ferro_prototipo', 0)
->like('presupuesto_direcciones.direccion', $direccion) ->like('presupuesto_direcciones.direccion', $direccion)
->groupBy('presupuesto_direcciones.id') ->groupBy('presupuesto_direcciones.id')
->first(); ->first();
@ -311,7 +361,7 @@ class LogisticaService
$EnvioLineasModel = model('App\Models\Logistica\EnvioLineaModel'); $EnvioLineasModel = model('App\Models\Logistica\EnvioLineaModel');
$EnvioLineasModel->save([ $EnvioLineasModel->save([
'envio_id' => $idEnvio, 'envio_id' => $idEnvio,
'pedido_id' => $pedido_id, 'pedido_id' => $datosEnvio->pedido_id,
'unidades_envio' => $datosEnvio->cantidad, 'unidades_envio' => $datosEnvio->cantidad,
'unidades_total' => $datosEnvio->cantidad_total, 'unidades_total' => $datosEnvio->cantidad_total,
'cajas' => 1, 'cajas' => 1,
@ -332,6 +382,96 @@ class LogisticaService
} }
public static function generateEnvioFerro($ot_id)
{
$presupuestoDireccionesModel = model('App\Models\Presupuestos\PresupuestoDireccionesModel');
$datosEnvio = $presupuestoDireccionesModel
->select("
presupuestos.id as presupuesto_id,
presupuesto_direcciones.att,
presupuesto_direcciones.direccion,
presupuesto_direcciones.provincia as ciudad,
presupuesto_direcciones.cp,
presupuesto_direcciones.telefono,
presupuesto_direcciones.email,
presupuesto_direcciones.pais_id,
presupuesto_direcciones.cantidad as cantidad_total,
presupuestos.cliente_id as cliente_id,
ordenes_trabajo.pedido_id as pedido_id,
")
->join('pedidos_linea', 'pedidos_linea.presupuesto_id = presupuesto_direcciones.presupuesto_id')
->join('pedidos', 'pedidos.id = pedidos_linea.pedido_id')
->join('presupuestos', 'pedidos_linea.presupuesto_id = presupuestos.id')
->join('ordenes_trabajo', 'ordenes_trabajo.pedido_id = pedidos.id')
->where('ordenes_trabajo.id', $ot_id)
->where('presupuesto_direcciones.is_ferro_prototipo', 1)
->where("
NOT EXISTS (
SELECT 1
FROM envios e
INNER JOIN envios_lineas el ON el.envio_id = e.id
WHERE e.tipo_envio = 'ferro_prototipo'
AND (el.pedido_id = pedidos.id OR el.presupuesto_id = presupuestos.id)
)
", null, false) // <= Esta es la parte nueva, importante
->groupBy('presupuesto_direcciones.id')
->first();
// Validación si no hay datos o no quedan unidades
if (empty($datosEnvio)) {
return [
'status' => false,
'message' => lang('Logistica.errors.noAddresses')
];
}
// Crear envío
$EnvioModel = model('App\Models\Logistica\EnvioModel');
$EnvioModel->set([
'cliente_id' => $datosEnvio->cliente_id,
'att' => $datosEnvio->att,
'direccion' => $datosEnvio->direccion,
'ciudad' => $datosEnvio->ciudad,
'cp' => $datosEnvio->cp,
'telefono' => $datosEnvio->telefono,
'email' => $datosEnvio->email,
'pais_id' => $datosEnvio->pais_id,
'cantidad' => 1,
'cajas' => 1,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
'tipo_envio' => 'ferro_prototipo',
]);
$EnvioModel->insert();
$idEnvio = $EnvioModel->insertID();
// Crear línea de envío
$EnvioLineasModel = model('App\Models\Logistica\EnvioLineaModel');
$EnvioLineasModel->save([
'envio_id' => $idEnvio,
'pedido_id' => $datosEnvio->pedido_id,
'unidades_envio' => 1,
'unidades_total' => 1,
'cajas' => 1,
'unidades_cajas' => 1,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
'presupuesto_id' => (int) $datosEnvio->presupuesto_id
]);
return [
'status' => true,
'data' => [
'id_envio' => $idEnvio,
],
];
}
public static function finalizarEnvio($envio_id, $finalizar_ot = false) public static function finalizarEnvio($envio_id, $finalizar_ot = false)
{ {
// hay que comprobar que para todas las lineas de envio de este envio // hay que comprobar que para todas las lineas de envio de este envio
@ -383,24 +523,36 @@ class LogisticaService
$cantidad_enviada = $cantidad_enviada[0]->unidades_enviadas; $cantidad_enviada = $cantidad_enviada[0]->unidades_enviadas;
} }
if ($cantidad_enviada + $linea->unidades_envio == $pedido->total_tirada) { if ($envio->tipo_envio == 'ferro_prototipo') {
$otModel = model('App\Models\OrdenTrabajo\OrdenTrabajoModel'); $otModel = model('App\Models\OrdenTrabajo\OrdenTrabajoModel');
$ot = $otModel->where('pedido_id', $linea->pedido_id) $ot = $otModel->where('pedido_id', $linea->pedido_id)
->first(); ->first();
$ps = (new ProductionService())->init($ot->id); $ps = (new ProductionService())->init($ot->id);
$ps->updateOrdenTrabajoDate([ $ps->updateOrdenTrabajoDate([
"name" => "envio_at", "name" => "ferro_en_cliente_at",
"envio_at" => date('Y-m-d H:i:s') "ferro_en_cliente_at" => date('Y-m-d H:i:s')
]); ]);
if ($finalizar_ot) { } else {
$ps->updateOrdenTrabajo( if ($cantidad_enviada + $linea->unidades_envio == $pedido->total_tirada) {
[ $otModel = model('App\Models\OrdenTrabajo\OrdenTrabajoModel');
"estado" => 'F' $ot = $otModel->where('pedido_id', $linea->pedido_id)
] ->first();
); $ps = (new ProductionService())->init($ot->id);
array_push($ots, $ot->id); $ps->updateOrdenTrabajoDate([
"name" => "envio_at",
"envio_at" => date('Y-m-d H:i:s')
]);
if ($finalizar_ot) {
$ps->updateOrdenTrabajo(
[
"estado" => 'F'
]
);
array_push($ots, $ot->id);
}
} }
} }
} }
$EnvioModel->update($envio_id, ['finalizado' => 1]); $EnvioModel->update($envio_id, ['finalizado' => 1]);
@ -424,19 +576,19 @@ class LogisticaService
$data = [ $data = [
"printer" => $printer->name, "printer" => $printer->name,
"header" => [ "header" => [
"_FORMAT" => "E:PEDIDO.ZPL", "_FORMAT" => "E:PEDIDO.ZPL",
"_QUANTITY" => 1, "_QUANTITY" => 1,
"_PRINBTERNAME" => $printer->name, "_PRINBTERNAME" => $printer->name,
"_JOBNAME" => "LBL101" "_JOBNAME" => "LBL101"
], ],
]; ];
foreach ($lineas as $linea) { foreach ($lineas as $linea) {
$data["labels"][] = [ $data["labels"][] = [
"cliente" => $envio->cliente, "cliente" => $envio->cliente,
"titulo" => "[" . $linea->pedido_id . "] - " . $linea->titulo, "titulo" => "[" . $linea->pedido_id . "] - " . $linea->titulo,
"cantidad" => $linea->unidades_envio, "cantidad" => $linea->unidades_envio,
"tirada" => $linea->unidades_total, "tirada" => $linea->unidades_total,
"cajas" => $cajas, "cajas" => $cajas,
"ean" => null, "ean" => null,
"nombre" => $envio->att, "nombre" => $envio->att,
@ -449,14 +601,14 @@ class LogisticaService
$servicioImpresora = new ImpresoraEtiquetaService(); $servicioImpresora = new ImpresoraEtiquetaService();
$xml = $servicioImpresora->createEtiqueta($data); $xml = $servicioImpresora->createEtiqueta($data);
if($xml == null){ if ($xml == null) {
return [ return [
'status' => false, 'status' => false,
'message' => lang('Logistica.errors.noEtiquetas'), 'message' => lang('Logistica.errors.noEtiquetas'),
]; ];
} }
$sk_environment = getenv('SK_ENVIRONMENT'); $sk_environment = getenv('SK_ENVIRONMENT');
if($sk_environment == 'production'){ if ($sk_environment == 'production') {
$status = $servicioImpresora->sendToImpresoraEtiqueta("ETIQUETA", $xml, $printer); $status = $servicioImpresora->sendToImpresoraEtiqueta("ETIQUETA", $xml, $printer);
if ($status) { if ($status) {
@ -472,7 +624,7 @@ class LogisticaService
]; ];
} }
}else{ } else {
return [ return [
'status' => true, 'status' => true,
'message' => lang('Logistica.success.imprimirEtiquetas'), 'message' => lang('Logistica.success.imprimirEtiquetas'),

View File

@ -58,7 +58,7 @@ class PresupuestoClienteService extends BaseService
if ($total_plana < 0 && $total_rotativa < 0) if ($total_plana < 0 && $total_rotativa < 0)
return []; return [];
else { else {
if ($total_plana > $total_rotativa) if ($total_plana > $total_rotativa && $data['forzarRotativa'] == 0)
return $plana; return $plana;
else else
return [$rotativa]; return [$rotativa];

View File

@ -1983,4 +1983,95 @@ class PresupuestoService extends BaseService
return $peso; return $peso;
} }
public static function ajustarPresupuesto($id, $precio_unidad = null, $unidades = null, $precio_total = null, $forzar_descuento = false){
$precio_total_asignado = 0;
$precio_unidad_asignado = $precio_unidad;
$warning = false;
$model = model('App\Models\Presupuestos\PresupuestoModel');
if($precio_unidad != null && $unidades != null){
$precio_total_asignado = round(floatval($precio_unidad) * intval($unidades), 2);
}
else{
$precio_total_asignado = floatval($precio_total);
}
$presupuesto = $model->find($id);
$costes = floatval($presupuesto->total_costes);
$envio_base = floatval($presupuesto->envio_base);
$total_descuento = 0;
$total_descuentoPercent = 0;
if($costes + $envio_base > $precio_total_asignado){
if($forzar_descuento){
$total_descuento = $costes + $envio_base - $precio_total_asignado;
$total_descuentoPercent = round($total_descuento / ($costes + $envio_base) * 100, 2);
}
else{
$precio_total_asignado = round($costes + $envio_base, 2);
$precio_unidad_asignado = round($precio_total_asignado / intval($unidades), 4);
}
$warning = true;
}
$total_margenes = $precio_total_asignado - $costes - $envio_base < 0 ?
0 :
$precio_total_asignado - $costes - $envio_base;
$sumForFactor = floatval($presupuesto->total_coste_papel) + floatval($presupuesto->total_coste_impresion);
$sumForFactorPonderado = $sumForFactor + floatval($presupuesto->total_coste_servicios);
$factor = ($precio_total_asignado - floatval($presupuesto->envio_base)
- floatval($presupuesto->total_coste_envios) - floatval($presupuesto->total_margen_envios)) / $sumForFactor;
$factorPonderado = ($precio_total_asignado - floatval($presupuesto->envio_base)
- floatval($presupuesto->total_coste_envios) - floatval($presupuesto->total_margen_envios)) / $sumForFactorPonderado;
if ($presupuesto) {
$presupuesto->total_margenes = $total_margenes;
$presupuesto->total_aceptado = $precio_total_asignado;
$presupuesto->total_aceptado_revisado = $precio_total_asignado;
$presupuesto->total_presupuesto = $precio_total_asignado;
$presupuesto->total_antes_descuento = $precio_total_asignado - $costes - $envio_base < 0 ?
$costes + $envio_base :
$precio_total_asignado;
$presupuesto->total_precio_unidad = $precio_unidad_asignado;
$presupuesto->total_descuento = $total_descuento;
$presupuesto->total_descuentoPercent = $total_descuentoPercent;
$presupuesto->total_factor = round($factor, 2);
$presupuesto->total_factor_ponderado = round($factorPonderado, 2);
$model->update($id, $presupuesto);
}
return [
"success" => true,
"warning" => $warning,
"new_total" => $precio_total_asignado,
"new_precio_unidad" => $precio_unidad_asignado,
];
}
public static function calcular_merma($tirada, $POD, $formas_lineas_interior = [])
{
$merma = 0;
if ($tirada > $POD) {
$merma = $tirada * 0.1;
} else {
$merma_lineas = [];
foreach ($formas_lineas_interior as $formas_linea) {
if ($formas_linea > $tirada)
array_push($merma_lineas, $formas_linea - $tirada);
else
array_push($merma_lineas, $tirada % $formas_linea);
}
if (count($merma_lineas) > 0)
$merma = max($merma_lineas);
}
return round($merma, 0);
}
} }

View File

@ -18,10 +18,13 @@ use App\Entities\Produccion\OrdenTrabajoFileEntity;
use App\Entities\Produccion\OrdenTrabajoTareaEntity; use App\Entities\Produccion\OrdenTrabajoTareaEntity;
use App\Entities\Tarifas\Acabados\TarifaAcabadoEntity; use App\Entities\Tarifas\Acabados\TarifaAcabadoEntity;
use App\Models\Configuracion\ConfigVariableModel; use App\Models\Configuracion\ConfigVariableModel;
use App\Models\Configuracion\FestivoModel;
use App\Models\Configuracion\MaquinaModel; use App\Models\Configuracion\MaquinaModel;
use App\Models\OrdenTrabajo\OrdenTrabajoFileModel; use App\Models\OrdenTrabajo\OrdenTrabajoFileModel;
use App\Models\OrdenTrabajo\OrdenTrabajoTareaProgressDate; use App\Models\OrdenTrabajo\OrdenTrabajoTareaProgressDate;
use App\Models\Pedidos\PedidoModel; use App\Models\Pedidos\PedidoModel;
use App\Models\Presupuestos\PresupuestoAcabadosModel;
use App\Models\Presupuestos\PresupuestoEncuadernacionesModel;
use App\Models\Usuarios\UserModel; use App\Models\Usuarios\UserModel;
use CodeIgniter\Database\BaseBuilder; use CodeIgniter\Database\BaseBuilder;
use CodeIgniter\Database\BaseResult; use CodeIgniter\Database\BaseResult;
@ -56,6 +59,7 @@ class ProductionService extends BaseService
protected OrdenTrabajoUser $otUser; protected OrdenTrabajoUser $otUser;
protected OrdenTrabajoEntity $ot; protected OrdenTrabajoEntity $ot;
protected OrdenTrabajoFileModel $otFileModel; protected OrdenTrabajoFileModel $otFileModel;
protected FestivoModel $festivoModel;
protected OrdenTrabajoTareaProgressDate $otTareaProgressDate; protected OrdenTrabajoTareaProgressDate $otTareaProgressDate;
protected PedidoModel $pedidoModel; protected PedidoModel $pedidoModel;
protected UserModel $userModel; protected UserModel $userModel;
@ -63,6 +67,8 @@ class ProductionService extends BaseService
protected MaquinaEntity $defaultMaquinaCorte; protected MaquinaEntity $defaultMaquinaCorte;
protected MaquinaModel $maquinaModel; protected MaquinaModel $maquinaModel;
protected OrdenTrabajo $ordenTrabajoConfig; protected OrdenTrabajo $ordenTrabajoConfig;
protected PresupuestoAcabadosModel $presupuestoAcabadoModel;
protected PresupuestoEncuadernacionesModel $presupuestoEncuadernacionModel;
/** /**
@ -90,7 +96,7 @@ class ProductionService extends BaseService
* `tirada <= podValue` * `tirada <= podValue`
* @var boolean * @var boolean
*/ */
protected bool $isPOD = false; public bool $isPOD = false;
/** /**
* Indica si la orden de trabajo contiene gofrado * Indica si la orden de trabajo contiene gofrado
@ -98,7 +104,30 @@ class ProductionService extends BaseService
* @var boolean * @var boolean
*/ */
public bool $isGofrado = false; //* CHECK DONE public bool $isGofrado = false; //* CHECK DONE
/**
* Indica si la orden de trabajo contiene plastificado
* Se usa para mostrar la fecha correspondiente en la vista
* @var boolean
*/
public bool $isPlastificado = false; //* CHECK DONE
/**
* Indica si la orden de trabajo contiene retractilado
* Se usa para mostrar la fecha correspondiente en la vista
* @var boolean
*/
public bool $isRetractilado = false; //* CHECK DONE
/**
* Indica si la orden de trabajo contiene gofrado
* Se usa para mostrar la fecha correspondiente en la vista
* @var boolean
*/
public bool $isPlakene = false; //* CHECK DONE
/**
* Indica si la orden de trabajo contiene gofrado
* Se usa para mostrar la fecha correspondiente en la vista
* @var boolean
*/
public bool $isEstampado = false; //* CHECK DONE
/** /**
* Indica si la orden de trabajo contiene cosido * Indica si la orden de trabajo contiene cosido
* Se usa para mostrar la fecha correspondiente en la vista y pliegos * Se usa para mostrar la fecha correspondiente en la vista y pliegos
@ -108,10 +137,10 @@ class ProductionService extends BaseService
/** /**
* Indica si la orden de trabajo contiene gofrado * Indica si la orden de trabajo contiene gofrado
* Se usa para mostrar la fecha correspondiente en la vista * Se usa para mostrar la fecha correspondiente en la vista
* TODO Hay que implementar un boolean en `lg_tarifa_acabado` para identificar * TODO Hay que implementar un boolean en `lg_tarifa_manipulado` para identificar
* @var boolean * @var boolean
*/ */
public bool $isGrapado = true; //TODO public bool $isGrapado = false; //TODO
/** /**
* Indica si la orden de trabajo contiene espiral * Indica si la orden de trabajo contiene espiral
* Se usa para mostrar la fecha correspondiente en la vista * Se usa para mostrar la fecha correspondiente en la vista
@ -119,21 +148,14 @@ class ProductionService extends BaseService
* DEFAULT true hasta implementacion * DEFAULT true hasta implementacion
* @var boolean * @var boolean
*/ */
public bool $isEspiral = true; //TODO public bool $isEspiral = false; //TODO
/** /**
* Indica si la orden de trabajo contiene UVI * Indica si la orden de trabajo contiene UVI
* Se usa para mostrar la fecha correspondiente en la vista * Se usa para mostrar la fecha correspondiente en la vista
* @var boolean * @var boolean
*/ */
public bool $isUVI = false; //* CHECK DONE public bool $isUVI = false; //* CHECK DONE
/**
* Indica si la orden de trabajo contiene plastificado
* Se usa para mostrar la fecha correspondiente en la vista
* TODO Hay que implementar un boolean en `lg_tarifa_acabado` para identificar
* DEFAULT true hasta implementacion
* @var boolean
*/
public bool $isPlastificado = true; //TODO
/** /**
* Indica si la orden de trabajo contiene cubierta * Indica si la orden de trabajo contiene cubierta
* Se usa para mostrar la fecha correspondiente en la vista * Se usa para mostrar la fecha correspondiente en la vista
@ -182,7 +204,10 @@ class ProductionService extends BaseService
$this->otFileModel = model(OrdenTrabajoFileModel::class); $this->otFileModel = model(OrdenTrabajoFileModel::class);
$this->pedidoModel = model(PedidoModel::class); $this->pedidoModel = model(PedidoModel::class);
$this->otTareaProgressDate = model(OrdenTrabajoTareaProgressDate::class); $this->otTareaProgressDate = model(OrdenTrabajoTareaProgressDate::class);
$this->festivoModel = model(FestivoModel::class);
$this->ordenTrabajoConfig = config('OrdenTrabajo'); $this->ordenTrabajoConfig = config('OrdenTrabajo');
$this->presupuestoAcabadoModel = model(PresupuestoAcabadosModel::class);
$this->presupuestoEncuadernacionModel = model(PresupuestoEncuadernacionesModel::class);
$this->statusColor = $this->ordenTrabajoConfig->OT_COLORS["sin_imprimir"]; $this->statusColor = $this->ordenTrabajoConfig->OT_COLORS["sin_imprimir"];
$this->configVariableModel = model(ConfigVariableModel::class); $this->configVariableModel = model(ConfigVariableModel::class);
$this->podValue = $this->configVariableModel->getVariable('POD')->value; $this->podValue = $this->configVariableModel->getVariable('POD')->value;
@ -254,31 +279,29 @@ class ProductionService extends BaseService
$this->storeOrdenTrabajoUsers(); $this->storeOrdenTrabajoUsers();
$this->storeOrdenTrabajoDates(); $this->storeOrdenTrabajoDates();
$this->storeAllTareas(); $this->storeAllTareas();
try {
$this->updatePodDates();
} catch (\Throwable $th) {
}
$this->updatePedidoEspera(); $this->updatePedidoEspera();
return $this->ot; return $this->ot;
} }
/** /**
* Inserta las fechas del pedido asociado a la orden de trabajo en `orden_trabajo_tareas` * Inserta las fechas del pedido asociado a la orden de trabajo en `orden_trabajo_tareas`
* Si el pedido es POD las fechas se insertan automaticamente usando `createDatesForPOD` y
* en base a las variables :
* - pod_impresion_dias_tras_confirmacion [fecha_impresion_at]
* - pod_encuadernacion_dias_tras_confirmacion [fecha_encuadernacion]
* - pod_entrega_real_dias_tras_confirmacion [fecha_impresion_at]
* - pod_embalaje_dias_tras_confirmacion [fecha_impresion_at]
* *
* @param OrdenTrabajoEntity $ot * @param OrdenTrabajoEntity $ot
* @return integer|boolean|string ID * @return integer|boolean|string ID
*/ */
protected function storeOrdenTrabajoDates(): int|bool|string protected function storeOrdenTrabajoDates(): int|bool|string
{ {
$fecha_encuadernado = Time::now()->addDays(2)->format("Y-m-d"); $otDateId = $this->otDate->insert(["orden_trabajo_id" => $this->ot->id]);
$fecha_entrega_real = Time::now()->addDays(5)->format("Y-m-d");
//$fecha_embalaje_at = Time::now()->addDays(4)->format("Y-m-d");
$data = [
"orden_trabajo_id" => $this->ot->id,
"fecha_encuadernado_at" => $fecha_encuadernado,
"fecha_entrega_real_at" => $fecha_entrega_real,
"fecha_impresion_at" => Time::now()->format("Y-m-d"),
//"embalaje_at" => $fecha_embalaje_at,
"fecha_entrega_externo" => $this->pedido->fecha_entrega_externo,
];
$otDateId = $this->otDate->insert($data);
$this->otDate->updateUserDateMap($this->ot->id, $data);
return $otDateId; return $otDateId;
} }
/** /**
@ -368,7 +391,7 @@ class ProductionService extends BaseService
$ot_tareas["maquina_id"] = $p_linea_maquina->id; $ot_tareas["maquina_id"] = $p_linea_maquina->id;
$ot_tareas["imposicion_id"] = null; $ot_tareas["imposicion_id"] = null;
$ot_tareas["tiempo_estimado"] = $p_linea->horas_maquina * 3600; $ot_tareas["tiempo_estimado"] = $p_linea->horas_maquina * 3600;
$ot_tareas["tiempo_real"] = $p_linea->horas_maquina * 3600; //? Tiempo real se inserta manual? $ot_tareas["tiempo_real"] = 0;
$insert_query_result = $this->otTarea->insert($ot_tareas); $insert_query_result = $this->otTarea->insert($ot_tareas);
$ot_tareas = []; $ot_tareas = [];
$this->storeTareaCorte($p_linea); $this->storeTareaCorte($p_linea);
@ -392,7 +415,7 @@ class ProductionService extends BaseService
'maquina_id' => $this->defaultMaquinaCorte->id, 'maquina_id' => $this->defaultMaquinaCorte->id,
'orden' => $this->defaultMaquinaCorte->orden_planning, 'orden' => $this->defaultMaquinaCorte->orden_planning,
'tiempo_estimado' => $pLinea->rotativa_tiempo_corte * 60, 'tiempo_estimado' => $pLinea->rotativa_tiempo_corte * 60,
'tiempo_real' => $pLinea->rotativa_tiempo_corte * 60, 'tiempo_real' => 0,
'is_corte' => true, 'is_corte' => true,
'tipo_corte' => "bobina", 'tipo_corte' => "bobina",
]); ]);
@ -578,6 +601,14 @@ class ProductionService extends BaseService
{ {
return view("themes/vuexy/pdfs/orden_trabajo", $this->getDataPdf()); return view("themes/vuexy/pdfs/orden_trabajo", $this->getDataPdf());
} }
public function getFerroPdf()
{
return view("themes/vuexy/pdfs/ferro", $this->getDataPdf());
}
public function getPrototipoPdf()
{
return view("themes/vuexy/pdfs/prototipo", $this->getDataPdf());
}
/** /**
* Query para mostrar en datatable * Query para mostrar en datatable
* *
@ -598,6 +629,10 @@ class ProductionService extends BaseService
"orden_trabajo_tareas.tiempo_real", "orden_trabajo_tareas.tiempo_real",
"orden_trabajo_tareas.comment", "orden_trabajo_tareas.comment",
"orden_trabajo_tareas.presupuesto_linea_id", "orden_trabajo_tareas.presupuesto_linea_id",
"orden_trabajo_tareas.presupuesto_acabado_id",
"orden_trabajo_tareas.presupuesto_manipulado_id",
"orden_trabajo_tareas.presupuesto_preimpresion_id",
"orden_trabajo_tareas.presupuesto_encuadernado_id",
"presupuesto_linea.tipo", "presupuesto_linea.tipo",
]) ])
@ -819,6 +854,7 @@ class ProductionService extends BaseService
"tareas_preimpresion" => $this->tareas_preimpresion(), "tareas_preimpresion" => $this->tareas_preimpresion(),
"tareas_impresion" => $this->tareas_impresion(), "tareas_impresion" => $this->tareas_impresion(),
"tiempo_procesamiento" => $this->getTiempoProcesamientoHHMM(), "tiempo_procesamiento" => $this->getTiempoProcesamientoHHMM(),
"tiempo_total" => $this->getTiempoTotalTareas(),
"statusColor" => $this->getOtColorStatus(), "statusColor" => $this->getOtColorStatus(),
"tareaCosido" => $this->getTareaCosido(), "tareaCosido" => $this->getTareaCosido(),
]; ];
@ -840,6 +876,7 @@ class ProductionService extends BaseService
"preimpresiones" => $this->presupuesto->preimpresiones(), "preimpresiones" => $this->presupuesto->preimpresiones(),
"manipulados" => $this->presupuesto->manipulados(), "manipulados" => $this->presupuesto->manipulados(),
"encuadernaciones" => $this->presupuesto->encuadernaciones(), "encuadernaciones" => $this->presupuesto->encuadernaciones(),
"encuadernacionCode" => $this->getEncuadernacionCode(),
"linea_impresion" => $this->presupuesto->presupuestoLineaImpresion(), "linea_impresion" => $this->presupuesto->presupuestoLineaImpresion(),
"linea_cubierta" => $this->presupuesto->presupuestoLineaCubierta(), "linea_cubierta" => $this->presupuesto->presupuestoLineaCubierta(),
"peso_unidad" => $logistica_data["peso_unidad"], "peso_unidad" => $logistica_data["peso_unidad"],
@ -850,7 +887,9 @@ class ProductionService extends BaseService
"colors" => $this->getPdfColors(), "colors" => $this->getPdfColors(),
"isPOD" => $this->isPOD, "isPOD" => $this->isPOD,
"uvi" => $this->getUVI(), "uvi" => $this->getUVI(),
"flags" => $this->getFlags(),
"tareaCosido" => $this->getTareaCosido(), "tareaCosido" => $this->getTareaCosido(),
"plakene_tipo" => $this->plakene_tipo()
]; ];
} }
public function getImposicionTareaImpresion(): ?Imposicion public function getImposicionTareaImpresion(): ?Imposicion
@ -961,6 +1000,18 @@ class ProductionService extends BaseService
throw new Exception(lang('Produccion.task_already_finished')); throw new Exception(lang('Produccion.task_already_finished'));
} }
} }
if (isset($data['estado'])) {
if ($data['estado'] == 'F') {
$tareaEntity = $this->otTarea->find($data['ot_tarea_id']);
$this->init($tareaEntity->orden_trabajo_id);
$dateName = $this->getOrdenTrabajoTareaDate($tareaEntity);
$dataDate = [
'name' => $dateName,
];
$dataDate[$dateName] = Time::now()->format('Y-m-d');
$this->updateOrdenTrabajoDate($dataDate);
}
}
return $this->otTareaProgressDate->insert($data); return $this->otTareaProgressDate->insert($data);
} }
public function getTareaLastState($tarea_id) public function getTareaLastState($tarea_id)
@ -975,6 +1026,12 @@ class ProductionService extends BaseService
$data["action_at"] = Time::now()->format('Y-m-d H:i:s'); $data["action_at"] = Time::now()->format('Y-m-d H:i:s');
$data["action_user_id"] = auth()->user()->id; $data["action_user_id"] = auth()->user()->id;
$status = $this->otTareaProgressDate->where('ot_tarea_id', $orden_trabajo_tarea_id)->delete(); $status = $this->otTareaProgressDate->where('ot_tarea_id', $orden_trabajo_tarea_id)->delete();
if ($status) {
$tareaEntity = $this->otTarea->find($orden_trabajo_tarea_id);
$this->init($tareaEntity->orden_trabajo_id);
$dateName = $this->getOrdenTrabajoTareaDate($tareaEntity);
$this->emptyOrdenTrabajoDate($this->ot->id, $dateName);
}
if ($status) { if ($status) {
$response = $this->storeOrdenTrabajoTareaProgressDate($data); $response = $this->storeOrdenTrabajoTareaProgressDate($data);
} }
@ -1353,27 +1410,50 @@ class ProductionService extends BaseService
} }
public function getTiempoProcesamientoHHMM(): ?string public function getTiempoProcesamientoHHMM(): ?string
{ {
$time_tareas_seconds = array_map(fn($q) => $q->tiempo_estimado ?? 0, $this->ot->tareas()); try {
$seconds = array_sum($time_tareas_seconds); $time_tareas_seconds = array_map(fn($q) => $q->tiempo_estimado ?? 0, $this->ot->tareas());
return float_seconds_to_hhmm_string($seconds); $seconds = array_sum($time_tareas_seconds);
return float_seconds_to_hhmm_string($seconds);
} catch (\Throwable $th) {
return '00:00';
}
} }
public function getTiempoTareasImpresionHHMM(): string public function getTiempoTareasImpresionHHMM(): string
{ {
$tareas_impresion = $this->ot->tareas_impresion(); try {
$tiempo_seconds = 0; $tareas_impresion = $this->ot->tareas_impresion();
foreach ($tareas_impresion as $key => $tarea) { $tiempo_seconds = 0;
if ($tarea->is_corte == false) { foreach ($tareas_impresion as $key => $tarea) {
$tiempo_seconds += $tarea->tiempo_estimado; if ($tarea->is_corte == false) {
$tiempo_seconds += $tarea->tiempo_estimado;
}
} }
return float_seconds_to_hhmm_string($tiempo_seconds);
} catch (\Throwable $th) {
return '00:00';
}
}
public function getTiempoTotalTareas(): string
{
try {
$tareas = $this->ot->tareas();
$tiempo_seconds = 0;
foreach ($tareas as $key => $tarea) {
if ($tarea->tiempo_real) {
$tiempo_seconds += $tarea->tiempo_real;
}
}
return float_seconds_to_hhmm_string($tiempo_seconds);
} catch (\Throwable $th) {
return '00:00';
} }
return float_seconds_to_hhmm_string($tiempo_seconds);
} }
public function getUVI(): ?TarifaAcabadoEntity public function getUVI(): ?TarifaAcabadoEntity
{ {
$uvi = null; $uvi = null;
$acabados = $this->presupuesto->acabados(); $acabados = $this->presupuesto->acabados();
foreach ($acabados as $key => $acabado) { foreach ($acabados as $key => $acabado) {
if ($acabado->tarifa()->isUVI()) { if ($acabado->tarifa()->uvi) {
$uvi = $acabado->tarifa(); $uvi = $acabado->tarifa();
} }
} }
@ -1489,8 +1569,11 @@ class ProductionService extends BaseService
{ {
$code = ""; $code = "";
$encuadernaciones = $this->presupuesto->encuadernaciones(); $encuadernaciones = $this->presupuesto->encuadernaciones();
if (isset($encuadernaciones[0])) { foreach ($encuadernaciones as $key => $value) {
$code = $encuadernaciones[0]->tarifa()->code; $code = $value->tarifa()->code;
if ($code) {
break;
}
} }
return $code; return $code;
} }
@ -1525,58 +1608,68 @@ class ProductionService extends BaseService
} }
public function getPapelImpresionBackgroundColor() public function getPapelImpresionBackgroundColor()
{ {
$papel = $this->presupuesto->presupuestoLineaImpresion()->papel_generico(); if ($this->presupuesto->presupuestoLineaImpresion()) {
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['default'];
$papel_code = $papel->code_ot;
if ($papel_code) {
if (strpos($papel_code, "BCLOF")) {
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['blanco'];
}
if (strpos($papel_code, "AH") && $papel->code == "OFF2") {
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['ahuesado'];
}
if (strpos($papel_code, "MARF")) {
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['marfil'];
}
if (strpos($papel_code, "VOLAH")) {
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['volumen_ahuesado'];
}
if ($papel_code == "EM") {
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['estucado_mate'];
}
if ($papel_code == "CGE") {
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['cartulina'];
}
}
return $color; $papel = $this->presupuesto->presupuestoLineaImpresion()->papel_generico();
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['default'];
$papel_code = $papel->code_ot;
if ($papel_code) {
if (strpos($papel_code, "BCLOF")) {
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['blanco'];
}
if (strpos($papel_code, "AH") && $papel->code == "OFF2") {
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['ahuesado'];
}
if (strpos($papel_code, "MARF")) {
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['marfil'];
}
if (strpos($papel_code, "VOLAH")) {
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['volumen_ahuesado'];
}
if ($papel_code == "EM") {
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['estucado_mate'];
}
if ($papel_code == "CGE") {
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['cartulina'];
}
}
return $color;
} else {
return $this->ordenTrabajoConfig->OT_PAPEL_COLOR['blanco'];
}
} }
public function getPapelImpresionCubiertaBackgroundColor() public function getPapelImpresionCubiertaBackgroundColor()
{ {
$papel = $this->presupuesto->presupuestoLineaCubierta()->papel_generico(); if ($this->presupuesto->presupuestoLineaCubierta()) {
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['default'];
$papel_code = $papel->code_ot; $papel = $this->presupuesto->presupuestoLineaCubierta()->papel_generico();
if ($papel_code) { $color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['default'];
if (strpos($papel_code, "BCLOF")) { $papel_code = $papel->code_ot;
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['blanco']; if ($papel_code) {
} if (strpos($papel_code, "BCLOF")) {
if (strpos($papel_code, "AH") && $papel->code == "OFF2") { $color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['blanco'];
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['ahuesado']; }
} if (strpos($papel_code, "AH") && $papel->code == "OFF2") {
if (strpos($papel_code, "MARF")) { $color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['ahuesado'];
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['marfil']; }
} if (strpos($papel_code, "MARF")) {
if (strpos($papel_code, "VOLAH")) { $color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['marfil'];
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['volumen_ahuesado']; }
} if (strpos($papel_code, "VOLAH")) {
if ($papel_code == "EM") { $color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['volumen_ahuesado'];
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['estucado_mate']; }
} if ($papel_code == "EM") {
if ($papel_code == "CGE") { $color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['estucado_mate'];
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['cartulina']; }
if ($papel_code == "CGE") {
$color = $this->ordenTrabajoConfig->OT_PAPEL_COLOR['cartulina'];
}
} }
return $color;
} else {
return $this->ordenTrabajoConfig->OT_PAPEL_COLOR['blanco'];
} }
return $color;
} }
public function getPlastificadoColor() public function getPlastificadoColor()
{ {
@ -1585,21 +1678,10 @@ class ProductionService extends BaseService
foreach ($acabados as $key => $acabado) { foreach ($acabados as $key => $acabado) {
$tarifa_acabado = $acabado->tarifa(); $tarifa_acabado = $acabado->tarifa();
if ($tarifa_acabado->code) { if ($tarifa_acabado->code) {
$plastificado_code = $tarifa_acabado->code; if ($tarifa_acabado->plastificado) {
if ($plastificado_code == "BRIL") { if (isset($this->ordenTrabajoConfig->OT_PLASTIFICADO_COLOR[$tarifa_acabado->plastificado_tipo])) {
$color = $this->ordenTrabajoConfig->OT_PLASTIFICADO_COLOR['BRIL']; $color = $this->ordenTrabajoConfig->OT_PLASTIFICADO_COLOR[$tarifa_acabado->plastificado_tipo];
} }
if ($plastificado_code == "MATE") {
$color = $this->ordenTrabajoConfig->OT_PLASTIFICADO_COLOR['MATE'];
}
if ($plastificado_code == "ANTI") {
$color = $this->ordenTrabajoConfig->OT_PLASTIFICADO_COLOR['ANTIRAYADO'];
}
if ($plastificado_code == "SAND") {
$color = $this->ordenTrabajoConfig->OT_PLASTIFICADO_COLOR['SANDY'];
}
if ($plastificado_code == "GOF") {
$color = $this->ordenTrabajoConfig->OT_PLASTIFICADO_COLOR['GOFRADO'];
} }
} }
} }
@ -1630,10 +1712,15 @@ class ProductionService extends BaseService
$this->color(); $this->color();
return [ return [
"isGofrado" => $this->gofrado(), "isGofrado" => $this->gofrado(),
"isEspiral" => $this->isEspiral, "isEspiral" => $this->isEspiral, //TODO
"isPlastificado" => $this->plastificado(),
"isPlakene" => $this->plakene(),
"isEstampado" => $this->estampado(),
"isRetractilado" => $this->retractilado(),
"isUVI" => $this->uvi(), "isUVI" => $this->uvi(),
"isPlastificado" => $this->isPlastificado,
"isCubierta" => $this->cubierta(), "isCubierta" => $this->cubierta(),
"isSobrecubierta" => $this->sobreCubierta(),
"isGuarda" => $this->guarda(),
"isColor" => $this->isColor, "isColor" => $this->isColor,
"isBN" => $this->isBN, "isBN" => $this->isBN,
"isCorte" => $this->corte(), "isCorte" => $this->corte(),
@ -1658,6 +1745,75 @@ class ProductionService extends BaseService
$this->isGofrado = $flag; $this->isGofrado = $flag;
return $this->isGofrado; return $this->isGofrado;
} }
public function plakene(): bool
{
$flag = false;
$acabados = $this->presupuesto->acabados();
foreach ($acabados as $key => $acabado) {
$tarifa_acabado = $acabado->tarifa();
if ($tarifa_acabado->plakene) {
$flag = true;
break;
}
}
$this->isPlakene = $flag;
return $this->isPlakene;
}
public function retractilado(): bool
{
$flag = false;
$acabados = $this->presupuesto->acabados();
foreach ($acabados as $key => $acabado) {
$tarifa_acabado = $acabado->tarifa();
if ($tarifa_acabado->rectractilado) {
$flag = true;
break;
}
}
$this->isRetractilado = $flag;
return $this->isRetractilado;
}
public function plakene_tipo(): ?string
{
$tipo = "";
$acabados = $this->presupuesto->acabados();
foreach ($acabados as $key => $acabado) {
$tarifa_acabado = $acabado->tarifa();
if ($tarifa_acabado->plakene) {
$tipo = $tarifa_acabado->plakene_tipo;
break;
}
}
return $tipo;
}
public function plastificado(): bool
{
$flag = false;
$acabados = $this->presupuesto->acabados();
foreach ($acabados as $key => $acabado) {
$tarifa_acabado = $acabado->tarifa();
if ($tarifa_acabado->plastificado) {
$flag = true;
break;
}
}
$this->isPlastificado = $flag;
return $this->isPlastificado;
}
public function estampado(): bool
{
$flag = false;
$acabados = $this->presupuesto->acabados();
foreach ($acabados as $key => $acabado) {
$tarifa_acabado = $acabado->tarifa();
if ($tarifa_acabado->estampado) {
$flag = true;
break;
}
}
$this->isEstampado = $flag;
return $this->isEstampado;
}
public function cosido(): bool public function cosido(): bool
{ {
$flag = false; $flag = false;
@ -1690,6 +1846,24 @@ class ProductionService extends BaseService
} }
return $this->isCubierta; return $this->isCubierta;
} }
public function sobreCubierta(): bool
{
$flag = false;
$lineaCubierta = $this->presupuesto->presupuestoLineaSobreCubierta();
if ($lineaCubierta) {
$flag = true;
}
return $flag;
}
public function guarda(): bool
{
$flag = false;
$lineaCubierta = $this->presupuesto->presupuestoLineaGuarda();
if ($lineaCubierta) {
$flag = true;
}
return $flag;
}
public function color(): bool public function color(): bool
{ {
$linea_impresion = $this->presupuesto->presupuestoLineaImpresion(); $linea_impresion = $this->presupuesto->presupuestoLineaImpresion();
@ -1728,10 +1902,7 @@ class ProductionService extends BaseService
"orden_trabajo_tareas.id as ot_tarea_id", "orden_trabajo_tareas.id as ot_tarea_id",
"pedidos.fecha_impresion", "pedidos.fecha_impresion",
"orden_trabajo_tareas.nombre as tareaName", "orden_trabajo_tareas.nombre as tareaName",
"presupuestos.titulo as presupuesto_titulo",
"orden_trabajo_tareas.maquina_id", "orden_trabajo_tareas.maquina_id",
"lg_papel_impresion.nombre as papel_impresion",
"presupuesto_linea.gramaje as papel_gramaje",
"tarea_progress.estado as tareaEstado" "tarea_progress.estado as tareaEstado"
]) ])
->join("orden_trabajo_tareas", "orden_trabajo_tareas.orden_trabajo_id = ordenes_trabajo.id", "left") ->join("orden_trabajo_tareas", "orden_trabajo_tareas.orden_trabajo_id = ordenes_trabajo.id", "left")
@ -1748,21 +1919,14 @@ class ProductionService extends BaseService
'tarea_progress.ot_tarea_id = orden_trabajo_tareas.id', 'tarea_progress.ot_tarea_id = orden_trabajo_tareas.id',
'left' 'left'
) )
->join("presupuesto_linea", "presupuesto_linea.id = orden_trabajo_tareas.presupuesto_linea_id", "left")
->join("presupuestos", "presupuestos.id = presupuesto_linea.presupuesto_id", "right")
->join("pedidos", "pedidos.id = ordenes_trabajo.pedido_id", "right") ->join("pedidos", "pedidos.id = ordenes_trabajo.pedido_id", "right")
->join("lg_papel_formato", "lg_papel_formato.id = presupuestos.papel_formato_id", "left")
->join("lg_maquinas", "lg_maquinas.id = orden_trabajo_tareas.maquina_id", "left") ->join("lg_maquinas", "lg_maquinas.id = orden_trabajo_tareas.maquina_id", "left")
->join("lg_papel_impresion", "lg_papel_impresion.id = presupuesto_linea.papel_impresion_id", "left") ->where('orden_trabajo_tareas.maquina_id', $maquina_id)
->groupStart()
->orWhere('orden_trabajo_tareas.maquina_id', $maquina_id)
->orWhere('presupuesto_linea.maquina_id', $maquina_id)
->groupEnd()
// ->where('pedidos.fecha_impresion IS NOT NULL', null, false) // ->where('pedidos.fecha_impresion IS NOT NULL', null, false)
->where("orden_trabajo_tareas.deleted_at", null) ->where("orden_trabajo_tareas.deleted_at", null)
->where("tarea_progress.estado", 'P') ->where("tarea_progress.estado", 'P')
->orderBy("pedidos.fecha_impresion", "ASC") ->orderBy("pedidos.fecha_impresion", "ASC")
->groupBy('orden_trabajo_tareas.nombre'); ->groupBy('orden_trabajo_tareas.id');
return $q; return $q;
} }
@ -1783,4 +1947,242 @@ class ProductionService extends BaseService
} }
return $tareaCosido; return $tareaCosido;
} }
public function createDatesForPOD(): array
{
$podDates = [
'fecha_encuadernado' => null,
'fecha_entrega_real' => null,
'fecha_embalaje' => null,
'fecha_impresion' => null,
];
try {
$impresionDays = $this->configVariableModel->getVariable('pod_impresion_dias_tras_confirmacion')->value;
$encuadernadoDays = $this->configVariableModel->getVariable('pod_encuadernacion_dias_tras_confirmacion')->value;
$entregaRealDays = $this->configVariableModel->getVariable('pod_entrega_real_dias_tras_confirmacion')->value;
$embalajeDays = $this->configVariableModel->getVariable('pod_embalaje_dias_tras_confirmacion')->value;
$totalDays = array_sum([$impresionDays, $encuadernadoDays, $entregaRealDays, $embalajeDays]);
$dates = $this->generateWorkdaysFromToday($totalDays);
for ($i = 0; $i < count($dates); $i++) {
if ($i == $impresionDays) {
$podDates['fecha_impresion'] = $dates[$i];
}
if ($i == $encuadernadoDays) {
$podDates['fecha_encuadernado'] = $dates[$i];
}
if ($i == $entregaRealDays) {
$podDates['fecha_entrega_real'] = $dates[$i];
}
if ($i == $embalajeDays) {
$podDates['fecha_embalaje'] = $dates[$i];
}
}
return $podDates;
} catch (\Throwable $th) {
return ["error" => $th->getMessage()];
}
}
/**
* Devuelve un array con la longitud `$count` con las fechas que corresponde con días laborales.
* Menos fines de semana y festivos.
*
* @param integer $count
* @return array <str,YYYY-MM-DD>
*/
public function generateWorkdaysFromToday(int $count): array
{
$current = Time::now();
$workdays = [];
while (count($workdays) < $count) {
$dayOfWeek = $current->format('N'); // 1 (Lunes) to 7 (Domingo)
if ($dayOfWeek < 6) { // Lunes a Viernes
$date = $current->format('Y-m-d 00:00:00');
if ($this->festivoModel->isFestivo($date) == false) {
$workdays[] = $date;
}
}
$current = $current->addDays(1);
}
return $workdays;
}
public function updatePodDates(): bool
{
$dates = $this->createDatesForPOD();
return $this->pedidoModel->update($this->pedido->id, $dates);
}
public function getProveedorTarea($tarea_id)
{
$proveedor = null;
$tareaEntity = $this->otTarea->find($tarea_id);
if ($tareaEntity) {
$proveedorEncuadernado = $tareaEntity->presupuesto_encuadernacion();
$proveedorAcabado = $tareaEntity->presupuesto_acabado();
if ($proveedorEncuadernado) {
$proveedor = $proveedorEncuadernado->proveedor();
} elseif ($proveedorAcabado) {
$proveedor = $proveedorAcabado->proveedor();
} else {
$proveedor = null;
}
}
return ["tarea" => $tareaEntity, "proveedor" => $proveedor];
}
public function updateProveedorLinea($tarea_id, $proveedor_id)
{
$status = false;
$tareaEntity = $this->otTarea->find($tarea_id);
$presupuestoEncuadernado = $tareaEntity->presupuesto_encuadernacion();
$presupuestoAcabado = $tareaEntity->presupuesto_acabado();
if ($presupuestoEncuadernado) {
$status = $this->presupuestoEncuadernacionModel->update($presupuestoEncuadernado->id, ['proveedor_id' => $proveedor_id]);
} elseif ($presupuestoAcabado) {
$status = $this->presupuestoAcabadoModel->update($presupuestoAcabado->id, ['proveedor_id' => $proveedor_id]);
} else {
$status = null;
}
return $status;
}
public function otTareaImpresionWithDates()
{
$tareasImpresion = $this->ot->tareas_impresion();
$data = [];
foreach ($tareasImpresion as $key => $tareaImpresion) {
if ($tareaImpresion->is_corte) {
$data[$tareaImpresion->id] = 'corte_at';
continue;
}
$presupuestoLineaEntity = $tareaImpresion->presupuesto_linea();
if ($presupuestoLineaEntity) {
if ($presupuestoLineaEntity->isGuarda()) {
$data[$tareaImpresion->id] = 'guarda_at';
} elseif ($presupuestoLineaEntity->isCubierta()) {
$data[$tareaImpresion->id] = 'cubierta_at';
} elseif ($presupuestoLineaEntity->isColor()) {
$data[$tareaImpresion->id] = 'interior_color_at';
} elseif ($presupuestoLineaEntity->isBN()) {
$data[$tareaImpresion->id] = 'interior_bn_at';
} elseif ($presupuestoLineaEntity->isSobreCubierta()) {
$data[$tareaImpresion->id] = 'sobrecubierta_at';
}
}
}
return $data;
}
public function tareaImpresionDate($tarea): string
{
$dateName = "";
$presupuestoLineaEntity = $tarea->presupuesto_linea();
if ($presupuestoLineaEntity) {
if ($presupuestoLineaEntity->isGuarda()) {
$dateName = 'guarda_at';
} elseif ($presupuestoLineaEntity->isCubierta()) {
$dateName = 'cubierta_at';
} elseif ($presupuestoLineaEntity->isColor()) {
$dateName = 'interior_color_at';
} elseif ($presupuestoLineaEntity->isBN()) {
$dateName = 'interior_bn_at';
} elseif ($presupuestoLineaEntity->isSobreCubierta()) {
$dateName = 'sobrecubierta_at';
}
if ($tarea->is_corte) {
$dateName = 'corte_at';
}
}
return $dateName;
}
public function otTareaAcabadoWithDates()
{
$tareasAcabado = $this->ot->tareas_acabado();
$data = [];
foreach ($tareasAcabado as $key => $tareasAcabado) {
$tarifaAcabado = $tareasAcabado->presupuesto_acabado()?->tarifa();
if ($tarifaAcabado) {
if ($tarifaAcabado->plastificado) {
$data[$tareasAcabado->id] = 'plastificado_at';
}
if ($tarifaAcabado->rectractilado) {
$data[$tareasAcabado->id] = 'rectractilado_at';
}
if ($tarifaAcabado->estampado) {
$data[$tareasAcabado->id] = 'estampado_at';
}
if ($tarifaAcabado->uvi) {
$data[$tareasAcabado->id] = 'uvi_at';
}
}
}
return $data;
}
public function tareaAcabadoDate($tarea): string
{
$dateName = "";
$tarifaAcabado = $tarea->presupuesto_acabado()?->tarifa();;
if ($tarifaAcabado) {
if ($tarifaAcabado->plastificado) {
$dateName = 'plastificado_at';
}
if ($tarifaAcabado->rectractilado) {
$dateName = 'rectractilado_at';
}
if ($tarifaAcabado->plakene) {
$dateName = 'plakene_at';
}
if ($tarifaAcabado->estampado) {
$dateName = 'estampado_at';
}
if ($tarifaAcabado->uvi) {
$dateName = 'uvi_at';
}
}
return $dateName;
}
public function otTareaEncuadernadoWithDates()
{
$tareas = $this->ot->tareas_encuadernado();
$data = [];
foreach ($tareas as $key => $tarea) {
$data[$tarea->id] = "encuadernacion_at";
}
return $data;
}
public function otTareaManipuladooWithDates()
{
$tareas = $this->ot->tareas_manipulado();
$data = [];
foreach ($tareas as $key => $tarea) {
$data[$tarea->id] = "entrada_manipulado_at";
}
return $data;
}
public function getOrdenTrabajoTareaDates(): array
{
$dates = [];
foreach ($this->ot->tareas() as $key => $tarea) {
$dates[] = $this->getOrdenTrabajoTareaDate($tarea);
}
return array_unique($dates);
}
public function getOrdenTrabajoTareaDate(OrdenTrabajoTareaEntity $tarea): ?string
{
$dateName = null;
if ($tarea->isImpresion()) {
$dateName = $this->tareaImpresionDate($tarea);
}
if ($tarea->isAcabado()) {
$dateName = $this->tareaAcabadoDate($tarea);
}
if ($tarea->isManipulado()) {
$dateName = "entrada_manipulado_at";
}
if ($tarea->isEncuadernado()) {
$dateName = "encuadernacion_at";
}
return $dateName;
}
} }

View File

@ -12,7 +12,7 @@
</div> </div>
<div class="col-md-6 mb-2"> <div class="col-md-6 mb-2">
<p class="mb-0">Clicks</p> <p class="mb-0">Clicks</p>
<h4 class="mb-0" id="clicks-info"><?= $ot_tarea->click_tarea ?></h4> <h4 class="mb-0" id="clicks-info"><?= $ot_tarea->click_end - $ot_tarea->click_init ?></h4>
</div> </div>
</div> </div>

View File

@ -6,9 +6,6 @@
<th><?= lang('ID') ?></th> <th><?= lang('ID') ?></th>
<th><?= lang('Produccion.task.task') ?></th> <th><?= lang('Produccion.task.task') ?></th>
<th><?= lang('Produccion.task.estado') ?></th> <th><?= lang('Produccion.task.estado') ?></th>
<th><?= lang('Produccion.datatable.titulo') ?></th>
<th><?= lang('Produccion.datatable.papel') ?></th>
<th><?= lang('Produccion.datatable.gramaje') ?></th>
<th><?= lang('Produccion.datatable.fecha_impresion') ?></th> <th><?= lang('Produccion.datatable.fecha_impresion') ?></th>
<th class="text-nowrap"><?= lang('Basic.global.Action') ?></th> <th class="text-nowrap"><?= lang('Basic.global.Action') ?></th>
</tr> </tr>

View File

@ -1,6 +1,6 @@
<div class="table-responsive"> <div class="table-responsive">
<table id="<?= $id ?>" class="table table-hover"> <table id="<?= $id ?>" class="table table-hover table-sm">
<thead> <thead>
<tr> <tr>
<th><?= lang('Produccion.task.order') ?></th> <th><?= lang('Produccion.task.order') ?></th>
@ -8,6 +8,7 @@
<th><?= lang('Produccion.task.maquina_presupuesto') ?></th> <th><?= lang('Produccion.task.maquina_presupuesto') ?></th>
<th><?= lang('Produccion.task.maquina_actual') ?></th> <th><?= lang('Produccion.task.maquina_actual') ?></th>
<th><?= lang('Produccion.task.imposicion') ?></th> <th><?= lang('Produccion.task.imposicion') ?></th>
<th><?= lang('Produccion.task.proveedor') ?></th>
<th><?= lang('Produccion.task.tiempo_estimado') ?></th> <th><?= lang('Produccion.task.tiempo_estimado') ?></th>
<th><?= lang('Produccion.task.tiempo') ?></th> <th><?= lang('Produccion.task.tiempo') ?></th>
<th></th> <th></th>

View File

@ -521,6 +521,28 @@
</label> </label>
</div> </div>
</div> </div>
<div class="col-md-3">
<div class="form-check">
<label for="removeEnvioBase" class="form-check-label">
<input type="checkbox" id="removeEnvioBase"
name="no_envio_base" value="1"
class="form-check-input"<?= $clienteEntity->no_envio_base == true ? 'checked' : ''; ?>>
<?= lang('Clientes.removeEnvioBase') ?>
</label>
</div>
</div>
<div class="col-md-3">
<div class="form-check">
<label for="rotativaPOD" class="form-check-label">
<input type="checkbox" id="rotativaPOD"
name="forzar_rotativa_pod" value="1"
class="form-check-input"<?= $clienteEntity->forzar_rotativa_pod == true ? 'checked' : ''; ?>>
<?= lang('Clientes.forzarRotativaPod') ?>
</label>
</div>
</div>
</div>
<div class="row g-3 mb-3">
<div class="col-md-3"> <div class="col-md-3">
<div class="form-check"> <div class="form-check">
<label for="tiradaFlexible" class="form-check-label"> <label for="tiradaFlexible" class="form-check-label">

View File

@ -0,0 +1,64 @@
<?= $this->include('themes/_commonPartialsBs/select2bs5') ?>
<?= $this->include('themes/_commonPartialsBs/datatables') ?>
<?= $this->include('themes/_commonPartialsBs/sweetalert') ?>
<?= $this->include('themes/_commonPartialsBs/_confirm2delete') ?>
<?= $this->extend('themes/vuexy/main/defaultlayout') ?>
<?= $this->section('content'); ?>
<div class="container-fluid h-100">
<div class="row">
<div class="col-md-12">
<div class="card card-info">
<div class="card-header">
<h3 class="card-title"><?= lang('Festivos.moduleTitle') ?></h3>
</div>
<!--//.card-header -->
<div class="card-body m-10 section-block" id="festivoCard">
<?= view('themes/_commonPartialsBs/_alertBoxes'); ?>
<div id="calendar"></div>
<!--//.card-footer -->
</div>
<!--//.card -->
</div>
<!--//.col -->
</div>
</div>
</div>
<!--//.row -->
<?= $this->endSection() ?>
<?= $this->section('css') ?>
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/formvalidation/dist/css/formValidation.min.css') ?>" />
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/notiflix/notiflix.css') ?>" />
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/sweetalert2/sweetalert2.css') ?>" />
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/spinkit/spinkit.css') ?>" />
<?= $this->endSection() ?>
<?= $this->section("additionalExternalJs") ?>
<script src="<?= site_url("themes/vuexy/vendor/libs/notiflix/notiflix.js") ?>"></script>
<script src="<?= site_url("themes/vuexy/vendor/libs/formvalidation/dist/js/FormValidation.js") ?>"></script>
<script src="<?= site_url("themes/vuexy/vendor/libs/formvalidation/dist/js/plugins/Bootstrap5.min.js") ?>"></script>
<script src="<?= site_url("themes/vuexy/vendor/libs/formvalidation/dist/js/plugins/AutoFocus.min.js") ?>"></script>
<script src="<?= site_url('themes/vuexy/vendor/libs/sweetalert2/sweetalert2.js') ?>"></script>
<script src="<?= site_url('themes/vuexy/vendor/libs/fullcalendar/dist/index.global.min.js') ?>"></script>
<script src="<?= site_url('themes/vuexy/vendor/libs/fullcalendar/packages/core/locales-all.global.min.js') ?>"></script>
<script type="module" src="<?= site_url("/assets/js/safekat/pages/configuracion/festivo/index.js") ?>"></script>
<?= $this->endSection() ?>

View File

@ -0,0 +1,103 @@
<?= $this->include('themes/_commonPartialsBs/datatables') ?>
<?= $this->include('themes/_commonPartialsBs/sweetalert') ?>
<?= $this->extend('themes/vuexy/main/defaultlayout') ?>
<?= $this->section('content'); ?>
<div class="row">
<div class="col-md-12">
<div class="card card-info">
<div class="card-header">
<h3 class="card-title"><?= lang('Importador.importadorBubokTitle') ?></h3>
</div><!--//.card-header -->
<form id="catalogoLibroForm" class="card-body" method="post" action="#">
<?= csrf_field() ?>
<!-- card-body -->
<div class="card-body">
<?= view('themes/_commonPartialsBs/_alertBoxes'); ?>
<div class="row">
<div class="col-md-6 mb-3">
<label for="xmlFile"
class="form-label"><?= lang('Importador.subirArchivoBubok') ?? 'Subir archivo XML' ?></label>
<input type="file" id="xmlFile" accept=".xml" class="form-control">
</div>
<div class="col-md-4 mb-3 d-flex align-items-end">
<button type="button" id="importBtn" class="btn btn-success w-100">
<i class="fas fa-file-import me-2"></i> <?= lang('Importador.importar') ?? 'Importar' ?>
</button>
</div>
<div class="col-md-12 mb-3">
<table id="xmlTable" class="table">
<thead>
<tr>
<th><input type="checkbox" id="selectAll" /></th>
<th>Referencia</th>
<th>Título</th>
<th>Tamaño</th>
<th>Páginas</th>
<th>Tirada</th>
<th>Interior</th>
<th>Notas</th>
<th>Acciones</th>
</tr>
<tr>
<th></th> <!-- No filtro para checkbox -->
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th> <!-- No filtro para notas -->
<th></th> <!-- No filtro para acciones -->
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</form>
</div><!--//.card-body -->
<div class="card-footer">
</div><!--//.card-footer -->
</div><!--//.card -->
</div><!--//.col -->
</div><!--//.row -->
<?= $this->endSection() ?>
<?= $this->section('css') ?>
<link rel="stylesheet"
href="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.bootstrap5.min.css") ?>">
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/sweetalert2/sweetalert2.css') ?>" />
<?= $this->endSection() ?>
<?= $this->section('additionalExternalJs') ?>
<script
src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/dataTables.buttons.min.js") ?>"></script>
<script
src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.bootstrap5.min.js") ?>"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.html5.min.js") ?>"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.print.min.js") ?>"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/jszip/jszip.min.js") ?>"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/pdfmake/pdfmake.min.js") ?>"
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/pdfmake/vfs_fonts.js") ?>"></script>
<script src="<?= site_url('themes/vuexy/vendor/libs/sweetalert2/sweetalert2.js') ?>"></script>
<script type="module" src="<?= site_url("assets/js/safekat/pages/importadores/bubok/bubok_tool.js") ?>"></script>
<?= $this->endSection() ?>

View File

@ -0,0 +1,106 @@
<?= $this->include('themes/_commonPartialsBs/datatables') ?>
<?= $this->include('themes/_commonPartialsBs/sweetalert') ?>
<?= $this->extend('themes/vuexy/main/defaultlayout') ?>
<?= $this->section('content'); ?>
<div class="row">
<div class="col-md-12">
<div class="card card-info">
<div class="card-header">
<h3 class="card-title"><?= lang('Importador.importadorCatalogoTitle') ?></h3>
</div><!--//.card-header -->
<form id="catalogoLibroForm" class="card-body" method="post" action="#">
<?= csrf_field() ?>
<!-- card-body -->
<div class="card-body">
<?= view('themes/_commonPartialsBs/_alertBoxes'); ?>
<div class="row">
<div class="col-md-6 mb-3">
<label for="excelFile"
class="form-label"><?= lang('Importador.subirArchivoRama') ?? 'Subir archivo Excel' ?></label>
<input type="file" class="form-control" id="excelFile" name="excelFile"
accept=".xlsx, .xls">
</div>
<div class="col-md-4 mb-3 d-flex align-items-end">
<button type="button" id="importBtn" class="btn btn-success w-100">
<i class="fas fa-file-import me-2"></i> <?= lang('Importador.importar') ?? 'Importar' ?>
</button>
</div>
<div class="col-md-12 mb-3">
<table id="excelTable" class="table table-striped table-hover" style="width: 100%;">
<thead>
<tr>
<th><input type="checkbox" id="selectAll"></th> <!-- Checkbox general -->
<th><?= lang('Importador.input') ?></th>
<th><?= lang('Importador.idlinea') ?></th>
<th><?= lang('Importador.descripcion') ?></th>
<th><?= lang('Importador.cnt_pedida') ?></th>
<th><?= lang('Importador.precio_compra') ?></th>
<th>Notas</th> <!-- Comentarios -->
<th><?= lang('Basic.global.Action') ?></th>
<!-- Acciones (importar/eliminar) -->
</tr>
<tr> <!-- Segunda fila para filtros -->
<th></th> <!-- No filtro en checkbox -->
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th> <!-- No filtro en notas -->
<th></th> <!-- No filtro en acciones -->
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
</form>
</div><!--//.card-body -->
<div class="card-footer">
</div><!--//.card-footer -->
</div><!--//.card -->
</div><!--//.col -->
</div><!--//.row -->
<?= $this->endSection() ?>
<?= $this->section('css') ?>
<link rel="stylesheet"
href="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.bootstrap5.min.css") ?>">
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/sweetalert2/sweetalert2.css') ?>" />
<?= $this->endSection() ?>
<?= $this->section('additionalExternalJs') ?>
<script
src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/dataTables.buttons.min.js") ?>"></script>
<script
src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.bootstrap5.min.js") ?>"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.html5.min.js") ?>"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.print.min.js") ?>"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/jszip/jszip.min.js") ?>"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/pdfmake/pdfmake.min.js") ?>"
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/pdfmake/vfs_fonts.js") ?>"></script>
<script src="<?= site_url('themes/vuexy/vendor/libs/sweetalert2/sweetalert2.js') ?>"></script>
<script src="https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js"></script>
<script type="module" src="<?= site_url("assets/js/safekat/pages/importadores/catalogo/catalogo_tool.js") ?>"></script>
<?= $this->endSection() ?>

View File

@ -10,6 +10,7 @@
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h4><?= $boxTitle ?> <h4><?= $boxTitle ?>
<?= ($envioEntity->tipo_envio == 'ferro_prototipo') ? '<span class="badge text-bg-warning fw-lg">FERRO</span>':'' ?>
<?= ($envioEntity->finalizado == 0) ? '' : '<span class="badge text-bg-success fw-lg">FINALIZADO</span>' ?> <?= ($envioEntity->finalizado == 0) ? '' : '<span class="badge text-bg-success fw-lg">FINALIZADO</span>' ?>
</h4> </h4>
</div> </div>
@ -18,7 +19,6 @@
<?= view("themes/_commonPartialsBs/_alertBoxes") ?> <?= view("themes/_commonPartialsBs/_alertBoxes") ?>
<input type="hidden" id="id" name="id" value="<?= $envioEntity->id ?>"> <input type="hidden" id="id" name="id" value="<?= $envioEntity->id ?>">
<input type="hidden" id="nextCaja" name="next_caja" value="<?= $envioEntity->nextCaja ?>">
<div class="accordion accordion-bordered"> <div class="accordion accordion-bordered">
<div class="card accordion-item active mb-5"> <div class="card accordion-item active mb-5">
@ -114,7 +114,7 @@
</div> </div>
</div> </div>
<?php if ($envioEntity->finalizado == 0): ?> <?php if ($envioEntity->finalizado == 0 && $envioEntity->tipo_envio=='estandar'): ?>
<div class="accordion accordion-bordered"> <div class="accordion accordion-bordered">
<div class="card accordion-item active mb-5"> <div class="card accordion-item active mb-5">
<h4 class="accordion-header px-4 py-3"> <h4 class="accordion-header px-4 py-3">
@ -172,7 +172,7 @@
<i class="ti ti-select"></i> <i class="ti ti-select"></i>
</button> </button>
</div> </div>
<?php if ($envioEntity->finalizado == 0): ?> <?php if ($envioEntity->finalizado == 0 && $envioEntity->tipo_envio=='estandar'): ?>
<div class="col-sm-2 px-3"> <div class="col-sm-2 px-3">
<button id="btnEliminarLineas" name="btnEliminarLineas" tabindex="1" <button id="btnEliminarLineas" name="btnEliminarLineas" tabindex="1"
class="btn btn-danger w-100"> class="btn btn-danger w-100">
@ -336,6 +336,7 @@
<ti class="ti ti-check"></ti> <ti class="ti ti-check"></ti>
</button> </button>
</div> </div>
<?php if ($envioEntity->tipo_envio=='estandar'): ?>
<div class="col-sm-3 px-3"> <div class="col-sm-3 px-3">
<button id="finalizarEnvioYOTs" name="finalizar_envio_ots" tabindex="1" <button id="finalizarEnvioYOTs" name="finalizar_envio_ots" tabindex="1"
class="btn btn-primary mt-4 w-100 btn-finalizar"> class="btn btn-primary mt-4 w-100 btn-finalizar">
@ -343,6 +344,7 @@
<ti class="ti ti-checks"></ti> <ti class="ti ti-checks"></ti>
</button> </button>
</div> </div>
<?php endif; ?>
<?php endif; ?> <?php endif; ?>
</div> </div>
</div> </div>

View File

@ -1,97 +0,0 @@
<?= $this->include("themes/_commonPartialsBs/sweetalert") ?>
<?= $this->include('themes/_commonPartialsBs/datatables') ?>
<?= $this->extend('themes/vuexy/main/defaultlayout') ?>
<?= $this->section('content'); ?>
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<h4><?= $boxTitle ?></h4>
</div>
<div class="card-body">
<?= view("themes/_commonPartialsBs/_alertBoxes") ?>
<div class="card accordion-item active mb-5">
<h4 class="accordion-header px-4 py-3">
<?= lang("Logistica.nuevoEnvio") ?>
</h4>
<div id="accordionNuevoEnvioTip" class="accordion-collapse collapse show">
<div class="accordion-body px-4 py-3">
<div class="row">
<div class="mb-1 col-sm-4">
<label for="buscadorPedidos" class="form-label">
<?= lang("Logistica.buscadorPedidosTitle") ?>
</label>
<input id="buscadorPedidos" name="buscador_pedidos" tabindex="1" maxlength="50"
class="form-control" value="">
</div>
</div>
</div>
</div>
</div>
<div class="card accordion-item active">
<h4 class="accordion-header px-4 py-3">
<?= lang("Logistica.listadoEnvios") ?>
</h4>
<div id="accordionListadoEnviosTip" class="accordion-collapse collapse show">
<div class="accordion-body px-4 py-3">
<div class="row">
<table id="tableOfEnvios" class="table table-striped table-hover w-100">
<thead>
<tr>
<th><?= lang('Logistica.idEnvio') ?? 'ID Envío' ?></th>
<th><?= lang('Logistica.numeroOts') ?? 'Nº OTs' ?></th>
<th><?= lang('Logistica.numeroLineas') ?? 'Nº Líneas' ?></th>
<th><?= lang('Logistica.att') ?? 'Att' ?></th>
<th><?= lang('Logistica.direccion') ?? 'Dirección' ?></th>
<th><?= lang('Logistica.ciudad') ?? 'Ciudad' ?></th>
<th><?= lang('Logistica.pais') ?? 'País' ?></th>
<th><?= lang('Logistica.cp') ?? 'CP' ?></th>
<th><?= lang('Logistica.email') ?? 'Email' ?></th>
<th><?= lang('Logistica.telefono') ?? 'Teléfono' ?></th>
<th><?= lang('Logistica.finalizado') ?? 'Finalizado' ?></th>
<th><?= lang('Logistica.acciones') ?? 'Acciones' ?></th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="mt-3">
<button type="button" class="btn btn-secondary" id="btnImprimirEtiquetas"
onclick="window.location.href='<?= route_to('LogisticaPanel') ?>'">
<?= lang('Logistica.backToPanel') ?>
</button>
</div>
</div>
</div>
</div>
</div>
<?= $this->endSection() ?>
<?= $this->section('css') ?>
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/sweetalert2/sweetalert2.css') ?>" />
<?= $this->endSection() ?>
<?= $this->section('additionalExternalJs') ?>
<script src="<?= site_url('themes/vuexy/vendor/libs/sweetalert2/sweetalert2.js') ?>"></script>
<script type="module" src="<?= site_url("assets/js/safekat/pages/logistica/envio.js") ?>"></script>
<?= $this->endSection() ?>

View File

@ -12,6 +12,8 @@
</div> </div>
<div class="card-body"> <div class="card-body">
<input type="hidden" id="tipo_envio" value="<?= $tipo_envio ?>" />
<?= view("themes/_commonPartialsBs/_alertBoxes") ?> <?= view("themes/_commonPartialsBs/_alertBoxes") ?>
<div class="card accordion-item active mb-5"> <div class="card accordion-item active mb-5">

View File

@ -17,7 +17,7 @@
<img src="<?= site_url("assets/img/logistica/envios.jpg") ?>" alt="Envíos"> <img src="<?= site_url("assets/img/logistica/envios.jpg") ?>" alt="Envíos">
<div><span><?= lang("Logistica.gestionEnvios"); ?></span></div> <div><span><?= lang("Logistica.gestionEnvios"); ?></span></div>
</div> </div>
<div class="item"> <div class="item" onclick="location.href='<?= route_to('gestionEnviosFerros') ?>'">
<img src="<?= site_url("assets/img/logistica/envios_ferros.png") ?>" alt="Envío de Ferros/Prototipos"> <img src="<?= site_url("assets/img/logistica/envios_ferros.png") ?>" alt="Envío de Ferros/Prototipos">
<div><span><?= lang("Logistica.envioFerros"); ?></span></div> <div><span><?= lang("Logistica.envioFerros"); ?></span></div>
</div> </div>

View File

@ -26,6 +26,9 @@ use Config\App;
<li class="nav-item"> <li class="nav-item">
<button type="button" class="nav-link" role="tab" id="navs-top-align-facturas-tab" data-bs-toggle="tab" data-bs-target="#navs-top-align-facturas"><?=lang('App.menu_facturas')?></button> <button type="button" class="nav-link" role="tab" id="navs-top-align-facturas-tab" data-bs-toggle="tab" data-bs-target="#navs-top-align-facturas"><?=lang('App.menu_facturas')?></button>
</li> </li>
<li class="nav-item">
<button type="button" class="nav-link" role="tab" id="navs-top-align-ot-tab" data-bs-toggle="tab" data-bs-target="#navs-top-align-ots"><?=lang('Produccion.ots')?></button>
</li>
</ul> </ul>
<div class="tab-content" id="message-datatables-container"> <div class="tab-content" id="message-datatables-container">
@ -41,7 +44,9 @@ use Config\App;
</div> </div>
<div class="tab-pane fade show" id="navs-top-align-facturas"> <div class="tab-pane fade show" id="navs-top-align-facturas">
<?= view("themes/vuexy/components/tables/messages_table", ["id" => "tableFacturaMessages"]) ?> <?= view("themes/vuexy/components/tables/messages_table", ["id" => "tableFacturaMessages"]) ?>
</div>
<div class="tab-pane fade show" id="navs-top-align-ots">
<?= view("themes/vuexy/components/tables/messages_table", ["id" => "tableOtMessages"]) ?>
</div> </div>
</div> </div>
<!--//.card --> <!--//.card -->

View File

@ -39,6 +39,7 @@
<th class="lp-header"><?= lang('PresupuestosDirecciones.costePrecio') ?></th> <th class="lp-header"><?= lang('PresupuestosDirecciones.costePrecio') ?></th>
<th class="lp-header"><?= lang('Tarifaacabado.margen') ?></th> <th class="lp-header"><?= lang('Tarifaacabado.margen') ?></th>
<th class="lp-header">Pallets?</th> <th class="lp-header">Pallets?</th>
<th class="lp-header">Ferro o Prototipo?</th>
<th style="min-width:120px !important;" class="lp-header"><?= lang('Basic.global.Action') ?></th> <th style="min-width:120px !important;" class="lp-header"><?= lang('Basic.global.Action') ?></th>
</tr> </tr>
</thead> </thead>
@ -60,6 +61,7 @@
<button id="insertar_direccion" type="button" class="btn btn-secondary waves-effect waves-light float-start"><?= lang("Presupuestos.insertar")?></button> <button id="insertar_direccion" type="button" class="btn btn-secondary waves-effect waves-light float-start"><?= lang("Presupuestos.insertar")?></button>
</div> </div>
</div> </div>
</div> <!-- //.accordion-body --> </div> <!-- //.accordion-body -->
</div> <!-- //.accordion-collapse --> </div> <!-- //.accordion-collapse -->
</div> <!-- //.accordion-item --> </div> <!-- //.accordion-item -->

View File

@ -8,6 +8,15 @@
<div class="modal-body"> <div class="modal-body">
<div id='error-tarifa'></div> <div id='error-tarifa'></div>
<div class="mb-3" id="direccionFerroProto">
<label for="dirFerroProto" class="form-label">
Dirección Ferro o Prototipo
</label>
<input type="checkbox" id="dirFerroProto" class="form-check-input">
</div><!--//.mb-3 -->
<div class="mb-3"> <div class="mb-3">
<label for="add_clientedAdd" class="form-label"> <label for="add_clientedAdd" class="form-label">
<?= lang('PresupuestosDirecciones.clientedAdd') ?>* <?= lang('PresupuestosDirecciones.clientedAdd') ?>*

View File

@ -0,0 +1,63 @@
<?= $this->include('themes/_commonPartialsBs/select2bs5') ?>
<?= $this->include('themes/_commonPartialsBs/datatables') ?>
<?= $this->include('themes/_commonPartialsBs/sweetalert') ?>
<?= $this->include('themes/_commonPartialsBs/_confirm2delete') ?>
<?= $this->extend('themes/vuexy/main/defaultlayout') ?>
<?= $this->section('content'); ?>
<!--Content Body-->
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-body">
<div class="table-responsive">
<table class="table-maquinista table table-hover text-dark" style="width: 100%;">
<thead>
<tr>
<th><?= lang('ID') ?></th>
<th><?= lang('Users.firstName') ?></th>
<th><?= lang('Users.lastName') ?></th>
<th><?= lang('Users.email') ?></th>
<th class="text-nowrap"><?= lang('Basic.global.Action') ?></th>
</tr>
</thead>
<tbody>
<?php if (count($maquinistas) > 0): ?>
<?php foreach ($maquinistas as $key => $maquinista): ?>
<tr>
<td><?= $maquinista->id ?></td>
<td><?= $maquinista->first_name ?></td>
<td><?= $maquinista->last_name ?></td>
<td><?= $maquinista->getEmail() ?></td>
<td style="color: white;">
<a type="button" href="<?= route_to("maquinistaChangeUserSession", $maquinista->id) ?>" class="btn btn-lg btn-primary h-100 w-100">Mi turno</a>
</td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<tr class="text-center">
<td colspan="5">No hay usuarios para cambiar turno</td>
</tr>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<?= $this->endSection() ?>
<?= $this->section('css') ?>
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/formvalidation/dist/css/formValidation.min.css') ?>" />
<link rel="stylesheet" href="<?= site_url('themes/vuexy/css/maquinista.css') ?>" />
<?= $this->endSection() ?>
<?= $this->section("additionalExternalJs") ?>
<script src="<?= site_url("themes/vuexy/vendor/libs/formvalidation/dist/js/FormValidation.js") ?>"></script>
<script src="<?= site_url("themes/vuexy/vendor/libs/formvalidation/dist/js/plugins/Bootstrap5.min.js") ?>"></script>
<script src="<?= site_url("themes/vuexy/vendor/libs/formvalidation/dist/js/plugins/AutoFocus.min.js") ?>"></script>
<?= $this->endSection() ?>

View File

@ -18,6 +18,8 @@ use CodeIgniter\I18n\Time;
<div class="d-flex flex-row justify-content-center align-items-stretch gap-2 h-100"> <div class="d-flex flex-row justify-content-center align-items-stretch gap-2 h-100">
<button type="button" id="btn-tareas-hoy" class="btn btn-primary h-100 active w-50" aria-pressed="true"><?= lang('Produccion.maquinista.tareas_hoy') ?></button> <button type="button" id="btn-tareas-hoy" class="btn btn-primary h-100 active w-50" aria-pressed="true"><?= lang('Produccion.maquinista.tareas_hoy') ?></button>
<button type="button" id="btn-all-tareas" class="btn btn-primary h-100 w-50"><?= lang('Produccion.maquinista.tareas_all') ?></button> <button type="button" id="btn-all-tareas" class="btn btn-primary h-100 w-50"><?= lang('Produccion.maquinista.tareas_all') ?></button>
<button type="button" id="btn-delay-tasks" class="btn btn-warning h-100 w-50"><?= lang('Produccion.maquinista.tareas_delay') ?></button>
</div> </div>
</div> </div>
<div class="col-md-6 col-xs-12 justify-content-end d-flex"> <div class="col-md-6 col-xs-12 justify-content-end d-flex">

View File

@ -1,6 +1,195 @@
<div class="accordion accordion-bordered mt-3" id="accordionComentarios">
<div class="card accordion-item active">
<h2 class="accordion-header" id="headingOne">
<button type="button" class="accordion-button" data-bs-toggle="collapse"
data-bs-target="#accordionComentariosTip" aria-expanded="false"
aria-controls="accordionComentariosTip">
<div class="d-flex flex-row justify-content-start align-items-stretch gap-2">
<span><i class="ti-quote ti-md ti"></i></span>
<h4> <?= lang('Produccion.comentarios') ?> </h4>
</div>
</button>
</h2>
<div class="cold-md-12 mt-3"> <div id="accordionComentariosTip" class="accordion-collapse collapse show"
<!-- Comment text area--> data-bs-parent="#accordionComentarios">
<label for="ot-comment" class="form-label"><h4><?= @lang("Produccion.comments") ?></h4></label> <div class="accordion-body">
<textarea rows=5 cols="10" type="text" class="form-control w-100" name="comentarios" id="ot-comment"></textarea> <div class="nav-align-top mb-4">
</div> <ul class="nav nav-pills mb-3" role="tablist">
<li class="nav-item">
<button
type="button"
class="nav-link active"
role="tab"
data-bs-toggle="tab"
data-bs-target="#comentarios-ot"
aria-controls="comentarios-ot"
aria-selected="true">
<?= lang("Produccion.comentariosOt") ?>
</button>
</li>
<li class="nav-item">
<button
type="button"
class="nav-link"
role="tab"
data-bs-toggle="tab"
data-bs-target="#comentarios-interior"
aria-controls="comentarios-interior"
aria-selected="true">
<?= lang("Produccion.comentariosImpresionInterior") ?>
</button>
</li>
<li class="nav-item">
<button
type="button"
class="nav-link"
role="tab"
data-bs-toggle="tab"
data-bs-target="#comentarios-cubierta"
aria-controls="comentarios-cubierta"
aria-selected="false">
<?= lang("Produccion.comentariosCubierta") ?>
</button>
</li>
<li class="nav-item">
<button
type="button"
class="nav-link"
role="tab"
data-bs-toggle="tab"
data-bs-target="#comentarios-encuadernacion"
aria-controls="comentarios-encuadernacion"
aria-selected="false">
<?= lang("Produccion.comentariosEncuadernacion") ?>
</button>
</li>
<li class="nav-item">
<button
type="button"
class="nav-link"
role="tab"
data-bs-toggle="tab"
data-bs-target="#comentarios-logistica"
aria-controls="comentarios-logistica"
aria-selected="false">
<?= lang("Produccion.comentariosLogistica") ?>
</button>
</li>
<li class="nav-item">
<button
type="button"
class="nav-link"
role="tab"
data-bs-toggle="tab"
data-bs-target="#info-solapa-guillotina"
aria-controls="info-solapa-guillotina"
aria-selected="false">
<?= lang("Produccion.info_solapa_guillotina") ?>
</button>
</li>
</ul>
<div class="tab-content border border-container">
<div class="tab-pane fade show active" id="comentarios-ot" role="tabpanel">
<div class="row">
<div class="col-md-12 col-lg-12 px-4">
<div class="mb-3">
<textarea
rows="3"
name="comentarios"
class="ot-comment w-100"
style="height: 10em;"
class="form-control"><?= $ot->comentarios ?></textarea>
</div>
</div>
</div>
</div>
<div class="tab-pane fade" id="comentarios-interior" role="tabpanel">
<div class="row">
<div class="col-md-12 col-lg-12 px-4">
<div class="mb-3">
<textarea
rows="3"
name="comment_interior"
class="ot-comment w-100"
style="height: 10em;"
class="form-control"><?= $ot->comment_interior ?></textarea>
</div>
</div>
</div>
</div>
<div class="tab-pane fade" id="comentarios-cubierta" role="tabpanel">
<div class="row">
<div class="col-md-12 col-lg-12 px-4">
<div class="mb-3">
<textarea
rows="3"
name="comment_cubierta"
class="ot-comment w-100"
style="height: 10em;"
class="form-control"><?= $ot->comment_cubierta ?></textarea>
</div>
</div>
</div>
</div>
<div class="tab-pane fade" id="comentarios-encuadernacion" role="tabpanel">
<div class="row">
<div class="col-md-12 col-lg-12 px-4">
<div class="mb-3">
<textarea
rows="3"
name="comment_encuadernacion"
class="ot-comment w-100"
style="height: 10em;"
class="form-control"><?= $ot->comment_encuadernacion ?></textarea>
</div>
</div>
</div>
</div>
<div class="tab-pane fade" id="comentarios-logistica" role="tabpanel">
<div class="row">
<div class="col-md-12 col-lg-12 px-4">
<div class="mb-3">
<textarea
rows="3"
name="comment_logistica"
class="ot-comment w-100"
style="height: 10em;"
class="form-control"><?= $ot->comment_logistica ?></textarea>
</div>
</div>
</div>
</div>
<div class="tab-pane fade" id="info-solapa-guillotina" role="tabpanel">
<div class="row">
<div class="col-md-12 col-lg-12 px-4">
<div class="mb-3">
<textarea
rows="3"
name="info_solapa_guillotina"
class="ot-comment w-100"
style="height: 10em;"
class="form-control"><?= $ot->info_solapa_guillotina ?></textarea>
</div>
</div>
</div>
</div>
</div>
</div>
</div> <!-- //.accordion-body -->
</div> <!-- //.accordion-collapse -->
</div> <!-- //.accordion-item -->
</div> <!-- //.accordion -->

View File

@ -42,9 +42,17 @@
<span class="ti-sm ti ti-truck-delivery me-1"></span> <span class="ti-sm ti ti-truck-delivery me-1"></span>
Pedido Pedido
</a> </a>
<a type="button" class="btn btn-danger btn-block mb-1" target="__blank" href="<?= "/produccion/ordentrabajo/pdf/" . $modelId ?>"> <?php if ($presupuesto->ferro == 1): ?>
<span class="ti-sm ti ti-file me-1"></span> <?php if ($ot->dates()->ferro_ok_at != null): ?>
PDF</a> <a type="button" class="btn btn-danger btn-block mb-1" target="__blank" href="<?= "/produccion/ordentrabajo/pdf/" . $modelId ?>">
<span class="ti-sm ti ti-file me-1"></span>
PDF</a>
<?php endif; ?>
<?php else: ?>
<a type="button" class="btn btn-danger btn-block mb-1" target="__blank" href="<?= "/produccion/ordentrabajo/pdf/" . $modelId ?>">
<span class="ti-sm ti ti-file me-1"></span>
PDF</a>
<?php endif; ?>
<a type="button" href="<?= route_to('getOrdenTrabajoBarCode', $modelId) ?>" class="btn btn-secondary btn-block mb-1" download><span class="ti-sm ti ti-barcode me-1"></span><?= @lang("Produccion.imprimir_codigo_safekat") ?></a> <a type="button" href="<?= route_to('getOrdenTrabajoBarCode', $modelId) ?>" class="btn btn-secondary btn-block mb-1" download><span class="ti-sm ti ti-barcode me-1"></span><?= @lang("Produccion.imprimir_codigo_safekat") ?></a>

View File

@ -21,7 +21,7 @@
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-3 <?= $user_dates["pre_formato_at"]||$user_dates["pre_lomo_at"]||$user_dates["pre_solapa_at"]||$user_dates["pre_codbarras_at"]||$user_dates["pre_imposicion_at"] ? "" : "d-none" ?>"> <div class="col-md-3 <?= $user_dates["pre_formato_at"] || $user_dates["pre_lomo_at"] || $user_dates["pre_solapa_at"] || $user_dates["pre_codbarras_at"] || $user_dates["pre_imposicion_at"] ? "" : "d-none" ?>">
<!-- PREIMPRESION --> <!-- PREIMPRESION -->
<!-- Preformato --> <!-- Preformato -->
<div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100"> <div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100">
@ -136,30 +136,90 @@
</div> </div>
<!-- Progress --> <!-- Progress -->
<div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $flags["isCubierta"] ? "" : "d-none" ?>"> <div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $flags["isCubierta"] ? "" : "d-none" ?>">
<label for="ot-portada" class="form-label"><?= @lang("Produccion.cubierta") ?></label> <label for="ot-cubierta" class="form-label"><?= @lang("Produccion.cubierta") ?></label>
<div class="input-group"> <div class="input-group">
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="cubierta_at" id="ot-portada" data-input <?= $is_finalizada ? "disabled" : "" ?>> <input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="cubierta_at" id="ot-cubierta" data-input <?= $is_finalizada ? "disabled" : "" ?>>
<button class="btn btn-outline-danger btn-erase-date" type="button"><i class="ti-eraser ti"></i></button> <button class="btn btn-outline-danger btn-erase-date" type="button"><i class="ti-eraser ti"></i></button>
</div> </div>
<div class="form-text"><?= $user_dates["cubierta_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div> <div class="form-text"><?= $user_dates["cubierta_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div>
</div> </div>
<!-- Progress -->
<div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $flags["isSobrecubierta"] ? "" : "d-none" ?>">
<label for="ot-sobrecubierta" class="form-label"><?= @lang("Produccion.sobrecubierta") ?></label>
<div class="input-group">
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="sobrecubierta_at" id="ot-sobrecubierta" data-input <?= $is_finalizada ? "disabled" : "" ?>>
<button class="btn btn-outline-danger btn-erase-date" type="button"><i class="ti-eraser ti"></i></button>
</div>
<div class="form-text"><?= $user_dates["sobrecubierta_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div>
</div>
<!-- Progress -->
<div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $flags["isGuarda"] ? "" : "d-none" ?>">
<label for="ot-guarda" class="form-label"><?= @lang("Produccion.guarda") ?></label>
<div class="input-group">
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="guarda_at" id="ot-guarda" data-input <?= $is_finalizada ? "disabled" : "" ?>>
<button class="btn btn-outline-danger btn-erase-date" type="button"><i class="ti-eraser ti"></i></button>
</div>
<div class="form-text"><?= $user_dates["guarda_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div>
</div>
</div>
<div class="col-md-3">
<!-- Progress -->
<div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100">
<h4 class="text-truncate"><?= lang("Produccion.progress_manipulado") ?></h4>
</div>
<!-- Progress --> <!-- Progress -->
<div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $flags["isPlastificado"] ? "" : "d-none" ?>"> <div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $flags["isPlastificado"] ? "" : "d-none" ?>">
<label for="ot-plastificado-mate" class="form-label"><?= @lang("Produccion.plastificado_mate") ?></label> <label for="ot-plastificado" class="form-label"><?= @lang("Produccion.plastificado") ?></label>
<div class="input-group"> <div class="input-group">
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="plastificado_at" id="ot-plastificado-mate" data-input <?= $is_finalizada ? "disabled" : "" ?>> <input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="plastificado_at" id="ot-plastificado" data-input <?= $is_finalizada ? "disabled" : "" ?>>
<button class="btn btn-outline-danger btn-erase-date" type="button"><i class="ti-eraser ti"></i></button> <button class="btn btn-outline-danger btn-erase-date" type="button"><i class="ti-eraser ti"></i></button>
</div> </div>
<div class="form-text"><?= $user_dates["plastificado_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div> <div class="form-text"><?= $user_dates["plastificado_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div>
</div> </div>
</div>
<div class="col-md-3">
<!-- Progress --> <!-- Progress -->
<div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100"> <div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $flags["isPlakene"] ? "" : "d-none" ?>">
<h4><?= lang("Produccion.progress_manipulado") ?></h4> <label for="ot-plakene" class="form-label"><?= @lang("Produccion.plakene") ?></label>
<div class="input-group">
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="plakene_at" id="ot-plakene" data-input <?= $is_finalizada ? "disabled" : "" ?>>
<button class="btn btn-outline-danger btn-erase-date" type="button"><i class="ti-eraser ti"></i></button>
</div>
<div class="form-text"><?= $user_dates["plakene_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div>
</div>
<!-- Progress -->
<div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $flags["isRetractilado"] ? "" : "d-none" ?>">
<label for="ot-retractilado" class="form-label"><?= @lang("Produccion.retractilado") ?></label>
<div class="input-group">
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="retractilado_at" id="ot-retractilado" data-input <?= $is_finalizada ? "disabled" : "" ?>>
<button class="btn btn-outline-danger btn-erase-date" type="button"><i class="ti-eraser ti"></i></button>
</div>
<div class="form-text"><?= $user_dates["retractilado_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div>
</div>
<!-- Progress -->
<div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $flags["isUVI"] ? "" : "d-none" ?>">
<label for="ot-uvi" class="form-label"><?= @lang("Produccion.uvi") ?></label>
<div class="input-group">
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="uvi_at" id="ot-uvi" data-input <?= $is_finalizada ? "disabled" : "" ?>>
<button class="btn btn-outline-danger btn-erase-date" type="button"><i class="ti-eraser ti"></i></button>
</div>
<div class="form-text"><?= $user_dates["uvi_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div>
</div>
<!-- Progress -->
<div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $flags["isEstampado"] ? "" : "d-none" ?>">
<label for="ot-estampado" class="form-label"><?= @lang("Produccion.estampado") ?></label>
<div class="input-group">
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="estampado_at" id="ot-estampado" data-input <?= $is_finalizada ? "disabled" : "" ?>>
<button class="btn btn-outline-danger btn-erase-date" type="button"><i class="ti-eraser ti"></i></button>
</div>
<div class="form-text"><?= $user_dates["estampado_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div>
</div> </div>
<div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $presupuesto->cosido ? "" : "d-none" ?>"> <div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $presupuesto->cosido ? "" : "d-none" ?>">
<label for="ot-prep-cosido" class="form-label"><?= @lang("Produccion.cosido") ?></label> <label for="ot-prep-cosido" class="form-label"><?= @lang("Produccion.cosido") ?></label>
@ -187,35 +247,6 @@
</div> </div>
<div class="form-text"><?= $user_dates["solapa_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div> <div class="form-text"><?= $user_dates["solapa_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div>
</div> </div>
<!-- Progress -->
<div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $presupuesto->retractilado ? "" : "d-none" ?>">
<label for="ot-prep-retractilado" class="form-label"><?= @lang("Produccion.retractilado") ?></label>
<div class="input-group">
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="retractilado_at" id="ot-prep-retractilado" data-input <?= $is_finalizada ? "disabled" : "" ?>>
<button class="btn btn-outline-danger btn-erase-date" type="button"><i class="ti-eraser ti"></i></button>
</div>
<div class="form-text"><?= $user_dates["retractilado_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div>
</div>
<!-- Progress -->
<div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $presupuesto->retractilado5 ? "" : "d-none" ?>">
<label for="ot-prep-retractilado5" class="form-label"><?= @lang("Produccion.retractilado5") ?></label>
<div class="input-group">
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="retractilado5_at" id="ot-prep-retractilado5" data-input <?= $is_finalizada ? "disabled" : "" ?>>
<button class="btn btn-outline-danger btn-erase-date" type="button"><i class="ti-eraser ti"></i></button>
</div>
<div class="form-text"><?= $user_dates["retractilado5_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div>
</div>
<!-- Progress -->
<div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $presupuesto->prototipo ? "" : "d-none" ?>">
<label for="ot-prep-prototipo" class="form-label"><?= @lang("Produccion.prototipo") ?></label>
<div class="input-group">
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="prototipo_at" id="ot-prep-prototipo" data-input <?= $is_finalizada ? "disabled" : "" ?>>
<button class="btn btn-outline-danger btn-erase-date" type="button"><i class="ti-eraser ti"></i></button>
</div>
<div class="form-text"><?= $user_dates["prototipo_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div>
</div>
<!-- Progress --> <!-- Progress -->
<div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $presupuesto->marcapaginas ? "" : "d-none" ?>"> <div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $presupuesto->marcapaginas ? "" : "d-none" ?>">
@ -237,13 +268,23 @@
</div> </div>
<!-- Progress --> <!-- Progress -->
<div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= $flags["isEspiral"] ? "" : "d-none" ?>"> <div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= count($ot->tareas_manipulado()) > 0 ? "" : "d-none" ?>">
<label for="ot-espiral" class="form-label"><?= @lang("Produccion.espiral") ?></label> <label for="ot-manipulado" class="form-label"><?= @lang("Produccion.manipulado") ?></label>
<div class="input-group"> <div class="input-group">
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="espiral_at" id="ot-espiral" data-input <?= $is_finalizada ? "disabled" : "" ?>> <input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="entrada_manipulado_at" id="ot-manipulado" data-input <?= $is_finalizada ? "disabled" : "" ?>>
<button class="btn btn-outline-danger btn-erase-date" type="button"><i class="ti-eraser ti"></i></button> <button class="btn btn-outline-danger btn-erase-date" type="button"><i class="ti-eraser ti"></i></button>
</div> </div>
<div class="form-text"> <?= $user_dates["espiral_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div> <div class="form-text"> <?= $user_dates["entrada_manipulado_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div>
</div>
<!-- Progress -->
<div class="col-xs-12 col-md-4 col-lg-4 mb-2 w-100 <?= count($ot->tareas_encuadernado()) > 0 ? "" : "d-none" ?>">
<label for="ot-encuadernacion" class="form-label"><?= @lang("Produccion.encuadernacion") ?></label>
<div class="input-group">
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="encuadernacion_at" id="ot-encuadernacion" data-input <?= $is_finalizada ? "disabled" : "" ?>>
<button class="btn btn-outline-danger btn-erase-date" type="button"><i class="ti-eraser ti"></i></button>
</div>
<div class="form-text"> <?= $user_dates["encuadernacion_at"] ?? "<span class='ti-sm ti ti-alert-triangle me-1'></span>" ?></div>
</div> </div>
</div> </div>
@ -279,10 +320,12 @@
</div> </div>
<div class="row"> <div class="row">
<div class="row"> <div class="row">
<p><?= @lang("Produccion.tiempo_estimado") ?> : <?= $tiempo_estimado ?> (HH:MM)</p> <span><?= @lang("Produccion.tiempo_estimado") ?>(HH:MM)</span>
<span class="tiempo-estimado"> <?= $tiempo_estimado ?></span>
</div> </div>
<div class="row"> <div class="row">
<p><?= @lang("Produccion.tiempo_consumido") ?> :</p> <span><?= @lang("Produccion.tiempo_consumido") ?>(HH:MM)</span>
<span id="tiempo-total"></span>
</div> </div>
</div> </div>
<div class="row"> <div class="row">

View File

@ -12,7 +12,7 @@
<div id="accordionOtTasksTip" class="accordion-collapse collapse show" data-bs-parent="#accordionOtTasks"> <div id="accordionOtTasksTip" class="accordion-collapse collapse show" data-bs-parent="#accordionOtTasks">
<div class="accordion-body"> <div class="accordion-body">
<div class="card text-center"> <div class="card">
<div class="card-header"> <div class="card-header">
<div class="nav-align-top"> <div class="nav-align-top">
<ul class="nav nav-pills" role="tablist"> <ul class="nav nav-pills" role="tablist">

View File

@ -45,9 +45,17 @@
href="<?= "/produccion/ordentrabajo/pdf/" . $modelId ?>"> href="<?= "/produccion/ordentrabajo/pdf/" . $modelId ?>">
<span class="ti-sm ti ti-eye me-1"></span> <span class="ti-sm ti ti-eye me-1"></span>
<?= @lang("Produccion.preview_pdf") ?></a> <?= @lang("Produccion.preview_pdf") ?></a>
<?php if ($presupuesto->ferro): ?>
<a type="button" class="btn btn-primary btn-block mb-1" target="__blank"
href="<?= "/produccion/ordentrabajo/pdf/ferro/" . $modelId ?>">
<span class="ti-sm ti ti-download me-1"></span>
<?= @lang("Produccion.imprimir_ferro") ?></a>
<?php endif; ?>
<?php if ($presupuesto->prototipo): ?> <?php if ($presupuesto->prototipo): ?>
<button type="button" <a type="button" class="btn btn-primary btn-block mb-1" target="__blank"
class="btn btn-primary btn-block mb-1 beta"><?= @lang("Produccion.imprimir_ferro") ?></button> href="<?= "/produccion/ordentrabajo/pdf/prototipo/" . $modelId ?>">
<span class="ti-sm ti ti-download me-1"></span>
<?= @lang("Produccion.prototipo") ?></a>
<?php endif; ?> <?php endif; ?>
<a type="button" href="<?= route_to('getOrdenTrabajoBarCode', $modelId) ?>" <a type="button" href="<?= route_to('getOrdenTrabajoBarCode', $modelId) ?>"
class="btn btn-secondary btn-block mb-1" class="btn btn-secondary btn-block mb-1"

View File

@ -11,17 +11,30 @@
<div class="nav-tabs-shadow nav-align-top"> <div class="nav-tabs-shadow nav-align-top">
<ul class="nav nav-tabs" role="tablist"> <ul class="nav nav-tabs" role="tablist">
<li class="nav-item"> <li class="nav-item">
<button type="button" class="nav-link" role="tab" id="navs-top-align-finalizados-tab" data-bs-toggle="tab" data-bs-target="#navs-top-align-finalizados"><?= lang("Produccion.finalizadas") ?></button> <button type="button" class="nav-link" role="tab" id="navs-top-align-news-tab" data-bs-toggle="tab" data-bs-target="#navs-top-align-news"><?= lang("Produccion.navs.news") ?></button>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<button type="button" class="nav-link active" role="tab" id="navs-top-align-pendientes-tab" data-bs-toggle="tab" data-bs-target="#navs-top-align-pendientes"><?= lang("Produccion.pendientes") ?></button> <button type="button" class="nav-link active" role="tab" id="navs-top-align-pendientes-tab" data-bs-toggle="tab" data-bs-target="#navs-top-align-pendientes"><?= lang("Produccion.pendientes") ?></button>
</li> </li>
<li class="nav-item">
<button type="button" class="nav-link" role="tab" id="navs-top-align-waiting-tab" data-bs-toggle="tab" data-bs-target="#navs-top-align-waiting"><?= lang("Produccion.navs.waiting") ?></button>
</li>
<li class="nav-item"> <li class="nav-item">
<button type="button" class="nav-link" role="tab" id="navs-top-align-ferro-pendiente-tab" data-bs-toggle="tab" data-bs-target="#navs-top-align-ferro-pendiente"><?= lang("Produccion.pendiente_ferro") ?></button> <button type="button" class="nav-link" role="tab" id="navs-top-align-ferro-pendiente-tab" data-bs-toggle="tab" data-bs-target="#navs-top-align-ferro-pendiente"><?= lang("Produccion.pendiente_ferro") ?></button>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<button type="button" class="nav-link" role="tab" id="navs-top-align-ferro-ok-tab" data-bs-toggle="tab" data-bs-target="#navs-top-align-ferro-ok"><?= lang("Produccion.ferro_ok") ?></button> <button type="button" class="nav-link" role="tab" id="navs-top-align-ferro-ok-tab" data-bs-toggle="tab" data-bs-target="#navs-top-align-ferro-ok"><?= lang("Produccion.ferro_ok") ?></button>
</li> </li>
<li class="nav-item d-none">
<button type="button" class="nav-link" role="tab" id="navs-top-align-revision-com-tab" data-bs-toggle="tab" data-bs-target="#navs-top-align-revision-com"><?= lang("Produccion.navs.revision_com") ?></button>
</li>
<li class="nav-item">
<button type="button" class="nav-link" role="tab" id="navs-top-align-prod-tab" data-bs-toggle="tab" data-bs-target="#navs-top-align-prod"><?= lang("Produccion.navs.prod") ?></button>
</li>
<li class="nav-item">
<button type="button" class="nav-link" role="tab" id="navs-top-align-finalizados-tab" data-bs-toggle="tab" data-bs-target="#navs-top-align-finalizados"><?= lang("Produccion.finalizadas") ?></button>
</li>
</ul> </ul>
<div class="tab-content" id="ots-datatables-container"> <div class="tab-content" id="ots-datatables-container">
<div class="tab-pane fade show" id="navs-top-align-finalizados"> <div class="tab-pane fade show" id="navs-top-align-finalizados">
@ -36,6 +49,19 @@
<div class="tab-pane fade show" id="navs-top-align-ferro-ok"> <div class="tab-pane fade show" id="navs-top-align-ferro-ok">
<?= view("themes/vuexy/components/tables/ot_table.php", ["id" => "ot-datatable-ferro-ok"]) ?> <?= view("themes/vuexy/components/tables/ot_table.php", ["id" => "ot-datatable-ferro-ok"]) ?>
</div> </div>
<div class="tab-pane fade show" id="navs-top-align-news">
<?= view("themes/vuexy/components/tables/ot_table.php", ["id" => "ot-datatable-news"]) ?>
</div>
<div class="tab-pane fade show" id="navs-top-align-waiting">
<?= view("themes/vuexy/components/tables/ot_table.php", ["id" => "ot-datatable-waiting"]) ?>
</div>
<div class="tab-pane fade show" id="navs-top-align-revision-com">
<?= view("themes/vuexy/components/tables/ot_table.php", ["id" => "ot-datatable-revision-com"]) ?>
</div>
<div class="tab-pane fade show" id="navs-top-align-prod">
<?= view("themes/vuexy/components/tables/ot_table.php", ["id" => "ot-datatable-prod"]) ?>
</div>
</div> </div>
<!--//.card --> <!--//.card -->
</div> </div>

View File

@ -110,6 +110,17 @@ $picture = "/assets/img/default-user.png";
<i class="ti ti-menu-2 ti-sm"></i> <i class="ti ti-menu-2 ti-sm"></i>
</a> </a>
</div> </div>
<!-- CAMBIO DE USUARIO PARA MAQUINISTA -->
<?php if (auth()->user()->inGroup('maquina')): ?>
<div class="navbar-nav-left d-flex align-items-center" id="navbar-collapse">
<ul class="navbar-nav flex-row justify-content-start align-items-center ms-auto">
<li class="nav-item dropdown-shortcuts navbar-dropdown dropdown me-2 me-xl-0">
<a type="btn" href="<?= route_to('maquinistaUserChangeList') ?>" class="btn btn-outline-primary btn-sm w-100">Cambiar usuario</a>
</li>
</ul>
</div>
<?php endif; ?>
<div class="navbar-nav-right d-flex align-items-center" id="navbar-collapse"> <div class="navbar-nav-right d-flex align-items-center" id="navbar-collapse">
<ul class="navbar-nav flex-row align-items-center ms-auto"> <ul class="navbar-nav flex-row align-items-center ms-auto">

View File

@ -32,7 +32,7 @@
require "menus/maquinista_menu.php"; require "menus/maquinista_menu.php";
require "menus/importacion_menu.php"; require "menus/importadores_menu.php";
require "menus/catalogo_menu.php"; require "menus/catalogo_menu.php";

View File

@ -134,6 +134,13 @@ if (
</a> </a>
</li> </li>
<?php } ?> <?php } ?>
<?php if (auth()->user()->inGroup('admin')) { ?>
<li class="menu-item">
<a href="<?= route_to('festivosList') ?>" class="menu-link">
<div> <?= lang("App.menu_config_holidays") ?></div>
</a>
</li>
<?php } ?>
</ul> </ul>
</li> </li>
<?php } ?> <?php } ?>

View File

@ -1,15 +0,0 @@
<?php
/**
* MENU IMPORTACION
*/
if (auth()->user()->inGroup('beta')) {
?>
<!-- Import -->
<li class="menu-item">
<a href="<?= site_url("importacion/importar") ?>" class="menu-link beta">
<i class="menu-icon tf-icons ti ti-file-import"></i>
<div> <?= lang("App.menu_importacion") ?></div>
</a>
</li>
<?php } ?>

View File

@ -0,0 +1,34 @@
<?php
/**
* MENU IMPORTACION
*/
if (auth()->user()->can('importadores.menu')) {
?>
<!-- Importadores -->
<li class="menu-item">
<a href="javascript:void(0);" class="menu-link menu-toggle">
<i class="menu-icon tf-icons ti ti-file-import"></i>
<div><?= lang("App.menu_importadores") ?> </div>
</a>
<ul class="menu-sub">
<?php if (auth()->user()->can('importadores.catalogo')) { ?>
<li class="menu-item">
<a href="<?= route_to("importadorCatalogoTool") ?>" class="menu-link">
<?= lang("App.menu_importadores_catalogo") ?>
</a>
</li>
<?php } ?>
<?php if (auth()->user()->can('importadores.bubok')) { ?>
<li class="menu-item">
<a href="<?= route_to("importadorBubokTool") ?>" class="menu-link">
<?= lang("App.menu_importadores_bubok") ?>
</a>
</li>
<?php } ?>
</ul>
</li>
<?php } ?>

View File

@ -3,7 +3,7 @@
/** /**
* MAQUINISTA MENU * MAQUINISTA MENU
*/ */
if (auth()->user()->inGroup('maquina')) { if (auth()->user()->inGroup('maquina','admin')) {
?> ?>
<!-- Catalogue --> <!-- Catalogue -->
<li class="menu-item"> <li class="menu-item">

View File

@ -1,7 +1,7 @@
<table> <table>
<tr class="encuadernacion"> <tr class="encuadernacion">
<th >Encuadernacion</th> <th >Encuadernacion</th>
<th class="cell-50"></th> <th class="cell-50"><?=$presupuesto->solapas > 0 ? "Solapas" : ""?></th>
<th class="cell-50"></th> <th class="cell-50"></th>
<th class="cell-50"></th> <th class="cell-50"></th>
<th class="cell-50"></th> <th class="cell-50"></th>
@ -10,10 +10,13 @@
<th class="cell-50">Marcapáginas</th> <th class="cell-50">Marcapáginas</th>
</tr> </tr>
<?php if (count($encuadernaciones) > 0): ?> <?php if (count($encuadernaciones) > 0): ?>
<?php foreach ($encuadernaciones as $key => $value): ?>
<tr style="color: red;"> <tr style="color: red;">
<td><?= $value->tarifa()->nombre ?></td> <td><?= $encuadernacion->tarifa()->nombre ?></td>
<td></td> <?php if ($presupuesto->solapas > 0): ?>
<td><?= "SI ($presupuesto->solapas_ancho mm.)" ?></td>
<?php else: ?>
<td></td>
<?php endif; ?>
<td></td> <td></td>
<td></td> <td></td>
<td></td> <td></td>
@ -21,7 +24,6 @@
<td><?= $presupuesto->retractilado ? "SI" : "NO" ?></td> <td><?= $presupuesto->retractilado ? "SI" : "NO" ?></td>
<td><?= $presupuesto->marcapaginas ? "SI" : "NO" ?></td> <td><?= $presupuesto->marcapaginas ? "SI" : "NO" ?></td>
</tr> </tr>
<?php endforeach; ?>
<?php else: ?> <?php else: ?>
<tr style="color: red;"> <tr style="color: red;">
<td colspan="7">Sin encuadernación</td> <td colspan="7">Sin encuadernación</td>

View File

@ -1,30 +0,0 @@
<table>
<tr class="encuadernacion">
<th >Encuadernacion</th>
<th class="cell-50">Solapas</th>
<th class="cell-50"></th>
<th class="cell-50"></th>
<th class="cell-50"></th>
<th class="cell-50"></th>
<th class="cell-50">Retractilado</th>
<th class="cell-50">Marcapáginas</th>
</tr>
<?php if (count($encuadernaciones) > 0): ?>
<?php foreach ($encuadernaciones as $key => $value): ?>
<tr style="color: red;">
<td><?= $value->tarifa()->nombre ?></td>
<td><?= $presupuesto->solapas ? "SI ($presupuesto->solapas_ancho mm.)" : "NO" ?></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td><?= $presupuesto->retractilado ? "SI" : "NO" ?></td>
<td><?= $presupuesto->marcapaginas ? "SI" : "NO" ?></td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<tr style="color: red;">
<td colspan="7">Sin encuadernación</td>
</tr>
<?php endif; ?>
</table>

View File

@ -9,17 +9,15 @@
<th class="cell-50">Retractilado</th> <th class="cell-50">Retractilado</th>
</tr> </tr>
<?php if (count($encuadernaciones) > 0): ?> <?php if (count($encuadernaciones) > 0): ?>
<?php foreach ($encuadernaciones as $key => $value): ?>
<tr style="color: red;"> <tr style="color: red;">
<td><?= $value->tarifa()->nombre ?></td> <td><?= $encuadernacion->tarifa()->nombre ?></td>
<td></td> <td>Plástico</td>
<td></td>
<td></td>
<td></td>
<td></td> <td></td>
<td><?= $flags['isPlakene'] ? "SI" : "NO" ?></td>
<td><?= $plakene_tipo ?? "" ?></td>
<td><?= $encuadernacion->proveedor() ? $encuadernacion->proveedor()->nombre : "" ?></td>
<td><?= $presupuesto->retractilado ? "SI" : "NO" ?></td> <td><?= $presupuesto->retractilado ? "SI" : "NO" ?></td>
</tr> </tr>
<?php endforeach; ?>
<?php else: ?> <?php else: ?>
<tr style="color: red;"> <tr style="color: red;">
<td colspan="7">Sin encuadernación</td> <td colspan="7">Sin encuadernación</td>

View File

@ -3,25 +3,27 @@
<th>Encuadernacion</th> <th>Encuadernacion</th>
<th class="cell-50">Pliegos</th> <th class="cell-50">Pliegos</th>
<th class="cell-50">Pliegos</th> <th class="cell-50">Pliegos</th>
<th class="cell-50"></th> <th class="cell-50"><?=$presupuesto->solapas > 0 ? "Solapas" : ""?></th>
<th class="cell-50">Sobrecubierta</th> <th class="cell-50">Sobrecubierta</th>
<th class="cell-50">Guardas</th> <th class="cell-50">Guardas</th>
<th class="cell-50">Retractilado</th> <th class="cell-50">Retractilado</th>
<th class="cell-50">Marcapáginas</th> <th class="cell-50">Marcapáginas</th>
</tr> </tr>
<?php if (count($encuadernaciones) > 0): ?> <?php if (count($encuadernaciones) > 0): ?>
<?php foreach ($encuadernaciones as $key => $value): ?>
<tr style="color: red;"> <tr style="color: red;">
<td><?= $value->tarifa()->nombre ?></td> <td><?= $encuadernacion->tarifa()->nombre ?></td>
<td><?=$tareaCosido->pliego_1." de ".$tareaCosido->pliego_1_total?></td> <td><?= $tareaCosido->pliego_1 . " de " . $tareaCosido->pliego_1_total ?></td>
<td><?=$tareaCosido->pliego_2." de ".$tareaCosido->pliego_2_total?></td> <td><?= $tareaCosido->pliego_2 . " de " . $tareaCosido->pliego_2_total ?></td>
<td></td> <?php if ($presupuesto->solapas > 0): ?>
<td><?= "SI ($presupuesto->solapas_ancho mm.)" ?></td>
<?php else: ?>
<td>NO</td>
<?php endif; ?>
<td><?= $presupuesto->hasSobrecubierta() ? "SI" : "NO" ?></td> <td><?= $presupuesto->hasSobrecubierta() ? "SI" : "NO" ?></td>
<td><?= $presupuesto->guardas ? "SI" : "NO" ?></td> <td><?= $presupuesto->guardas ? "SI" : "NO" ?></td>
<td><?= $presupuesto->retractilado ? "SI" : "NO" ?></td> <td><?= $presupuesto->retractilado ? "SI" : "NO" ?></td>
<td><?= $presupuesto->marcapaginas ? "SI" : "NO" ?></td> <td><?= $presupuesto->marcapaginas ? "SI" : "NO" ?></td>
</tr> </tr>
<?php endforeach; ?>
<?php else: ?> <?php else: ?>
<tr style="color: red;"> <tr style="color: red;">
<td colspan="7">Sin encuadernación</td> <td colspan="7">Sin encuadernación</td>

View File

@ -1,30 +0,0 @@
<table>
<tr class="encuadernacion">
<th>Encuadernacion</th>
<th class="cell-50">Pliegos</th>
<th class="cell-50">Pliegos</th>
<th class="cell-50">Solapas</th>
<th class="cell-50">Sobrecubierta</th>
<th class="cell-50">Guardas</th>
<th class="cell-50">Retractilado</th>
<th class="cell-50">Marcapáginas</th>
</tr>
<?php if (count($encuadernaciones) > 0): ?>
<?php foreach ($encuadernaciones as $key => $value): ?>
<tr style="color: red;">
<td><?= $value->tarifa()->nombre ?></td>
<td><?=$tareaCosido->pliego_1." de ".$tareaCosido->pliego_1_total?></td>
<td><?=$tareaCosido->pliego_2." de ".$tareaCosido->pliego_2_total?></td>
<td><?= $presupuesto->solapas ? "SI ($presupuesto->solapas_ancho mm.)" : "NO" ?></td>
<td><?= $presupuesto->hasSobrecubierta() ? "SI" : "NO" ?></td>
<td><?= $presupuesto->guardas ? "SI" : "NO" ?></td>
<td><?= $presupuesto->retractilado ? "SI" : "NO" ?></td>
<td><?= $presupuesto->marcapaginas ? "SI" : "NO" ?></td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<tr style="color: red;">
<td colspan="7">Sin encuadernación</td>
</tr>
<?php endif; ?>
</table>

Some files were not shown because too many files have changed in this diff Show More