This commit is contained in:
amazuecos
2024-12-15 16:07:54 +01:00
parent 71157bfda5
commit d5719b70a1
31 changed files with 970 additions and 502 deletions

View File

@ -80,5 +80,6 @@ class Filters extends BaseConfig
/*'jwt' => [ /*'jwt' => [
'before' => ['api', 'api/*'] 'before' => ['api', 'api/*']
],*/ ],*/
]; ];
} }

View File

@ -9,18 +9,18 @@ const SK_PERMISSION_MATRIX = [
"plantilla-tarifa.edit", "plantilla-tarifa.edit",
"plantilla-tarifa.delete", "plantilla-tarifa.delete",
"plantilla-tarifa.menu", "plantilla-tarifa.menu",
"perfil.create",
"perfil.edit",
"perfil.delete",
"perfil.menu",
"presupuesto.create", "presupuesto.create",
"presupuesto.edit", "presupuesto.edit",
"presupuesto.delete", "presupuesto.delete",
"presupuesto.menu", "presupuesto.menu",
"presupuesto-cliente.create", "pedidos-activos.view",
"presupuesto-cliente.edit", "pedidos-activos.menu",
"presupuesto-cliente.delete", "pedidos-finalizados.view",
"presupuesto-cliente.menu", "pedidos-finalizados.menu",
"pedidos-cancelados.view",
"pedidos-cancelados.menu",
"pedidos-todos.view",
"pedidos-todos.menu",
"tarifa-preimpresion.create", "tarifa-preimpresion.create",
"tarifa-preimpresion.edit", "tarifa-preimpresion.edit",
"tarifa-preimpresion.delete", "tarifa-preimpresion.delete",
@ -41,10 +41,6 @@ const SK_PERMISSION_MATRIX = [
"tarifa-envio.edit", "tarifa-envio.edit",
"tarifa-envio.delete", "tarifa-envio.delete",
"tarifa-envio.menu", "tarifa-envio.menu",
"tarifa-extra.create",
"tarifa-extra.edit",
"tarifa-extra.delete",
"tarifa-extra.menu",
"proveedores.create", "proveedores.create",
"proveedores.edit", "proveedores.edit",
"proveedores.delete", "proveedores.delete",
@ -61,10 +57,6 @@ const SK_PERMISSION_MATRIX = [
"paises.edit", "paises.edit",
"paises.delete", "paises.delete",
"paises.menu", "paises.menu",
"formas-pago.create",
"formas-pago.edit",
"formas-pago.delete",
"formas-pago.menu",
"maquinas.create", "maquinas.create",
"maquinas.edit", "maquinas.edit",
"maquinas.delete", "maquinas.delete",
@ -89,36 +81,12 @@ const SK_PERMISSION_MATRIX = [
"roles-permisos.edit", "roles-permisos.edit",
"roles-permisos.delete", "roles-permisos.delete",
"roles-permisos.menu", "roles-permisos.menu",
"ubicaciones.create",
"ubicaciones.edit",
"ubicaciones.delete",
"ubicaciones.menu",
"series-facturas.create",
"series-facturas.edit",
"series-facturas.delete",
"series-facturas.menu",
], ],
"cliente-admin" => [ "cliente-admin" => [
"perfil.edit", "pedidos-activos.view",
"perfil.menu", "pedidos-activos.menu",
"direcciones.create",
"direcciones.edit",
"direcciones.delete",
"direcciones.menu",
"presupuesto-cliente.create",
"presupuesto-cliente.edit",
"presupuesto-cliente.delete",
"presupuesto-cliente.menu",
], ],
"cliente-editor" => [ "cliente-editor" => [
"perfil.create",
"perfil.edit",
"perfil.delete",
"perfil.menu",
"direcciones.create",
"direcciones.edit",
"direcciones.delete",
"direcciones.menu",
"presupuesto-cliente.create", "presupuesto-cliente.create",
"presupuesto-cliente.edit", "presupuesto-cliente.edit",
"presupuesto-cliente.delete", "presupuesto-cliente.delete",
@ -129,8 +97,15 @@ const SK_PERMISSION_MATRIX = [
"token.menu", "token.menu",
], ],
"produccion" => [ "produccion" => [
"token.token", "clientes.create",
"token.menu", "clientes.edit",
"clientes.menu",
"direcciones.create",
"direcciones.edit",
"direcciones.menu",
"presupuesto.create",
"presupuesto.edit",
"presupuesto.menu",
], ],
"maquina" => [ "maquina" => [
"token.token", "token.token",
@ -163,18 +138,18 @@ const SK_PERMISSION_MATRIX = [
"plantilla-tarifa.edit", "plantilla-tarifa.edit",
"plantilla-tarifa.delete", "plantilla-tarifa.delete",
"plantilla-tarifa.menu", "plantilla-tarifa.menu",
"perfil.create",
"perfil.edit",
"perfil.delete",
"perfil.menu",
"presupuesto.create", "presupuesto.create",
"presupuesto.edit", "presupuesto.edit",
"presupuesto.delete", "presupuesto.delete",
"presupuesto.menu", "presupuesto.menu",
"presupuesto-cliente.create", "pedidos-activos.view",
"presupuesto-cliente.edit", "pedidos-activos.menu",
"presupuesto-cliente.delete", "pedidos-finalizados.view",
"presupuesto-cliente.menu", "pedidos-finalizados.menu",
"pedidos-cancelados.view",
"pedidos-cancelados.menu",
"pedidos-todos.view",
"pedidos-todos.menu",
"tarifa-preimpresion.create", "tarifa-preimpresion.create",
"tarifa-preimpresion.edit", "tarifa-preimpresion.edit",
"tarifa-preimpresion.delete", "tarifa-preimpresion.delete",
@ -195,10 +170,6 @@ const SK_PERMISSION_MATRIX = [
"tarifa-envio.edit", "tarifa-envio.edit",
"tarifa-envio.delete", "tarifa-envio.delete",
"tarifa-envio.menu", "tarifa-envio.menu",
"tarifa-extra.create",
"tarifa-extra.edit",
"tarifa-extra.delete",
"tarifa-extra.menu",
"proveedores.create", "proveedores.create",
"proveedores.edit", "proveedores.edit",
"proveedores.delete", "proveedores.delete",
@ -239,13 +210,5 @@ const SK_PERMISSION_MATRIX = [
"roles-permisos.edit", "roles-permisos.edit",
"roles-permisos.delete", "roles-permisos.delete",
"roles-permisos.menu", "roles-permisos.menu",
"ubicaciones.create",
"ubicaciones.edit",
"ubicaciones.delete",
"ubicaciones.menu",
"series-facturas.create",
"series-facturas.edit",
"series-facturas.delete",
"series-facturas.menu",
], ],
]; ];

View File

@ -9,10 +9,6 @@ const SK_PERMISSIONS = [
'plantilla-tarifa.edit' => 'Can edit', 'plantilla-tarifa.edit' => 'Can edit',
'plantilla-tarifa.delete' => 'Can delete', 'plantilla-tarifa.delete' => 'Can delete',
'plantilla-tarifa.menu' => 'Menu shall be visualize', 'plantilla-tarifa.menu' => 'Menu shall be visualize',
'perfil.create' => 'Can create',
'perfil.edit' => 'Can edit',
'perfil.delete' => 'Can delete',
'perfil.menu' => 'Menu shall be visualize',
'direcciones.create' => 'Can create', 'direcciones.create' => 'Can create',
'direcciones.edit' => 'Can edit', 'direcciones.edit' => 'Can edit',
'direcciones.delete' => 'Can delete', 'direcciones.delete' => 'Can delete',
@ -21,10 +17,14 @@ const SK_PERMISSIONS = [
'presupuesto.edit' => 'Can edit', 'presupuesto.edit' => 'Can edit',
'presupuesto.delete' => 'Can delete', 'presupuesto.delete' => 'Can delete',
'presupuesto.menu' => 'Menu shall be visualize', 'presupuesto.menu' => 'Menu shall be visualize',
'presupuesto-cliente.create' => 'Can create', 'pedidos-activos.view' => 'Can view',
'presupuesto-cliente.edit' => 'Can edit', 'pedidos-activos.menu' => 'Menu shall be visualize',
'presupuesto-cliente.delete' => 'Can delete', 'pedidos-finalizados.view' => 'Can view',
'presupuesto-cliente.menu' => 'Menu shall be visualize', 'pedidos-finalizados.menu' => 'Menu shall be visualize',
'pedidos-cancelados.view' => 'Can view',
'pedidos-cancelados.menu' => 'Menu shall be visualize',
'pedidos-todos.view' => 'Can view',
'pedidos-todos.menu' => 'Menu shall be visualize',
'tarifa-preimpresion.create' => 'Can create', 'tarifa-preimpresion.create' => 'Can create',
'tarifa-preimpresion.edit' => 'Can edit', 'tarifa-preimpresion.edit' => 'Can edit',
'tarifa-preimpresion.delete' => 'Can delete', 'tarifa-preimpresion.delete' => 'Can delete',
@ -45,10 +45,6 @@ const SK_PERMISSIONS = [
'tarifa-envio.edit' => 'Can edit', 'tarifa-envio.edit' => 'Can edit',
'tarifa-envio.delete' => 'Can delete', 'tarifa-envio.delete' => 'Can delete',
'tarifa-envio.menu' => 'Menu shall be visualize', 'tarifa-envio.menu' => 'Menu shall be visualize',
'tarifa-extra.create' => 'Can create',
'tarifa-extra.edit' => 'Can edit',
'tarifa-extra.delete' => 'Can delete',
'tarifa-extra.menu' => 'Menu shall be visualize',
'proveedores.create' => 'Can create', 'proveedores.create' => 'Can create',
'proveedores.edit' => 'Can edit', 'proveedores.edit' => 'Can edit',
'proveedores.delete' => 'Can delete', 'proveedores.delete' => 'Can delete',
@ -65,10 +61,6 @@ const SK_PERMISSIONS = [
'paises.edit' => 'Can edit', 'paises.edit' => 'Can edit',
'paises.delete' => 'Can delete', 'paises.delete' => 'Can delete',
'paises.menu' => 'Menu shall be visualize', 'paises.menu' => 'Menu shall be visualize',
'formas-pago.create' => 'Can create',
'formas-pago.edit' => 'Can edit',
'formas-pago.delete' => 'Can delete',
'formas-pago.menu' => 'Menu shall be visualize',
'maquinas.create' => 'Can create', 'maquinas.create' => 'Can create',
'maquinas.edit' => 'Can edit', 'maquinas.edit' => 'Can edit',
'maquinas.delete' => 'Can delete', 'maquinas.delete' => 'Can delete',
@ -93,12 +85,4 @@ const SK_PERMISSIONS = [
'roles-permisos.edit' => 'Can edit', 'roles-permisos.edit' => 'Can edit',
'roles-permisos.delete' => 'Can delete', 'roles-permisos.delete' => 'Can delete',
'roles-permisos.menu' => 'Menu shall be visualize', 'roles-permisos.menu' => 'Menu shall be visualize',
'ubicaciones.create' => 'Can create',
'ubicaciones.edit' => 'Can edit',
'ubicaciones.delete' => 'Can delete',
'ubicaciones.menu' => 'Menu shall be visualize',
'series-facturas.create' => 'Can create',
'series-facturas.edit' => 'Can edit',
'series-facturas.delete' => 'Can delete',
'series-facturas.menu' => 'Menu shall be visualize',
]; ];

View File

@ -654,6 +654,8 @@ $routes->group('pedidos', ['namespace' => 'App\Controllers\Pedidos'], function (
$routes->post('cambiarestado', 'Pedido::cambiarEstado', ['as' => 'cambiarEstadoPedido']); $routes->post('cambiarestado', 'Pedido::cambiarEstado', ['as' => 'cambiarEstadoPedido']);
$routes->post('update/(:any)', 'Pedido::update/$1', ['as' => 'actualizarPedido']); $routes->post('update/(:any)', 'Pedido::update/$1', ['as' => 'actualizarPedido']);
$routes->get('xml/(:num)', 'Pedido::get_xml_pedido/$1', ['as' => 'getXMLPedido']); $routes->get('xml/(:num)', 'Pedido::get_xml_pedido/$1', ['as' => 'getXMLPedido']);
$routes->get('produccion/(:num)', 'Pedido::to_produccion/$1', ['as' => 'toProduccion']);
}); });
$routes->resource('pedidos', ['namespace' => 'App\Controllers\Pedidos', 'controller' => 'Pedido', 'except' => 'show,new,create,update']); $routes->resource('pedidos', ['namespace' => 'App\Controllers\Pedidos', 'controller' => 'Pedido', 'except' => 'show,new,create,update']);
@ -839,6 +841,8 @@ $routes->group('produccion', ['namespace' => 'App\Controllers\Produccion'], func
$routes->group('ordentrabajo', ['namespace' => 'App\Controllers\Produccion'], function ($routes) { $routes->group('ordentrabajo', ['namespace' => 'App\Controllers\Produccion'], function ($routes) {
$routes->get('', 'Ordentrabajo::index', ['as' => 'viewOrdenTrabajoIndex']); $routes->get('', 'Ordentrabajo::index', ['as' => 'viewOrdenTrabajoIndex']);
$routes->get('edit/$1', 'Ordentrabajo::edit/$1', ['as' => 'viewOrdenTrabajoEdit']); $routes->get('edit/$1', 'Ordentrabajo::edit/$1', ['as' => 'viewOrdenTrabajoEdit']);
$routes->get('datatable', 'Ordentrabajo::datatable', ['as' => 'datatableOrdenTrabajo']);
}); });
}); });

View File

@ -4,7 +4,7 @@ namespace Config;
use App\Services\FTPService; use App\Services\FTPService;
use CodeIgniter\Config\BaseService; use CodeIgniter\Config\BaseService;
use App\Services\ProductionService;
/** /**
* Services Configuration file. * Services Configuration file.
* *
@ -30,4 +30,7 @@ class Services extends BaseService
* return new \CodeIgniter\Example(); * return new \CodeIgniter\Example();
* } * }
*/ */
public static function production(){
return new ProductionService();
}
} }

