diff --git a/ci4/app/Controllers/Presupuestos/Cosidotapablanda.php b/ci4/app/Controllers/Presupuestos/Cosidotapablanda.php index b3cbdf5c..88c78f3c 100755 --- a/ci4/app/Controllers/Presupuestos/Cosidotapablanda.php +++ b/ci4/app/Controllers/Presupuestos/Cosidotapablanda.php @@ -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); + } } diff --git a/ci4/app/Entities/Presupuestos/PresupuestoEntity.php b/ci4/app/Entities/Presupuestos/PresupuestoEntity.php index 99350fbc..14ef818b 100755 --- a/ci4/app/Entities/Presupuestos/PresupuestoEntity.php +++ b/ci4/app/Entities/Presupuestos/PresupuestoEntity.php @@ -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", ]; } diff --git a/ci4/app/Models/Presupuestos/PresupuestoAcabadosModel.php b/ci4/app/Models/Presupuestos/PresupuestoAcabadosModel.php index 78940187..b3e5b954 100755 --- a/ci4/app/Models/Presupuestos/PresupuestoAcabadosModel.php +++ b/ci4/app/Models/Presupuestos/PresupuestoAcabadosModel.php @@ -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]; + } + } diff --git a/ci4/app/Models/Presupuestos/PresupuestoModel.php b/ci4/app/Models/Presupuestos/PresupuestoModel.php index 5b588d92..687bd03f 100755 --- a/ci4/app/Models/Presupuestos/PresupuestoModel.php +++ b/ci4/app/Models/Presupuestos/PresupuestoModel.php @@ -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; } - - } diff --git a/ci4/app/Services/PresupuestoService.php b/ci4/app/Services/PresupuestoService.php index 888b6051..32400b85 100755 --- a/ci4/app/Services/PresupuestoService.php +++ b/ci4/app/Services/PresupuestoService.php @@ -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){ diff --git a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.js b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.js index e7a7042b..bbfef9bf 100644 --- a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.js +++ b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.js @@ -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); diff --git a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.php b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.php index 22c58bdf..fb3c516c 100755 --- a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.php +++ b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.php @@ -245,7 +245,7 @@ window.routes_servicios = { dataTableOfPresupuestoAcabados: "", - dataTableOfPresupuestoPreimpresion: "", + dataTableOfPresupuestoPreimpresion: "", dataTableOfPresupuestoEncuadernaciones: "", dataTableOfPresupuestoManipulados: "", menuItemsOfPresupuestoEncuadernaciones: '',