acabado actualizar lineas presupuesto

This commit is contained in:
jaimejimenezortega
2024-03-23 11:56:02 +01:00
parent afce4b35e5
commit 6460b0e502
7 changed files with 282 additions and 25 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;
}
@ -351,10 +358,13 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
$this->viewData['presupuestoEntity']->cambios_lineas=true;
}
// Tarifas
$this->viewData['serviciosAcabado'] = $this->getServiciosAcabado();
$this->viewData['serviciosPreimpresion'] = $this->getServiciosPreimpresion();
$this->viewData['serviciosEncuadernacion'] = $this->getServiciosEncuadernacion();
$this->viewData['serviciosManipulado'] = $this->getServiciosManipulado();
$this->viewData['serviciosAcabado'] = $this->getServiciosAcabado();
[$cambios_en_servicios, $servicios] = $this->getLineasServicios($presupuestoEntity);
$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();
@ -380,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(...)
@ -834,6 +849,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
$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');
@ -1326,4 +1342,41 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
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);
}
}

View File

@ -87,6 +87,7 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity
"total_factor_ponderado" => null,
"acabado_cubierta_id" => null,
"acabado_sobrecubierta_id" => null,
"is_duplicado" => false,
];
protected $casts = [
"cliente_id" => "int",
@ -149,5 +150,6 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity
"total_factor_ponderado" => "?float",
"acabado_cubierta_id" => "int",
"acabado_sobrecubierta_id" => "int",
"is_duplicado" => "boolean",
];
}

View File

@ -75,23 +75,7 @@ class PresupuestoAcabadosModel extends \App\Models\GoBaseModel
return [];
}
private function calcularTarifa($tarifa, $tirada, $is_POD=false){
$precio_unidad = floatval($tarifa->precio_min) - (floatval($tarifa->precio_min) - floatval($tarifa->precio_max))/($tarifa->tirada_max - $tarifa->tirada_min) * ($tirada - $tarifa->tirada_min);
if ($tirada > $tarifa->tirada_max)
$precio_unidad = $tarifa->precio_max;
$precio_unidad = $precio_unidad* (1+ floatval($tarifa->margen)/100.0);
$total = $precio_unidad * $tirada;
$margen = floatval($tarifa->margen);
if (!$is_POD){
$total += floatval($tarifa->tarifa_importe_fijo);
}
return [$precio_unidad, $total, $margen];
}
public function deleteAllServicios($presupuesto_id){
$this->db
@ -261,4 +245,21 @@ class PresupuestoAcabadosModel extends \App\Models\GoBaseModel
return $builder;
}
private function calcularTarifa($tarifa, $tirada, $is_POD=false){
$precio_unidad = floatval($tarifa->precio_min) - (floatval($tarifa->precio_min) - floatval($tarifa->precio_max))/($tarifa->tirada_max - $tarifa->tirada_min) * ($tirada - $tarifa->tirada_min);
if ($tirada > $tarifa->tirada_max)
$precio_unidad = $tarifa->precio_max;
$precio_unidad = $precio_unidad* (1+ floatval($tarifa->margen)/100.0);
$total = $precio_unidad * $tirada;
$margen = floatval($tarifa->margen);
if (!$is_POD){
$total += floatval($tarifa->tarifa_importe_fijo);
}
return [$precio_unidad, $total, $margen];
}
}

View File