View File

@ -6,6 +6,7 @@ use App\Entities\Pedidos\PedidoEntity;
use App\Models\Collection; use App\Models\Collection;
use App\Models\Pedidos\PedidoModel; use App\Models\Pedidos\PedidoModel;
use App\Services\PedidoXMLService; use App\Services\PedidoXMLService;
use App\Services\ProductionService;
class Pedido extends \App\Controllers\BaseResourceController class Pedido extends \App\Controllers\BaseResourceController
{ {
@ -389,8 +390,13 @@ class Pedido extends \App\Controllers\BaseResourceController
return $this->respond($data); return $this->respond($data);
} }
public function pedidoToProduction(int $pedido_id){ public function to_produccion($pedido_id)
{
$serviceProduction = service('production');
$pedido = $this->model->find($pedido_id);
$serviceProduction->setPedido($pedido);
return $this->respond()->setJSON($serviceProduction->createOrdenTrabajo());
} }
} }

View File

@ -2,8 +2,10 @@
namespace App\Controllers\Produccion; namespace App\Controllers\Produccion;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Models\OrdenTrabajo\OrdenTrabajoModel;
use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface; use CodeIgniter\HTTP\ResponseInterface;
use Hermawan\DataTables\DataTable;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
class Ordentrabajo extends BaseController class Ordentrabajo extends BaseController
@ -11,7 +13,7 @@ class Ordentrabajo extends BaseController
protected $format = 'json'; protected $format = 'json';
protected array $viewData = []; protected array $viewData = [];
protected OrdenTrabajoModel $otModel;
protected static $viewPath = 'themes/vuexy/form/produccion/'; protected static $viewPath = 'themes/vuexy/form/produccion/';
protected static $controllerSlug = "orden-trabajo"; protected static $controllerSlug = "orden-trabajo";
protected $indexRoute = 'viewOrdenTrabajoList'; protected $indexRoute = 'viewOrdenTrabajoList';
@ -19,6 +21,7 @@ class Ordentrabajo extends BaseController
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{ {
$this->otModel = model(OrdenTrabajoModel::class);
parent::initController($request, $response, $logger); parent::initController($request, $response, $logger);
} }
@ -52,19 +55,13 @@ class Ordentrabajo extends BaseController
return view(static::$viewPath . $this->editRoute, $this->viewData); return view(static::$viewPath . $this->editRoute, $this->viewData);
} }
public function cien() public function datatable(){
{
echo 'Orden trabajo 100%';
}
public function finalizado() $q = $this->otModel->getDatatableQuery();
{ // return $this->response->setJSON($q->get()->getResultArray());
echo 'Orden trabajo finalizado'; return DataTable::of($q)
} ->add("action" ,fn($q) => $q->id)
->toJson(true);
public function pendiente()
{
echo 'Orden trabajo pendiente';
} }
} }

