diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index 1425d588..05556596 100644 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -590,6 +590,7 @@ $routes->resource('presupuestocliente', ['namespace' => 'App\Controllers\Presupu $routes->group('serviciosacabados', ['namespace' => 'App\Controllers\Presupuestos'], function ($routes) { $routes->post('datatable', 'Presupuestoacabados::datatable', ['as' => 'dataTableOfPresupuestoAcabados']); + $routes->post('menuitems', 'Presupuestoacabados::menuItems', ['as' => 'menuItemsOfPresupuestoAcabados']); $routes->post('edit/(:num)', 'Presupuestoacabados::edit/$1', ['as' => 'updatePresupuestoacabados']); }); diff --git a/ci4/app/Controllers/Presupuestos/Presupuestoacabados.php b/ci4/app/Controllers/Presupuestos/Presupuestoacabados.php index 47f2eb68..48fa392c 100755 --- a/ci4/app/Controllers/Presupuestos/Presupuestoacabados.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestoacabados.php @@ -99,12 +99,13 @@ class Presupuestoacabados extends \App\Controllers\BaseResourceController $tarifa_acabado_id = $reqData['tarifa_acabado_id'] ?? 0; $tirada = $reqData['tirada'] ?? 0; + $proveedor_id = $reqData['proveedor_id'] ?? -1; $POD = $reqData['POD'] ?? 0; $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); - $values = $this->model->getPrecioTarifa($tarifa_acabado_id, $tirada, $POD); + $values = $this->model->getPrecioTarifa($tarifa_acabado_id, $tirada, $proveedor_id, $POD); $data = [ 'values' => $values, @@ -119,4 +120,39 @@ class Presupuestoacabados extends \App\Controllers\BaseResourceController } + public function menuItems() + { + if ($this->request->isAJAX()) { + + $reqData = $this->request->getPost(); + try{ + + $tarifa_id = $reqData['tarifa_id'] ?? -1; + $tirada = $reqData['tirada'] ?? 0; + + $newTokenHash = csrf_hash(); + $csrfTokenName = csrf_token(); + + $menu = $this->model->getProveedoresForSelector($tarifa_id, $tirada); + + $data = [ + 'menu' => $menu, + $csrfTokenName => $newTokenHash + ]; + + } + catch(Exception $e){ + $data = [ + 'error' => $e, + $csrfTokenName => $newTokenHash + ]; + } + finally{ + return $this->respond($data); + } + + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } } diff --git a/ci4/app/Controllers/Tarifas/Acabados/TarifaAcabadosLineas.php b/ci4/app/Controllers/Tarifas/Acabados/TarifaAcabadosLineas.php index a79a6221..e3021245 100644 --- a/ci4/app/Controllers/Tarifas/Acabados/TarifaAcabadosLineas.php +++ b/ci4/app/Controllers/Tarifas/Acabados/TarifaAcabadosLineas.php @@ -216,7 +216,7 @@ class TarifaAcabadosLineas extends \App\Controllers\BaseResourceController $searchValues = get_filter_datatables_columns($reqData); $resourceData = $this->model->getResource($searchValues, $id_TA)->orderBy($order, $dir)->limit($length, $start)->get()->getResultObject(); - $query = $this->model->db->getLastQuery(); + return $this->respond(Collection::datatable( $resourceData, $this->model->getResource()->countAllResults(), diff --git a/ci4/app/Entities/Presupuestos/PresupuestoAcabadosEntity.php b/ci4/app/Entities/Presupuestos/PresupuestoAcabadosEntity.php index 71c10315..02af9b3a 100755 --- a/ci4/app/Entities/Presupuestos/PresupuestoAcabadosEntity.php +++ b/ci4/app/Entities/Presupuestos/PresupuestoAcabadosEntity.php @@ -9,6 +9,7 @@ class PresupuestoAcabadosEntity extends \CodeIgniter\Entity\Entity "id" => null, "presupuesto_id" => null, "tarifa_acabado_id" => null, + "proveedor_id" => null, "precio_unidad" => null, "precio_total" => null, "margen" => null, @@ -20,6 +21,7 @@ class PresupuestoAcabadosEntity extends \CodeIgniter\Entity\Entity protected $casts = [ "presupuesto_id" => "int", "tarifa_acabado_id" => "int", + "proveedor_id" => "int", "precio_unidad" => "float", "precio_total" => "float", "margen" => "float", diff --git a/ci4/app/Models/Presupuestos/PresupuestoAcabadosModel.php b/ci4/app/Models/Presupuestos/PresupuestoAcabadosModel.php index 9eadaf14..08d98bfb 100755 --- a/ci4/app/Models/Presupuestos/PresupuestoAcabadosModel.php +++ b/ci4/app/Models/Presupuestos/PresupuestoAcabadosModel.php @@ -17,11 +17,12 @@ class PresupuestoAcabadosModel extends \App\Models\BaseModel const SORTABLE = [ 0 => "t2.nombre", - 1 => "t1.precio_unidad", - 2 => "t1.precio_total" + 1 => "t1.proveedor_id", + 2 => "t1.precio_unidad", + 3 => "t1.precio_total" ]; - protected $allowedFields = ["presupuesto_id", "tarifa_acabado_id", "nombre", "precio_total", "precio_unidad", "margen", "cubierta", "sobrecubierta"]; + protected $allowedFields = ["presupuesto_id", "tarifa_acabado_id", "proveedor_id", "nombre", "precio_total", "precio_unidad", "margen", "cubierta", "sobrecubierta"]; protected $returnType = "App\Entities\Presupuestos\PresupuestoAcabadosEntity"; protected $useTimestamps = true; @@ -46,10 +47,29 @@ class PresupuestoAcabadosModel extends \App\Models\BaseModel ], ]; - public function getPrecioTarifa($tarifa_acabado_id, $tirada, $POD){ + + public function getProveedoresForSelector($tarifa_acabado_id, $tirada){ + + $proveedores = []; + $modelTarifa = model('App\Models\Tarifas\Acabados\TarifaAcabadoModel'); + + $tarifa_value = $modelTarifa->getTarifaPresupuestoAcabado($tarifa_acabado_id, $tirada); + + if (count($tarifa_value)>0) { + foreach($tarifa_value as $tarifa) + array_push($proveedores, + (object)[ + 'id'=> $tarifa->proveedor_id, + 'text'=> $tarifa->proveedor_nombre, + ]); + } + return $proveedores; + } + + public function getPrecioTarifa($tarifa_acabado_id, $tirada, $proveedor_id, $POD){ $modelTarifa = model('App\Models\Tarifas\Acabados\TarifaAcabadoModel'); - $tarifa_value = $modelTarifa->getTarifaPresupuestoAcabado($tarifa_acabado_id, $tirada); + $tarifa_value = $modelTarifa->getTarifaPresupuestoAcabado($tarifa_acabado_id, $tirada, $proveedor_id); if (count($tarifa_value)>0) { $result_data = $this->calcularTarifa($tarifa_value[0], $tirada, $POD<$tirada?false:true); @@ -59,6 +79,8 @@ class PresupuestoAcabadosModel extends \App\Models\BaseModel 'precio_unidad'=> $result_data[0], 'total'=> $result_data[1], 'margen'=> $result_data[2], + 'proveedor' => $tarifa_value[0]->proveedor_nombre, + 'proveedor_id' => $tarifa_value[0]->proveedor_id, ]; return $ret_array; } @@ -119,6 +141,8 @@ class PresupuestoAcabadosModel extends \App\Models\BaseModel foreach($tarifas as $tarifa){ + $proveedor = $tarifa->proveedor_id=='undefined'?'NULL':$tarifa->proveedor_id; + $builder = $this->db ->table($this->table . " t1"); $builder->select("id"); @@ -132,6 +156,7 @@ class PresupuestoAcabadosModel extends \App\Models\BaseModel ->table($this->table . " t1") ->where('presupuesto_id', $presupuesto_id) ->where('tarifa_acabado_id', $tarifa->tarifa_id) + ->set('proveedor_id', $proveedor) ->set('precio_unidad', $tarifa->precio_unidad) ->set('precio_total', $tarifa->precio_total) ->set('margen', $tarifa->margen) @@ -146,6 +171,7 @@ class PresupuestoAcabadosModel extends \App\Models\BaseModel ->table($this->table . " t1") ->set('presupuesto_id', $presupuesto_id) ->set('tarifa_acabado_id', $tarifa->tarifa_id) + ->set('proveedor_id', $proveedor, false) ->set('precio_unidad', $tarifa->precio_unidad) ->set('precio_total', $tarifa->precio_total) ->set('margen', $tarifa->margen) @@ -169,11 +195,13 @@ class PresupuestoAcabadosModel extends \App\Models\BaseModel ->table($this->table . " t1") ->select( "t1.id AS id, t1.tarifa_acabado_id AS tarifa_acabado_id, t1.precio_unidad AS precio_unidad, - t1.precio_total AS precio_total, t1.margen AS margen, t2.nombre AS nombre, t1.cubierta AS cubierta, t1.sobrecubierta AS sobrecubierta" + t1.precio_total AS precio_total, t1.margen AS margen, t2.nombre AS nombre, t1.cubierta AS cubierta, t1.sobrecubierta AS sobrecubierta, + t1.proveedor_id AS proveedor_id, t3.nombre AS proveedor," ); $builder->where('t1.presupuesto_id', $presupuesto_id); $builder->join("lg_tarifa_acabado t2", "t1.tarifa_acabado_id = t2.id", "left"); + $builder->join("lg_proveedores t3", "t1.proveedor_id = t3.id", "left"); return $builder; } diff --git a/ci4/app/Models/Tarifas/Acabados/TarifaAcabadoModel.php b/ci4/app/Models/Tarifas/Acabados/TarifaAcabadoModel.php index 3d2e3162..4ae2b09f 100644 --- a/ci4/app/Models/Tarifas/Acabados/TarifaAcabadoModel.php +++ b/ci4/app/Models/Tarifas/Acabados/TarifaAcabadoModel.php @@ -114,16 +114,17 @@ class TarifaAcabadoModel extends \App\Models\BaseModel return $builder->orderBy("t1.nombre", "asc")->get()->getResultObject(); } - public function getTarifaPresupuestoAcabado($tarifa_id, $tirada){ + public function getTarifaPresupuestoAcabado($tarifa_id, $tirada, $proveedor_id = -1){ $builder = $this->db ->table($this->table . " t1") ->select( "t1.id AS tarifa_acabado_id, t1.nombre AS tarifa_acabado_nombre, t1.precio_min AS tarifa_precio_min, t1.importe_fijo AS tarifa_importe_fijo, t1.acabado_cubierta AS acabado_cubierta, t1.acabado_sobrecubierta AS acabado_sobrecubierta, t2.id AS tarifa_linea_id, t2.tirada_min AS tirada_min, t2.tirada_max AS tirada_max, - t2.precio_min AS precio_min, t2.precio_max AS precio_max, t2.margen AS margen" + t2.precio_min AS precio_min, t2.precio_max AS precio_max, t2.margen AS margen, t2.proveedor_id AS proveedor_id, t3.nombre AS proveedor_nombre" ) ->join("tarifa_acabado_lineas t2", "t1.id = t2.tarifa_acabado_id", "left") + ->join("lg_proveedores t3", "t2.proveedor_id = t3.id", "left") ->where("t1.is_deleted", 0) //->where("t1.mostrar_en_presupuesto", 1) ->where("t2.is_deleted", 0); @@ -132,6 +133,9 @@ class TarifaAcabadoModel extends \App\Models\BaseModel $builder->where('t2.tirada_min <=', $tirada); $builder->where('t2.tirada_max >=', $tirada); + if($proveedor_id != -1){ + $builder->where('t2.proveedor_id', $proveedor_id); + } return $builder->get()->getResultObject(); } diff --git a/ci4/app/Services/PresupuestoService.php b/ci4/app/Services/PresupuestoService.php index 0fe6e6f3..94bac7e7 100755 --- a/ci4/app/Services/PresupuestoService.php +++ b/ci4/app/Services/PresupuestoService.php @@ -1353,7 +1353,14 @@ class PresupuestoService extends BaseService $model = new PresupuestoAcabadosModel(); foreach ($servicios as $servicio) { - $nueva_tarifa = $model->getPrecioTarifa($servicio->tarifa_acabado_id, $input_data['tirada'], $input_data['POD']); + // Si es un presupuesto duplicado hay que buscar el proveedor más barato + if($input_data['is_duplicado']){ + $nueva_tarifa = $model->getPrecioTarifa($servicio->tarifa_acabado_id, $input_data['tirada'], -1, $input_data['POD']); + } + else{ + $nueva_tarifa = $model->getPrecioTarifa($servicio->tarifa_acabado_id, $input_data['tirada'], $servicio->proveedor_id, $input_data['POD']); + } + if($nueva_tarifa && count($nueva_tarifa)>0){ if(round($nueva_tarifa[0]->precio_unidad, 2) != round($servicio->precio_unidad,2) || $nueva_tarifa[0]->margen != $servicio->margen){ diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.js b/ci4/app/Views/themes/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.js index e2977d49..31de5f54 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.js +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.js @@ -207,9 +207,9 @@ function init_servicio_acabado(){ tableServiciosAcabado.row.add([ element.tarifa_acabado_id, nombre_completo, - '' + '' + '', '' + parseFloat(element.precio_unidad).toFixed(2) + '', @@ -218,6 +218,44 @@ function init_servicio_acabado(){ '' ]).draw(false) + $('#proveedor_acabado_' + element.tarifa_acabado_id).select2({ + allowClear: false, + minimumResultsForSearch: -1, + ajax: { + url: window.routes_servicios.menuItemsOfPresupuestoAcabados, + type: 'post', + dataType: 'json', + + data: function (params) { + + if(parseInt($('#tirada').val())>0){ + var tirada = parseInt($('#tirada').val()) + } + else{ + var tirada = 0 + } + + var return_data = { + tarifa_id: element.tarifa_acabado_id, + tirada: tirada, + }; + return_data = Object.assign(return_data, window.token_ajax); + + return return_data; + }, + delay: 60, + processResults: function (response) { + yeniden(response[window.csrf_token]); + return { + results: response.menu + }; + }, + cache: true + } + }); + $('#proveedor_acabado_' + element.tarifa_acabado_id).on('change', select_acabado_event) + + $('#precio_total_acabado_' + element.tarifa_acabado_id).on('change', function(){ updatePresupuesto({ update_lineas: false, @@ -228,9 +266,55 @@ function init_servicio_acabado(){ }) }) + check_serv_acabado_error() } +function select_acabado_event(){ + + if(parseInt($('#tirada').val())>0){ + var tirada = parseInt($('#tirada').val()) + parseInt($('#merma').val()) + } + else{ + var tirada = 0 + } + + var tarifa_id = null; + if(this.id.includes('proveedor_acabado')){ + tarifa_id = this.id.split('_')[2]; + } + else{ + tarifa_id = this.id.split('_')[1]; + } + + var datos = { + tarifa_acabado_id: tarifa_id, + tirada: tirada, + proveedor_id: parseInt($('#proveedor_acabado_' + tarifa_id).select2('data')[0].id), + POD: parseInt($('#POD').val()) + }; + datos = Object.assign(datos, window.token_ajax); + + $.ajax({ + type: "POST", + url: window.routes_servicios.dataTableOfPresupuestoAcabados, + data: datos, + success: function (data) { + + $('#precio_unidad_acabado_' + datos.tarifa_acabado_id).text(parseFloat(data.values[0].precio_unidad).toFixed(2)) + $('#precio_total_acabado_' + datos.tarifa_acabado_id).val(parseFloat(data.values[0].total).toFixed(2)) + $('#acabado_margen_' + datos.tarifa_acabado_id).val(parseFloat(data.values[0].margen).toFixed(2)) + + yeniden(data[window.csrf_token]); + return true; + }, + error: function(e){ + return false; + } + }) + return false; +} + function check_serv_acabado_error(){ var htmlString = ''; @@ -285,6 +369,11 @@ function get_tarifas_acabado(tarifa_id = -1, uso=null){ tableServiciosAcabado.row.add([ row.tarifa_id, nombre, + '', '' + parseFloat(row.precio_unidad).toFixed(2) + '', '', '', @@ -300,6 +389,44 @@ function get_tarifas_acabado(tarifa_id = -1, uso=null){ update_tiradas_alternativas: true}) }) + + + $('#proveedor_acabado_' + row.tarifa_id).select2({ + allowClear: false, + minimumResultsForSearch: -1, + ajax: { + url: window.routes_servicios.menuItemsOfPresupuestoAcabados, + type: 'post', + dataType: 'json', + + data: function (params) { + + if(parseInt($('#tirada').val())>0){ + var tirada = parseInt($('#tirada').val()) + } + else{ + var tirada = 0 + } + + var return_data = { + tarifa_id: row.tarifa_id, + tirada: tirada, + }; + return_data = Object.assign(return_data, window.token_ajax); + + return return_data; + }, + delay: 60, + processResults: function (response) { + yeniden(response[window.csrf_token]); + return { + results: response.menu + }; + }, + cache: true + } + }); + $('#proveedor_acabado_' + row.tarifa_id).on('change', select_acabado_event) }); check_serv_acabado_error() @@ -420,12 +547,15 @@ function get_datos_acabado(){ values['sobrecubierta'] = 0 break case 2: - values['precio_unidad'] = $(this).text() + values['proveedor_id'] = $(this).children(":first").select2('data')[0].id break case 3: - values['precio_total'] = $(this).children(":first").val() + values['precio_unidad'] = $(this).text() break case 4: + values['precio_total'] = $(this).children(":first").val() + break + case 5: values['margen'] = $(this).text() break } @@ -736,11 +866,7 @@ async function get_tarifas_enc(tipo=null, tarifa_id = -1){ var datos = { tarifa_encuadernacion_id : tarifa_id, - solapas: $('#solapas').is(':checked')?1:0, - paginas: parseInt($('#paginas').val())>0?parseInt($('#paginas').val()):0, tirada: tirada, - ancho: dimension.ancho, - alto: dimension.alto, POD: parseInt($('#POD').val()) }; datos = Object.assign(datos, window.token_ajax) @@ -1743,9 +1869,19 @@ async function actualizar_servicios(update_preimpresion=false){ .then(response => response.json()) .then(data => { data.lines.forEach((line) => { + $('#proveedor_acabado_' + line[0].tarifa_id).off('change') + if(line[0].hasOwnProperty('proveedor_id')){ + $('#proveedor_acabado_' + line[0].tarifa_id) + .append('') + } + else{ + $('#proveedor_acabado_' + line[0].tarifa_id).empty() + .append('') + } $('#precio_unidad_acabado_' + line[0].tarifa_id).text(parseFloat(line[0].precio_unidad).toFixed(2)) $('#precio_total_acabado_' + line[0].tarifa_id).val(parseFloat(line[0].total).toFixed(2)) $('#acabado_margen_' + line[0].tarifa_id).text(parseFloat(line[0].margen).toFixed(2)) + $('#proveedor_acabado_' + line[0].tarifa_id).on('change', select_enc_event) }); check_serv_acabado_error() yeniden(data[window.csrf_token]); diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.php index 498fd0eb..e54931d2 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.php +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.php @@ -90,6 +90,7 @@ + @@ -297,6 +298,7 @@ window.routes_servicios = { dataTableOfPresupuestoAcabados: "", + menuItemsOfPresupuestoAcabados: '', dataTableOfPresupuestoPreimpresion: "", dataTableOfPresupuestoEncuadernaciones: "", dataTableOfPresupuestoManipulados: "",