update with ot files

This commit is contained in:
amazuecos
2025-04-04 00:52:41 +02:00
parent 00ff185cf1
commit 3d6e8b4886
9 changed files with 174 additions and 17 deletions

View File

@ -6,6 +6,7 @@ use App\Controllers\Produccion\Ordentrabajo;
use App\Database\Migrations\OrdenTrabajoDatesTable; use App\Database\Migrations\OrdenTrabajoDatesTable;
use App\Entities\Pedidos\PedidoEntity; use App\Entities\Pedidos\PedidoEntity;
use App\Models\OrdenTrabajo\OrdenTrabajoDate; use App\Models\OrdenTrabajo\OrdenTrabajoDate;
use App\Models\OrdenTrabajo\OrdenTrabajoFileModel;
use App\Models\OrdenTrabajo\OrdenTrabajoTarea; use App\Models\OrdenTrabajo\OrdenTrabajoTarea;
use App\Models\OrdenTrabajo\OrdenTrabajoUser; use App\Models\OrdenTrabajo\OrdenTrabajoUser;
use App\Models\Pedidos\PedidoModel; use App\Models\Pedidos\PedidoModel;
@ -109,4 +110,9 @@ class OrdenTrabajoEntity extends Entity
$barcodeData = $barcode->getBarcode($this->pedido()->presupuesto()->id); $barcodeData = $barcode->getBarcode($this->pedido()->presupuesto()->id);
return base64_encode($renderer->render($barcodeData,200, 50)); return base64_encode($renderer->render($barcodeData,200, 50));
} }
public function files() : array
{
$m = model(OrdenTrabajoFileModel::class);
return $m->where('orden_trabajo_id',$this->attributes['id'])->findAll() ?? [];
}
} }

View 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];
}
}

View 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 = [];
}

View File