View File

@ -15,256 +15,57 @@ class OrdenTrabajoTable extends Migration
], ],
"pedido_id" => [ "pedido_id" => [
"type" => "INT", "type" => "INT",
"constraint" => 10, "unsigned" => true,
"comment" => "Pedido asociado", "constraint" => 16,
"comment" => "Pedido original asociado",
], ],
"user_created_id" => [ "user_created_id" => [
"type" => "INT", "type" => "INT",
"unsigned" => true,
"constraint" => 10, "constraint" => 10,
"comment" => "Usuario que ha pasado el pedido a producción", "comment" => "Usuario que ha pasado el pedido a producción",
], ],
"user_update_id" => [
"user_updated_id" => [
"type" => "INT", "type" => "INT",
"unsigned" => true,
"constraint" => 10, "constraint" => 10,
"comment" => "Usuario que ha actualizado la orden de trabajo", "comment" => "Usuario que ha actualizado la orden de trabajo",
], ],
"maquina_orden_negro_id" => [ "total_tirada" => [
"type" => "INT",
"constraint" => 10,
"null" => true,
"comment" => "Maquina para impresion en negro",
],
"maquina_orden_color_id" => [
"type" => "INT",
"constraint" => 10,
"null" => true,
"comment" => "Maquina para impresion en color",
],
"maquina_orden_portada_id" => [
"type" => "INT",
"constraint" => 10,
"null" => true,
"comment" => "Maquina para impresion portada",
],
"maquina_orden_cubierta_id" => [
"type" => "INT",
"constraint" => 10,
"null" => true,
"comment" => "Maquina para impresion cubierta",
],
"negro_forma_id" => [
"type" => "INT",
"constraint" => 10,
"null" => true
],
"color_forma_id" => [
"type" => "INT",
"constraint" => 10,
"null" => true
],
"portada_forma_id" => [
"type" => "INT",
"constraint" => 10,
"null" => true
],
"cubierta_forma_id" => [
"type" => "INT",
"constraint" => 10,
"null" => true
],
"tirada" => [
"type" => "DOUBLE",
],
"negro_pliegos_pedido" => [
"type" => "DOUBLE", "type" => "DOUBLE",
"null" => true "null" => true
], ],
"color_pliegos_pedido" => [ "total_precio" => [
"type" => "DOUBLE", "type" => "DOUBLE",
"null" => true "null" => true
], ],
"portada_pliegos_pedido" => [
"type" => "DOUBLE",
"null" => true
],
"cubierta_pliegos_pedido" => [
"type" => "DOUBLE",
"null" => true
],
"negro_clicks_pedido" => [
"type" => "DOUBLE",
],
"color_clicks_pedido" => [
"type" => "DOUBLE",
],
"portada_clicks_pedido" => [
"type" => "DOUBLE",
],
"cubierta_clicks_pedido" => [
"type" => "DOUBLE",
],
"pliegos1" => [
"type" => "INT",
"constraint" => 11,
],
"paginas1" => [
"type" => "INT",
"constraint" => 11,
],
"pliegos2" => [
"type" => "INT",
"constraint" => 11,
],
"paginas2" => [
"type" => "INT",
"constraint" => 11,
],
"negro_proveedor_nombre" => [
"type" => "VARCHAR",
"constraint" => 225
],
"color_proveedor_nombre" => [
"type" => "VARCHAR",
"constraint" => 225
],
"portada_proveedor_nombre" => [
"type" => "VARCHAR",
"constraint" => 225
],
"corte_pie" => [
"type" => "DOUBLE",
],
"lomo" => [
"type" => "INT",
"constraint" => 11,
"null" => true,
],
"tipo_entrada" => [ "tipo_entrada" => [
"type" => "ENUM", "type" => "ENUM",
"constraint" => ["in", "out"], "constraint" => ["in", "out"],
"default" => "out" "default" => "out",
"comment" => "Tipo de entrada"
], ],
"fecha_entrega_real_warning" => [
"type" => "BOOLEAN",
"default" => false,
],
"fecha_entrega_warning" => [
"type" => "BOOLEAN",
"default" => false
],
"fecha_entrega_warning_revised" => [
"type" => "BOOLEAN",
"default" => false
],
"ferro_disponible" => [
"type" => "TINYINT",
"constraint" => 4,
],
"ferro_disponible_thread_id" => [
"type" => "INT",
"constraint" => 10,
],
"ferro_cp" => [
"type" => "VARCHAR",
"constraint" => 10,
"null" => true
],
"ferro_proveedor" => [
"type" => "INT",
"unsigned" => true,
"constraint" => 10,
],
"ferro_tracking" => [
"type" => "VARCHAR",
"constraint" => 100,
"null" => true,
],
"pre_formato" => [
"type" => "BOOLEAN",
"default" => false
],
"pre_lomo" => [
"type" => "BOOLEAN",
"default" => 0,
],
"pre_solapa" => [
"type" => "BOOLEAN",
"default" => 0,
],
"pre_isbn" => [
"type" => "BOOLEAN",
"default" => 0,
],
"pre_codbarras" => [
"type" => "BOOLEAN",
"default" => 0,
],
"pre_imposicion" => [
"type" => "BOOLEAN",
"default" => 0,
],
"pre_imprimir" => [
"type" => "BOOLEAN",
"default" => 0,
],
"pre_faltan_materiales" => [
"type" => "BOOLEAN",
"default" => 0,
],
"pre_faltan_materiales_note" => [
"type" => "TEXT",
"null" => true,
],
"progreso" => [ "progreso" => [
"type" => "DOUBLE", "type" => "DOUBLE",
"default" => 0.00, "default" => 0.00,
"comment" => "Progreso de 0 a 100"
], ],
"message_production_send" => [
"type" => "BOOLEAN", "estado" => [
"default" => 0, "type" => "ENUM",
], "constraint" => ["I","F","P","E"],
"finalizado" => [ "default" => "I",
"type" => "BOOLEAN", "comment" => "I => INICIADO, F => FINALIZADO, P => PROGRESO , E => ERROR"
"default" => 0,
], ],
"comentarios" => [ "comentarios" => [
"type" => "TEXT", "type" => "TEXT",
"null" => true, "null" => true,
"default" => null,
"comment" => "Comentarios orden de trabajo"
] ]
]; ];
public function up() public function up()
@ -289,10 +90,10 @@ class OrdenTrabajoTable extends Migration
], ],
]); ]);
$this->forge->addPrimaryKey("id"); $this->forge->addPrimaryKey("id");
// $this->forge->addForeignKey(["maquina_orden_portada_id"],"lg_maquinas",["id"]); $this->forge->addForeignKey("pedido_id","pedidos","id");
// $this->forge->addForeignKey(["maquina_orden_negro_id"],"lg_maquinas",["id"]); $this->forge->addForeignKey("user_created_id","users","id");
// $this->forge->addForeignKey(["maquina_orden_cubierta_id"],"lg_maquinas",["id"]); $this->forge->addForeignKey("user_updated_id","users","id");
// $this->forge->addForeignKey(["maquina_orden_color_id"],"lg_maquinas",["id"]);
$this->forge->createTable("ordenes_trabajo", true); $this->forge->createTable("ordenes_trabajo", true);
} }

View File

