From 5ae6618c37aca160fe5285a7e03fe8a2d850bfcb Mon Sep 17 00:00:00 2001 From: jaimejimenezortega Date: Thu, 9 May 2024 22:08:38 +0200 Subject: [PATCH] falta sumar envios --- ci4/app/Controllers/Js_loader.php | 6 + .../Presupuestos/Presupuestocliente.php | 228 +- .../presupuestos/cliente/_resumenItems.php | 59 +- .../form/presupuestos/cliente/direcciones.js | 11 +- .../form/presupuestos/cliente/disenioLibro.js | 45 +- .../cliente/presupuestoCliente.js | 18 +- .../form/presupuestos/cliente/resumen.js | 107 + .../cliente/viewPresupuestoclienteForm.php | 17 +- xdebug.log | 25497 ++++++++++++++++ 9 files changed, 25826 insertions(+), 162 deletions(-) create mode 100644 ci4/app/Views/themes/vuexy/form/presupuestos/cliente/resumen.js diff --git a/ci4/app/Controllers/Js_loader.php b/ci4/app/Controllers/Js_loader.php index ffaa9c87..8dceddde 100755 --- a/ci4/app/Controllers/Js_loader.php +++ b/ci4/app/Controllers/Js_loader.php @@ -105,5 +105,11 @@ class Js_loader extends BaseController $this->response->setHeader('Content-Type', 'text/javascript'); return view('themes/vuexy/form/presupuestos/cliente/direcciones.js'); } + + function presupuestoClienteResumen_js() + { + $this->response->setHeader('Content-Type', 'text/javascript'); + return view('themes/vuexy/form/presupuestos/cliente/resumen.js'); + } } \ No newline at end of file diff --git a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php index 6b1222de..1806dd70 100755 --- a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php @@ -607,30 +607,31 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); - $error =(object)[ + $error = (object)[ 'interior' => "", 'cubierta' => "", 'sobrecubierta' => "", - 'guardas' => "", + 'guardas' => "", 'servicios' => "", 'serviciosDefecto' => "", ]; $coste_servicios = 0.0; - + $POD = model('App\Models\Configuracion\ConfiguracionSistemaModel')->getPOD(); - - + + $tirada = $reqData['tirada'] ?? 0; $tamanio = $reqData['tamanio']; $tipo_impresion_id = $this->getTipoImpresion($reqData['tipo'], $reqData['tapa']); $precio_u = []; - - for($t=0; $tget_isCosido($tipo_impresion_id); - + $datosPedido = (object)array( 'paginas' => intval($reqData['paginas']) ?? 0, 'tirada' => $tirada[$t], @@ -639,7 +640,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'alto' => intval($tamanio['alto']) ?? 100000, 'isCosido' => $is_cosido, ); - + $papel_generico = [ 'id' => $reqData['papelInterior'] ?? 0, 'nombre' => $reqData['papelInteriorNombre'] ?? "", @@ -647,7 +648,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $gramaje = $reqData['gramajeInterior'] ?? 0; $cliente_id = $reqData['clienteId'] ?? -1; $excluirRotativa = $reqData['excluirRotativa'] ?? 0; - + $input_data = array( 'uso' => 'interior', 'tipo_impresion_id' => $tipo_impresion_id, @@ -660,20 +661,22 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'paginas_color' => $paginas_color, 'excluirRotativa' => $excluirRotativa, ); - + $interior = PresupuestoClienteService::obtenerInterior($input_data); - + $costeInterior = 0.0; + $peso_interior = 0.0; foreach ($interior as $linea) { if (count($linea) > 0) { $costeInterior += floatval($linea['total_impresion']); + $peso_interior += floatval($linea['peso']); } } - + if ($costeInterior <= 0) { $error->interior = lang('Presupuestos.errores.noInterior'); } - + // Si es POD hay que volver a calcular para incluir la merma correcta if ($tirada[$t] <= $POD) { $num_formas = []; @@ -684,23 +687,25 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } } $input_data['datosPedido']->merma = $this->calcular_merma($tirada[$t], $POD, $num_formas); - + $interior = PresupuestoClienteService::obtenerInterior($input_data); } - + $costeInterior = 0.0; + $peso_interior = 0.0; foreach ($interior as $linea) { if (count($linea) > 0) { $costeInterior += floatval($linea['total_impresion']); + $peso_interior += floatval($linea['peso']); } } - - if ($costeInterior <= 0) + + if ($costeInterior <= 0) $error->interior = lang('Presupuestos.errores.noInterior'); else $error->interior = ""; - - + + // Cubierta $papel_generico = [ 'id' => $reqData['papelCubierta'] ?? 0, @@ -711,41 +716,44 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $input_data['datosPedido']->paginas = intval($reqData['carasCubierta'] ?? 0); $input_data['paginas_color'] = intval($reqData['carasCubierta'] ?? 0); $input_data['datosPedido']->solapas_ancho = intval($reqData['solapasCubierta'] ?? 0); - $input_data['datosPedido']->solapas = $input_data['datosPedido']->solapas_ancho>0 ? 1 : 0; + $input_data['datosPedido']->solapas = $input_data['datosPedido']->solapas_ancho > 0 ? 1 : 0; $input_data['datosPedido']->lomo = $this->calcular_lomo($interior, 0); $input_data['isColor'] = 1; $input_data['isHq'] = 1; $input_data['uso'] = 'cubierta'; - + $cubierta = PresupuestoClienteService::obtenerCubierta($input_data); $coste_cubierta = 0.0; + $peso_cubierta = 0.0; if (count($cubierta) > 0) { $coste_cubierta += floatval($cubierta['total_impresion']); + $peso_cubierta += floatval($cubierta['peso']); } - if($coste_cubierta <= 0) + if ($coste_cubierta <= 0) $error->cubierta = lang('Presupuestos.errores.noCubiertaSobrecubierta'); else $error->cubierta = ""; - + $tarifaAcabadoCubierta = intval($reqData['acabadoCubierta'] ?? 0); $acabadoCubierta = []; - if($tarifaAcabadoCubierta > 0){ + if ($tarifaAcabadoCubierta > 0) { $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); $acabadoCubierta = $model->getPrecioTarifa($tarifaAcabadoCubierta, $datosPedido->tirada, $POD); } - if(count($acabadoCubierta) > 0){ - if($acabadoCubierta[0]->total <= 0 ) + if (count($acabadoCubierta) > 0) { + if ($acabadoCubierta[0]->total <= 0) $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); $coste_servicios += floatval($acabadoCubierta[0]->total); } - + // Sobrecubierta $coste_sobrecubierta = 0.0; + $peso_sobrecubierta = 0.0; $linea_sobrecubierta = []; $acabadoSobrecubierta = []; $sobreCubierta = $reqData["sobrecubierta"] ?? null; - if(!is_null($sobreCubierta)){ - + if (!is_null($sobreCubierta)) { + $papel_generico = [ 'id' => $sobreCubierta['papel'] ?? 0, 'nombre' => $sobreCubierta['papel_nombre'] ?? "", @@ -755,39 +763,42 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $input_data['datosPedido']->paginas = 4; $input_data['paginas_color'] = 4; $input_data['datosPedido']->solapas_ancho = intval($sobreCubierta['solapas'] ?? 0); - $input_data['datosPedido']->solapas = $input_data['datosPedido']->solapas_ancho>0 ? 1 : 0; + $input_data['datosPedido']->solapas = $input_data['datosPedido']->solapas_ancho > 0 ? 1 : 0; $input_data['datosPedido']->lomo = $this->calcular_lomo([$cubierta], $input_data['datosPedido']->lomo); $input_data['isColor'] = 1; $input_data['isHq'] = 1; $input_data['uso'] = 'sobrecubierta'; - + $linea_sobrecubierta = PresupuestoClienteService::obtenerSobrecubierta($input_data); - + if (count($linea_sobrecubierta) > 0) { $coste_sobrecubierta += floatval($linea_sobrecubierta['total_impresion']); + $peso_sobrecubierta += floatval($linea_sobrecubierta['peso']); } - if($coste_sobrecubierta <= 0) + if ($coste_sobrecubierta <= 0) $error->sobrecubierta = lang('Presupuestos.errores.noCubiertaSobrecubierta'); else $error->sobrecubierta = ""; - - $tarifaAcabadoSobrecubierta = intval(strlen($sobreCubierta['acabado'])==0 ? 0:$sobreCubierta['acabado']); + + $tarifaAcabadoSobrecubierta = intval(strlen($sobreCubierta['acabado']) == 0 ? 0 : $sobreCubierta['acabado']); $acabadoSobrecubierta = []; - if($tarifaAcabadoSobrecubierta > 0){ + if ($tarifaAcabadoSobrecubierta > 0) { $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); $acabadoSobrecubierta = $model->getPrecioTarifa($tarifaAcabadoSobrecubierta, $datosPedido->tirada, $POD); } - if(count($acabadoSobrecubierta) > 0){ - if($acabadoSobrecubierta[0]->total <= 0 ) + if (count($acabadoSobrecubierta) > 0) { + if ($acabadoSobrecubierta[0]->total <= 0) $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); $coste_servicios += floatval($acabadoSobrecubierta[0]->total); } } - + //Guardas $guardas = []; - if($reqData['guardas'] ?? 0 > 0){ - + $peso_guardas = 0.0; + $coste_guardas = 0.0; + if ($reqData['guardas'] ?? 0 > 0) { + $guardas = $reqData['guardas']; $papel_generico = [ 'id' => $guardas['papel'] ?? 0, @@ -803,7 +814,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $input_data['isColor'] = 1; $input_data['isHq'] = 1; $input_data['uso'] = 'guardas'; - + // 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 // o wire-o tapa dura, las guardas se imprimen como hojas sueltas @@ -812,18 +823,19 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } else if ($tipo_impresion_id == 5 || $tipo_impresion_id == 7) { $input_data['datosPedido']->isCosido = false; } - + $guardas = PresupuestoClienteService::obtenerGuardas($input_data); - $coste_guardas = 0.0; + if (count($guardas) > 0) { $coste_guardas += floatval($guardas['total_impresion']); + $peso_guardas += floatval($guardas['peso']); } - if($coste_guardas <= 0) + if ($coste_guardas <= 0) $error->guardas = lang('Presupuestos.errores.noGuardas'); else $error->guardas = ""; } - + // Servicios defecto $servDefecto = PresupuestoCLienteService::getServiciosEncuadernacionDefault([ 'tipo_impresion_id' => $tipo_impresion_id, @@ -832,19 +844,19 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'ancho' => $datosPedido->ancho, 'alto' => $datosPedido->alto, 'POD' => $POD, - 'solapas' => intval($reqData['solapasCubierta'] ?? 0)>0?1:0, + 'solapas' => intval($reqData['solapasCubierta'] ?? 0) > 0 ? 1 : 0, ]); $costeServiciosDefecto = 0.0; foreach ($servDefecto as $servicio) { - if($servicio->total <= 0 ) + if ($servicio->total <= 0) $error->serviciosDefecto = lang('Presupuestos.errores.errorPresupuesto'); - + $costeServiciosDefecto += floatval($servicio->total); } - + // Servicios $servicios = $reqData['servicios'] ?? []; - if($reqData['guardas'] ?? 0 > 0){ + if ($reqData['guardas'] ?? 0 > 0) { array_push($servicios, 62); // Plegado de guardas } /* @@ -856,10 +868,9 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'plegadoGuardas' => 62, */ $serviciosAutomaticos = []; - - foreach($servicios as $servicio){ - if(intval($servicio) == 3 || intval($servicio) == 5 || intval($servicio) == 16) - { + + foreach ($servicios as $servicio) { + if (intval($servicio) == 3 || intval($servicio) == 5 || intval($servicio) == 16) { // Servicios acabado $resultado = PresupuestoCLienteService::getServiciosManipulado([ 'tarifa_id' => $servicio, @@ -867,26 +878,21 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'POD' => $POD, ]); array_push($serviciosAutomaticos, $resultado[0]); - if($resultado[0]->total <= 0 ) + if ($resultado[0]->total <= 0) $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); - + $coste_servicios += floatval($resultado[0]->total); - - } - else if (intval($servicio) == 24 || intval($servicio) == 9 ) - { + } else if (intval($servicio) == 24 || intval($servicio) == 9) { // Servicios preimpresion $resultado = PresupuestoCLienteService::getServiciosExtra([ 'tarifa_id' => $servicio, ]); array_push($serviciosAutomaticos, $resultado[0]); - if($resultado[0]->precio <= 0 ) + if ($resultado[0]->precio <= 0) $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); - + $coste_servicios += floatval($resultado[0]->precio); - } - else if (intval($servicio) == 62) - { + } else if (intval($servicio) == 62) { // Servicios manipulado $resultado = PresupuestoCLienteService::getServiciosManipulado([ 'tarifa_id' => $servicio, @@ -894,31 +900,33 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'POD' => $POD, ]); array_push($serviciosAutomaticos, $resultado[0]); - if($resultado[0]->total <= 0 ) + if ($resultado[0]->total <= 0) $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); - + $coste_servicios += floatval($resultado[0]->total); } } - - array_push($precio_u, round(($costeInterior + $coste_cubierta + $coste_sobrecubierta + $costeServiciosDefecto + $coste_servicios)/$tirada[$t], 4)); - foreach($error as $err){ - if($err != "") + + array_push($precio_u, round(($costeInterior + $coste_cubierta + $coste_sobrecubierta + $costeServiciosDefecto + $coste_servicios) / $tirada[$t], 4)); + array_push($peso, round($peso_interior + $peso_cubierta + $peso_sobrecubierta + $peso_guardas, 2)); + foreach ($error as $err) { + if ($err != "") break; } } - - + + $return_data = [ 'errors' => $error, - 'total_lp' => $costeInterior+$coste_cubierta+$coste_sobrecubierta, + 'total_lp' => $costeInterior + $coste_cubierta + $coste_sobrecubierta, 'acabadoCubierta' => $acabadoCubierta, 'acabadoSobrecubierta' => $acabadoSobrecubierta, 'total_servicios_defecto' => $costeServiciosDefecto, 'total_servicios_automaticos' => $coste_servicios, 'tiradas' => $tirada, 'precio_u' => $precio_u, - + 'peso' => $peso, + 'interior' => $interior, 'cubierta' => $cubierta, 'sobrecubierta' => $linea_sobrecubierta, @@ -935,9 +943,10 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } } - public function getDireccionesCliente(){ + public function getDireccionesCliente() + { if ($this->request->isAJAX()) { - + $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); @@ -948,7 +957,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController array_unshift($data, ['id' => 0, 'text' => 'Agregar nueva dirección']); return $this->respond([ - 'menu'=>$data, + 'menu' => $data, $csrfTokenName => $newTokenHash ]); } else { @@ -956,21 +965,54 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } } - public function getDatosDireccion(){ + public function getDatosDireccion() + { if ($this->request->isAJAX()) { - + $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); $reqData = $this->request->getPost(); $direccionId = $reqData['id'] ?? 0; + $peso = $reqData['peso'] ?? 0; + $unidades = $reqData['unidades'] ?? 0; $model = model('App\Models\Clientes\ClienteDireccionesModel'); $data = $model->getDireccion($direccionId); - + + $modelTarifaEnvio = model('App\Models\Tarifas\TarifaEnvioModel'); + $coste = 0; + if ($data > 0) { + $tarifas_envio = $modelTarifaEnvio->getTarifaEnvio($data[0]->pais_id, $peso, $unidades, 'cajas'); + for ($i = 0; $i < count($tarifas_envio); $i++) { + if ($peso > $tarifas_envio[$i]->peso_max) { + $tarifas_envio[$i]->precio = number_format($tarifas_envio[$i]->peso_min + ($peso - $data[$i]->peso_min) * $data[$i]->precio_adicional, 2); + } + // si no se calcula linealmente + else { + $m = (($tarifas_envio[$i]->precio_max - $tarifas_envio[$i]->precio_min) / ($tarifas_envio[$i]->peso_max - $tarifas_envio[$i]->peso_min)); + $b = $tarifas_envio[$i]->precio_max - $m * $tarifas_envio[$i]->peso_max; + $tarifas_envio[$i]->precio = number_format($m * $peso + $b, 2); + } + $tarifas_envio[$i]->margen = $tarifas_envio[$i]->margen; + } + + if(count($tarifas_envio) > 1){ + $tarifa_final = array_reduce($tarifas_envio, function ($previous, $current) { + return $current->precio < $previous->precio ? $current : $previous; + }); + $coste = $tarifa_final->precio; + } + else{ + $coste = $tarifas_envio[0]->precio; + } + + + } + $data[0]->coste = $coste; return $this->respond([ - 'data'=>$data, + 'data' => $data, $csrfTokenName => $newTokenHash ]); } else { @@ -978,10 +1020,11 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } } - public function getNuevaDireccion(){ + public function getNuevaDireccion() + { if ($this->request->isAJAX()) { - + $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); @@ -999,15 +1042,15 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'cp' => $reqData['cp'] ?? "", 'telefono' => $reqData['telefono'] ?? "" ]; - + $model = model('App\Models\Clientes\ClienteDireccionesModel'); $id = $model->nuevaDireccion($data); $menu = $model->getMenuDirecciones($data['cliente_id']); - + return $this->respond([ - 'data'=>$menu, + 'data' => $menu, $csrfTokenName => $newTokenHash ]); } else { @@ -1020,8 +1063,9 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController * * Funciones auxiliares * - **********************/ - protected function calcular_lomo($lineas, $lomo_inicial){ + **********************/ + protected function calcular_lomo($lineas, $lomo_inicial) + { $lomo = $lomo_inicial; foreach ($lineas as $linea) { if (count($linea) > 0) { diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_resumenItems.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_resumenItems.php index 88704cd8..e43acb94 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_resumenItems.php +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_resumenItems.php @@ -1,40 +1,47 @@
+

Resumen

-

Resumen

-

Libro

-

Rústica cosido tapa blanda

-

Número de páginas: 200

-

Tirada: 200

-

Prototipo: NO

+
Libro
+

Rústica cosido tapa blanda

+

Tamaño: 100x100

+

Número de páginas: 200

+

Tirada: 200

+

Prototipo: NO

+

Ferro: NO

-

Interior

-

Impresion: Negro premium

-

Páginas a color: 100

-

Papel: Blanco Offset 70gr/m^2

+
Interior
+

Impresion: Negro premium

+ +

Papel: Blanco Offset 70gr/m²

-

Cubierta

-

Papel: Blanco Offset 70gr/m^2

-

Impresión: 1 cara

+
Cubierta
+

Papel: Blanco Offset 70gr/m²

+

Impresión: 1 cara

+

Solapas: 25mm

+

Acabado: Ninguno

-

Sobrecubierta

-

Papel: Blanco Offset 70gr/m^2

-

Impresión: sin impresion

+
Sobrecubierta
+

Papel: Blanco Offset 70gr/m2

+

Ancho solapas: 25mm

+

Acabado: Ninguno

-

Guardas

-

Papel: Blanco Offset 70gr/m^2

-

Impresión: 1 cara

+
Guardas
+

Papel: Blanco Offset 70gr/m2

+

Impresión: 1 cara

-

Extras

-

Retractilado de 5

+
Extras
+

Retractilado individual

+

Retractilado de 5

+

Imprimir faja a color

-
Coste impresion: 100€
-
Coste impresion (4% IVA): 104€
-
Precio unidad (I.V.A. incl): 10.4€
-
Coste Envío: 30€
-
Total (I.V.A. inc.): 134€
+

Total: 100€

+
10.4€/ud
+
Coste impresion (4% IVA): 104€
+
Envío: 30€
+
diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/direcciones.js b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/direcciones.js index 4777abb3..d0b74ab9 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/direcciones.js +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/direcciones.js @@ -33,12 +33,13 @@ function initTiradasDirecciones() { let tirada_id = "ud_tiradaPrecio" + i; let total_id = "tot_tiradaPrecio" + i; let precio_u_id = "pu_tiradaPrecio" + i; + let peso = $('#' + id).attr('peso'); let html = ''; html += '
'; html += '
'; html += '