mirror of
https://git.imnavajas.es/jjimenez/safekat.git
synced 2025-07-25 22:52:08 +00:00
Merge branch 'feat/sk-32' into 'main'
Feat/sk 32 See merge request jjimenez/safekat!662
This commit is contained in:
@ -1001,6 +1001,11 @@ $routes->group('produccion', ['namespace' => 'App\Controllers\Produccion'], func
|
||||
$routes->post("upload/portada", 'Ordentrabajo::upload_orden_trabajo_portada');
|
||||
$routes->delete("portada/(:num)", 'Ordentrabajo::delete_orden_trabajo_portada/$1');
|
||||
|
||||
/**======================
|
||||
* FILES
|
||||
*========================**/
|
||||
$routes->post('get_files', 'Ordentrabajo::get_files');
|
||||
$routes->post('upload_files', 'Ordentrabajo::upload_files');
|
||||
/**======================
|
||||
* PDF
|
||||
*========================**/
|
||||
|
||||
@ -68,8 +68,13 @@ class Ordentrabajo extends BaseController
|
||||
|
||||
public function get_orden_trabajo_summary($orden_trabajo_id)
|
||||
{
|
||||
$summary = $this->produccionService->init($orden_trabajo_id)->getSummary();
|
||||
return $this->response->setJSON($summary);
|
||||
try {
|
||||
//code...
|
||||
$summary = $this->produccionService->init($orden_trabajo_id)->getSummary();
|
||||
return $this->response->setJSON($summary);
|
||||
} catch (\Throwable $th) {
|
||||
return $this->response->setStatusCode(500)->setJSON(["message" => $th->getMessage(), "error" => $th]);
|
||||
}
|
||||
}
|
||||
public function add() {}
|
||||
|
||||
@ -168,7 +173,7 @@ class Ordentrabajo extends BaseController
|
||||
->add("logo", fn($q) => site_url($logo->get_logo_path($q->presupuesto_linea_tipo)))
|
||||
->edit(
|
||||
"fecha_encuadernado_at",
|
||||
fn($q) =>$q->fecha_encuadernado_at ? Time::createFromFormat("Y-m-d", $q->fecha_encuadernado_at)->format("d/m/Y") : ""
|
||||
fn($q) => $q->fecha_encuadernado_at ? Time::createFromFormat("Y-m-d", $q->fecha_encuadernado_at)->format("d/m/Y") : ""
|
||||
)
|
||||
->add("action", fn($q) => $q->id)
|
||||
->toJson(true);
|
||||
@ -193,8 +198,8 @@ class Ordentrabajo extends BaseController
|
||||
|
||||
$q = $this->produccionService->papelGramajeDatatableQuery();
|
||||
return DataTable::of($q)
|
||||
->edit("tiempoReal", fn($q) => $q->tiempoReal * 3600)
|
||||
->add("action", fn($q) => ["title" => lang('Produccion.datatable.filter_by_task'), 'data' => $q])
|
||||
->edit("tiempoReal", fn($q) => $q->tiempoReal)
|
||||
->add("action", fn($q) => ["title" => lang('Produccion.datatable.filter_by_paper'), 'data' => $q])
|
||||
->toJson(true);
|
||||
}
|
||||
public function papel_pliego_datatable()
|
||||
@ -202,8 +207,8 @@ class Ordentrabajo extends BaseController
|
||||
|
||||
$q = $this->produccionService->papelPliegoDatatableQuery();
|
||||
return DataTable::of($q)
|
||||
->edit("tiempoReal", fn($q) => $q->tiempoReal * 3600)
|
||||
->add("action", fn($q) => ["title" => lang('Produccion.datatable.filter_by_task'), 'data' => $q])
|
||||
->edit("tiempoReal", fn($q) => $q->tiempoReal)
|
||||
->add("action", fn($q) => ["title" => lang('Produccion.datatable.filter_by_paper'), 'data' => $q])
|
||||
->toJson(true);
|
||||
}
|
||||
public function reset_tareas(int $orden_trabajo_id)
|
||||
@ -260,7 +265,7 @@ class Ordentrabajo extends BaseController
|
||||
$otEntity = $this->otModel->find($orden_trabajo_id);
|
||||
$pathActualFile = $otEntity->portada_path;
|
||||
$fullPath = WRITEPATH . 'uploads/' . $pathActualFile;
|
||||
if(file_exists($fullPath)){
|
||||
if (file_exists($fullPath)) {
|
||||
delete_files($fullPath);
|
||||
}
|
||||
$r = $this->otModel->update($otEntity->id, ["portada_path" => null]);
|
||||
@ -289,7 +294,7 @@ class Ordentrabajo extends BaseController
|
||||
return DataTable::of($q)
|
||||
->edit("fecha_entrega_real_at", fn($q) => $q->fecha_entrega_real_at ? Time::createFromFormat("Y-m-d", $q->fecha_entrega_real_at)->format("d/m/Y") : "")
|
||||
->add("metros_check", fn($q) => $q->otId)
|
||||
->add("corte", fn($q) => ["otId" => $q->otId,"tipo_corte" => $this->produccionService->ordenTrabajoTareaCorte($q->otId)])
|
||||
->add("corte", fn($q) => ["otId" => $q->otId, "tipo_corte" => $this->produccionService->ordenTrabajoTareaCorte($q->otId)])
|
||||
->add("action", fn($q) => $q)
|
||||
->toJson(true);
|
||||
}
|
||||
@ -297,27 +302,32 @@ class Ordentrabajo extends BaseController
|
||||
{
|
||||
$q = $this->produccionService->planningPlanaQueryDatatable();
|
||||
return DataTable::of($q)
|
||||
->edit("tiempo_real_sum", fn($q) => $q->tiempo_real_sum)
|
||||
->edit("fecha_entrega_real_at", fn($q) => $q->fecha_entrega_real_at ? Time::createFromFormat("Y-m-d", $q->fecha_entrega_real_at)->format("d/m/Y") : "")
|
||||
->add("pliegos_check", fn($q) => $q->otId)
|
||||
->add("action", fn($q) => $q)
|
||||
->toJson(true);
|
||||
}
|
||||
public function select_maquina_planning_rot(){
|
||||
public function select_maquina_planning_rot()
|
||||
{
|
||||
$q = $this->request->getGet('q');
|
||||
$result = $this->produccionService->querySelectMaquinaPlanningRotativa($q);
|
||||
return $this->response->setJSON($result);
|
||||
}
|
||||
public function select_papel_planning_rot(){
|
||||
public function select_papel_planning_rot()
|
||||
{
|
||||
$q = $this->request->getGet('q');
|
||||
$result = $this->produccionService->querySelectPapelPlanningRot($q);
|
||||
return $this->response->setJSON($result);
|
||||
}
|
||||
public function select_maquina_planning_plana(){
|
||||
public function select_maquina_planning_plana()
|
||||
{
|
||||
$q = $this->request->getGet('q');
|
||||
$result = $this->produccionService->querySelectMaquinaPlanningPlana($q);
|
||||
return $this->response->setJSON($result);
|
||||
}
|
||||
public function select_papel_planning_plana(){
|
||||
public function select_papel_planning_plana()
|
||||
{
|
||||
$q = $this->request->getGet('q');
|
||||
$result = $this->produccionService->querySelectPapelPlanningPlana($q);
|
||||
return $this->response->setJSON($result);
|
||||
@ -325,7 +335,52 @@ class Ordentrabajo extends BaseController
|
||||
public function tarea_toggle_corte($orden_trabajo_id)
|
||||
{
|
||||
$status = $this->produccionService->tareaUpdateMaquinaCorte($orden_trabajo_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]);
|
||||
}
|
||||
public function get_files()
|
||||
{
|
||||
$bodyData = $this->request->getPost();
|
||||
$files = $this->produccionService->init($bodyData["orden_trabajo_id"])->getOtFiles();
|
||||
$response = [];
|
||||
foreach ($files as $key => $file) {
|
||||
$file_ci4 = new File($file->file_path);
|
||||
$response[] = [
|
||||
"name" => $file->name,
|
||||
"size" => $file_ci4->getSize(),
|
||||
"hash" => $file->hash()
|
||||
];
|
||||
}
|
||||
return json_encode($response);
|
||||
}
|
||||
public function upload_files()
|
||||
{
|
||||
try {
|
||||
//code...
|
||||
$otFiles = [];
|
||||
$bodyData = $this->request->getPost();
|
||||
$files = $this->request->getFileMultiple('file');
|
||||
$ps = $this->produccionService->init($bodyData["orden_trabajo_id"]);
|
||||
$existingFiles = json_decode($bodyData["oldFiles"]);
|
||||
$ps->deleteOtFiles($existingFiles);
|
||||
if($files){
|
||||
$response = $ps->storeOtFiles($files);
|
||||
}else{
|
||||
$response = null;
|
||||
}
|
||||
return $this->response->setJSON([
|
||||
"message" => lang("App.global_alert_save_success"),
|
||||
"data" => $response,
|
||||
"status" => true
|
||||
]);
|
||||
} catch (\Throwable $th) {
|
||||
return $this->response->setJSON(
|
||||
[
|
||||
"message" => lang("App.global_alert_save_error"),
|
||||
"data" => $th,
|
||||
"error" => $th->getMessage(),
|
||||
"status" => false
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -56,5 +56,27 @@ class Intranet extends Controller
|
||||
}
|
||||
|
||||
}
|
||||
function orden_trabajo($ot_id,$resource_name)
|
||||
{
|
||||
helper('file');
|
||||
$resource_path = WRITEPATH . 'uploads/orden_trabajo/'.$ot_id. '/' . $resource_name;
|
||||
if (file_exists($resource_path)) {
|
||||
// Get the mime type of the file
|
||||
$mime_type = mime_content_type($resource_path);
|
||||
|
||||
// Get an instance of the Response class
|
||||
$response = service('response');
|
||||
|
||||
// Set the content type
|
||||
$response->setContentType($mime_type);
|
||||
|
||||
// Set the output
|
||||
$response->setBody(file_get_contents($resource_path));
|
||||
|
||||
// Send the response to the browser
|
||||
$response->send();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
namespace App\Database\Migrations;
|
||||
|
||||
use CodeIgniter\Database\Migration;
|
||||
use CodeIgniter\Database\RawSql;
|
||||
|
||||
class OrdenTrabajoTableFilesTable extends Migration
|
||||
{
|
||||
protected array $COLUMNS = [
|
||||
"id" => [
|
||||
"type" => "INT",
|
||||
"unsigned" => true,
|
||||
"auto_increment" => true
|
||||
],
|
||||
"orden_trabajo_id" => [
|
||||
"type" => "INT",
|
||||
"unsigned" => true,
|
||||
],
|
||||
"name" => [
|
||||
"type" => "TEXT",
|
||||
],
|
||||
"upload_by" => [
|
||||
"type" => "INT",
|
||||
"unsigned" => true,
|
||||
"constraint" => 10,
|
||||
],
|
||||
"file_path" => [
|
||||
"type" => "TEXT",
|
||||
]
|
||||
];
|
||||
|
||||
public function up()
|
||||
{
|
||||
$this->forge->addField($this->COLUMNS);
|
||||
$currenttime = new RawSql("CURRENT_TIMESTAMP");
|
||||
$this->forge->addField([
|
||||
"created_at" => [
|
||||
"type" => "TIMESTAMP",
|
||||
"default" => $currenttime,
|
||||
|
||||
],
|
||||
"updated_at" => [
|
||||
"type" => "TIMESTAMP",
|
||||
"null" => true,
|
||||
|
||||
],
|
||||
"deleted_at" => [
|
||||
"type" => "TIMESTAMP",
|
||||
"null" => true,
|
||||
],
|
||||
]);
|
||||
$this->forge->addPrimaryKey("id");
|
||||
$this->forge->addForeignKey("upload_by", "users", "id","CASCADE","CASCADE");
|
||||
$this->forge->addForeignKey("orden_trabajo_id", "ordenes_trabajo", "id","CASCADE","CASCADE");
|
||||
$this->forge->createTable("orden_trabajo_files", true);
|
||||
}
|
||||
|
||||
public function down()
|
||||
{
|
||||
$this->forge->dropTable("orden_trabajo_files");
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace App\Database\Migrations;
|
||||
|
||||
use CodeIgniter\Database\Migration;
|
||||
|
||||
class AddColumnIsPedidoEsperaOrdenTrabajoTable extends Migration
|
||||
{
|
||||
public function up()
|
||||
{
|
||||
$field = [
|
||||
'is_pedido_espera' => [
|
||||
'type' => 'BOOLEAN',
|
||||
'default' => false,
|
||||
'comment' => 'Marca que el pedido está en espera.'
|
||||
],
|
||||
'pedido_espera_by' => [
|
||||
'type' => 'int',
|
||||
'unsigned' => true,
|
||||
'constraint' => 11,
|
||||
'null' => true,
|
||||
'comment' => 'Foreign a usuario que ha marcado is_pedido_espera'
|
||||
|
||||
]
|
||||
];
|
||||
$this->forge->addColumn('ordenes_trabajo',$field);
|
||||
}
|
||||
|
||||
public function down()
|
||||
{
|
||||
$this->forge->dropColumn('ordenes_trabajo',['is_pedido_espera','pedido_espera_by']);
|
||||
|
||||
}
|
||||
}
|
||||
@ -8,6 +8,7 @@ use App\Models\Clientes\ClienteModel;
|
||||
use App\Models\Configuracion\PapelFormatoModel;
|
||||
use App\Models\Presupuestos\PresupuestoAcabadosModel;
|
||||
use App\Models\Presupuestos\PresupuestoEncuadernacionesModel;
|
||||
use App\Models\Presupuestos\PresupuestoFicheroModel;
|
||||
use App\Models\Presupuestos\PresupuestoLineaModel;
|
||||
use App\Models\Presupuestos\PresupuestoManipuladosModel;
|
||||
use App\Models\Presupuestos\PresupuestoModel;
|
||||
@ -293,4 +294,10 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity
|
||||
$m = model(PapelFormatoModel::class);
|
||||
return $m->find($this->attributes["papel_formato_id"]);
|
||||
}
|
||||
public function files(): array
|
||||
{
|
||||
$m = model(PresupuestoFicheroModel::class);
|
||||
$files = $m->where('presupuesto_id',$this->attributes['id'])->findAll();
|
||||
return $files ?? [];
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,10 +5,14 @@ namespace App\Entities\Produccion;
|
||||
use App\Controllers\Produccion\Ordentrabajo;
|
||||
use App\Database\Migrations\OrdenTrabajoDatesTable;
|
||||
use App\Entities\Pedidos\PedidoEntity;
|
||||
use App\Entities\Usuarios\UserEntity;
|
||||
use App\Entities\Usuarios\UsersEntity;
|
||||
use App\Models\OrdenTrabajo\OrdenTrabajoDate;
|
||||
use App\Models\OrdenTrabajo\OrdenTrabajoFileModel;
|
||||
use App\Models\OrdenTrabajo\OrdenTrabajoTarea;
|
||||
use App\Models\OrdenTrabajo\OrdenTrabajoUser;
|
||||
use App\Models\Pedidos\PedidoModel;
|
||||
use App\Models\UserModel;
|
||||
use CodeIgniter\Entity\Entity;
|
||||
use Picqer\Barcode\Renderers\PngRenderer;
|
||||
use Picqer\Barcode\Types\TypeCode128;
|
||||
@ -34,6 +38,9 @@ class OrdenTrabajoEntity extends Entity
|
||||
"revisar_codigo_barras" => false,
|
||||
"realizar_imposicion" => false,
|
||||
"enviar_impresion" => false,
|
||||
"portada_path" => null,
|
||||
"is_pedido_espera" => null,
|
||||
"pedido_espera_by" => null,
|
||||
];
|
||||
protected $casts = [
|
||||
"pedido_id" => "integer",
|
||||
@ -54,6 +61,8 @@ class OrdenTrabajoEntity extends Entity
|
||||
"revisar_codigo_barras" => "bool",
|
||||
"realizar_imposicion" => "bool",
|
||||
"enviar_impresion" => "bool",
|
||||
"portada_path" => "string",
|
||||
"is_pedido_espera" => "bool",
|
||||
];
|
||||
|
||||
|
||||
@ -109,4 +118,22 @@ class OrdenTrabajoEntity extends Entity
|
||||
$barcodeData = $barcode->getBarcode($this->pedido()->presupuesto()->id);
|
||||
return base64_encode($renderer->render($barcodeData,200, 50));
|
||||
}
|
||||
public function files() : array
|
||||
{
|
||||
$m = model(OrdenTrabajoFileModel::class);
|
||||
return $m->where('orden_trabajo_id',$this->attributes['id'])->findAll() ?? [];
|
||||
}
|
||||
public function pedidoEsperaBy() : ?UsersEntity
|
||||
{
|
||||
$m = model(UserModel::class);
|
||||
if($this->attributes['pedido_espera_by']){
|
||||
return $m->findById($this->attributes['pedido_espera_by']);
|
||||
}else{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
public function getPedidoEsperaBy(): ?UsersEntity
|
||||
{
|
||||
return $this->pedidoEsperaBy();
|
||||
}
|
||||
}
|
||||
|
||||
32
ci4/app/Entities/Produccion/OrdenTrabajoFileEntity.php
Normal file
32
ci4/app/Entities/Produccion/OrdenTrabajoFileEntity.php
Normal file
@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Entities\Produccion;
|
||||
|
||||
use App\Models\OrdenTrabajo\OrdenTrabajoModel;
|
||||
use CodeIgniter\Entity\Entity;
|
||||
|
||||
class OrdenTrabajoFileEntity extends Entity
|
||||
{
|
||||
protected $attributes = [
|
||||
"orden_trabajo_id" => null,
|
||||
"name" => null,
|
||||
"upload_by" => null,
|
||||
"file_path" => null
|
||||
];
|
||||
protected $casts = [
|
||||
"orden_trabajo_id" => "integer",
|
||||
"name" => "string",
|
||||
"upload_by" => "integer",
|
||||
"file_path" => "string"
|
||||
];
|
||||
|
||||
public function orden_trabajo(): ?OrdenTrabajoEntity
|
||||
{
|
||||
$m = model(OrdenTrabajoModel::class);
|
||||
return $m->find($this->attributes["orden_trabajo_id"]);
|
||||
}
|
||||
public function hash(): string
|
||||
{
|
||||
return array_reverse(explode('/', $this->attributes["file_path"]))[0];
|
||||
}
|
||||
}
|
||||
@ -24,6 +24,7 @@ return [
|
||||
"progreso" => "Progreso",
|
||||
"logo" => "Logo impresion",
|
||||
"filter_by_task" => "Filtrar por tarea",
|
||||
"filter_by_paper" => "Filtrar por papel",
|
||||
"metros" => "Metros",
|
||||
"corte" => "Corte",
|
||||
"pliegos" => "Pliegos",
|
||||
@ -76,6 +77,8 @@ return [
|
||||
"planning_rotativa" => "Planificación rotativa",
|
||||
"planning_plana" => "Planificación plana",
|
||||
"solapa" => "Solapa",
|
||||
"papel_gramajes" => "Papel y gramajes"
|
||||
"papel_gramajes" => "Papel y gramajes",
|
||||
"estado" => "Estado",
|
||||
"pedido_espera" => "Pedido en espera"
|
||||
|
||||
];
|
||||
56
ci4/app/Models/OrdenTrabajo/OrdenTrabajoFileModel.php
Normal file
56
ci4/app/Models/OrdenTrabajo/OrdenTrabajoFileModel.php
Normal file
@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\OrdenTrabajo;
|
||||
|
||||
use App\Entities\Produccion\OrdenTrabajoFileEntity;
|
||||
use CodeIgniter\Database\BaseBuilder;
|
||||
use CodeIgniter\Model;
|
||||
class OrdenTrabajoFileModel extends Model
|
||||
{
|
||||
protected $table = 'orden_trabajo_files';
|
||||
protected $primaryKey = 'id';
|
||||
protected $useAutoIncrement = true;
|
||||
protected $returnType = OrdenTrabajoFileEntity::class;
|
||||
protected $useSoftDeletes = true;
|
||||
protected $protectFields = true;
|
||||
protected $allowedFields = [
|
||||
"orden_trabajo_id",
|
||||
"name",
|
||||
"upload_by",
|
||||
"file_path"
|
||||
];
|
||||
|
||||
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 = [];
|
||||
|
||||
|
||||
}
|
||||
@ -33,29 +33,14 @@ class OrdenTrabajoModel extends Model
|
||||
"realizar_imposicion",
|
||||
"enviar_impresion",
|
||||
"portada_path",
|
||||
"is_pedido_espera",
|
||||
"pedido_espera_by"
|
||||
];
|
||||
|
||||
protected bool $allowEmptyInserts = false;
|
||||
protected bool $updateOnlyChanged = true;
|
||||
|
||||
protected array $casts = [
|
||||
"pedido_id" => "integer",
|
||||
"user_created_id" => "?integer",
|
||||
"user_updated_id" => "?integer",
|
||||
"fecha_entrega_warning" => "bool",
|
||||
"fecha_entrega_warning_revised" => "bool",
|
||||
"total_tirada" => "?integer",
|
||||
"total_precio" => "?integer",
|
||||
"tipo_entrada" => "?integer",
|
||||
"progreso" => "float",
|
||||
"revisar_formato" => "bool",
|
||||
"revisar_lomo" => "bool",
|
||||
"revisar_solapa" => "bool",
|
||||
"revisar_isbn" => "bool",
|
||||
"revisar_codigo_barras" => "bool",
|
||||
"realizar_imposicion" => "bool",
|
||||
"enviar_impresion" => "bool"
|
||||
];
|
||||
protected array $casts = [];
|
||||
protected array $castHandlers = [];
|
||||
|
||||
// Dates
|
||||
|
||||
@ -15,15 +15,18 @@ use App\Models\OrdenTrabajo\OrdenTrabajoUser;
|
||||
use App\Models\Usuarios\UserModel;
|
||||
use CodeIgniter\Config\BaseService;
|
||||
use App\Entities\Configuracion\Maquina as MaquinaEntity;
|
||||
use App\Entities\Produccion\OrdenTrabajoFileEntity;
|
||||
use App\Entities\Produccion\OrdenTrabajoTareaEntity;
|
||||
use App\Models\Configuracion\ConfigVariableModel;
|
||||
use App\Models\Configuracion\MaquinaModel;
|
||||
use App\Models\OrdenTrabajo\OrdenTrabajoFileModel;
|
||||
use CodeIgniter\Database\BaseBuilder;
|
||||
use CodeIgniter\Database\BaseResult;
|
||||
use CodeIgniter\Database\Exceptions\DatabaseException;
|
||||
use CodeIgniter\Files\File;
|
||||
use CodeIgniter\HTTP\Files\UploadedFile;
|
||||
use CodeIgniter\I18n\Time;
|
||||
use CodeIgniter\Model;
|
||||
use Dompdf\Dompdf;
|
||||
use Exception;
|
||||
|
||||
/**
|
||||
* Clase con las funcionalidades necesarias trabajar con las ordenes de trabajo.
|
||||
@ -39,6 +42,7 @@ class ProductionService extends BaseService
|
||||
protected OrdenTrabajoDate $otDate;
|
||||
protected OrdenTrabajoUser $otUser;
|
||||
protected OrdenTrabajoEntity $ot;
|
||||
protected OrdenTrabajoFileModel $otFileModel;
|
||||
protected UserModel $userModel;
|
||||
protected string $defaultMaquinaCorteName = 'HT-1000';
|
||||
protected MaquinaEntity $defaultMaquinaCorte;
|
||||
@ -80,6 +84,7 @@ class ProductionService extends BaseService
|
||||
$this->otTarea = model(OrdenTrabajoTarea::class);
|
||||
$this->otUser = model(OrdenTrabajoUser::class);
|
||||
$this->userModel = model(UserModel::class);
|
||||
$this->otFileModel = model(OrdenTrabajoFileModel::class);
|
||||
}
|
||||
public function init(int $orden_trabajo_id): self
|
||||
{
|
||||
@ -138,6 +143,7 @@ class ProductionService extends BaseService
|
||||
];
|
||||
$id = $this->otModel->insert($data);
|
||||
$this->init($id);
|
||||
$this->updatePedidoEspera();
|
||||
$this->storeOrdenTrabajoUsers();
|
||||
$this->storeOrdenTrabajoDates();
|
||||
$this->storeAllTareas();
|
||||
@ -329,6 +335,8 @@ class ProductionService extends BaseService
|
||||
$ot_tareas["nombre"] = $p_linea->tarifa()->nombre;
|
||||
$ot_tareas["orden"] = $linea_maquina->orden_planning ?? 110;
|
||||
$ot_tareas["maquina_id"] = $linea_maquina->id;
|
||||
$ot_tareas["tiempo_estimado"] = $p_linea->tiempo;
|
||||
$ot_tareas["tiempo_real"] = $p_linea->tiempo;
|
||||
$ot_tareas["imposicion_id"] = null;
|
||||
$this->otTarea->insert($ot_tareas);
|
||||
$ot_tareas = [];
|
||||
@ -336,6 +344,8 @@ class ProductionService extends BaseService
|
||||
$ot_tareas["orden_trabajo_id"] = $this->ot->id;
|
||||
$ot_tareas["presupuesto_encuadernado_id"] = $p_linea->id;
|
||||
$ot_tareas["nombre"] = $p_linea->tarifa()->nombre ?? "";
|
||||
$ot_tareas["tiempo_estimado"] = $p_linea->tiempo;
|
||||
$ot_tareas["tiempo_real"] = $p_linea->tiempo;
|
||||
$ot_tareas["orden"] = 110;
|
||||
$this->otTarea->insert($ot_tareas);
|
||||
}
|
||||
@ -443,13 +453,8 @@ class ProductionService extends BaseService
|
||||
"lg_papel_formato.ancho as papel_ancho",
|
||||
"lg_papel_formato.alto as papel_alto",
|
||||
"presupuesto_linea.rotativa_metros_total as metros",
|
||||
// "JSON_EXTRACT(presupuesto_linea.formas,'$.maquina_ancho') as maquina_ancho",
|
||||
// "JSON_EXTRACT(presupuesto_linea.formas,'$.maquina_alto') as maquina_alto",
|
||||
"lg_papel_impresion.nombre as papel_impresion",
|
||||
"presupuesto_linea.gramaje as papel_gramaje",
|
||||
|
||||
|
||||
|
||||
])
|
||||
->join("orden_trabajo_tareas", "orden_trabajo_tareas.orden_trabajo_id = ordenes_trabajo.id", "left")
|
||||
->join("orden_trabajo_dates", "orden_trabajo_dates.orden_trabajo_id = ordenes_trabajo.id", "left")
|
||||
@ -460,11 +465,12 @@ class ProductionService extends BaseService
|
||||
->join("lg_papel_impresion", "lg_papel_impresion.id = presupuesto_linea.papel_impresion_id", "left")
|
||||
->join("lg_maquinas as lgmp", "lgmp.id = presupuesto_linea.maquina_id", "left")
|
||||
->join("lg_imposiciones", "lg_imposiciones.id = orden_trabajo_tareas.imposicion_id", "left")
|
||||
// ->where("orden_trabajo_tareas.orden_trabajo_id", $this->ot->id)
|
||||
->whereIn("presupuesto_linea.tipo", $this->TIPOS_ROTATIVA)
|
||||
->where('lg_maquinas.is_rotativa', true)
|
||||
->where("orden_trabajo_tareas.deleted_at", null)
|
||||
->orderBy("orden_trabajo_tareas.orden", "ASC");
|
||||
->orderBy("orden_trabajo_tareas.orden", "ASC")
|
||||
->groupBy('ordenes_trabajo.id');
|
||||
|
||||
return $q;
|
||||
}
|
||||
/**
|
||||
@ -488,9 +494,7 @@ class ProductionService extends BaseService
|
||||
// "JSON_EXTRACT(presupuesto_linea.formas,'$.maquina_alto') as maquina_alto",
|
||||
"lg_papel_impresion.nombre as papel_impresion",
|
||||
"presupuesto_linea.gramaje as papel_gramaje",
|
||||
|
||||
|
||||
|
||||
"SUM(orden_trabajo_tareas.tiempo_real) as tiempo_real_sum"
|
||||
])
|
||||
->join("orden_trabajo_tareas", "orden_trabajo_tareas.orden_trabajo_id = ordenes_trabajo.id", "left")
|
||||
->join("orden_trabajo_dates", "orden_trabajo_dates.orden_trabajo_id = ordenes_trabajo.id", "left")
|
||||
@ -505,7 +509,9 @@ class ProductionService extends BaseService
|
||||
->whereIn("presupuesto_linea.tipo", $this->TIPOS_PLANA)
|
||||
->where('lg_maquinas.is_rotativa', false)
|
||||
->where("orden_trabajo_tareas.deleted_at", null)
|
||||
->orderBy("orden_trabajo_tareas.orden", "ASC");
|
||||
->orderBy("orden_trabajo_tareas.orden", "ASC")
|
||||
->groupBy('ordenes_trabajo.id');
|
||||
|
||||
return $q;
|
||||
}
|
||||
/**
|
||||
@ -749,6 +755,9 @@ class ProductionService extends BaseService
|
||||
|
||||
public function updateOrdenTrabajo($data): bool
|
||||
{
|
||||
if(isset($data["is_pedido_espera"])){
|
||||
$data["pedido_espera_by"] = auth()->user()->id;
|
||||
}
|
||||
return $this->otModel->update($this->ot->id, $data);
|
||||
}
|
||||
/**========================================================================
|
||||
@ -894,7 +903,8 @@ class ProductionService extends BaseService
|
||||
->join("lg_papel_impresion", "presupuesto_linea.papel_impresion_id = lg_papel_impresion.id", "left")
|
||||
->join("lg_papel_formato", "lg_papel_formato.id = presupuestos.papel_formato_id", "left")
|
||||
->where("orden_trabajo_tareas.deleted_at", null)
|
||||
->where("orden_trabajo_tareas.presupuesto_linea_id IS NOT NULL", NULL, FALSE)
|
||||
->where("orden_trabajo_tareas.presupuesto_linea_
|
||||
id IS NOT NULL", NULL, FALSE)
|
||||
->whereIn("presupuesto_linea.tipo", $this->TIPOS_PLANA)
|
||||
->groupBy('lg_papel_impresion.id');
|
||||
if ($q) {
|
||||
@ -926,4 +936,66 @@ class ProductionService extends BaseService
|
||||
{
|
||||
return $this->otTarea->where('orden_trabajo_id', $ot_id)->where('is_corte', true)?->first()->tipo_corte ?? null;
|
||||
}
|
||||
|
||||
public function getOtFiles(): array
|
||||
{
|
||||
$otFiles = $this->ot->files();
|
||||
return $otFiles;
|
||||
}
|
||||
public function storeOtFiles(array $uploadFiles): array
|
||||
{
|
||||
$otFileEntities = [];
|
||||
foreach ($uploadFiles as $uploadFile) {
|
||||
$otFileEntities[] = $this->storeOtFile($uploadFile);
|
||||
}
|
||||
return $otFileEntities;
|
||||
}
|
||||
protected function storeOtFile(UploadedFile $file): ?OrdenTrabajoFileEntity
|
||||
{
|
||||
$result = null;
|
||||
if ($this->ot) {
|
||||
if ($file->isValid() && !$file->hasMoved()) {
|
||||
$fullpath = $file->store('orden_trabajo/' . $this->ot->id);
|
||||
$ot_file_id = $this->otFileModel->insert([
|
||||
"orden_trabajo_id" => $this->ot->id,
|
||||
"name" => $file->getClientName(),
|
||||
"file_path" => WRITEPATH . 'uploads/' . $fullpath,
|
||||
"upload_by" => auth()->user()->id
|
||||
]);
|
||||
$result = $this->otFileModel->find($ot_file_id);
|
||||
}
|
||||
return $result;
|
||||
} else {
|
||||
throw new Exception('No se ha especificado una orden de trabajo. Usa $this->producctionService->init($orden_trabajo_id)');
|
||||
}
|
||||
}
|
||||
public function deleteOtFiles(?array $existingFiles): bool
|
||||
{
|
||||
helper('filesystem');
|
||||
if ($this->ot) {
|
||||
$otFiles = $this->ot->files();
|
||||
|
||||
foreach ($otFiles as $key => $file) {
|
||||
$file_path = $file->file_path;
|
||||
if ($existingFiles) {
|
||||
if (!in_array($file->name, $existingFiles)) {
|
||||
$this->otFileModel->delete($file->id);
|
||||
unlink($file_path);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
throw new Exception('No se ha especificado una orden de trabajo. Usa $this->producctionService->init($orden_trabajo_id)');
|
||||
}
|
||||
}
|
||||
protected function updatePedidoEspera(): bool
|
||||
{
|
||||
$status = false;
|
||||
$presupuestoFiles = $this->presupuesto->files();
|
||||
if (count($presupuestoFiles) == 0) {
|
||||
$status = $this->otModel->update($this->ot->id, ['pedido_espera' => true]);
|
||||
}
|
||||
return $status;
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,7 +4,8 @@
|
||||
<button type="button" class="accordion-button collapsed" data-bs-toggle="collapse"
|
||||
data-bs-target="#accordionPresupuestoFilesTip" aria-expanded="false"
|
||||
aria-controls="accordionPresupuestoFilesTip">
|
||||
<h3><?= lang("Presupuestos.files") ?></h3>
|
||||
<span><i class="ti-files ti-md ti"></i></span>
|
||||
<h4><?= lang("Presupuestos.files") ?></h4>
|
||||
</button>
|
||||
</h2>
|
||||
<div id="accordionPresupuestoFilesTip" class="accordion-collapse collapse"
|
||||
@ -22,11 +23,11 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12 gap-2">
|
||||
<button id="<?= $id ?>_btnUploadFiles" class="btn mt-3 btn-primary btn-submit waves-effect waves-light ml-2 ">
|
||||
<button id="<?= $id ?>_btnUploadFiles" class="btn mt-3 btn-sm btn-primary waves-effect waves-light ml-2 ">
|
||||
<span class="align-middle d-sm-inline-block d-none me-sm-1"><?= lang('App.global_upload_files') ?></span>
|
||||
<i class="ti ti-upload ti-xs"></i>
|
||||
</button>
|
||||
<button id="<?= $id ?>_btnSubmitFiles" class="btn mt-3 btn-success btn-submit waves-effect waves-light ml-2">
|
||||
<button id="<?= $id ?>_btnSubmitFiles" class="btn mt-3 btn-success btn-sm waves-effect waves-light ml-2">
|
||||
<span class="align-middle d-sm-inline-block d-none me-sm-1"><?= lang('App.global_save_file') ?></span>
|
||||
<i class="ti ti-device-floppy ti-xs"></i>
|
||||
</button>
|
||||
|
||||
@ -14,6 +14,7 @@
|
||||
<th><?= lang('Produccion.datatable.gramaje') ?></th>
|
||||
<th></th>
|
||||
<th><?= lang('Produccion.datatable.pliegos') ?></th>
|
||||
<th><?= lang('Produccion.datatable.tiempo') ?></th>
|
||||
<th class="text-nowrap"><?= lang('Basic.global.Action') ?></th>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -25,13 +26,14 @@
|
||||
<th></th>
|
||||
<th></th>
|
||||
<th><select class="select2 form-select-sm planning-papel-select" name="papel_impresion"></select></th>
|
||||
<th><input type="text" class="form-control planning-filter" name="gramaje"></th>
|
||||
<th><input type="text" class="form-control planning-filter" name="papel_gramaje"></th>
|
||||
<th>
|
||||
<div class="form-check mt-4">
|
||||
<input class="form-check-input" id="pliegos-check-all" type="checkbox" value="" />
|
||||
</div>
|
||||
</th>
|
||||
<th><span id="pliegos-sel-total"></span></th>
|
||||
<th><span id="horas-sel-total"></span></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
<th><?= lang('Produccion.datatable.corte') ?></th>
|
||||
<th></th>
|
||||
<th><?= lang('Produccion.datatable.metros') ?></th>
|
||||
|
||||
<th class="text-nowrap"><?= lang('Basic.global.Action') ?></th>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -26,7 +27,7 @@
|
||||
<th></th>
|
||||
<th></th>
|
||||
<th><select class="select2 form-select-sm planning-papel-select" name="papel_impresion"></select></th>
|
||||
<th><input type="text" class="form-control planning-filter" name="gramaje"></th>
|
||||
<th><input type="text" class="form-control planning-filter" name="papel_gramaje"></th>
|
||||
<th>
|
||||
<select class="select2 form-select-sm w-100" name="corte">
|
||||
<option value="0" default></option>
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
<h2 class="accordion-header">
|
||||
<button type="button" class="accordion-button" data-bs-toggle="collapse" data-bs-target="#accordionOtDatesTip" aria-expanded="false" aria-controls="accordionOtDatesTip">
|
||||
|
||||
<div class="d-flex flex-row justify-content-start align-items-stretch gap-2">
|
||||
<div class="d-flex flex-row justify-content-start align-items-stretch gap-2">
|
||||
<span><i class="ti-calendar ti-md ti"></i></span>
|
||||
<h4> Fechas </h4>
|
||||
</div>
|
||||
@ -40,32 +40,38 @@
|
||||
<!-- Date 5-->
|
||||
<div class="col-xs-12 col-md-4 col-lg-4 mb-2">
|
||||
<div class="row d-flex flex-column">
|
||||
<label for="ot-fecha-entrega" class="form-label"><?= @lang("Produccion.fecha_entrega_real") ?></label>
|
||||
<input type="date" class="form-control ot-date" placeholder="DD/MM/YYYY" name="fecha_entrega_real_at" id="ot-fecha-entrega-real" data-input />
|
||||
<label class="switch switch-danger switch-md mt-1">
|
||||
<input type="checkbox" class="switch-input ot-preview" name="fecha_entrega_warning" />
|
||||
<span class="switch-toggle-slider">
|
||||
<span class="switch-on">
|
||||
<i class="ti ti-alert-triangle"></i>
|
||||
<div>
|
||||
|
||||
<label for="ot-fecha-entrega" class="form-label"><?= @lang("Produccion.fecha_entrega_real") ?></label>
|
||||
<input type="date" class="form-control ot-date" placeholder="DD/MM/YYYY" name="fecha_entrega_real_at" id="ot-fecha-entrega-real" data-input />
|
||||
</div>
|
||||
<div class="d-flex flex-column">
|
||||
|
||||
<label class="switch switch-danger switch-lg mt-1">
|
||||
<input type="checkbox" class="switch-input ot-preview" name="fecha_entrega_warning" />
|
||||
<span class="switch-toggle-slider">
|
||||
<span class="switch-on">
|
||||
<i class="ti ti-alert-triangle"></i>
|
||||
</span>
|
||||
<span class="switch-off">
|
||||
<i class="ti ti-x"></i>
|
||||
</span>
|
||||
</span>
|
||||
<span class="switch-off">
|
||||
<i class="ti ti-x"></i>
|
||||
<span class="switch-label fw-large">Inaplazable</span>
|
||||
</label>
|
||||
<label class="switch switch-lg mt-1">
|
||||
<input type="checkbox" class="switch-input ot-preview" name="fecha_entrega_warning_revised" />
|
||||
<span class="switch-toggle-slider">
|
||||
<span class="switch-on">
|
||||
<i class="ti ti-check"></i>
|
||||
</span>
|
||||
<span class="switch-off">
|
||||
<i class="ti ti-x"></i>
|
||||
</span>
|
||||
</span>
|
||||
</span>
|
||||
<span class="switch-label">Inaplazable</span>
|
||||
</label>
|
||||
<label class="switch switch-md mt-1">
|
||||
<input type="checkbox" class="switch-input ot-preview" name="fecha_entrega_warning_revised" />
|
||||
<span class="switch-toggle-slider">
|
||||
<span class="switch-on">
|
||||
<i class="ti ti-check"></i>
|
||||
</span>
|
||||
<span class="switch-off">
|
||||
<i class="ti ti-x"></i>
|
||||
</span>
|
||||
</span>
|
||||
<span class="switch-label">Revisada</span>
|
||||
</label>
|
||||
<span class="switch-label fw-large">Revisada</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@ -0,0 +1,5 @@
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<?= view("themes/vuexy/components/dropzone",data: ['id' => 'dropzone-ot-files','modelId' => $modelId]) ?>
|
||||
</div><!--//.col -->
|
||||
</div><!--//.row -->
|
||||
@ -9,7 +9,7 @@
|
||||
</button>
|
||||
</h2>
|
||||
|
||||
<div id="accordionOtPortadaTip" class="accordion-collapse collapse show" data-bs-parent="#accordionOtPortada">
|
||||
<div id="accordionOtPortadaTip" class="accordion-collapse collapse" data-bs-parent="#accordionOtPortada">
|
||||
<div class="accordion-body">
|
||||
<div class="mb-3">
|
||||
<label for="formFile" class="form-label">Portada</label>
|
||||
@ -17,8 +17,8 @@
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="d-flex flex-row align-items-center justify-content-start gap-2">
|
||||
<button type="button" class="btn btn-primary" id="btn-upload-portada"><i class="ti ti-md ti-upload"></i>Subir portada </button>
|
||||
<button type="button" class="btn btn-danger" id="btn-delete-portada"><i class="ti ti-md ti-trash"></i>Eliminar </button>
|
||||
<button type="button" class="btn btn-primary btn-sm" id="btn-upload-portada"><i class="ti ti-sm ti-upload"></i>Subir portada </button>
|
||||
<button type="button" class="btn btn-danger btn-sm" id="btn-delete-portada"><i class="ti ti-sm ti-trash"></i>Eliminar </button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
<h2 class="accordion-header">
|
||||
<button type="button" class="accordion-button" data-bs-toggle="collapse" data-bs-target="#accordionOtProgressTip" aria-expanded="false" aria-controls="accordionOtProgressTip">
|
||||
|
||||
<div class="d-flex flex-row justify-content-start align-items-stretch gap-2">
|
||||
<div class="d-flex flex-row justify-content-start align-items-stretch gap-2">
|
||||
<span><i class="ti-list-details ti-md ti"></i></span>
|
||||
<h4> Progreso </h4>
|
||||
</div>
|
||||
@ -14,9 +14,9 @@
|
||||
<div class="accordion-body">
|
||||
<div class="row">
|
||||
<div class="col-md-12 mb-3">
|
||||
<label class="form-label" for="ot-progress-bar-parent"><?=@lang("App.progress") ?></label>
|
||||
<label class="form-label" for="ot-progress-bar-parent"><?= @lang("App.progress") ?></label>
|
||||
<div class="progress" id="ot-progress-bar-parent">
|
||||
<div id="ot-progress-bar" class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>
|
||||
<div id="ot-progress-bar" class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -34,7 +34,7 @@
|
||||
<!-- Progress -->
|
||||
<div class="col-xs-12 col-md-4 col-lg-4 mb-2">
|
||||
<label for="ot-ferro-ok" class="form-label"><?= @lang("Produccion.ferro_ok") ?></label>
|
||||
<input type="text" class="form-control ot-date" name="ferro_ok_at" placeholder="DD/MM/YYYY" id="ot-ferro-ok">
|
||||
<input type="text" class="form-control ot-date" name="ferro_ok_at" placeholder="DD/MM/YYYY" id="ot-ferro-ok">
|
||||
</div>
|
||||
<!-- Progress -->
|
||||
<div class="col-xs-12 col-md-4 col-lg-4 mb-2">
|
||||
@ -44,12 +44,12 @@
|
||||
<!-- Progress -->
|
||||
<div class="col-xs-12 col-md-4 col-lg-4 mb-2">
|
||||
<label for="ot-impresion-color" class="form-label"><?= @lang("Produccion.impresion_color") ?></label>
|
||||
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="interior_color_at" id="ot-impresion-color">
|
||||
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="interior_color_at" id="ot-impresion-color">
|
||||
</div>
|
||||
<!-- Progress -->
|
||||
<div class="col-xs-12 col-md-4 col-lg-4 mb-2">
|
||||
<label for="ot-portada" class="form-label"><?= @lang("Produccion.portada") ?></label>
|
||||
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="cubierta_at" id="ot-portada">
|
||||
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="cubierta_at" id="ot-portada">
|
||||
</div>
|
||||
<!-- Progress -->
|
||||
<div class="col-xs-12 col-md-4 col-lg-4 mb-2">
|
||||
@ -76,6 +76,15 @@
|
||||
<label for="ot-envio" class="form-label"><?= @lang("Produccion.envio") ?></label>
|
||||
<input type="text" class="form-control ot-date" placeholder="DD/MM/YYYY" name="envio_at" id="ot-envio">
|
||||
</div>
|
||||
<!-- <div class="col-xs-12 col-md-4 col-lg-4 mb-2">
|
||||
<label for="ot-estado" class="form-label"><?= @lang("Produccion.estado") ?></label>
|
||||
<select class="form-control ot-preview" name="estado" id="ot-estado">
|
||||
<option value="I">INICIADA</option>
|
||||
<option value="E">ERROR</option>
|
||||
<option value="P">PENDIENTE</option>
|
||||
</select>
|
||||
</div> -->
|
||||
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="row">
|
||||
@ -87,8 +96,21 @@
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="d-grip">
|
||||
<button type="button" id="btn-finalizar-orden-pedido" class="btn btn-primary btn-block w-100" <?=$ot->estado == "F" ? "disabled" : "" ?>><?=@lang("Produccion.finalizar_orden")?></button>
|
||||
<div class="d-flex flex-row justify-content-between align-items-center">
|
||||
<label class="switch switch-danger switch-lg mt-1">
|
||||
<input type="checkbox" class="switch-input ot-preview" id="ot-pedido-espera" name="is_pedido_espera" />
|
||||
<span class="switch-toggle-slider">
|
||||
<span class="switch-on">
|
||||
<i class="ti ti-alert-triangle"></i>
|
||||
</span>
|
||||
<span class="switch-off">
|
||||
<i class="ti ti-x"></i>
|
||||
</span>
|
||||
</span>
|
||||
<span class="switch-label fw-lg"><?= @lang("Produccion.pedido_espera") ?></span>
|
||||
<span class="badge text-bg-warning fw-lg" id="pedido_espera_by"></span>
|
||||
</label>
|
||||
<button type="button" id="btn-finalizar-orden-pedido" class="btn btn-primary btn-block" <?= $ot->estado == "F" ? "disabled" : "" ?>><?= @lang("Produccion.finalizar_orden") ?></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -9,41 +9,45 @@
|
||||
<?= view("themes/vuexy/form/produccion/ot/otHeader") ?>
|
||||
|
||||
<div class="row">
|
||||
<form id="ot-edit-form">
|
||||
<div class="col-md-12">
|
||||
<idv id="ot-edit-form">
|
||||
<div class="col-md-12 section-block">
|
||||
<?= view("themes/vuexy/form/produccion/ot/otPortada") ?>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
|
||||
<div class="col-md-12 section-block">
|
||||
<?= view("themes/vuexy/form/produccion/ot/otDates") ?>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="col-md-12 section-block">
|
||||
<?= view("themes/vuexy/form/produccion/ot/otDetails") ?>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="col-md-12 section-block">
|
||||
<?= view("themes/vuexy/form/produccion/ot/otProgress") ?>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="col-md-12 section-block">
|
||||
<?= view("themes/vuexy/form/produccion/ot/otTask") ?>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="col-md-12 section-block">
|
||||
<?= view("themes/vuexy/form/produccion/ot/otFiles") ?>
|
||||
</div>
|
||||
<div class="col-md-12 section-block">
|
||||
<?= view("themes/vuexy/form/produccion/ot/otCosts") ?>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="col-md-12 section-block">
|
||||
<?= view("themes/vuexy/form/produccion/ot/otComments") ?>
|
||||
</div>
|
||||
</form>
|
||||
<div class="col-md-12 mt-3">
|
||||
<div class="d-grip gap-2">
|
||||
<a type="button" class="btn btn-outline-danger btn-block mb-1" target="__blank" href="<?= "/produccion/ordentrabajo/pdf/" . $modelId ?>">
|
||||
</div>
|
||||
<div class="col-md-12 mt-3">
|
||||
<div class="d-grip gap-2">
|
||||
<a type="button" class="btn btn-outline-danger btn-block mb-1" target="__blank" href="<?= "/produccion/ordentrabajo/pdf/" . $modelId ?>">
|
||||
<span class="ti-sm ti ti-eye me-1"></span>
|
||||
<?= @lang("Produccion.preview_pdf") ?></a>
|
||||
<button type="button" class="btn btn-primary btn-block mb-1"><?= @lang("Produccion.imprimir_ferro") ?></button>
|
||||
<button type="button" class="btn btn-secondary btn-block mb-1"><?= @lang("Produccion.imprimir_codigo_safekat") ?></button>
|
||||
<button type="button" class="btn btn-primary btn-block mb-1"><?= @lang("Produccion.imprimir_ferro") ?></button>
|
||||
<button type="button" class="btn btn-secondary btn-block mb-1"><?= @lang("Produccion.imprimir_codigo_safekat") ?></button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Modal -->
|
||||
<div class="modal fade" id="modalCommentTarea" tabindex="-1" aria-hidden="true">
|
||||
<div class="modal-dialog" role="document">
|
||||
@ -67,6 +71,8 @@
|
||||
<?= $this->section('css') ?>
|
||||
<link rel="stylesheet" href="<?= site_url("themes/vuexy/vendor/libs/dropzone/dropzone.css") ?>" />
|
||||
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/spinkit/spinkit.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') ?>" />
|
||||
|
||||
|
||||
@ -74,6 +80,7 @@
|
||||
<?= $this->endSection() ?>
|
||||
<?= $this->section('additionalExternalJs') ?>
|
||||
<script src="<?= site_url("themes/vuexy/vendor/libs/dropzone/dropzone.js") ?>"></script>
|
||||
<script src="<?= site_url("themes/vuexy/vendor/libs/notiflix/notiflix.js") ?>"></script>
|
||||
<script src="<?= site_url("themes/vuexy/vendor/libs/bs-stepper/bs-stepper.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>
|
||||
|
||||
@ -23,7 +23,7 @@ const PREVIEW_TEMPLATE = `
|
||||
class FileUploadDropzone {
|
||||
|
||||
|
||||
constructor({ domElement, nameId = "presupuesto_id", getUri = null, postUri = null }) {
|
||||
constructor({ domElement, nameId = "presupuesto_id", getUri = null, postUri = null, resourcePath = "presupuestos" }) {
|
||||
Dropzone.autoDiscover = false;
|
||||
this.domElement = domElement
|
||||
this.jqElement = $(domElement)
|
||||
@ -35,6 +35,7 @@ class FileUploadDropzone {
|
||||
this.getUri = getUri
|
||||
this.postUri = postUri
|
||||
this.dataPost[nameId] = this.modelId;
|
||||
this.resourcePath = resourcePath
|
||||
|
||||
}
|
||||
init() {
|
||||
@ -58,19 +59,21 @@ class FileUploadDropzone {
|
||||
maxFilesize: 5e+7, // Bytes
|
||||
init: this._handleGetFiles.bind(this)
|
||||
});
|
||||
this.dropzone.on("addedfile", function (file) {
|
||||
if (file.hash) {
|
||||
var viewButton = Dropzone.createElement("<span class='dz-remove'>Ver</span>");
|
||||
file.previewElement.appendChild(viewButton);
|
||||
// Listen to the view button click event
|
||||
viewButton.addEventListener("click", function (e) {
|
||||
window.open(window.location.protocol + "//" + window.location.host + "/sistema/intranet/presupuestos/" + file.hash, '_blank');
|
||||
});
|
||||
}
|
||||
});
|
||||
this.dropzone.on("addedfile", this._handleAddedFile.bind(this));
|
||||
}
|
||||
}
|
||||
|
||||
_handleAddedFile(file) {
|
||||
if (file.hash) {
|
||||
var viewButton = Dropzone.createElement("<span class='dz-remove'>Ver</span>");
|
||||
file.previewElement.appendChild(viewButton);
|
||||
// Listen to the view button click event
|
||||
viewButton.addEventListener("click", this.onViewButton.bind(this,file));
|
||||
}
|
||||
}
|
||||
onViewButton(file) {
|
||||
console.log(window.location.protocol + "//" + window.location.host + "/sistema/intranet/" + this.resourcePath + "/" + file.hash)
|
||||
window.open(window.location.protocol + "//" + window.location.host + "/sistema/intranet/" + this.resourcePath + "/" + file.hash, '_blank');
|
||||
}
|
||||
_getDropzoneFilesFormData() {
|
||||
var files = this.dropzone.files;
|
||||
|
||||
@ -81,7 +84,7 @@ class FileUploadDropzone {
|
||||
|
||||
if (files[i].upload) {
|
||||
var file = files[i];
|
||||
formData.append('file[' + counter + ']', file);
|
||||
formData.append('file[]', file);
|
||||
counter += 1;
|
||||
}
|
||||
else {
|
||||
@ -146,7 +149,7 @@ class FileUploadDropzone {
|
||||
dropZoneAddFile(mockFile) {
|
||||
this.dropzone.files.push(mockFile); // add to files array
|
||||
this.dropzone.emit("addedfile", mockFile);
|
||||
this.dropzone.emit("thumbnail", mockFile, window.location.host + "/sistema/intranet/presupuestos/" + mockFile.hash);
|
||||
this.dropzone.emit("thumbnail", mockFile, window.location.host + "/sistema/intranet/" + this.resourcePath + "/" + mockFile.hash);
|
||||
this.dropzone.emit("complete", mockFile);
|
||||
this.dropzone.options.success.call(this.dropzone, mockFile);
|
||||
|
||||
|
||||
@ -3,11 +3,12 @@ import ClassSelect from "../../components/select2.js";
|
||||
import DatePicker from "../../components/datepicker.js";
|
||||
import { alertConfirmationDelete, alertSuccess } from "../../components/alerts/sweetAlert.js";
|
||||
import Modal from "../../components/modal.js"
|
||||
|
||||
import FileUploadDropzone from '../../components/forms/fileUploadDropzone.js';
|
||||
class OrdenTrabajo {
|
||||
constructor(domItem) {
|
||||
this.item = domItem
|
||||
this.otForm = this.item.find("#ot-edit-form")
|
||||
this.block = document.querySelector('.section-block');
|
||||
this.modelId = this.item.data("id");
|
||||
this.tareasTableItem = this.item.find("#ot-task-table");
|
||||
this.tareasId = []
|
||||
@ -16,6 +17,10 @@ class OrdenTrabajo {
|
||||
this.alertOrdenTrabajo = this.item.find("#alert-orden-trabajo");
|
||||
this.btnFinalizarPedido = this.item.find("#btn-finalizar-orden-pedido")
|
||||
this.btnResetTareas = this.item.find("#btn-reset-tareas")
|
||||
this.pedidoEnEsperaCheck = this.item.find("#ot-pedido-espera");
|
||||
this.pedidoEnEsperaBy = this.item.find("#pedido_espera_by");
|
||||
this.otEstado = this.item.find("#ot-estado");
|
||||
|
||||
this.datatableColumns = [
|
||||
{ data: 'orden', searchable: true, sortable: true, render: this._renderOrdenTarea.bind(this), width: "10%" },
|
||||
{ data: 'nombre', searchable: true, sortable: true, width: "20%" },
|
||||
@ -29,9 +34,24 @@ class OrdenTrabajo {
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* DROP ZONE FILES OT
|
||||
*/
|
||||
this.configUploadDropzone = {
|
||||
domElement: '#dropzone-ot-files',
|
||||
nameId: "orden_trabajo_id",
|
||||
getUri: '/produccion/ordentrabajo/get_files',
|
||||
postUri: '/produccion/ordentrabajo/upload_files',
|
||||
resourcePath : 'orden_trabajo/' + this.modelId
|
||||
}
|
||||
if ($(this.configUploadDropzone.domElement).length > 0) {
|
||||
this.fileUploadDropzone = new FileUploadDropzone(this.configUploadDropzone)
|
||||
}
|
||||
}
|
||||
initDropFiles(){
|
||||
if ($(this.configUploadDropzone.domElement).length > 0) {
|
||||
this.fileUploadDropzone.init()
|
||||
}
|
||||
}
|
||||
configDatePickers() {
|
||||
const option = {
|
||||
@ -90,6 +110,7 @@ class OrdenTrabajo {
|
||||
this.otForm.off("click", ".decrease-order")
|
||||
}
|
||||
init() {
|
||||
this.initDropFiles()
|
||||
this.configDatePickers()
|
||||
this.initDatatableTareas()
|
||||
this.tareasTableItem.on("draw.dt", this.createSelectMaquinaTarea.bind(this))
|
||||
@ -136,6 +157,7 @@ class OrdenTrabajo {
|
||||
return data
|
||||
}
|
||||
_handleGetData() {
|
||||
Notiflix.Block.circle('.section-block');
|
||||
const ajax = new Ajax(`/produccion/ordentrabajo/summary/${this.modelId}`,
|
||||
null,
|
||||
null,
|
||||
@ -265,11 +287,14 @@ class OrdenTrabajo {
|
||||
} finally {
|
||||
this.otForm.on("change", ".ot-date", this.handleDateChange.bind(this))
|
||||
this.otForm.on("change", ".ot-preview", this.handlePreimpresionReviewChange.bind(this))
|
||||
Notiflix.Block.remove('.section-block');
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
handleSummaryError(error) { }
|
||||
handleSummaryError(error) {
|
||||
Notiflix.Block.remove('.section-block');
|
||||
}
|
||||
fillPreimpresionReview() {
|
||||
this.otForm.find("[name=fecha_entrega_warning]").prop("checked", this.summaryData.ot.fecha_entrega_warning)
|
||||
this.otForm.find("[name=fecha_entrega_warning_revised]").prop("checked", this.summaryData.ot.fecha_entrega_warning_revised)
|
||||
@ -281,6 +306,7 @@ class OrdenTrabajo {
|
||||
this.otForm.find("[name=realizar_imposicion]").prop("checked", this.summaryData.ot.realizar_imposicion)
|
||||
this.otForm.find("[name=enviar_impresion]").prop("checked", this.summaryData.ot.enviar_impresion)
|
||||
|
||||
|
||||
}
|
||||
fillOtDetails() {
|
||||
const progreso = this.summaryData.ot.progreso
|
||||
@ -307,6 +333,14 @@ class OrdenTrabajo {
|
||||
this.espiral.setDate(this.summaryData.dates.fecha_impresion_at)
|
||||
this.embalaje.setDate(this.summaryData.dates.embalaje_at)
|
||||
this.envio.setDate(this.summaryData.dates.envio_at)
|
||||
this.pedidoEnEsperaCheck.prop("checked",this.summaryData.ot.is_pedido_espera);
|
||||
if(this.summaryData.ot.pedido_espera_by){
|
||||
this.pedidoEnEsperaBy.text([this.summaryData.ot.pedido_espera_by.first_name,this.summaryData.ot.pedido_espera_by.last_name].join(" "))
|
||||
}else{
|
||||
this.pedidoEnEsperaBy.text("");
|
||||
}
|
||||
this.otEstado.val(this.summaryData.ot.estado)
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -355,12 +389,15 @@ class OrdenTrabajo {
|
||||
},
|
||||
null,
|
||||
(response) => {
|
||||
|
||||
this._handleGetData();
|
||||
alertSuccess(response.message).fire()
|
||||
},
|
||||
null
|
||||
)
|
||||
ajax.post();
|
||||
}
|
||||
|
||||
handleDateChange(event) {
|
||||
const key = $(event.currentTarget).attr("name")
|
||||
const data = {}
|
||||
@ -382,6 +419,7 @@ class OrdenTrabajo {
|
||||
handleDateChangeSuccess(formItem, response) {
|
||||
formItem.addClass("is-valid")
|
||||
alertSuccess(response.message).fire()
|
||||
this._handleGetData();
|
||||
if (response.user) {
|
||||
formItem.parent().find(".form-text").remove()
|
||||
formItem.parent().append(`<div class="form-text">${[response.user.first_name, response.user.last_name].join(" ")}</div>`)
|
||||
@ -404,6 +442,7 @@ class OrdenTrabajo {
|
||||
|
||||
}
|
||||
handlePreimpresionReviewChangeSuccess(response) {
|
||||
this._handleGetData();
|
||||
alertSuccess(response.message).fire()
|
||||
|
||||
}
|
||||
|
||||
@ -13,8 +13,10 @@ class PlanningRotativa {
|
||||
this.papelImpresionHeader = this.item.find('#papel-impresion-name-header')
|
||||
this.papelImpresionPlanaHeader = this.item.find('#papel-impresion-name-plana-header')
|
||||
|
||||
|
||||
this.checkAllMetros = this.item.find("#metros-check-all")
|
||||
this.checkAllPliegos = this.item.find("#pliegos-check-all")
|
||||
this.tiempoPlanaTotal = this.tablePlanningPlana.find('#horas-sel-total')
|
||||
|
||||
this.datatableColumns = [
|
||||
{ data: 'otId', searchable: false, sortable: false, width: "3rem" },
|
||||
@ -25,10 +27,11 @@ class PlanningRotativa {
|
||||
{ data: 'papel_ancho', searchable: false, sortable: false, width: "5rem", render: d => `<span class="autonumeric">${d}</span>` },
|
||||
{ data: 'papel_alto', searchable: false, sortable: false, width: "5rem", render: d => `<span class="autonumeric">${d}</span>` },
|
||||
{ data: 'papel_impresion', searchable: false, sortable: false },
|
||||
{ data: 'papel_gramaje', searchable: false, sortable: false, width: "5rem", render: d => `<span class="autonumeric">${d}</span>` },
|
||||
{ data: 'papel_gramaje',name:"presupuesto_linea.gramaje", searchable: false, sortable: false, width: "5rem", render: d => `<span class="autonumeric">${d}</span>` },
|
||||
{ data: 'corte', searchable: false, sortable: false, render: this.renderCorteImage.bind(this), width: "10rem" },
|
||||
{ data: 'metros_check', searchable: false, sortable: false, render: d => `<input class="form-check-input metros-check" data-id="${d}" type="checkbox" value="" />` },
|
||||
{ data: 'metros', searchable: false, sortable: false, render: d => `<span class="autonumeric">${d}</span>` },
|
||||
|
||||
{ data: 'action', searchable: false, sortable: false, render: this._renderBtnAction },
|
||||
|
||||
]
|
||||
@ -41,9 +44,10 @@ class PlanningRotativa {
|
||||
{ data: 'papel_ancho', searchable: false, sortable: false, width: "5rem", render: d => `<span class="autonumeric">${d}</span>` },
|
||||
{ data: 'papel_alto', searchable: false, sortable: false, width: "5rem", render: d => `<span class="autonumeric">${d}</span>` },
|
||||
{ data: 'papel_impresion', searchable: false, sortable: false },
|
||||
{ data: 'papel_gramaje', searchable: false, sortable: false, width: "5rem", render: d => `<span class="autonumeric">${d}</span>` },
|
||||
{ data: 'papel_gramaje', name:"presupuesto_linea.gramaje", searchable: false, sortable: false, width: "5rem", render: d => `<span class="autonumeric">${d}</span>` },
|
||||
{ data: 'pliegos_check', searchable: false, sortable: false, render: d => `<input class="form-check-input pliegos-check" data-id="${d}" type="checkbox" value="" />` },
|
||||
{ data: 'pliegosPedido', searchable: false, sortable: false, render: d => `<span class="autonumeric">${d}</span>` },
|
||||
{ data: 'tiempo_real_sum', searchable: false, sortable: false,render: d => this.formatSeconds(parseFloat(d))},
|
||||
{ data: 'action', searchable: false, sortable: false, render: this._renderBtnAction },
|
||||
|
||||
]
|
||||
@ -112,6 +116,7 @@ class PlanningRotativa {
|
||||
this.totalMetrosSel = new AutoNumeric(this.item.find('#metros-sel-total')[0], autoNumericOptions);
|
||||
this.totalPliegos = new AutoNumeric(this.item.find('#total-pliegos')[0], autoNumericPliegosOptions);
|
||||
this.totalPliegosSel = new AutoNumeric(this.item.find('#pliegos-sel-total')[0], autoNumericPliegosOptions);
|
||||
|
||||
this.maquinaSelectFilter.init()
|
||||
this.papelImpresionFilter.init()
|
||||
this.maquinaSelectFilterPlana.init()
|
||||
@ -261,25 +266,27 @@ class PlanningRotativa {
|
||||
}
|
||||
getPapelImpresionSuccess(response) {
|
||||
this.papelImpresionFilter.setOption(response.id, response.nombre)
|
||||
this.tablePlanningRot.find('input[name=gramaje]').val(response.gramaje).trigger("change")
|
||||
this.tablePlanningRot.find('input[name=papel_gramaje]').val(response.gramaje).trigger("change")
|
||||
this.papelImpresionHeader.text(response.nombre)
|
||||
}
|
||||
getPapelImpresionError(response) { }
|
||||
getPapelImpresionPlanaSuccess(response) {
|
||||
this.papelImpresionFilterPlana.setOption(response.id, response.nombre)
|
||||
this.tablePlanningPlana.find('input[name=gramaje]').val(response.gramaje).trigger("change")
|
||||
this.tablePlanningPlana.find('input[name=papel_gramaje]').val(response.gramaje).trigger("change")
|
||||
this.papelImpresionPlanaHeader.text(response.nombre)
|
||||
}
|
||||
getPapelImpresionPlanaError(response) { }
|
||||
formatSeconds(s) {
|
||||
return [parseInt(s / 60 / 60), parseInt(s / 60 % 60)].join(':').replace(/\b(\d)\b/g, '0$1');
|
||||
const hours = Math.floor(s / 60 / 60)
|
||||
const minutes = Math.floor(s / 60 % 60)
|
||||
return [hours, minutes].join(':').replace(/\b(\d)\b/g, '0$1');
|
||||
}
|
||||
addTotalFooter() {
|
||||
const seconds = this.papelGramajeDatatable.column(5).data().reduce((a, b) => {
|
||||
return parseFloat(a) + parseFloat(b)
|
||||
}, 0)
|
||||
const metros = this.papelGramajeDatatable.column(4).data().map((e) => parseFloat(e))
|
||||
$('#total-tiempo-papel').text(this.formatSeconds(seconds))
|
||||
$('#total-tiempo-papel').text(this.formatSeconds(parseInt(seconds)))
|
||||
this.totalMetros.set(metros.reduce((a, b) => a + b, 0))
|
||||
|
||||
|
||||
@ -305,7 +312,14 @@ class PlanningRotativa {
|
||||
const metros_sel = this.datatablePlanningPlana.rows((idx, data, node) => {
|
||||
return $(node).find('input[type="checkbox"]').prop('checked');
|
||||
}).data().toArray().map((e) => parseInt(e.pliegosPedido))
|
||||
const tiempo_total_sel = this.datatablePlanningPlana.rows((idx, data, node) => {
|
||||
return $(node).find('input[type="checkbox"]').prop('checked');
|
||||
}).data().toArray().map((e) => parseFloat(e.tiempo_real_sum))
|
||||
this.totalPliegosSel.set(metros_sel.reduce((a, b) => a + b, 0))
|
||||
const totalSeconds = tiempo_total_sel.reduce((a,b) => a+b,0)
|
||||
console.log("Total seconds",totalSeconds);
|
||||
this.tiempoPlanaTotal.text(this.formatSeconds(totalSeconds))
|
||||
|
||||
|
||||
}
|
||||
renderCorteImage(data) {
|
||||
|
||||
3
httpdocs/themes/vuexy/vendor/libs/notiflix/notiflix-aio-3.2.8.min.js
vendored
Normal file
3
httpdocs/themes/vuexy/vendor/libs/notiflix/notiflix-aio-3.2.8.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
3
httpdocs/themes/vuexy/vendor/libs/notiflix/notiflix-block.js
vendored
Normal file
3
httpdocs/themes/vuexy/vendor/libs/notiflix/notiflix-block.js
vendored
Normal file
File diff suppressed because one or more lines are too long
3
httpdocs/themes/vuexy/vendor/libs/notiflix/notiflix-confirm-aio-3.2.8.min.js
vendored
Normal file
3
httpdocs/themes/vuexy/vendor/libs/notiflix/notiflix-confirm-aio-3.2.8.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
3
httpdocs/themes/vuexy/vendor/libs/notiflix/notiflix-loading-aio-3.2.8.min.js
vendored
Normal file
3
httpdocs/themes/vuexy/vendor/libs/notiflix/notiflix-loading-aio-3.2.8.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
3
httpdocs/themes/vuexy/vendor/libs/notiflix/notiflix-notify-aio-3.2.8.min.js
vendored
Normal file
3
httpdocs/themes/vuexy/vendor/libs/notiflix/notiflix-notify-aio-3.2.8.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
3
httpdocs/themes/vuexy/vendor/libs/notiflix/notiflix-report-aio-3.2.8.min.js
vendored
Normal file
3
httpdocs/themes/vuexy/vendor/libs/notiflix/notiflix-report-aio-3.2.8.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
3
httpdocs/themes/vuexy/vendor/libs/notiflix/notiflix.css
vendored
Normal file
3
httpdocs/themes/vuexy/vendor/libs/notiflix/notiflix.css
vendored
Normal file
File diff suppressed because one or more lines are too long
3
httpdocs/themes/vuexy/vendor/libs/notiflix/notiflix.js
vendored
Normal file
3
httpdocs/themes/vuexy/vendor/libs/notiflix/notiflix.js
vendored
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user