@ -11,17 +11,60 @@ class OrdenTrabajoTareasTable extends Migration
"id" => [ "id" => [
"type" => "INT", "type" => "INT",
"unsigned" => true, "unsigned" => true,
"autoincrement" => true "auto_increment" => true
],
"tarea_servicio_id" => [
"type" => "INT",
"unsigned" => true,
], ],
"orden_trabajo_id" => [ "orden_trabajo_id" => [
"type" => "INT", "type" => "INT",
"unsigned" => true, "unsigned" => true,
"constraint" => 10,
"comment" => "Orden de trabajo a la que pertenece esta tarea",
], ],
"presupuesto_linea_id" => [
"type" => "INT",
"unsigned" => true,
"constraint" => 10,
"null" => true,
"comment" => "Presupuesto linea asociada a esta tarea. Puede ser NULL porque se podría añadir una tarea manual",
],
"nombre" => [
"type" => "VARCHAR",
"constraint" => 255,
"comment" => "Nombre de la tarea",
],
"orden" => [
"type" => "INT",
"unsigned" => true,
"comment" => "Orden de ejecución del tarea. Por defecto el orden será la de la máquina asociada a la línea de presupuesto."
],
"maquina_id" =>
[
"type" => "INT",
"unsigned" => true,
"constraint" => 10,
"null" => true,
"comment" => "Máquina asociada a la tarea. Por defecto será la asociada a la linea de presupuesto"
],
"imposicion_id" => [
"type" => "INT",
"null" => true,
"constraint" => 11,
"default" => null,
"comment" => "Imposicion aplicada a la tarea. Default null"
],
"tiempo_estimado" => [
"type" => "DOUBLE",
"default" => 0.00,
"null" => true,
"comment" => "Tiempo ejecución estimado de la tarea en minutos",
],
"tiempo_real" => [
"type" => "DOUBLE",
"default" => 0.00,
"null" => true,
"comment" => "Tiempo ejecución real de la tarea",
]
]; ];
public function up() public function up()
{ {
@ -43,14 +86,17 @@ class OrdenTrabajoTareasTable extends Migration
"null" => true, "null" => true,
], ],
]); ]);
// $this->forge->addPrimaryKey("id"); $this->forge->addPrimaryKey("id");
// $this->forge->addForeignKey("orden_trabajo_id","ordenes_trabajo","id"); $this->forge->addForeignKey("orden_trabajo_id","ordenes_trabajo","id","CASCADE","CASCADE");
// $this->forge->addForeignKey("tarea_servicio_id","tareas_servicio","id"); $this->forge->addForeignKey("presupuesto_linea_id","presupuesto_linea","id");
$this->forge->createTable("orden_trabajo_tareas", true); $this->forge->addForeignKey("imposicion_id","lg_imposiciones","id");
$this->forge->addForeignKey("maquina_id","lg_maquinas","id");
$this->forge->createTable("orden_trabajo_tareas");
} }
public function down() public function down()
{ {
$this->forge->dropTable("orden_trabajo_tareas"); $this->forge->dropTable("orden_trabajo_tareas",true);
} }
} }

View File

@ -8,6 +8,10 @@ use CodeIgniter\Database\RawSql;
class OrdenTrabajoDatesTable extends Migration class OrdenTrabajoDatesTable extends Migration
{ {
protected array $COLUMNS = [ protected array $COLUMNS = [
"orden_trabajo_id" => [
"type" => "INT",
"unsigned" => true,
],
"fecha_entrada_at" => [ "fecha_entrada_at" => [
"type" => "DATETIME", "type" => "DATETIME",
"null" => true, "null" => true,
@ -33,11 +37,11 @@ class OrdenTrabajoDatesTable extends Migration
"type" => "DATE", "type" => "DATE",
"null" => true, "null" => true,
], ],
"fecha_encuardernado_at" => [ "fecha_encuadernado_at" => [
"type" => "DATE", "type" => "DATE",
"null" => true, "null" => true,
], ],
"fecha_externo_at" => [ "fecha_entrega_externo" => [
"type" => "DATE", "type" => "DATE",
"null" => true, "null" => true,
], ],
@ -161,6 +165,8 @@ class OrdenTrabajoDatesTable extends Migration
"null" => true, "null" => true,
], ],
]); ]);
$this->forge->addPrimaryKey('orden_trabajo_id');
$this->forge->addForeignKey("orden_trabajo_id","ordenes_trabajo","id","CASCADE","CASCADE");
$this->forge->createTable("orden_trabajo_dates", true); $this->forge->createTable("orden_trabajo_dates", true);
} }

View File

@ -1,6 +1,11 @@
<?php <?php
namespace App\Entities\Pedidos; namespace App\Entities\Pedidos;
use App\Entities\Presupuestos\PresupuestoEntity;
use App\Entities\Produccion\OrdenTrabajoEntity;
use App\Models\OrdenTrabajo\OrdenTrabajoModel;
use App\Models\Pedidos\PedidoLineaModel;
use App\Models\Presupuestos\PresupuestoModel;
use CodeIgniter\Entity; use CodeIgniter\Entity;
class PedidoEntity extends \CodeIgniter\Entity\Entity class PedidoEntity extends \CodeIgniter\Entity\Entity
@ -27,4 +32,35 @@ class PedidoEntity extends \CodeIgniter\Entity\Entity
"total_precio" => "float", "total_precio" => "float",
"total_tirada" => "float", "total_tirada" => "float",
]; ];
/**
* Devuelve la entidad `PedidoEntity` con sus relaciones
*
* @return self
*/
public function withAllRelations() : self
{
$this->attributes["pedido_lineas"] = $this->lineas();
$this->attributes["presupuesto"] = $this->presupuesto();
return $this;
}
public function lineas(): array
{
$q = model(PedidoLineaModel::class);
$q->where("pedido_id",$this->attributes["id"]);
return $q->findAll();
}
public function presupuesto() : PresupuestoEntity
{
$q = model(PedidoLineaModel::class);
$p = model(PresupuestoModel::class);
$presupuesto_id = $q->where("pedido_id",$this->attributes["id"])->first()->presupuesto_id;
return $p->find($presupuesto_id);
}
public function orden_trabajo() : ?OrdenTrabajoEntity
{
$m = model(OrdenTrabajoModel::class);
return $m->where("pedido_id",$this->attributes["id"])->first();
}
} }

View File

@ -191,4 +191,5 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity
return $q; return $q;
} }
} }

View File

@ -1,7 +1,17 @@
<?php <?php
namespace App\Entities\Presupuestos; namespace App\Entities\Presupuestos;
use App\Models\Configuracion\MaquinaModel;
use CodeIgniter\Entity; use CodeIgniter\Entity;
use App\Entities\Configuracion\Maquina as MaquinaEntity;
use App\Entities\Configuracion\MaquinasTarifasImpresionEntity;
use App\Entities\Configuracion\PapelGenerico;
use App\Entities\Configuracion\PapelImpresion;
use App\Entities\Tarifas\TarifapreimpresionEntity;
use App\Models\Configuracion\MaquinasTarifasImpresionModel;
use App\Models\Configuracion\PapelGenericoModel;
use App\Models\Configuracion\PapelImpresionModel;
class PresupuestoLineaEntity extends \CodeIgniter\Entity\Entity class PresupuestoLineaEntity extends \CodeIgniter\Entity\Entity
{ {
@ -141,5 +151,45 @@ class PresupuestoLineaEntity extends \CodeIgniter\Entity\Entity
"precio_impresion" => "double", "precio_impresion" => "double",
"total_linea" => "double", "total_linea" => "double",
]; ];
}
/**
* Devuelve la entity MaquinaEntity asociada a esta linea de presupuesto
*
* @return MaquinaEntity
*/
public function maquina(): MaquinaEntity
{
$m = model(MaquinaModel::class);
return $m->find($this->attributes["maquina_id"]);
}
/**
* Devuelve la entity PapelImpresion asociada a esta linea de presupuesto.
*
* @return PapelImpresion
*/
public function papel_impresion(): PapelImpresion
{
$m = model(PapelImpresionModel::class);
return $m->find($this->attributes['papel_impresion_id']);
}
/**
* Devuelve la entity PapelGenerico asociada a esta linea de presupuesto.
*
* @return PapelGenerico
*/
public function papel_generico(): PapelGenerico
{
$m = model(PapelGenericoModel::class);
return $m->find($this->attributes['papel_id']);
}
/**
* Devuelve la entity MaquinasTarifasImpresionEntity asociada a esta linea de presupuesto.
*
* @return MaquinasTarifasImpresionEntity
*/
public function tarifa_impresion(): MaquinasTarifasImpresionEntity
{
$m = model(MaquinasTarifasImpresionModel::class);
return $m->find($this->attributes['tarifa_impresion_id']);
}
}

