Merge branch 'dev/actualizar_presupuesto' into 'main'

Dev/actualizar presupuesto

See merge request jjimenez/safekat!197
This commit is contained in:
2024-04-01 15:25:41 +00:00
21 changed files with 108844 additions and 344 deletions

View File

@ -102,6 +102,10 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
$sanitizedData['papel_formato_id'] = 0;
}
if (!isset($sanitizedData['is_duplicado']) || $sanitizedData['is_duplicado'] == null) {
$sanitizedData['is_duplicado'] = 0;
}
$noException = true;
if ($successfulResult = $this->canValidate($this->model->validationRulesAdd, $this->model->validationMessagesAdd)) : // if ($successfulResult = $this->validate($this->formValidationRules) ) :
@ -191,10 +195,13 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
$sanitizedData = $this->sanitized($postData, $nullIfEmpty);
// JJO
$sanitizedData['user_updated_id'] = $session->id_user;
if ($this->request->getPost('is_duplicado') == null) {
$sanitizedData['is_duplicado'] = 0;
}
if ($this->request->getPost('retractilado') == null) {
$sanitizedData['retractilado'] = false;
}
@ -339,28 +346,33 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
$this->viewData['papelGenericoRotativaNegroList'] = $this->getPapelGenericoRotativaNegro();
$this->viewData['papelGenericoRotativaColorList'] = $this->getPapelGenericoRotativaColor();
$this->viewData['direccionesList'] = $this->getDirecciones($id);
// Acabados exteriores
$this->viewData['acabadosCubierta'] = $this->getAcabadosCubierta();
$this->viewData['acabadosSobrecubierta'] = $this->getAcabadosSobrecubierta();
// Lineas Presupuesto
$this->viewData['lineasPresupuesto'] = (new PresupuestoLineaModel())->getLineasPresupuesto($id);
[$cambios_lineas, $this->viewData['lineasPresupuesto']] = $this->getLineasPresupuesto($presupuestoEntity);
$this->viewData['presupuestoEntity']->cambios_lineas=$cambios_lineas;
// Tarifas
$this->viewData['serviciosAcabado'] = $this->getServiciosAcabado();
// Servicios
$this->viewData['serviciosPreimpresion'] = $this->getServiciosPreimpresion();
$this->viewData['serviciosPreimpresion'] = $this->getServiciosPreimpresion();
$this->viewData['serviciosEncuadernacion'] = $this->getServiciosEncuadernacion();
$this->viewData['serviciosManipulado'] = $this->getServiciosManipulado();
$this->viewData['serviciosEncuadernacionList'] = (new PresupuestoEncuadernacionesModel())->getResource($id)->get()->getResultObject();
$this->viewData['serviciosAcabadosList'] = (new PresupuestoAcabadosModel())->getResource($id)->get()->getResultObject();
$this->viewData['serviciosManipuladoList'] = (new PresupuestoManipuladosModel())->getResource($id)->get()->getResultObject();
$this->viewData['serviciosPreimpresionList'] = (new PresupuestoPreimpresionesModel())->getResource($id)->get()->getResultObject();
$this->viewData['serviciosAcabado'] = $this->getServiciosAcabado();
[$cambios_en_servicios, $servicios] = $this->getLineasServicios($presupuestoEntity);
$this->viewData['presupuestoEntity']->cambios_servicios=$cambios_en_servicios;
$this->viewData['serviciosEncuadernacionList'] = $servicios->serviciosEncuadernacion;
$this->viewData['serviciosAcabadosList'] = $servicios->serviciosAcabado;
$this->viewData['serviciosManipuladoList'] = $servicios->serviciosManipulado;
$this->viewData['serviciosPreimpresionList'] = $servicios->serviciosPreimpresion;
// Direciones presupuesto
$this->viewData['presupuestoDirecciones'] = (new PresupuestoDireccionesModel())->getResource("", $id)->get()->getResultObject();
[$cambios_en_direcciones, $this->viewData['direccionesList']] = $this->getLineasDirecciones($presupuestoEntity);
$this->viewData['presupuestoEntity']->cambios_direcciones=$cambios_en_direcciones;
$this->viewData['POD'] = $this->getPOD();
$this->viewData['serviciosAutomaticos'] = [
@ -378,8 +390,13 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
$this->viewData['formAction'] = route_to('updateCosidotapablanda', $id);
$this->viewData['boxTitle'] = lang('Basic.global.edit2') . ' ' . $this->viewData['pageTitle'] . ' ' . lang('Basic.global.edit3');
// Si se ha llamado a esta funcion porque se ha duplicado el presupuesto
// se actualiza la bbdd para que sólo ejecute algunas funciones una vez
if($presupuestoEntity->is_duplicado){
$this->model->removeIsDuplicado($presupuestoEntity->id);
}
$this->viewData['boxTitle'] = lang('Basic.global.edit2') . ' ' . $this->viewData['pageTitle'] . ' ' . lang('Basic.global.edit3');
return $this->displayForm(__METHOD__, $id);
} // end function edit(...)
@ -524,6 +541,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
$item->ws_externo_json_data = character_limiter($item->ws_externo_json_data, 100);
endif;
endforeach;
} else {
$isColor = $reqData['color'] ?? false;
@ -548,7 +566,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
$cliente_id = $reqData['cliente_id'] ?? -1;
$resourceData = [];
if ($type == 'interior' || $type == 'guardas') {
@ -568,6 +586,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
}
if ($type == 'guardas') {
$datosPedido->paginas_impresion = intval($reqData['paginas_impresion']) ?? 0;
// Para el caso de Fresado y Cosido tapa dura, las guardas son un diptico
// y hay que imprimirlas como "cosido" (dos hojas pegadas). En el caso de espiral
@ -581,16 +600,21 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
$a_favor_fibra = $reqData['a_favor_fibra'] ?? false;
$resourceData = $this->getCompIntData($type, $datosPedido, $papel_generico, $gramaje, $isColor, $isHq, $cliente_id, $datosTipolog, $a_favor_fibra);
$input_data = array(
'uso' => $type,
'tipo_impresion_id' => $tipo_impresion_id,
'datosPedido' => $datosPedido,
'papel_generico' => $papel_generico,
'gramaje' => $gramaje,
'isColor' => $isColor,
'isHq' => $isHq,
'cliente_id' => $cliente_id,
'datosTipolog' => $datosTipolog,
'a_favor_fibra' => $a_favor_fibra
);
$newTokenHash = csrf_hash();
$csrfTokenName = csrf_token();
$data = [
'lineas' => $resourceData,
$csrfTokenName => $newTokenHash
];
$resourceData = PresupuestoService::obtenerComparadorPlana($input_data);
return $this->respond($data);
} else if ($type == 'interior_rot') {
$paginas = (object)array(
@ -612,36 +636,45 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
array_push($datosTipolog, $data);
}
$resourceData = $this->getCompIntRotData($datosPedido, $papel_generico, $gramaje, $paginas, $cliente_id, $datosTipolog);
$newTokenHash = csrf_hash();
$csrfTokenName = csrf_token();
$data = [
'lineas' => $resourceData,
$csrfTokenName => $newTokenHash
$input_data = [
'datosPedido' => $datosPedido,
'papel_generico' => $papel_generico,
'gramaje' => $gramaje,
'paginas' => $paginas,
'cliente_id' => $cliente_id,
'datosTipolog' => $datosTipolog
];
$resourceData = PresupuestoService::obtenerComparadorRotativa($input_data);
return $this->respond($data);
} else if ($type == 'cubierta' || $type == 'sobrecubierta') {
$datosPedido->solapas = $reqData['solapas'];
$datosPedido->solapas_ancho = $reqData['solapas_ancho'];
$datosPedido->lomo = $reqData['lomo'];
$datosPedido->anchoExteriores = PresupuestoService::getAnchoTotalExteriores($type, $tipo_impresion_id, $datosPedido);
$datosPedido->altoExteriores = PresupuestoService::getAltoTotalExteriores($type, $tipo_impresion_id, $datosPedido);
// Cubierta y sobrecubierta siempre color HQ
$resourceData = $this->getCompIntData($type, $datosPedido, $papel_generico, $gramaje, $isColor, 1, $cliente_id);
$newTokenHash = csrf_hash();
$csrfTokenName = csrf_token();
$data = [
'lineas' => $resourceData,
$csrfTokenName => $newTokenHash
];
return $this->respond($data);
$input_data = array(
'uso' => $type,
'tipo_impresion_id' => $tipo_impresion_id,
'datosPedido' => $datosPedido,
'papel_generico' => $papel_generico,
'gramaje' => $gramaje,
'isColor' => 1, // Cubierta y sobrecubierta siempre color HQ
'isHq' => 1,
'cliente_id' => $cliente_id,
);
$resourceData = PresupuestoService::obtenerComparadorPlana($input_data);
}
$newTokenHash = csrf_hash();
$csrfTokenName = csrf_token();
$data = [
'lineas' => $resourceData,
$csrfTokenName => $newTokenHash
];
return $this->respond($data);
}
return $this->respond(Collection::datatable(
@ -809,215 +842,75 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
return $viewData;
}
private function getCompIntData($uso, $datosPedido, $papel_generico, $gramaje, $isColor, $isHq, $cliente_id, $datosTipolog = null, $a_favor_fibra = false)
{
$tipo = $isColor ? ($isHq ? 'colorhq' : 'color') : ($isHq ? 'negrohq' : 'negro');
$opciones_papel = PresupuestoService::get_opciones_papel($uso, $isColor);
// Se obtienen los papeles disponibles
$papelimpresionmodel = new PapelImpresionModel();
$papeles = $papelimpresionmodel->getIdPapelesImpresionForPresupuesto(
papel_generico_id: $papel_generico['id'],
gramaje: $gramaje,
options: $opciones_papel
);
$lineas = array();
// Para cada papel, se obtienen las maquinas disponibles
foreach ($papeles as $papel) {
$maquinamodel = new MaquinaModel();
$maquinas = $maquinamodel->getMaquinaImpresionForPresupuesto(
is_rotativa: 0,
tarifa_tipo: $tipo,
uso_tarifa: ($uso == 'guardas') ? 'interior' : $uso,
tirada: $datosPedido->tirada + $datosPedido->merma,
papel_impresion_id: $papel->id,
);
// Se recorren las máquinas y se calcula el coste de linea por cada una
foreach ($maquinas as $maquina) {
$data['uso'] = $uso;
$data['tipo'] = $tipo;
$data['datosPedido'] = $datosPedido;
$data['cliente_id'] = $cliente_id;
$data['papel'] = $papel;
$data['opciones_papel'] = $opciones_papel;
$data['maquina'] = $maquina;
$data['papel_generico'] = $papel_generico;
$data['isColor'] = $isColor;
$data['a_favor_fibra'] = $a_favor_fibra;
$data['datosTipolog'] = $datosTipolog;
$data['gramaje'] = $gramaje;
$linea = PresupuestoService::getLineaPresupuestoPlana($data);
if(empty($linea))
continue;
array_push($lineas, $linea);
}
}
return $lineas;
}
/**
* Duplica un presupuesto dado por su ID.
*
* Esta función duplica un presupuesto y todas sus entidades relacionadas como acabados, encuadernaciones, manipulados,
* preimpresiones, direcciones y lineas. El presupuesto duplicado se marca como tal y a su título se le añade
* una cadena 'duplicado'. La función devuelve un array con un estado de éxito y el ID del nuevo presupuesto.
*
* @param int $id El ID del presupuesto a duplicar.
* @return array Un array asociativo que contiene una clave 'success' que indica el estado de éxito de la operación,
* y una clave 'id' que contiene el ID del nuevo presupuesto si la operación fue exitosa.
* Si ocurre una excepción, la clave 'success' será false y una clave 'message' contendrá el mensaje de la excepción.
* @throws \Exception Si ocurre un error durante la operación.
*/
private function duplicarPresupuesto($id){
try{
$presupuesto = $this->model->find($id);
$presupuesto->titulo = $presupuesto->titulo .' - ' . lang('Presupuestos.duplicado');
$new_id = $this->model->insert($presupuesto);
$presupuestoAcabadosModel = model('App\Models\Presupuestos\PresupuestoAcabadosModel');
foreach ($presupuestoAcabadosModel->where('presupuesto_id', $presupuesto->id)->findAll() as $acabado) {
$acabado->presupuesto_id = $new_id;
$presupuestoAcabadosModel->insert($acabado);
}
$presupuestoEncuadernacionesModel = model('App\Models\Presupuestos\PresupuestoEncuadernacionesModel');
foreach ($presupuestoEncuadernacionesModel->where('presupuesto_id', $presupuesto->id)->findAll() as $encuadernacion) {
$encuadernacion->presupuesto_id = $new_id;
$presupuestoEncuadernacionesModel->insert($encuadernacion);
}
$presupuestoManipuladosModel = model('App\Models\Presupuestos\PresupuestoManipuladosModel');
foreach ($presupuestoManipuladosModel->where('presupuesto_id', $presupuesto->id)->findAll() as $manipulado) {
$manipulado->presupuesto_id = $new_id;
$presupuestoManipuladosModel->insert($manipulado);
}
$presupuestoPreimpresionesModel = model('App\Models\Presupuestos\PresupuestoPreimpresionesModel');
foreach ($presupuestoPreimpresionesModel->where('presupuesto_id', $presupuesto->id)->findAll() as $preimpresion) {
$preimpresion->presupuesto_id = $new_id;
$presupuestoPreimpresionesModel->insert($preimpresion);
}
$presupuestoDireccionesModel = model('App\Models\Presupuestos\PresupuestoDireccionesModel');
foreach ($presupuestoDireccionesModel->where('presupuesto_id', $presupuesto->id)->findAll() as $direccion) {
$direccion->presupuesto_id = $new_id;
$presupuestoDireccionesModel->insert($direccion);
}
$presupuestoLineaModel = model('App\Models\Presupuestos\PresupuestoLineaModel');
$presupuestoLineaModel->duplicateLineasPresupuesto($presupuesto->id, $new_id);
return [
'success' => true,
'id' => $new_id
];
}catch(\Exception $e){
return [
'success' => false,
'message' => $e->getMessage()
];
}
}
private function getCompIntRotData($datosPedido, $papel_generico, $gramaje, $paginas, $cliente_id, $datosTipolog = null)
{
$uso = 'interior';
$tipo = $paginas->color > 0 ? 'color' : 'negro';
$parametrosRotativa = (object)array(
'a_favor_fibra' => $datosPedido->a_favor_fibra,
'bnPages' => $paginas->negro,
'colorPages' => $paginas->color,
'rotativa_gota_negro' => 0,
'rotativa_gota_color' => 0,
);
$opciones_papel = array(
'rotativa' => 1,
);
$tipo = array();
if ($paginas->color > 0) {
$tipo = 'color';
$opciones_papel['color'] = 1;
}
else {
$opciones_papel['bn'] = 1;
$tipo = 'negro';
}
// Se obtienen los papeles disponibles
$papelimpresionmodel = new PapelImpresionModel();
$papeles = $papelimpresionmodel->getIdPapelesImpresionForPresupuesto(
papel_generico_id: $papel_generico['id'],
gramaje: $gramaje,
options: $opciones_papel
);
$lineas = array();
// Para cada papel, se obtienen las maquinas disponibles
foreach ($papeles as $papel) {
$papelImpresionTipologiaModel = new \App\Models\Configuracion\PapelImpresionTipologiaModel();
if (is_null($datosTipolog)) {
$datosTipologias = $papelImpresionTipologiaModel
->findTipologiasForPapelImpresion($papel->id, $parametrosRotativa->colorPages > 0 ? 'color' : 'negro')
->get()->getResultObject();
if (count($datosTipologias) == 0) {
continue;
}
} else {
$datosTipologias = $datosTipolog;
}
$parametrosRotativa->rotativa_gota_negro = $datosTipologias[0]->gota_negro;
$parametrosRotativa->rotativa_gota_color = $datosTipologias[0]->gota_color;
$parametrosRotativa->rotativa_negro = $datosTipologias[0]->negro;
$parametrosRotativa->rotativa_cyan = $datosTipologias[0]->cyan;
$parametrosRotativa->rotativa_magenta = $datosTipologias[0]->magenta;
$parametrosRotativa->rotativa_amarillo = $datosTipologias[0]->amarillo;
$maquinamodel = new MaquinaModel();
$maquinas = $maquinamodel->getMaquinaImpresionForPresupuesto(
is_rotativa: 1,
tarifa_tipo: $tipo,
uso_tarifa: $uso,
tirada: $datosPedido->tirada + $datosPedido->merma,
papel_impresion_id: $papel->id,
);
// Se recorren las máquinas y se calcula el coste de linea por cada una
foreach ($maquinas as $maquina) {
$data['uso'] = $uso;
$data['tipo'] = $tipo;
$data['datosPedido'] = $datosPedido;
$data['cliente_id'] = $cliente_id;
$data['papel'] = $papel;
$data['maquina'] = $maquina;
$data['papel_generico'] = $papel_generico;
$data['parametrosRotativa'] = $parametrosRotativa;
$data['paginas'] = $paginas;
$data['gramaje'] = $gramaje;
$linea = PresupuestoService::getLineaPresupuestoRotativa($data);
if(empty($linea))
continue;
array_push($lineas, $linea);
}
}
return $lineas;
}
try{
$presupuesto = $this->model->find($id);
$presupuesto->titulo = $presupuesto->titulo .' - ' . lang('Presupuestos.duplicado');
$presupuesto->is_duplicado = 1;
$new_id = $this->model->insert($presupuesto);
$presupuestoAcabadosModel = model('App\Models\Presupuestos\PresupuestoAcabadosModel');
foreach ($presupuestoAcabadosModel->where('presupuesto_id', $presupuesto->id)->findAll() as $acabado) {
$acabado->presupuesto_id = $new_id;
$presupuestoAcabadosModel->insert($acabado);
}
$presupuestoEncuadernacionesModel = model('App\Models\Presupuestos\PresupuestoEncuadernacionesModel');
foreach ($presupuestoEncuadernacionesModel->where('presupuesto_id', $presupuesto->id)->findAll() as $encuadernacion) {
$encuadernacion->presupuesto_id = $new_id;
$presupuestoEncuadernacionesModel->insert($encuadernacion);
}
$presupuestoManipuladosModel = model('App\Models\Presupuestos\PresupuestoManipuladosModel');
foreach ($presupuestoManipuladosModel->where('presupuesto_id', $presupuesto->id)->findAll() as $manipulado) {
$manipulado->presupuesto_id = $new_id;
$presupuestoManipuladosModel->insert($manipulado);
}
$presupuestoPreimpresionesModel = model('App\Models\Presupuestos\PresupuestoPreimpresionesModel');
foreach ($presupuestoPreimpresionesModel->where('presupuesto_id', $presupuesto->id)->findAll() as $preimpresion) {
$preimpresion->presupuesto_id = $new_id;
$presupuestoPreimpresionesModel->insert($preimpresion);
}
$presupuestoDireccionesModel = model('App\Models\Presupuestos\PresupuestoDireccionesModel');
foreach ($presupuestoDireccionesModel->where('presupuesto_id', $presupuesto->id)->findAll() as $direccion) {
$direccion->presupuesto_id = $new_id;
$presupuestoDireccionesModel->insert($direccion);
}
$presupuestoLineaModel = model('App\Models\Presupuestos\PresupuestoLineaModel');
$presupuestoLineaModel->duplicateLineasPresupuesto($presupuesto->id, $new_id);
return [
'success' => true,
'id' => $new_id
];
}catch(\Exception $e){
return [
'success' => false,
'message' => $e->getMessage()
];
}
}
public function allItemsSelect()
{
@ -1186,8 +1079,6 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
}
protected function getPapelGenericoRotativaNegro()
{
$model = model('App\Models\Configuracion\PapelGenericoModel');
@ -1338,8 +1229,57 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
return $model->getPOD();
}
protected function getDirecciones($presupuesto_id){
protected function getLineasPresupuesto($presupuestoEntity){
$lineas = (new PresupuestoLineaModel())->getLineasPresupuesto($presupuestoEntity->id);
$input_data = [];
$input_data['presupuesto'] = $presupuestoEntity;
return PresupuestoService::checkLineasPresupuesto($input_data, $lineas);
}
protected function getLineasServicios($presupuestoEntity){
$serviciosPresupuesto = (object)array();
$serviciosPresupuesto->serviciosAcabado = (new PresupuestoAcabadosModel())->getResource($presupuestoEntity->id)->get()->getResultObject();
$serviciosPresupuesto->serviciosPreimpresion = (new PresupuestoPreimpresionesModel())->getResource($presupuestoEntity->id)->get()->getResultObject();
$serviciosPresupuesto->serviciosEncuadernacion = (new PresupuestoEncuadernacionesModel())->getResource($presupuestoEntity->id)->get()->getResultObject();
$serviciosPresupuesto->serviciosManipulado = (new PresupuestoManipuladosModel())->getResource($presupuestoEntity->id)->get()->getResultObject();
$input_data = [];
$input_data['presupuesto_id'] = $presupuestoEntity->id;
$input_data['tipo_impresion_id'] = $presupuestoEntity->tipo_impresion_id;
$input_data['tirada'] = $presupuestoEntity->tirada;
$input_data['POD'] = $this->getPOD();
$input_data['paginas'] = $presupuestoEntity->paginas;
$input_data['is_duplicado'] = $presupuestoEntity->is_duplicado;
if($presupuestoEntity->papel_formato_personalizado){
$input_data['ancho'] = $presupuestoEntity->ancho;
$input_data['alto'] = $presupuestoEntity->alto;
}
else{
$model = model("App\Models\Configuracion\PapelFormatoModel");
$papel = $model->find($presupuestoEntity->papel_formato_id);
if($papel){
$input_data['ancho'] = $papel->ancho;
$input_data['alto'] = $papel->alto;
}
else{
$input_data['ancho'] = 0;
$input_data['alto'] = 0;
}
}
return PresupuestoService::checkLineasServicios($input_data, $serviciosPresupuesto);
}
protected function getLineasDirecciones($presupuestoEntity){
$model = model('App\Models\Presupuestos\PresupuestoDireccionesModel');
return $model->where('presupuesto_id', $presupuesto_id)->findAll();
$direccionesEnvio = $model->where('presupuesto_id', $presupuestoEntity->id)->findAll();
return PresupuestoService::checkLineasEnvios($direccionesEnvio);
}
}

View File

@ -17,19 +17,9 @@ class Test extends BaseController
public function index()
{
$presupuestoModel = model('App\Models\Presupuestos\PresupuestoModel');
$presupuesto = $presupuestoModel->find(44);
$presupuestoAcabadosModel = model('App\Models\Presupuestos\PresupuestoAcabadosModel');
echo '<pre>';
$presupuestoLineaModel = model('App\Models\Presupuestos\PresupuestoLineaModel');
$presupuestoLineaModel->duplicateLineasPresupuesto(48, 75);
echo '</pre>';
$status = PresupuestoService::checkMaquina(1995);
var_dump($status);
echo xdebug_info();
}