@ -15,15 +15,18 @@ use App\Models\OrdenTrabajo\OrdenTrabajoUser;
use App\Models\Usuarios\UserModel; use App\Models\Usuarios\UserModel;
use CodeIgniter\Config\BaseService; use CodeIgniter\Config\BaseService;
use App\Entities\Configuracion\Maquina as MaquinaEntity; use App\Entities\Configuracion\Maquina as MaquinaEntity;
use App\Entities\Produccion\OrdenTrabajoFileEntity;
use App\Entities\Produccion\OrdenTrabajoTareaEntity; use App\Entities\Produccion\OrdenTrabajoTareaEntity;
use App\Models\Configuracion\ConfigVariableModel; use App\Models\Configuracion\ConfigVariableModel;
use App\Models\Configuracion\MaquinaModel; use App\Models\Configuracion\MaquinaModel;
use App\Models\OrdenTrabajo\OrdenTrabajoFileModel;
use CodeIgniter\Database\BaseBuilder; use CodeIgniter\Database\BaseBuilder;
use CodeIgniter\Database\BaseResult; use CodeIgniter\Database\BaseResult;
use CodeIgniter\Database\Exceptions\DatabaseException; use CodeIgniter\Database\Exceptions\DatabaseException;
use CodeIgniter\Files\File;
use CodeIgniter\HTTP\Files\UploadedFile;
use CodeIgniter\I18n\Time; use CodeIgniter\I18n\Time;
use CodeIgniter\Model; use Exception;
use Dompdf\Dompdf;
/** /**
* Clase con las funcionalidades necesarias trabajar con las ordenes de trabajo. * Clase con las funcionalidades necesarias trabajar con las ordenes de trabajo.
@ -39,6 +42,7 @@ class ProductionService extends BaseService
protected OrdenTrabajoDate $otDate; protected OrdenTrabajoDate $otDate;
protected OrdenTrabajoUser $otUser; protected OrdenTrabajoUser $otUser;
protected OrdenTrabajoEntity $ot; protected OrdenTrabajoEntity $ot;
protected OrdenTrabajoFileModel $otFileModel;
protected UserModel $userModel; protected UserModel $userModel;
protected string $defaultMaquinaCorteName = 'HT-1000'; protected string $defaultMaquinaCorteName = 'HT-1000';
protected MaquinaEntity $defaultMaquinaCorte; protected MaquinaEntity $defaultMaquinaCorte;
@ -80,6 +84,7 @@ class ProductionService extends BaseService
$this->otTarea = model(OrdenTrabajoTarea::class); $this->otTarea = model(OrdenTrabajoTarea::class);
$this->otUser = model(OrdenTrabajoUser::class); $this->otUser = model(OrdenTrabajoUser::class);
$this->userModel = model(UserModel::class); $this->userModel = model(UserModel::class);
$this->otFileModel = model(OrdenTrabajoFileModel::class);
} }
public function init(int $orden_trabajo_id): self public function init(int $orden_trabajo_id): self
{ {
@ -894,7 +899,8 @@ class ProductionService extends BaseService
->join("lg_papel_impresion", "presupuesto_linea.papel_impresion_id = lg_papel_impresion.id", "left") ->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") ->join("lg_papel_formato", "lg_papel_formato.id = presupuestos.papel_formato_id", "left")
->where("orden_trabajo_tareas.deleted_at", null) ->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) ->whereIn("presupuesto_linea.tipo", $this->TIPOS_PLANA)
->groupBy('lg_papel_impresion.id'); ->groupBy('lg_papel_impresion.id');
if ($q) { if ($q) {
@ -926,4 +932,37 @@ class ProductionService extends BaseService
{ {
return $this->otTarea->where('orden_trabajo_id', $ot_id)->where('is_corte', true)?->first()->tipo_corte ?? null; 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)');
}
}
} }

View File

@ -22,11 +22,11 @@
</div> </div>
</div> </div>
<div class="col-md-12 gap-2"> <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-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> <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> <i class="ti ti-upload ti-xs"></i>
</button> </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 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> <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> <i class="ti ti-device-floppy ti-xs"></i>
</button> </button>

View File

@ -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 -->

View File

@ -9,10 +9,13 @@
<?= view("themes/vuexy/form/produccion/ot/otHeader") ?> <?= view("themes/vuexy/form/produccion/ot/otHeader") ?>
<div class="row"> <div class="row">
<form id="ot-edit-form"> <idv id="ot-edit-form">
<div class="col-md-12"> <div class="col-md-12">
<?= view("themes/vuexy/form/produccion/ot/otPortada") ?> <?= view("themes/vuexy/form/produccion/ot/otPortada") ?>
</div> </div>
<div class="col-md-12">
<?= view("themes/vuexy/form/produccion/ot/otFiles") ?>
</div>
<div class="col-md-12"> <div class="col-md-12">
<?= view("themes/vuexy/form/produccion/ot/otDates") ?> <?= view("themes/vuexy/form/produccion/ot/otDates") ?>
</div> </div>
@ -31,19 +34,19 @@
<div class="col-md-12"> <div class="col-md-12">
<?= view("themes/vuexy/form/produccion/ot/otComments") ?> <?= view("themes/vuexy/form/produccion/ot/otComments") ?>
</div> </div>
</form> </div>
<div class="col-md-12 mt-3"> <div class="col-md-12 mt-3">
<div class="d-grip gap-2"> <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 ?>"> <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> <span class="ti-sm ti ti-eye me-1"></span>
<?= @lang("Produccion.preview_pdf") ?></a> <?= @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-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-secondary btn-block mb-1"><?= @lang("Produccion.imprimir_codigo_safekat") ?></button>
</div>
</div> </div>
</div> </div>
</div> </div>
</div>
<!-- Modal --> <!-- Modal -->
<div class="modal fade" id="modalCommentTarea" tabindex="-1" aria-hidden="true"> <div class="modal fade" id="modalCommentTarea" tabindex="-1" aria-hidden="true">
<div class="modal-dialog" role="document"> <div class="modal-dialog" role="document">

View File

@ -81,7 +81,7 @@ class FileUploadDropzone {
if (files[i].upload) { if (files[i].upload) {
var file = files[i]; var file = files[i];
formData.append('file[' + counter + ']', file); formData.append('file[]', file);
counter += 1; counter += 1;
} }
else { else {

View File

@ -3,6 +3,7 @@ import ClassSelect from "../../components/select2.js";
import DatePicker from "../../components/datepicker.js"; import DatePicker from "../../components/datepicker.js";
import { alertConfirmationDelete, alertSuccess } from "../../components/alerts/sweetAlert.js"; import { alertConfirmationDelete, alertSuccess } from "../../components/alerts/sweetAlert.js";
import Modal from "../../components/modal.js" import Modal from "../../components/modal.js"
import FileUploadDropzone from '../../components/forms/fileUploadDropzone.js';
class OrdenTrabajo { class OrdenTrabajo {
constructor(domItem) { constructor(domItem) {
@ -29,9 +30,23 @@ 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'
}
if ($(this.configUploadDropzone.domElement).length > 0) {
this.fileUploadDropzone = new FileUploadDropzone(this.configUploadDropzone)
}
}
initDropFiles(){
if ($(this.configUploadDropzone.domElement).length > 0) {
this.fileUploadDropzone.init()
}
} }
configDatePickers() { configDatePickers() {
const option = { const option = {
@ -90,6 +105,7 @@ class OrdenTrabajo {
this.otForm.off("click", ".decrease-order") this.otForm.off("click", ".decrease-order")
} }
init() { init() {
this.initDropFiles()
this.configDatePickers() this.configDatePickers()
this.initDatatableTareas() this.initDatatableTareas()
this.tareasTableItem.on("draw.dt", this.createSelectMaquinaTarea.bind(this)) this.tareasTableItem.on("draw.dt", this.createSelectMaquinaTarea.bind(this))