View File

@ -0,0 +1,62 @@
<?php
namespace App\Entities\Produccion;
use CodeIgniter\Entity\Entity;
class OrdenTrabajoDateEntity extends Entity
{
protected $attributes = [
"fecha_entrada_at" => null,
"fecha_entrega_at" => null,
"fecha_entrega_change_at" => null,
"fecha_entrega_real_at" => null,
"fecha_entrega_real_warning" => null,
"fecha_impresion_at" => null,
"fecha_encuadernado_at" => null,
"fecha_externo_at" => null,
"fecha_entrega_warning" => null,
"fecha_entrega_warning_revised" => null,
"pendiente_ferro_at" => null,
"ferro_en_cliente_at" => null,
"ferro_ok_at" => null,
"interior_bn_at" => null,
"interior_color_at" => null,
"preparacion_interiores_at" => null,
"cubierta_at" => null,
"plastificado_at" => null,
"encuadernacion_at" => null,
"corte_at" => null,
"embalaje_at" => null,
"envio_at" => null,
"entrada_manipulado_at" => null
];
protected $datamap = [];
protected $dates = ['created_at', 'updated_at', 'deleted_at'];
protected $casts = [
"fecha_entrada_at" => "?datetime",
"fecha_entrega_at" => "?datetime",
"fecha_entrega_change_at" => "?datetime",
"fecha_entrega_real_at" => "?datetime",
"fecha_entrega_real_warning" => "?bool",
"fecha_impresion_at" => "?datetime",
"fecha_encuadernado_at" => "?datetime",
"fecha_externo_at" => "?datetime",
"fecha_entrega_warning" => "?bool",
"fecha_entrega_warning_revised" => "?bool",
"pendiente_ferro_at" => "?datetime",
"ferro_en_cliente_at" => "?datetime",
"ferro_ok_at" => "?datetime",
"interior_bn_at" => "?datetime",
"interior_color_at" => "?datetime",
"preparacion_interiores_at" => "?datetime",
"cubierta_at" => "?datetime",
"plastificado_at" => "?datetime",
"encuadernacion_at" => "?datetime",
"corte_at" => "?datetime",
"embalaje_at" => "?datetime",
"envio_at" => "?datetime",
"entrada_manipulado_at" => "?datetime"
];
}

View File

@ -1,6 +1,11 @@
<?php <?php
namespace App\Entities\Produccion; namespace App\Entities\Produccion;
use App\Database\Migrations\OrdenTrabajoDatesTable;
use App\Entities\Pedidos\PedidoEntity;
use App\Models\OrdenTrabajo\OrdenTrabajoTarea;
use App\Models\Pedidos\PedidoModel;
use CodeIgniter\Entity\Entity; use CodeIgniter\Entity\Entity;
@ -8,107 +13,61 @@ class OrdenTrabajoEntity extends Entity
{ {
protected $attributes = [ protected $attributes = [
"pedido_id" => null, "pedido_id" => null,
"maquina_orden_negro_id" => null, "user_created_id" => null,
"maquina_orden_color_id" => null, "user_updated_id" => null,
"maquina_orden_portada_id" => null, "total_tirada" => null,
"maquina_orden_cubierta_id" => null, "total_precio" => null,
"negro_forma_id" => null, "tipo_entrada" => "out",
"color_forma_id" => null, "progreso" => 0.00,
"portada_forma_id" => null, "estado" => "I",
"cubierta_forma_id" => null, "comentarios" => null,
"tirada" => null,
"negro_pliegos_pedido" => null,
"color_pliegos_pedido" => null,
"portada_pliegos_pedido" => null,
"cubierta_pliegos_pedido" => null,
"negro_clicks_pedido" => null,
"color_clicks_pedido" => null,
"portada_clicks_pedido" => null,
"cubierta_clicks_pedido" => null,
"pliegos1" => null,
"paginas1" => null,
"pliegos2" => null,
"paginas2" => null,
"negro_proveedor_nombre" => null,
"color_proveedor_nombre" => null,
"portada_proveedor_nombre" => null,
"corte_pie" => null,
"lomo" => null,
"tipo_entrada" => null,
"fecha_entrega_real_warning" => null,
"fecha_entrega_warning" => null,
"fecha_entrega_warning_revised" => null,
"ferro_disponible" => null,
"ferro_disponible_thread_id" => null,
"ferro_cp" => null,
"ferro_proveedor" => null,
"ferro_tracking" => null,
"pre_formato" => null,
"pre_lomo" => null,
"pre_solapa" => null,
"pre_isbn" => null,
"pre_codbarras" => null,
"pre_imposicion" => null,
"pre_imprimir" => null,
"pre_faltan_materiales" => null,
"pre_faltan_materiales_note" => null,
"progreso" => null,
"message_production_send" => null,
"finalizado" => null,
"comentarios" => null
]; ];
protected $casts = [ protected $casts = [
"pedido_id" => 'integer', "pedido_id" => "integer",
"maquina_orden_negro_id" => '?integer', "user_created_id" => "integer",
"maquina_orden_color_id" => '?integer', "user_updated_id" => "?integer",
"maquina_orden_portada_id" => '?integer', "total_tirada" => "float",
"maquina_orden_cubierta_id" => '?integer', "total_precio" => "float",
"negro_forma_id" => '?integer', "tipo_entrada" => "string",
"color_forma_id" => '?integer', "progreso" => "float",
"portada_forma_id" => '?integer', "estado" => "string",
"cubierta_forma_id" => '?integer', "comentarios" => "string",
"tirada" => 'integer',
"negro_pliegos_pedido" => '?integer',
"color_pliegos_pedido" => 'string',
"portada_pliegos_pedido" => 'string',
"cubierta_pliegos_pedido" => 'string',
"negro_clicks_pedido" => '?integer',
"color_clicks_pedido" => '?integer',
"portada_clicks_pedido" => '?integer',
"cubierta_clicks_pedido" => null,
"pliegos1" => '?integer',
"paginas1" => '?integer',
"pliegos2" => '?integer',
"paginas2" => '?integer',
"negro_proveedor_nombre" => null,
"color_proveedor_nombre" => null,
"portada_proveedor_nombre" => null,
"corte_pie" => null,
"lomo" => null,
"tipo_entrada" => 'string',
"fecha_entrega_real_warning" => 'boolean',
"fecha_entrega_warning" => 'boolean',
"fecha_entrega_warning_revised" => 'boolean',
"ferro_disponible" => 'boolean',
"ferro_disponible_thread_id" => '?integer',
"ferro_cp" => '?string',
"ferro_proveedor" => '?string',
"ferro_tracking" => '?string',
"pre_formato" => '?string',
"pre_lomo" => '?string',
"pre_solapa" => '?string',
"pre_isbn" => '?string',
"pre_codbarras" => '?string',
"pre_imposicion" => '?string',
"pre_imprimir" => 'boolean',
"pre_faltan_materiales" => 'boolean',
"pre_faltan_materiales_note" => '?string',
"progreso" => 'float',
"message_production_send" => 'boolean',
"finalizado" => 'boolean',
"comentarios" => 'string'
]; ];
/**
* Devuelve las tareas de la orden de trabajo.
*
* @return array<OrdenTrabajoTarea>
*/
public function tareas(): array
{
$m = model(OrdenTrabajoTarea::class);
return $m->where("orden_trabajo_id", $this->attributes["id"])->findAll();
}
/**
* Devuelve el pedido de la orden de trabajo
*
* @return PedidoEntity
*/
public function pedido(): PedidoEntity
{
$m = model(PedidoModel::class);
return $m->find($this->attributes["pedido_id"]);
}
/**
* Almacena en la tabla `orden_trabajo_dates` las fechas correspondientes del pedido.
* Se almacenan en una tabla externa porque puede haber modificaciones de estas fechas
* en la orden del trabajo, pero en el pedido quedarán fijas.
*
* @todo Falta implementacion
* @return boolean
*/
public function storeDates($data): self
{
$ot_dates = new OrdenTrabajoDateEntity();
$this->attributes["dates"] = $ot_dates->fill($data);
return $this;
}
} }

