From b288ca498cf42a2d1b93282201bde5dfbf43823d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Jim=C3=A9nez?= Date: Tue, 29 Apr 2025 19:30:35 +0200 Subject: [PATCH] terminado --- .../Importadores/ImportadorCatalogo.php | 23 +++--- .../Presupuestos/Presupuestocliente.php | 77 +++++++++++++++---- ...5-04-29-180600_AddClienteNoBasePODnoHQ.php | 30 ++++++++ ci4/app/Entities/Clientes/ClienteEntity.php | 4 + ci4/app/Language/es/Clientes.php | 2 + ci4/app/Models/Clientes/ClienteModel.php | 2 + ci4/app/Services/EmailService.php | 2 +- .../Services/PresupuestoClienteService.php | 2 +- ci4/app/Services/PresupuestoService.php | 51 ++++++++++++ .../clientes/cliente/_clienteFormItems.php | 22 ++++++ .../importadores/catalogo/catalogo_tool.js | 34 ++++++-- 11 files changed, 215 insertions(+), 34 deletions(-) create mode 100644 ci4/app/Database/Migrations/2025-04-29-180600_AddClienteNoBasePODnoHQ.php diff --git a/ci4/app/Controllers/Importadores/ImportadorCatalogo.php b/ci4/app/Controllers/Importadores/ImportadorCatalogo.php index 30386acf..f945ccb3 100644 --- a/ci4/app/Controllers/Importadores/ImportadorCatalogo.php +++ b/ci4/app/Controllers/Importadores/ImportadorCatalogo.php @@ -5,6 +5,7 @@ use App\Controllers\BaseResourceController; use App\Entities\Catalogo\CatalogoLibroEntity; use App\Models\Catalogo\CatalogoLibroModel; use App\Controllers\Presupuestos\Presupuestocliente; +use App\Services\PresupuestoService; class ImportadorCatalogo extends BaseResourceController { @@ -281,17 +282,19 @@ class ImportadorCatalogo extends BaseResourceController ] ]; - // Ajuste del precio a RAMA - $dataToUpdate = [ - 'total_aceptado' => ($tirada * $precio_compra), - 'total_aceptado_revisado' => ($tirada * $precio_compra), - 'total_precio_unidad' => $precio_compra - ]; - $presupuestoModel = model('App\Models\Presupuestos\Presupuestomodel'); - $presupuestoModel->update($response['data']['sk_id'], $dataToUpdate); - - + // Ajuste del precio a RAMA + $respuesta_ajuste = PresupuestoService::ajustarPresupuesto( + $response['data']['sk_id'], + $precio_compra, + $tirada + ); + if ($respuesta_ajuste['warning'] == true) { + $response['price_warning'] = [ + 'new_precio_unidad' => $respuesta_ajuste['new_precio_unidad'], + 'new_total' => $respuesta_ajuste['new_total'], + ]; + } return $this->respond($response); diff --git a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php index d6bce82f..4ce82823 100755 --- a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php @@ -330,10 +330,16 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'a_favor_fibra' => 1, ); + $cliente_model = model(('App\Models\Clientes\ClienteModel')); + $cliente = $cliente_model->find($cliente_id); // Para POD siempre es HQ - if ($tirada[0] <= $POD) { + if ($tirada[0] <= $POD && !$cliente->forzar_rotativa_pod) { $isHq = true; } + $forzarRotativa = false; + if ($tirada[0] <= $POD && $cliente->forzar_rotativa_pod) { + $forzarRotativa = true; + } $input_data = array( 'uso' => 'interior', @@ -346,7 +352,8 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'cliente_id' => $cliente_id, 'paginas_color' => $paginas_color, 'excluirRotativa' => $excluirRotativa, - 'papelInteriorDiferente' => $papelInteriorDiferente + 'papelInteriorDiferente' => $papelInteriorDiferente, + 'forzarRotativa' => $forzarRotativa, ); $interior = PresupuestoClienteService::obtenerInterior($input_data); @@ -460,6 +467,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $id = $reqData['id'] ?? 0; $cliente_id = $reqData['clienteId'] ?? -1; + $noEnvioBase = model('App\Models\Clientes\ClienteModel')->find($cliente_id)->no_envio_base ?? false; $tirada = $reqData['tirada'] ?? 0; $selectedTirada = $reqData['selectedTirada'] ?? -1; @@ -609,6 +617,10 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } else { $coste = floatval($coste_direccion->coste); $margen = $coste * (intval($coste_direccion->margen) / 100.0); + if ($noEnvioBase) { + $coste = 0.0; + $margen = 0.0; + } $return_data['eb'][$i] = round($coste + $margen, 2); } } @@ -746,10 +758,16 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'a_favor_fibra' => 1, ); + $cliente_model = model(('App\Models\Clientes\ClienteModel')); + $cliente = $cliente_model->find($cliente_id); // Para POD siempre es HQ - if ($tirada[0] <= $POD) { + if ($tirada[0] <= $POD && !$cliente->forzar_rotativa_pod) { $isHq = true; } + $forzarRotativa = false; + if ($tirada[0] <= $POD && $cliente->forzar_rotativa_pod) { + $forzarRotativa = true; + } $input_data = array( 'uso' => 'interior', @@ -762,7 +780,8 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'cliente_id' => $cliente_id, 'paginas_color' => $paginas_color, 'excluirRotativa' => $excluirRotativa, - 'papelInteriorDiferente' => $papelInteriorDiferente + 'papelInteriorDiferente' => $papelInteriorDiferente, + 'forzarRotativa' => $forzarRotativa, ); $interior = PresupuestoClienteService::obtenerInterior($input_data); @@ -1126,6 +1145,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $peso_libro = $resultado_presupuesto['peso'][array_search($selected_tirada, $tirada)]; // calculo del envio base (tirada_maxima) + $noEnvioBase = model('App\Models\Clientes\ClienteModel')->find($cliente_id)->no_envio_base ?? false; $resultado_presupuesto['eb'] = []; $datos_presupuesto['envio_base'] = 0; for ($i = 0; $i < count($tirada); $i++) { @@ -1139,6 +1159,10 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController ); if (intval($selected_tirada) == intval($tirada[$i])) { + if ($noEnvioBase) { + $coste_direccion->coste = 0.0; + $coste_direccion->margen = 0.0; + } $datos_presupuesto['envio_base'] = round($coste_direccion->coste * (1 + $coste_direccion->margen / 100.0), 2); } @@ -1160,6 +1184,10 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController ]; return $resultado_presupuesto; } else { + if ($noEnvioBase) { + $coste_direccion->coste = 0.0; + $coste_direccion->margen = 0.0; + } $resultado_presupuesto['eb'][$i] = round($coste_direccion->coste, 2); $resultado_presupuesto['eb_margen'][$i] = round($coste_direccion->margen, 2); } @@ -1176,10 +1204,10 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController for ($i = 0; $i < count($tirada); $i++) { $coste_envio = 0.0; $coste_envio += ($resultado_presupuesto['eb'][$i] / $tirada[$i]); - $resultado_presupuesto['info']['totales'][$i]['envio_base_margen'] = - floatval($resultado_presupuesto['eb'][$i])*(floatval($resultado_presupuesto['eb_margen'][$i])/100.0); + $resultado_presupuesto['info']['totales'][$i]['envio_base_margen'] = + floatval($resultado_presupuesto['eb'][$i]) * (floatval($resultado_presupuesto['eb_margen'][$i]) / 100.0); $resultado_presupuesto['info']['totales'][$i]['envio_base_coste'] = $resultado_presupuesto['eb'][$i]; - + $resultado_presupuesto['precio_u'][$i] = round(floatval($resultado_presupuesto['precio_u'][$i]) + $coste_envio, 4); } @@ -1357,7 +1385,11 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController foreach ($serviciosAcabado as $service) { $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); $servicio = $model->getPrecioTarifa( - intval($service), intval($selected_tirada)+$resultado_presupuesto['info']['merma'], -1, $POD); + intval($service), + intval($selected_tirada) + $resultado_presupuesto['info']['merma'], + -1, + $POD + ); if (count($servicio) > 0) { if ($servicio[0]->total > 0) { @@ -1375,8 +1407,11 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController foreach ($serviciosAcabado as $service) { $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); $servicio = $model->getPrecioTarifa( - intval($service), - intval($selected_tirada) + $resultado_presupuesto['info']['merma'], -1, $POD); + intval($service), + intval($selected_tirada) + $resultado_presupuesto['info']['merma'], + -1, + $POD + ); if (count($servicio) > 0) { if ($servicio[0]->total > 0) { @@ -1393,8 +1428,11 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController foreach ($serviciosAcabado as $service) { $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); $servicio = $model->getPrecioTarifa( - intval($service), - intval($selected_tirada) + $resultado_presupuesto['info']['merma'], -1, $POD); + intval($service), + intval($selected_tirada) + $resultado_presupuesto['info']['merma'], + -1, + $POD + ); if (count($servicio) > 0) { if ($servicio[0]->total > 0) { @@ -1407,7 +1445,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $tarifa_id = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_lomo_redondo')->value; $serv_lomo = PresupuestoCLienteService::getServiciosManipulado([ 'tarifa_id' => intval($tarifa_id), - 'tirada' => $selected_tirada+$resultado_presupuesto['info']['merma'], + 'tirada' => $selected_tirada + $resultado_presupuesto['info']['merma'], 'POD' => $POD, ])[0]; @@ -2039,10 +2077,16 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $info['merma'] = $datosPedido->merma; } + $cliente_model = model(('App\Models\Clientes\ClienteModel')); + $cliente = $cliente_model->find($cliente_id); // Para POD siempre es HQ - if ($tirada[$t] <= $POD) { + if ($tirada[$t] <= $POD && !$cliente->forzar_rotativa_pod) { $isHq = true; } + $forzarRotativa = false; + if ($tirada[$t] <= $POD && $cliente->forzar_rotativa_pod) { + $forzarRotativa = true; + } $input_data = array( 'uso' => 'interior', @@ -2055,7 +2099,8 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'cliente_id' => $cliente_id, 'paginas_color' => $paginas_color, 'excluirRotativa' => $excluirRotativa, - 'papelInteriorDiferente' => $papelInteriorDiferente + 'papelInteriorDiferente' => $papelInteriorDiferente, + 'forzarRotativa' => $forzarRotativa, ); $interior = PresupuestoClienteService::obtenerInterior($input_data); @@ -3071,7 +3116,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $sumForFactor += round($linea['precio_pedido'], 2) - round($linea['margen_papel_pedido'], 2); $margenPapel += round($linea['margen_papel_pedido'], 2); - + $totalImpresion += round($linea['precio_click_pedido'], 2); $totalImpresion -= round($linea['margen_click_pedido'], 2); $sumForFactor += round($linea['precio_click_pedido'], 2) diff --git a/ci4/app/Database/Migrations/2025-04-29-180600_AddClienteNoBasePODnoHQ.php b/ci4/app/Database/Migrations/2025-04-29-180600_AddClienteNoBasePODnoHQ.php new file mode 100644 index 00000000..161c00f6 --- /dev/null +++ b/ci4/app/Database/Migrations/2025-04-29-180600_AddClienteNoBasePODnoHQ.php @@ -0,0 +1,30 @@ + [ + "type" => "TINYINT", + "default" => 0, + ], + "forzar_rotativa_pod" => [ + "type" => "TINYINT", + "default" => 0, + ], + ]; + public function up() + { + $this->forge->addColumn('clientes', $this->COLUMNS); + } + + public function down() + { + // + $this->forge->dropColumn('clientes', array_keys($this->COLUMNS)); + } +} diff --git a/ci4/app/Entities/Clientes/ClienteEntity.php b/ci4/app/Entities/Clientes/ClienteEntity.php index 5ea34297..d97b60b1 100755 --- a/ci4/app/Entities/Clientes/ClienteEntity.php +++ b/ci4/app/Entities/Clientes/ClienteEntity.php @@ -48,6 +48,8 @@ class ClienteEntity extends \CodeIgniter\Entity\Entity "updated_at" => null, "user_created_id" => 1, "user_update_id" => 1, + "no_envio_base" => 0, + "forzar_rotativa_pod" => 0, ]; protected $casts = [ "comunidad_autonoma_id" => "?int", @@ -70,6 +72,8 @@ class ClienteEntity extends \CodeIgniter\Entity\Entity "is_deleted" => "int", "user_created_id" => "int", "user_update_id" => "int", + "no_envio_base" => "boolean", + "forzar_rotativa_pod" => "boolean", ]; public function comercial() : ?UserEntity diff --git a/ci4/app/Language/es/Clientes.php b/ci4/app/Language/es/Clientes.php index 3e505bbb..b236c7d8 100755 --- a/ci4/app/Language/es/Clientes.php +++ b/ci4/app/Language/es/Clientes.php @@ -46,6 +46,8 @@ return [ 'userCreatedId' => 'User Created ID', 'userUpdateId' => 'User Update ID', 'vencimiento' => 'Vencimiento', + 'removeEnvioBase' => 'No añadir Envio Base', + 'forzarRotativaPod' => 'Forzar rotativa en POD', 'direccionesEnvio' => 'Direcciones de Envío', diff --git a/ci4/app/Models/Clientes/ClienteModel.php b/ci4/app/Models/Clientes/ClienteModel.php index 57de29a4..16a7ce91 100755 --- a/ci4/app/Models/Clientes/ClienteModel.php +++ b/ci4/app/Models/Clientes/ClienteModel.php @@ -61,6 +61,8 @@ class ClienteModel extends \App\Models\BaseModel "comentarios", "user_created_id", "user_update_id", + "no_envio_base", + "forzar_rotativa_pod", ]; protected $returnType = ClienteEntity::class; protected $useSoftDeletes = true; diff --git a/ci4/app/Services/EmailService.php b/ci4/app/Services/EmailService.php index 3e9a63e5..95cfd5b0 100755 --- a/ci4/app/Services/EmailService.php +++ b/ci4/app/Services/EmailService.php @@ -9,7 +9,7 @@ class EmailService public function send(string $subject, string $body, $recipient): bool { - $skEnv = env('sk_environment', 'production'); // fallback a producción si no está definido + $skEnv = env('SK_ENVIRONMENT', 'production'); // fallback a producción si no está definido // Si no estamos en producción, forzar el destinatario a uno fijo if ($skEnv !== 'production') { diff --git a/ci4/app/Services/PresupuestoClienteService.php b/ci4/app/Services/PresupuestoClienteService.php index 6cc202df..21dc68d1 100755 --- a/ci4/app/Services/PresupuestoClienteService.php +++ b/ci4/app/Services/PresupuestoClienteService.php @@ -58,7 +58,7 @@ class PresupuestoClienteService extends BaseService if ($total_plana < 0 && $total_rotativa < 0) return []; else { - if ($total_plana > $total_rotativa) + if ($total_plana > $total_rotativa && $data['forzarRotativa'] == 0) return $plana; else return [$rotativa]; diff --git a/ci4/app/Services/PresupuestoService.php b/ci4/app/Services/PresupuestoService.php index 0c46362a..de6986af 100755 --- a/ci4/app/Services/PresupuestoService.php +++ b/ci4/app/Services/PresupuestoService.php @@ -1983,4 +1983,55 @@ class PresupuestoService extends BaseService return $peso; } + + public static function ajustarPresupuesto($id, $precio_unidad = null, $unidades = null, $precio_total = null){ + + $precio_total_asignado = 0; + $precio_unidad_asignado = $precio_unidad; + $warning = false; + + $model = model('App\Models\Presupuestos\PresupuestoModel'); + if($precio_unidad != null && $unidades != null){ + $precio_total_asignado = round(floatval($precio_unidad) * intval($unidades), 2); + } + else{ + $precio_total_asignado = floatval($precio_total); + } + $presupuesto = $model->find($id); + $costes = floatval($presupuesto->total_costes); + $envio_base = floatval($presupuesto->envio_base); + if($costes + $envio_base > $precio_total_asignado){ + $precio_total_asignado = round($costes + $envio_base, 2); + $precio_unidad_asignado = round($precio_total_asignado / intval($unidades), 4); + $warning = true; + } + $total_margenes = $precio_total_asignado - $costes - $envio_base; + + $sumForFactor = floatval($presupuesto->total_coste_papel) + floatval($presupuesto->total_coste_impresion); + $sumForFactorPonderado = $sumForFactor + floatval($presupuesto->total_coste_servicios); + + $factor = ($precio_total_asignado - floatval($presupuesto->envio_base) + - floatval($presupuesto->total_coste_envios) - floatval($presupuesto->total_margen_envios)) / $sumForFactor; + + $factorPonderado = ($precio_total_asignado - floatval($presupuesto->envio_base) + - floatval($presupuesto->total_coste_envios) - floatval($presupuesto->total_margen_envios)) / $sumForFactorPonderado; + + if ($presupuesto) { + + $presupuesto->total_margenes = $total_margenes; + $presupuesto->total_aceptado = $precio_total_asignado; + $presupuesto->total_aceptado_revisado = $precio_total_asignado; + $presupuesto->total_antes_descuento = $precio_total_asignado; + $presupuesto->total_precio_unidad = $precio_unidad_asignado; + $presupuesto->total_factor = round($factor, 2); + $presupuesto->total_factor_ponderado = round($factorPonderado, 2); + $model->update($id, $presupuesto); + } + return [ + "success" => true, + "warning" => $warning, + "new_total" => $precio_total_asignado, + "new_precio_unidad" => $precio_unidad_asignado, + ]; + } } diff --git a/ci4/app/Views/themes/vuexy/form/clientes/cliente/_clienteFormItems.php b/ci4/app/Views/themes/vuexy/form/clientes/cliente/_clienteFormItems.php index fd9280ac..3bd3e733 100755 --- a/ci4/app/Views/themes/vuexy/form/clientes/cliente/_clienteFormItems.php +++ b/ci4/app/Views/themes/vuexy/form/clientes/cliente/_clienteFormItems.php @@ -521,6 +521,28 @@ +
+
+ +
+
+
+
+ +
+
+ +