@ -105,6 +105,7 @@ class PresupuestoModel extends \App\Models\GoBaseModel
"total_factor_ponderado",
"acabado_cubierta_id",
"acabado_sobrecubierta_id",
"is_duplicado"
];
protected $returnType = "App\Entities\Presupuestos\PresupuestoEntity";
@ -264,6 +265,13 @@ class PresupuestoModel extends \App\Models\GoBaseModel
}
public function removeIsDuplicado($presupuesto_id){
$this->db
->table($this->table . " t1")
->where('id', $presupuesto_id)
->set('is_duplicado', false)
->update();
}
/**
* Get resource data for creating PDFs.
@ -299,6 +307,4 @@ class PresupuestoModel extends \App\Models\GoBaseModel
return $builder;
}
}

View File

@ -11,8 +11,15 @@ use App\Models\Configuracion\PapelImpresionModel;
use App\Models\Configuracion\PapelGenericoModel;
use App\Models\Configuracion\TipoPresupuestoModel;
use App\Models\Configuracion\PapelFormatoModel;
use App\Models\Presupuestos\PresupuestoLineaModel;
use App\Models\Presupuestos\PresupuestoAcabadosModel;
use App\Models\Presupuestos\PresupuestoManipuladosModel;
use App\Models\Presupuestos\PresupuestoEncuadernacionesModel;
use App\Models\Tarifas\TarifaEncuadernacionModel;
class PresupuestoService extends BaseService
{
/**
@ -1119,6 +1126,192 @@ class PresupuestoService extends BaseService
return $output_data;
}
// Funcion que procesa los servicios y actualiza los precios en caso de cambio
public static function checkLineasServicios($input_data, $servicios){
$cambio_en_servicios = false;
$cambio = false;
if(count($servicios->serviciosAcabado)>0){
[$cambio, $servicios->serviciosAcabado] =
PresupuestoService::procesarServiciosAcabado($input_data, $servicios->serviciosAcabado);
$cambio_en_servicios = $cambio_en_servicios? $cambio_en_servicios: $cambio;
}
if(count($servicios->serviciosManipulado)>0){
[$cambio, $servicios->serviciosManipulado] =
PresupuestoService::procesarServiciosManipulado($input_data, $servicios->serviciosManipulado);
$cambio_en_servicios = $cambio_en_servicios? $cambio_en_servicios: $cambio;
}
if(count($servicios->serviciosEncuadernacion)>0){
[$cambio, $servicios->serviciosEncuadernacion] =
PresupuestoService::procesarServiciosEncuadernacion($input_data, $servicios->serviciosEncuadernacion);
$cambio_en_servicios = $cambio_en_servicios? $cambio_en_servicios: $cambio;
}
// Los servicios de preimpresion se dejan tal y como esten
return [$cambio_en_servicios, $servicios];
}
// Funcion que procesa los servicios de acabado del presupuesto
// y actualiza los precios en caso de cambio de valor en precio_unidad
private static function procesarServiciosAcabado($input_data, $servicios){
$serviciosUpdated = [];
$cambio = false;
$model = new PresupuestoAcabadosModel();
foreach ($servicios as $servicio) {
$count = 0;
$nueva_tarifa = $model->getPrecioTarifa($servicio->tarifa_acabado_id, $input_data['tirada'], $input_data['POD']);
if($nueva_tarifa && count($nueva_tarifa)>0){
if(round($nueva_tarifa[0]->precio_unidad, 2) != $servicio->precio_unidad ||
$nueva_tarifa[0]->margen != $servicio->margen){
$servicio->precio_unidad = round($nueva_tarifa[0]->precio_unidad, 2);
$servicio->precio_total = round($nueva_tarifa[0]->total, 2);
$servicio->margen = round($nueva_tarifa[0]->margen);
$cambio = true;
}
array_push($serviciosUpdated, $servicio);
$servicio_temp = $servicio;
$servicio_temp->tarifa_id = $servicio_temp->tarifa_acabado_id;
$model->updateTarifas($input_data['presupuesto_id'], array($servicio_temp));
}
}
return [$cambio, $serviciosUpdated];
}
// Funcion que procesa los servicios de manipulado del presupuesto
// y actualiza los precios en caso de cambio de valor en precio_unidad
private static function procesarServiciosManipulado($input_data, $servicios){
$serviciosUpdated = [];
$cambio = false;
$model = new PresupuestoManipuladosModel();
foreach ($servicios as $servicio) {
$count = 0;
$nueva_tarifa = $model->getPrecioTarifa($servicio->tarifa_manipulado_id, $input_data['tirada'], $input_data['POD']);
if($nueva_tarifa && count($nueva_tarifa)>0){
if(round($nueva_tarifa[0]->precio_unidad, 2) != $servicio->precio_unidad ||
$nueva_tarifa[0]->margen != $servicio->margen){
$servicio->precio_unidad = round($nueva_tarifa[0]->precio_unidad, 2);
$servicio->precio_total = round($nueva_tarifa[0]->total, 2);
$servicio->margen = round($nueva_tarifa[0]->margen);
$cambio = true;
}
array_push($serviciosUpdated, $servicio);
$servicio_temp = $servicio;
$servicio_temp->tarifa_id = $servicio_temp->tarifa_manipulado_id;
$model->updateTarifas($input_data['presupuesto_id'], array($servicio_temp));
}
}
return [$cambio, $serviciosUpdated];
}
// Funcion que procesa los servicios de encuadernacion del presupuesto
// y actualiza los precios en caso de cambio de valor en precio_unidad
private static function procesarServiciosEncuadernacion($input_data, $servicios){
$serviciosUpdated = [];
$cambio = false;
$model = new PresupuestoEncuadernacionesModel();
$tarifaModel = model('App\Models\Tarifas\TarifaEncuadernacionModel');
foreach ($servicios as $servicio) {
// Si es un presupuesto duplicado hay que buscar el proveedor más barato
if($input_data['is_duplicado']){
if($tarifaModel->isTarifaPorHoras($servicio->tarifa_encuadernado_id)){
$nueva_tarifa = $model->getPrecioTarifaHoras(
$servicio->tarifa_encuadernado_id,
$input_data['paginas'],
$input_data['tirada'],
-1,
$input_data['POD']);
}else{
$nueva_tarifa = $model->getPrecioTarifa(
$servicio->tarifa_encuadernado_id,
$input_data['paginas'],
$input_data['tirada'],
$input_data['ancho'],
$input_data['alto'],
-1,
$input_data['POD']);
}
}
// En caso de que el presupuesto no sea duplicado, recalcular la tarifa
// con el mismo proveedor
else{
if($tarifaModel->isTarifaPorHoras($servicio->tarifa_encuadernado_id)){
$nueva_tarifa = $model->getPrecioTarifaHoras(
$servicio->tarifa_encuadernado_id,
$input_data['paginas'],
$input_data['tirada'],
$servicio->proveedor_id,
$input_data['POD']);
}else{
$nueva_tarifa = $model->getPrecioTarifa(
$servicio->tarifa_encuadernado_id,
$input_data['paginas'],
$input_data['tirada'],
$input_data['ancho'],
$input_data['alto'],
$servicio->proveedor_id,
$input_data['POD']);
}
}
if($nueva_tarifa && count($nueva_tarifa)>0){
if(!isset($nueva_tarifa[0]->proveedor_id)){
$nueva_tarifa[0]->proveedor_id = null;
}
// Si el presupuesto no es duplicado, se comprueba que
// no ha cambiado el precio unidad
if(round($nueva_tarifa[0]->precio_unidad, 2) != $servicio->precio_unidad ||
$nueva_tarifa[0]->margen != $servicio->margen){
$servicio->precio_unidad = round($nueva_tarifa[0]->precio_unidad, 2);
$servicio->precio_total = round($nueva_tarifa[0]->total, 2);
$servicio->margen = round($nueva_tarifa[0]->margen);
$cambio = true;
}
else if($input_data['is_duplicado'] && $nueva_tarifa[0]->proveedor_id != $servicio->proveedor_id){
$servicio->precio_unidad = round($nueva_tarifa[0]->precio_unidad, 2);
$servicio->precio_total = round($nueva_tarifa[0]->total, 2);
$servicio->margen = round($nueva_tarifa[0]->margen);
$servicio->proveedor = $nueva_tarifa[0]->proveedor;
$servicio->proveedor_id = $nueva_tarifa[0]->proveedor_id;
$cambio = true;
}
array_push($serviciosUpdated, $servicio);
$servicio_temp = $servicio;
$servicio_temp->tarifa_id = $servicio_temp->tarifa_encuadernado_id;
$model->updateTarifas($input_data['presupuesto_id'], array($servicio_temp));
}
}
return [$cambio, $serviciosUpdated];
}
// Funcion que comprueba si existe una maquina
private static function checkMaquina($maquina_id){

View File

@ -527,6 +527,8 @@ function init_servicio_encuadernado(){
data: function (params) {
const dimension = getDimensionLibro();
if(parseInt($('#tirada').val())>0){
var tirada = parseInt($('#tirada').val())
}
@ -538,8 +540,8 @@ function init_servicio_encuadernado(){
tarifa_id: tarifa_id,
paginas: parseInt($('#paginas').val())>0?parseInt($('#paginas').val()):0,
tirada: tirada,
ancho: ancho_libro,
alto: alto_libro,
ancho: dimension.ancho,
alto: dimension.alto,
searchtxt: params.term, // search term
};
return_data = Object.assign(return_data, window.token_ajax);

View File

@ -245,7 +245,7 @@
window.routes_servicios = {
dataTableOfPresupuestoAcabados: "<?=route_to('dataTableOfPresupuestoAcabados') ?>",
dataTableOfPresupuestoPreimpresion: "<?=route_to('dataTableOfPresupuestoPreimpresion') ?>",
dataTableOfPresupuestoPreimpresion: "<?=route_to('dataTableOfPresupuestoPreimpresiones') ?>",
dataTableOfPresupuestoEncuadernaciones: "<?=route_to('dataTableOfPresupuestoEncuadernaciones') ?>",
dataTableOfPresupuestoManipulados: "<?=route_to('dataTableOfPresupuestoManipulados') ?>",
menuItemsOfPresupuestoEncuadernaciones: '<?= route_to("menuItemsOfPresupuestoEncuadernaciones") ?>',