View File

@ -0,0 +1,12 @@
<?php
namespace App\Entities\Produccion;
use CodeIgniter\Entity\Entity;
class OrdenTrabajoMaquetacionEntity extends Entity
{
protected $datamap = [];
protected $dates = ['created_at', 'updated_at', 'deleted_at'];
protected $casts = [];
}

View File

@ -0,0 +1,12 @@
<?php
namespace App\Entities\Produccion;
use CodeIgniter\Entity\Entity;
class OrdenTrabajoMaquetacionMovimientoEntity extends Entity
{
protected $datamap = [];
protected $dates = ['created_at', 'updated_at', 'deleted_at'];
protected $casts = [];
}

View File

@ -0,0 +1,88 @@
<?php
namespace App\Entities\Produccion;
use App\Entities\Configuracion\Maquina;
use App\Entities\Presupuestos\PresupuestoLineaEntity;
use App\Models\Configuracion\MaquinaModel;
use App\Models\OrdenTrabajo\OrdenTrabajoModel;
use App\Models\Presupuestos\PresupuestoLineaModel;
use CodeIgniter\Entity\Entity;
class OrdenTrabajoTareaEntity extends Entity
{
protected $attributes = [
"id" => null,
"orden_trabajo_id" => null,
"presupuesto_linea_id" => null,
"nombre" => null,
"orden" => null,
"maquina_id" => null,
"imposicion_id" => null,
"tiempo_estimado" => null,
"tiempo_real" => null,
];
protected $datamap = [];
protected $dates = ['created_at', 'updated_at', 'deleted_at'];
protected $casts = [
"id" => "integer",
"orden_trabajo_id" => "integer",
"presupuesto_linea_id" => "?integer",
"nombre" => "string",
"orden" => "integer",
"maquina_id" => "?integer",
"imposicion_id" => "?integer",
"tiempo_estimado" => "?float",
"tiempo_real" => "?float"
];
/**
* Orden de trabajo de la tarea
*
* @return OrdenTrabajoEntity
*/
public function orden_trabajo() : OrdenTrabajoEntity
{
$m = model(OrdenTrabajoModel::class);
return $m->find($this->attributes["orden_trabajo_id"]);
}
/**
* Tarea orden de trabajo con orden de trabajo
*
* @return self
*/
public function withOrdenTrabajo() : self
{
$this->attributes["orden_trabajo"] = $this->orden_trabajo();
return $this;
}
/**
* Devuelve la maquina actual de esta tarea
*
* @return Maquina
*/
public function maquina_actual() : Maquina
{
$m = model(MaquinaModel::class);
return $m->find($this->attributes["maquina_id"]);
}
/**
* Devuelve el presupuesto linea origen de esta tarea
*
* @return PresupuestoLineaEntity
*/
public function presupuesto_linea() : PresupuestoLineaEntity
{
$m = model(PresupuestoLineaModel::class);
return $m->find($this->attributes["presupuesto_linea_id"]);
}
/**
* Devuelve la maquina original del presupuesto linea
*
* @return Maquina
*/
public function maquina_presupuesto_linea() : Maquina
{
return $this->presupuesto_linea()->maquina();
}
}

View File

@ -0,0 +1,12 @@
<?php
namespace App\Entities\Produccion;
use CodeIgniter\Entity\Entity;
class OrdenTrabajoUserEntity extends Entity
{
protected $datamap = [];
protected $dates = ['created_at', 'updated_at', 'deleted_at'];
protected $casts = [];
}

View File

@ -9,5 +9,14 @@ return [
"ubicacion"=> "Ubicación", "ubicacion"=> "Ubicación",
"tirada"=> "Tirada", "tirada"=> "Tirada",
"impresion"=> "Impresión", "impresion"=> "Impresión",
],
"task" => [
"order" => "Orden",
"task" => "Tarea",
"note" => "Nota",
"maquina_presupuesto" => "Máquina presupuesto",
"maquina_actual" => "Máquina actual",
"tiempo_estimado" => "Tiempo estimado",
"tiempo" => "Tiempo"
] ]
]; ];

View File

@ -0,0 +1,97 @@
<?php
namespace App\Models\OrdenTrabajo;
use App\Entities\Produccion\OrdenTrabajoDateEntity;
use CodeIgniter\Database\MySQLi\Builder;
use CodeIgniter\Model;
class OrdenTrabajoDate extends Model
{
protected $table = 'orden_trabajo_dates';
protected $primaryKey = 'orden_trabajo_id';
protected $useAutoIncrement = true;
protected $returnType = OrdenTrabajoDateEntity::class;
protected $useSoftDeletes = true;
protected $protectFields = true;
protected $allowedFields = [
"orden_trabajo_id",
"fecha_entrada_at",
"fecha_entrega_at",
"fecha_entrega_change_at",
"fecha_entrega_real_at",
"fecha_entrega_real_warning",
"fecha_impresion_at",
"fecha_encuadernado_at",
"fecha_externo_at",
"fecha_entrega_warning" ,
"fecha_entrega_warning_revised",
"pendiente_ferro_at",
"ferro_en_cliente_at",
"ferro_ok_at",
"interior_bn_at",
"interior_color_at",
"preparacion_interiores_at",
"cubierta_at",
"plastificado_at",
"encuadernacion_at",
"corte_at",
"embalaje_at",
"envio_at",
"entrada_manipulado_at"
];
protected 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 $validationRules = [];
protected $validationMessages = [];
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 = [];
/**
* Query datatable
*
* @return Builder
*/
protected function getQueryDatatable() : Builder
{
$q = $this->builder()
->select([
"orden_trabajo_tareas.orden",
"mp.nombre as maquina_presupuesto",
"m.nombre as maquina_tarea",
"orden_trabajo_tareas.tiempo_estimado",
"orden_trabajo_tareas.tiempo_real"
])
->join("presupuesto_linea","presupuesto_linea.id = orden_trabajo_tareas.presupuesto_linea_id","left")
->join("lg_maquinas m","lg_maquinas.id = orden_trabajo_tareas.maquina_id","left")
->join("lg_maquinas mp","lg_maquinas.id = presupuesto_linea.maquina_id","left")
->join("lg_imposiciones", "lg_imposiciones.id = orden_trabajo_tareas.imposicion_id" , "left")
->where("orden_trabajo_tareas.deleted_at" , NULL);
return $q;
}
}

View File

@ -15,54 +15,14 @@ class OrdenTrabajoModel extends Model
protected $protectFields = true; protected $protectFields = true;
protected $allowedFields = [ protected $allowedFields = [
"pedido_id", "pedido_id",
"maquina_orden_negro_id", "user_created_id",
"maquina_orden_color_id", "user_updated_id",
"maquina_orden_portada_id", "total_tirada",
"maquina_orden_cubierta_id", "total_precio",
"negro_forma_id",
"color_forma_id",
"portada_forma_id",
"cubierta_forma_id",
"tirada",
"negro_pliegos_pedido",
"color_pliegos_pedido",
"portada_pliegos_pedido",
"cubierta_pliegos_pedido",
"negro_clicks_pedido",
"color_clicks_pedido",
"portada_clicks_pedido",
"cubierta_clicks_pedido",
"pliegos1",
"paginas1",
"pliegos2",
"paginas2",
"negro_proveedor_nombre",
"color_proveedor_nombre",
"portada_proveedor_nombre",
"corte_pie",
"lomo",
"tipo_entrada", "tipo_entrada",
"fecha_entrega_real_warning",
"fecha_entrega_warning",
"fecha_entrega_warning_revised",
"ferro_disponible",
"ferro_disponible_thread_id",
"ferro_cp",
"ferro_proveedor",
"ferro_tracking",
"pre_formato",
"pre_lomo",
"pre_solapa",
"pre_isbn",
"pre_codbarras",
"pre_imposicion",
"pre_imprimir",
"pre_faltan_materiales",
"pre_faltan_materiales_note",
"progreso", "progreso",
"message_production_send", "estado",
"finalizado", "comentarios",
"comentarios"
]; ];
protected bool $allowEmptyInserts = false; protected bool $allowEmptyInserts = false;
@ -97,23 +57,26 @@ class OrdenTrabajoModel extends Model
public function getDatatableQuery() : BaseBuilder public function getDatatableQuery() : BaseBuilder
{ {
$q = $this->builder("ordenes_trabajo ot") $q = $this->builder()
->select([ ->select([
"pedidos.id", "ordenes_trabajo.id",
"ordenes_trabajo.pedido_id",
"orden_trabajo_dates.fecha_encuadernado_at", "orden_trabajo_dates.fecha_encuadernado_at",
"clientes.nombre as client_name", "clientes.nombre as cliente_nombre",
"presupuestos.titulo as presupuesto_title", "presupuestos.titulo as presupuesto_titulo",
"tp.codigo as tipo_presupuesto_impresion", "ubicaciones.nombre as ubicacion_nombre",
"ubicaciones.nombre as ubicacion_name", "pedidos.total_tirada",
"tipos_presupuestos.codigo as tipo_presupuesto_impresion",
]) ])
->join("orden_trabajo_dates otdates","otdates.orden_trabajo_id = ot.id","left") ->join("orden_trabajo_dates","orden_trabajo_dates.orden_trabajo_id = ordenes_trabajo.id","left")
->join("pedidos","pedidos.id = ot.pedido_id","left") ->join("pedidos","pedidos.id = ordenes_trabajo.pedido_id","left")
->join("pedidos_linea","pedidos.id = pedidos_linea.pedido_id","left") ->join("pedidos_linea","pedidos.id = pedidos_linea.pedido_id","left")
->join("presupuestos","presupuestos.id = pedidos_linea.presupuesto_id","left") ->join("presupuestos","presupuestos.id = pedidos_linea.presupuesto_id","left")
->join("clientes","clientes.id = presupuestos.cliente_id","left") ->join("clientes","clientes.id = presupuestos.cliente_id","left")
->join("tipos_presupuestos tp","presupuestos.tipo_impresion_id = tp.id","left") ->join("tipos_presupuestos","presupuestos.tipo_impresion_id = tipos_presupuestos.id","left")
->join("ubicaciones","ubicaciones.id = pedidos_linea.ubicacion_id","left") ->join("ubicaciones","ubicaciones.id = pedidos_linea.ubicacion_id","left")
->groupBy("ot.id"); ->where("ordenes_trabajo.deleted_at",null)
->groupBy("ordenes_trabajo.id");
return $q; return $q;
} }

View File

@ -0,0 +1,81 @@
<?php
namespace App\Models\OrdenTrabajo;
use App\Entities\Produccion\OrdenTrabajoTareaEntity;
use CodeIgniter\Database\MySQLi\Builder;
use CodeIgniter\Model;
class OrdenTrabajoTarea extends Model
{
protected $table = 'orden_trabajo_tareas';
protected $primaryKey = 'id';
protected $useAutoIncrement = true;
protected $returnType = OrdenTrabajoTareaEntity::class;
protected $useSoftDeletes = true;
protected $protectFields = true;
protected $allowedFields = [
"orden_trabajo_id",
"presupuesto_linea_id",
"nombre",
"orden",
"maquina_id",
"imposicion_id",
"tiempo_estimado",
"tiempo_real"
];
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 $validationRules = [];
protected $validationMessages = [];
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 = [];
/**
* Query datatable
*
* @return Builder
*/
protected function getQueryDatatable() : Builder
{
$q = $this->builder()
->select([
"orden_trabajo_tareas.orden",
"mp.nombre as maquina_presupuesto",
"m.nombre as maquina_tarea",
"orden_trabajo_tareas.tiempo_estimado",
"orden_trabajo_tareas.tiempo_real"
])
->join("presupuesto_linea","presupuesto_linea.id = orden_trabajo_tareas.presupuesto_linea_id","left")
->join("lg_maquinas m","lg_maquinas.id = orden_trabajo_tareas.maquina_id","left")
->join("lg_maquinas mp","lg_maquinas.id = presupuesto_linea.maquina_id","left")
->join("lg_imposiciones", "lg_imposiciones.id = orden_trabajo_tareas.imposicion_id" , "left")
->where("orden_trabajo_tareas.deleted_at" , NULL);
return $q;
}
}

View File

@ -5,10 +5,13 @@ declare(strict_types=1);
namespace App\Models; namespace App\Models;
use App\Entities\Usuarios\UsersEntity; use App\Entities\Usuarios\UsersEntity;
use CodeIgniter\Shield\Authentication\Traits\HasAccessTokens;
use CodeIgniter\Shield\Models\UserModel as ShieldUserModel; use CodeIgniter\Shield\Models\UserModel as ShieldUserModel;
class UserModel extends ShieldUserModel class UserModel extends ShieldUserModel
{ {
use HasAccessTokens;
protected function initialize(): void protected function initialize(): void
{ {
parent::initialize(); parent::initialize();

View File

@ -0,0 +1,202 @@
<?php
namespace App\Services;
use App\Database\Migrations\OrdenTrabajoUsers;
use App\Entities\Configuracion\Maquina;
use App\Entities\Pedidos\PedidoEntity;
use App\Entities\Presupuestos\PresupuestoEntity;
use App\Entities\Presupuestos\PresupuestoLineaEntity;
use App\Entities\Produccion\OrdenTrabajoEntity;
use App\Models\OrdenTrabajo\OrdenTrabajoDate;
use App\Models\OrdenTrabajo\OrdenTrabajoModel;
use App\Models\OrdenTrabajo\OrdenTrabajoTarea;
use CodeIgniter\Config\BaseService;
use CodeIgniter\Database\BaseBuilder;
use CodeIgniter\Database\Exceptions\DatabaseException;
/**
* Clase con las funcionalidades necesarias trabajar con las ordenes de trabajo.
*/
class ProductionService extends BaseService
{
protected OrdenTrabajoModel $otModel;
protected OrdenTrabajoTarea $otTarea;
protected OrdenTrabajoDate $otDate;
/**
* Pedido Entity
*
* @var PedidoEntity
*/
protected PedidoEntity $pedido;
/**
* Presupuesto Entity
*
* @var PresupuestoEntity
*/
protected PresupuestoEntity $presupuesto;
/**
* Establece el pedido sobre el que se va a trabajar
*
* @param PedidoEntity $pedido
* @return self
*/
public function setPedido(PedidoEntity $pedido): self
{
$this->pedido = $pedido;
$this->presupuesto = $this->pedido->presupuesto();
$this->otModel = model(OrdenTrabajoModel::class);
$this->otDate = model(OrdenTrabajoDate::class);
$this->otTarea = model(OrdenTrabajoTarea::class);
return $this;
}
/**
* Obtiene el pedido asociado a esta clase
*
* @return PedidoEntity
*/
public function getPedido(): PedidoEntity
{
return $this->pedido;
}
public function getPresupuesto(): PresupuestoEntity
{
return $this->presupuesto;
}
/**
* Crea una instancia de la orden de trabajo
*
* @return self
*/
public function createOrdenTrabajo(): OrdenTrabajoEntity|DatabaseException
{
$auth_user = auth()->user();
$ot = new OrdenTrabajoEntity();
$ot_exists = $this->pedido->orden_trabajo();
if ($ot_exists) {
return $ot_exists;
}
$data = [
"pedido_id" => $this->pedido->id,
"user_created_id" => $auth_user->id,
"user_updated_id" => $auth_user->id,
"total_tirada" => $this->pedido->total_tirada,
"total_precio" => $this->pedido->total_precio
];
$ot->fill($data);
$this->otModel->save($ot);
$ot_id = $this->otModel->getInsertID();
$ot->id = $ot_id;
$this->storeOrdenTrabajoDates($ot);
$this->storeOrdenTrabajoTareas($ot);
return $ot;
}
/**
* Inserta las fechas del pedido asociado a la orden de trabajo en `orden_trabajo_tareas`
*
* @param OrdenTrabajoEntity $ot
* @return integer|boolean|string ID
*/
protected function storeOrdenTrabajoDates(OrdenTrabajoEntity $ot): bool|int|string
{
return $this->otDate->insert([
"orden_trabajo_id" => $ot->id,
"fecha_encuadernado_at" => $this->pedido->fecha_encuadernado,
"fecha_entrega_real_at" => $this->pedido->fecha_entrega_real,
"fecha_impresion_at" => $this->pedido->fecha_impresion,
"fecha_entrega_externo" => $this->pedido->fecha_entrega_externo,
]);
}
/**
* Inserta las tareas de la orden de trabajo.
* Acepta como argumento una entidad de la orden de trabajo OrdenTrabajoEntity
*
*
* @param OrdenTrabajoEntity $ot
* @return integer|boolean Numero de registro insertados o `FALSE` si error
*/
protected function storeOrdenTrabajoTareas(OrdenTrabajoEntity $ot): int|bool
{
$p_lineas = $this->presupuesto->presupuestoLineas();
$ot_tareas = [];
foreach ($p_lineas as $key => $p_linea) {
$p_linea_maquina = $p_linea->maquina();
$ot_tareas["orden_trabajo_id"] = $ot->id;
$ot_tareas["presupuesto_linea_id"] = $p_linea->id;
//TODO : Por ahora nombre maquina, asignar nombre tarea en
//TODO : base a la tarifa asociada a la linea de presupuesto
$ot_tareas["nombre"] = $p_linea_maquina->nombre;
$ot_tareas["orden"] = $p_linea_maquina->orden_planning;
$ot_tareas["maquina_id"] = $p_linea_maquina->id;
$ot_tareas["imposicion_id"] = null;
$ot_tareas["tiempo_estimado"] = $p_linea->horas_maquina;
$ot_tareas["tiempo_real"] = $p_linea->horas_maquina; //? Tiempo real se inserta manual?
$insert_query_result = $this->otTarea->insert($ot_tareas);
$ot_tareas = [];
}
return $insert_query_result;
}
/**
* Devuelve las lineas de presupuesto con la máquina asociada a cada una
*
* @return array<PresupuestoLineaEntity>
*/
protected function getPresupuestoLineasWithMaquina(): array
{
$presupuesto_lineas = $this->presupuesto->presupuestoLineas();
foreach ($presupuesto_lineas as $key => $linea) {
$linea->maquina = $linea->maquina();
}
return $presupuesto_lineas;
}
public function getTareas(): array
{
$p_lineas_with_maquina = $this->getPresupuestoLineasWithMaquina();
$tareas = [];
$tarea = [];
foreach ($p_lineas_with_maquina as $key => $linea) {
$tarea["orden"] = $linea->maquina->orden_planning;
$tarea["maquina_tipo"] = $linea->maquina->tipo;
$tarea["maquina_nombre"] = $linea->maquina->nombre;
$tarea["nota"] = null;
$tareas[] = $tarea;
$tarea = [];
}
return ["tareas" => $tareas];
}
/**
* Query para mostrar en datatable
*
* @param integer $ot_id Primary key de la orden de trabajo
* @return BaseBuilder
*/
public function taskDatatableQuery(int $ot_id): BaseBuilder
{
$q = $this->otModel->builder()->select([
"orden_trabajo_tareas.orden",
"orden_trabajo_tareas.nombre",
"presupuesto_lineas.maquina_id as maquina_tarea",
"orden_trabajo_tareas.maquina_id as maquina_presupuesto_linea",
"lg_imposiciones.id",
"orden_trabajo_tareas.tiempo_estimado",
"orden_trabajo_tareas.tiempo_real"
])
->join("orden_trabajo_tareas", "orden_trabajo_tareas.orden_trabajo_id = ordenes_trabajo.id", "left")
->join("presupuesto_lineas", "presupuesto_lineas.id = orden_trabajo_tareas.presupuesto_linea_id")
->join("lg_maquinas", "lg_maquinas.id = orden_trabajo_tareas.maquina_id")
->where("orden_trabajo_tareas.orden_trabajo_id", $ot_id)
->where("orden_trabajo_tareas.deleted_at", null)
->orderBy("orden_trabajo_tareas.orden", "DESC");
return $q;
}
}

View File

@ -0,0 +1,16 @@
<table id="<?= $id ?>" class="table table-striped table-hover" style="width: 100%;">
<thead>
<tr>
<th><?= lang('Produccion.task.order') ?></th>
<th><?= lang('Produccion.task.task') ?></th>
<th><?= lang('Produccion.task.note') ?></th>
<th><?= lang('Produccion.task.maquina_presupuesto') ?></th>
<th><?= lang('Produccion.task.maquina_actual') ?></th>
<th><?= lang('Produccion.task.tiempo_estimado') ?></th>
<th><?= lang('Produccion.task.tiempo') ?></th>
</tr>
</thead>
<tbody>
</tbody>
</table>

View File

@ -31,9 +31,11 @@
<div class="pt-4"> <div class="pt-4">
<?= anchor(route_to("listaPresupuestos"), lang("Basic.global.Cancel"), ["class" => "btn btn-secondary float-start"]) ?> <?= anchor(route_to("listaPresupuestos"), lang("Basic.global.Cancel"), ["class" => "btn btn-secondary float-start"]) ?>
</div><!-- /.card-footer --> </div><!-- /.card-footer -->
<div class="pt-4"> <?php if ($pedidoEntity->estado == 'finalizado') : ?>
<button class="btn btn-primary btn-md"><span> <i class="ti ti-building-factory-2 ti-xs"></i> <?= lang("Produccion.btn_pedido_produccion_accion") ?> </span></button> <div class="pt-4">
</div><!-- /.card-footer --> <button class="btn btn-primary btn-md"><span> <i class="ti ti-building-factory-2 ti-xs"></i> <?= lang("Produccion.btn_pedido_produccion_accion") ?> </span></button>
</div><!-- /.card-footer -->
<?php endif; ?>
</div> </div>
</div> </div>

View File

@ -35,7 +35,7 @@
<div class="tab-content p-0"> <div class="tab-content p-0">
<!-- TAREAS --> <!-- TAREAS -->
<div class="tab-pane fade show active" id="nav-ot-task-general" role="tabpanel"> <div class="tab-pane fade show active" id="nav-ot-task-general" role="tabpanel">
<?= view("themes/vuexy/components/tables/ot_task_table",["id" => "ot-task-table"]) ?>
</div> </div>
<!-- PREIMPRESION --> <!-- PREIMPRESION -->
<div class="tab-pane fade" id="nav-ot-task-preimpresion" role="tabpanel"> <div class="tab-pane fade" id="nav-ot-task-preimpresion" role="tabpanel">

View File

@ -37,6 +37,7 @@
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?= $this->section("additionalExternalJs") ?> <?= $this->section("additionalExternalJs") ?>
<script type="module" src="<?= site_url("assets/js/safekat/pages/produccion/index.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/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/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/formvalidation/dist/js/plugins/AutoFocus.min.js") ?>"></script>

View File

@ -0,0 +1,45 @@
class OrdenTrabajoDatatable {
constructor(domItem) {
this.datatableItem = domItem
this.datatableColumns = [
{ data: 'pedido_id',searchable: false, sortable: false },
{ data: 'fecha_encuadernado_at', searchable: false, sortable: false },
{ data: 'cliente_nombre', searchable: false, sortable: false },
{ data: 'presupuesto_titulo', searchable: false, sortable: false },
{ data: 'ubicacion_nombre', searchable: false, sortable: false },
{ data: 'total_tirada', searchable: false, sortable: false },
{ data: 'tipo_presupuesto_impresion', searchable: false, sortable: false },
{
data: 'action', searchable: false, sortable: false,
render: (d, t) => {
return `<div class="btn-group btn-group-sm">
<a href="/produccion/ordentrabajo/edit/${d}" class="ot-edit"><i class="ti ti-eye ti-sm mx-2"></i></a>
</div>`
}
}
]
}
init() {
this.datatable = this.datatableItem.DataTable({
processing: true,
layout: {
topStart: 'pageLength',
topEnd: 'search',
bottomStart: 'info',
bottomEnd: 'paging'
},
serverSide: true,
pageLength: 25,
language: {
url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json"
},
columns: this.datatableColumns,
ajax: '/produccion/ordentrabajo/datatable'
});
}
}
export default OrdenTrabajoDatatable;

View File

@ -0,0 +1,6 @@
import OrdenTrabajoDatatable from '../../components/datatables/otDatatable.js'
$(function() {
const otDatatable = new OrdenTrabajoDatatable($("#ot-datatable"))
otDatatable.init()
})