From a4394ed470386ec25794ba705b0f14107b403185 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Jim=C3=A9nez?= Date: Tue, 14 Jan 2025 20:33:55 +0100 Subject: [PATCH] =?UTF-8?q?trabajando=20en=20a=C3=B1adir=20tiradas=20alter?= =?UTF-8?q?nativas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presupuestos/Presupuestoacabados.php | 30 +- .../Presupuestos/Presupuestoadmin.php | 6 + .../Presupuestos/Presupuestocliente.php | 398 +++++++++++------- .../Presupuestoencuadernaciones.php | 34 +- .../Presupuestos/Presupuestomanipulados.php | 26 +- .../Presupuestotiradasalternativas.php | 183 ++++++-- .../Presupuestos/PresupuestoEntity.php | 2 + ci4/app/Language/es/Presupuestos.php | 2 +- .../Models/Presupuestos/PresupuestoModel.php | 3 + .../form/presupuestos/admin/_datosEnvios.js | 139 ------ .../form/presupuestos/admin/_datosEnvios.php | 9 + .../admin/_presupuestoDireccionesForm.php | 83 ++-- .../admin/_tiradasAlternativasItems.js | 153 ------- .../admin/_tiradasAlternativasItems.php | 17 +- .../cliente/viewPresupuestoclienteForm.php | 1 + .../components/tarjetaDireccionPresupuesto.js | 11 +- .../presupuestoAdmin/presupuestoAdminEdit.js | 15 +- .../sections/tiradasAlternativas.js | 338 +++++++++++++++ .../pages/presupuestoCliente/direcciones.js | 34 +- .../presupuestoCliente/presupuestoCliente.js | 9 + 20 files changed, 934 insertions(+), 559 deletions(-) create mode 100644 httpdocs/assets/js/safekat/pages/presupuestoAdmin/sections/tiradasAlternativas.js diff --git a/ci4/app/Controllers/Presupuestos/Presupuestoacabados.php b/ci4/app/Controllers/Presupuestos/Presupuestoacabados.php index 097dcb39..39f80e0f 100755 --- a/ci4/app/Controllers/Presupuestos/Presupuestoacabados.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestoacabados.php @@ -73,17 +73,8 @@ class Presupuestoacabados extends \App\Controllers\BaseResourceController $datos_tarifas = $postData['datos'] ?? []; $tirada = $postData['tirada'] ?? 0; $POD = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('POD')->value; - $result = []; - - if (count($datos_tarifas) > 0) { - foreach ($datos_tarifas as $tarifa) { - $proveedor = $tarifa['proveedor_id'] == '' ? -1 : $tarifa['proveedor_id']; - $values = $this->model->getPrecioTarifa($tarifa['tarifa_id'], $tirada, $proveedor, $POD); - $values[0]->cubierta = $tarifa['cubierta'] ?? 0; - $values[0]->sobrecubierta = $tarifa['sobrecubierta'] ?? 0; - array_push($result, $values[0]); - } - } + + $result = $this->getServiciosAcabados($datos_tarifas, $tirada, $POD); $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); @@ -95,6 +86,23 @@ class Presupuestoacabados extends \App\Controllers\BaseResourceController return $this->respond($data); } + public function getServiciosAcabados($datos_tarifas, $tirada, $POD){ + + $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); + $result = []; + if (count($datos_tarifas) > 0) { + foreach ($datos_tarifas as $tarifa) { + $proveedor = $tarifa['proveedor_id'] == '' ? -1 : $tarifa['proveedor_id']; + + $values = $model->getPrecioTarifa($tarifa['tarifa_id'], $tirada, $proveedor, $POD); + $values[0]->cubierta = $tarifa['cubierta'] ?? 0; + $values[0]->sobrecubierta = $tarifa['sobrecubierta'] ?? 0; + array_push($result, $values[0]); + } + } + return $result; + } + public function cargar() { if($this->request->isAJAX()) { diff --git a/ci4/app/Controllers/Presupuestos/Presupuestoadmin.php b/ci4/app/Controllers/Presupuestos/Presupuestoadmin.php index 750083b9..e9eabcae 100644 --- a/ci4/app/Controllers/Presupuestos/Presupuestoadmin.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestoadmin.php @@ -517,6 +517,12 @@ class Presupuestoadmin extends \App\Controllers\BaseResourceController $data['direcciones'] = $this->obtenerDireccionesEnvio($id, $presupuesto->cliente_id); } + $data['comentarios_cliente'] = $presupuesto->comentarios_cliente; + $data['comentarios_safekat'] = $presupuesto->comentarios_safekat; + $data['comentarios_presupuesto'] = $presupuesto->comentarios_presupuesto; + $data['comentarios_produccion'] = $presupuesto->comentarios_produccion; + + $data['tiradasAlternativas'] = json_decode($presupuesto->tirada_alternativa_json_data); /* diff --git a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php index dc493501..564616ad 100755 --- a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php @@ -126,6 +126,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $this->viewData['POD'] = $POD; $this->viewData['lomo_maximo'] = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('lomo_maximo')->value; $this->viewData['lomo_minimo_fresado_cosido'] = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('lomo_minimo_fresado_cosido')->value; + $this->viewData['eb'] = 0; $this->viewData['boxTitle'] = lang('Basic.global.addNew') . ' ' . $this->viewData['pageTitle'] . ' ' . lang('Basic.global.addNewSuffix'); @@ -166,6 +167,8 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $this->viewData['POD'] = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('POD')->value; $this->viewData['lomo_maximo'] = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('lomo_maximo')->value; $this->viewData['lomo_minimo_fresado_cosido'] = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('lomo_minimo_fresado_cosido')->value; + $this->viewData['eb'] = $presupuestoEntity->envio_base; + // 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) { @@ -384,7 +387,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } $guardas = PresupuestoClienteService::obtenerGuardas($input_data); - + foreach ($guardas as $linea) { if (count($linea) > 0) { $lomo += floatval($linea['mano']); @@ -403,20 +406,22 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController if ($tipo == 'cosido' || $tipo == 'fresado') { if ($lomo < $lomo_minimo_fresado_cosido) { $errors['status'] = 1; - $errors['value'] = 'No se pueden encuadernar libros cosidos o fresados con lomo inferior a ' - . $lomo_minimo_fresado_cosido . ' mm. El lomo actual es de ' . $lomo . ' mm. ' . - "Por favor, aumente el número de páginas o el gramaje del papel para que sea encuadernable."; + $errors['value'] = 'No se pueden encuadernar libros cosidos o fresados con lomo inferior a ' + . $lomo_minimo_fresado_cosido . ' mm. El lomo actual es de ' . $lomo . ' mm. ' . + "Por favor, aumente el número de páginas o el gramaje del papel para que sea encuadernable."; } if ($lomo > $lomo_maximo) { $errors['status'] = 1; - $errors['value'] = 'No se pueden encuadernar con un lomo superior a ' - . $lomo_maximo . ' mm. El lomo actual es de ' . $lomo . ' mm. ' . - "Por favor, disminuya el número de páginas o el gramaje del papel para que sea encuadernable."; + $errors['value'] = 'No se pueden encuadernar con un lomo superior a ' + . $lomo_maximo . ' mm. El lomo actual es de ' . $lomo . ' mm. ' . + "Por favor, disminuya el número de páginas o el gramaje del papel para que sea encuadernable."; } } - $data = (object) array('lomo' => $lomo, - 'errors' => $errors); + $data = (object) array( + 'lomo' => $lomo, + 'errors' => $errors + ); return $this->respond($data); } else { @@ -439,6 +444,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $cliente_id = $reqData['clienteId'] ?? -1; $tirada = $reqData['tirada'] ?? 0; + $selectedTirada = $reqData['selectedTirada'] ?? -1; $tamanio = $reqData['tamanio']; $paginas = $reqData['paginas'] ?? 0; $paginas_color = $reqData['paginasColor'] ?? 0; @@ -551,21 +557,67 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController ); } - if (count($direcciones) > 1) { + // calculo del envio base (tirada_maxima) + $return_data['eb'] = []; + for ($i = 0; $i < count($tirada); $i++) { + $direccion = []; + $coste_direccion = $this->getCosteEnvio( + $direccion, + $return_data['peso'][$i], + $tirada[$i], + false, + true + ); + + if (!property_exists($coste_direccion, 'coste')) { + $errorModel = new ErrorPresupuesto(); + $data['direccion'] = 'Sin direccion'; + $data['peso'] = $return_data['peso'][$i]; + $data['palets'] = 'Sin direccion'; + $errorModel->insertError( + $id, + auth()->user()->id, + 'No se ha podido calcular el coste de envío', + $data + ); + $return_data = [ + 'errors' => (object) ([ + 'status' => 1 + ]), + ]; + return $return_data; + } else { + $return_data['eb'][$i] = round($coste_direccion->coste, 2); + } + } + + + $envio_base = true; + if (count($direcciones) > 0) { for ($i = 0; $i < count($tirada); $i++) { - $coste_envio = 0.0; - $primer_envio = false; foreach ($direcciones as $direccion) { + // El primer envio no se calcula ya que se añade el base + if ($envio_base) { + //aporte del envio al precio unidad + $coste_envio += ($return_data['eb'][$i] / $tirada[$i]); + $envio_base = false; + continue; + } + if($selectedTirada > 0){ + $unidades = floor($direccion['unidades'] * $tirada[$i] / $selectedTirada); + } + else{ + $unidades = $direccion['unidades']; + } $coste_direccion = $this->getCosteEnvio( - $direccion['id'], + $direccion['direccion'], $return_data['peso'][$i], - !$primer_envio ? intval($tirada[$i]) : $direccion['unidades'], - $direccion['entregaPalets'] == 'true' ? 1 : 0 - )[0]; - - $primer_envio = true; + $unidades, + $direccion['entregaPalets'] == 'true' ? 1 : 0, + false, + ); if (!property_exists($coste_direccion, 'coste')) { @@ -586,43 +638,22 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController ]; return $return_data; } else { - $coste_envio += $coste_direccion->coste; + //aporte del envio al precio unidad + $coste_envio += ($coste_direccion->coste / $tirada[$i]); } } - $return_data['precio_u'][$i] = round(floatval($return_data['precio_u'][$i]) + $coste_envio / $tirada[$i], 4); + $return_data['precio_u'][$i] = round(floatval($return_data['precio_u'][$i]) + $coste_envio, 4); } } else { - for ($i = 0; $i < count($tirada); $i++) { - $coste_envio = 0.0; - $coste_direccion = $this->getCosteEnvio(null, $return_data['peso'][$i], $tirada[$i], false)[0]; - - if (!property_exists($coste_direccion, 'coste')) { - $errorModel = new ErrorPresupuesto(); - $data['direccion'] = 'Sin direccion'; - $data['peso'] = $return_data['peso'][$i]; - $data['palets'] = 'Sin direccion'; - $errorModel->insertError( - $id, - auth()->user()->id, - 'No se ha podido calcular el coste de envío', - $data - ); - $return_data = [ - 'errors' => (object) ([ - 'status' => 1 - ]), - ]; - return $return_data; - } else { - $coste_envio += $coste_direccion->coste; - } - - $return_data['precio_u'][$i] = round(floatval($return_data['precio_u'][$i]) + $coste_envio / $tirada[$i], 4); + $coste_envio += ($return_data['eb'][$i] / $tirada[$i]); + $return_data['precio_u'][$i] = round(floatval($return_data['precio_u'][$i]) + $coste_envio, 4); } } + + return $this->respond($return_data); } catch (Exception $e) { return $this->failServerError($e->getMessage() . ' - ' . $e->getFile() . ' - ' . $e->getLine()); @@ -708,16 +739,15 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } $anchoTotal = 0; - if(count($interior) == 2) { - - if(count($interior[0]) > 0) - $anchoTotal += $interior[0]['mano']; - if(count($interior[1]) > 0) + if (count($interior) == 2) { + + if (count($interior[0]) > 0) + $anchoTotal += $interior[0]['mano']; + if (count($interior[1]) > 0) $anchoTotal += $interior[1]['mano']; - } - else{ - if(count($interior) > 0) - $anchoTotal += $interior['mano']; + } else { + if (count($interior) > 0) + $anchoTotal += $interior['mano']; } @@ -900,17 +930,20 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $datosCabecera = $reqData['datosCabecera'] ?? []; + $confirmar = $reqData['confirmar'] ?? 0; $confirmar = intval($confirmar); $cliente_id = $reqData['clienteId'] ?? -1; - $tirada = $reqData['tirada'] ?? 0; + $tirada = $reqData['tirada'] ?? []; $selected_tirada = $reqData['selectedTirada'] ?? 0; $tamanio = $reqData['tamanio']; $paginas = $reqData['paginas'] ?? 0; $paginas_color = $reqData['paginasColor'] ?? 0; + $envio_base = $reqData['eb'] ?? 0; + $posPaginasColor = $reqData['posPaginasColor'] ?? ""; $paginasColorConsecutivas = $reqData['pagColorConsecutivas'] ?? 0; $papelInteriorDiferente = $reqData['papelInteriorDiferente'] ?? 0; @@ -1038,43 +1071,120 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController // seleccionamos el peso de la tirada seleccionada $peso_libro = $resultado_presupuesto['peso'][array_search($selected_tirada, $tirada)]; + // calculo del envio base (tirada_maxima) + $resultado_presupuesto['eb'] = []; + $datos_presupuesto['envio_base'] = 0; + for ($i = 0; $i < count($tirada); $i++) { + $direccion = []; + $coste_direccion = $this->getCosteEnvio( + $direccion, + $resultado_presupuesto['peso'][$i], + $tirada[$i], + false, + true + ); - if (count($direcciones) > 1) { - - for ($i = 0; $i < count($tirada); $i++) { - - $resultado_presupuesto['info']['totales'][$i]['coste_envio'] = 0.0; - $resultado_presupuesto['info']['totales'][$i]['margen_envio'] = 0.0; - - $coste_envio = 0.0; - foreach ($direcciones as $direccion) { - $precio_envio = $this->getCosteEnvio( - $direccion['id'], - $resultado_presupuesto['peso'][$i], - $direccion['unidades'], - $direccion['entregaPalets'] == 'true' ? 1 : 0 - )[0]; - $coste_envio += $precio_envio->coste; - $margen_envio = $precio_envio->margen; - $resultado_presupuesto['info']['totales'][$i]['coste_envio'] += $coste_envio - $margen_envio; - $resultado_presupuesto['info']['totales'][$i]['margen_envio'] += $margen_envio; - } - $resultado_presupuesto['precio_u'][$i] = round(floatval($resultado_presupuesto['precio_u'][$i]) + $coste_envio / $tirada[$i], 4); + if(intval($selected_tirada) == intval($tirada[$i])){ + $datos_presupuesto['envio_base'] = round($coste_direccion->coste*(1 + $coste_direccion->margen/100.0), 2) ; } - } else { - for ($i = 0; $i < count($tirada); $i++) { - $coste_envio = 0.0; - $precio_envio = $this->getCosteEnvio(null, $resultado_presupuesto['peso'][$i], $tirada[$i], false)[0]; - $coste_envio += $precio_envio->coste; - $margen_envio = $precio_envio->margen; - $resultado_presupuesto['precio_u'][$i] = round(floatval($resultado_presupuesto['precio_u'][$i]) + $coste_envio / $tirada[$i], 4); - - $resultado_presupuesto['info']['totales'][$i]['coste_envio'] = $coste_envio - $margen_envio; - $resultado_presupuesto['info']['totales'][$i]['margen_envio'] = $margen_envio; + if (!property_exists($coste_direccion, 'coste')) { + $errorModel = new ErrorPresupuesto(); + $data['direccion'] = 'Sin direccion'; + $data['peso'] = $resultado_presupuesto['peso'][$i]; + $data['palets'] = 'Sin direccion'; + $errorModel->insertError( + $id, + auth()->user()->id, + 'No se ha podido calcular el coste de envío', + $data + ); + $resultado_presupuesto = [ + 'errors' => (object) ([ + 'status' => 1 + ]), + ]; + return $resultado_presupuesto; + } else { + $resultado_presupuesto['eb'][$i] = round($coste_direccion->coste, 2); + $resultado_presupuesto['eb_margen'][$i] = round($coste_direccion->margen, 2); } } + + for ($i = 0; $i < count($tirada); $i++) { + + $resultado_presupuesto['info']['totales'][$i]['coste_envio'] = 0.0; + $resultado_presupuesto['info']['totales'][$i]['margen_envio'] = 0.0; + } + if (count($direcciones) > 0) { + + for ($i = 0; $i < count($tirada); $i++) { + + $envio_base = true; + $coste_envio = 0.0; + $margen_envio = 0.0; + foreach ($direcciones as $direccion) + { + // El primer envio no se calcula ya que se añade el base + if ($envio_base) { + //aporte del envio al precio unidad + $coste_envio += ($resultado_presupuesto['eb'][$i] / $tirada[$i]); + $margen_envio += ($resultado_presupuesto['eb_margen'][$i] / $tirada[$i]); + $resultado_presupuesto['info']['totales'][$i]['coste_envio'] += $resultado_presupuesto['eb'][$i] - $resultado_presupuesto['eb_margen'][$i]; + $resultado_presupuesto['info']['totales'][$i]['margen_envio'] += $resultado_presupuesto['eb_margen'][$i]; + $envio_base = false; + continue; + } + + $unidades = floor($direccion['unidades'] * $tirada[$i] / $selected_tirada); + $coste_direccion = $this->getCosteEnvio( + $direccion['direccion'], + $resultado_presupuesto['peso'][$i], + $unidades, + $direccion['entregaPalets'] == 'true' ? 1 : 0, + false, + ); + + if (!property_exists($coste_direccion, 'coste')) { + + $errorModel = new ErrorPresupuesto(); + $data['direccion'] = $direccion; + $data['peso'] = $resultado_presupuesto['peso'][$i]; + $data['palets'] = $direccion['entregaPalets'] == 'true' ? 1 : 0; + $errorModel->insertError( + $id, + auth()->user()->id, + 'No se ha podido calcular el coste de envío', + $data + ); + $resultado_presupuesto = [ + 'errors' => (object) ([ + 'status' => 1 + ]), + ]; + return $resultado_presupuesto; + } else { + //aporte del envio al precio unidad + $coste_envio += ($coste_direccion->coste / $tirada[$i]); + $resultado_presupuesto['info']['totales'][$i]['coste_envio'] += $coste_direccion->coste - $coste_direccion->margen; + $resultado_presupuesto['info']['totales'][$i]['margen_envio'] += $coste_direccion->margen; + + } + } + $resultado_presupuesto['precio_u'][$i] = round(floatval($resultado_presupuesto['precio_u'][$i]) + $coste_envio, 4); + } + } else { + for ($i = 0; $i < count($tirada); $i++) { + $coste_envio = 0.0; + $coste_envio += ($resultado_presupuesto['eb'][$i] / $tirada[$i]); + $resultado_presupuesto['info']['totales'][$i]['coste_envio'] = $resultado_presupuesto['eb'][$i] - $resultado_presupuesto['eb_margen'][$i]; + $resultado_presupuesto['info']['totales'][$i]['margen_envio'] = $resultado_presupuesto['eb_margen'][$i]; + $resultado_presupuesto['precio_u'][$i] = round(floatval($resultado_presupuesto['precio_u'][$i]) + $coste_envio, 4); + } + } + + $model_presupuesto = new PresupuestoModel(); $tiradas_alternativas = []; $resumen_totales = []; @@ -1117,6 +1227,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $datos_presupuesto['retractilado'] = $retractilado; $datos_presupuesto['retractilado5'] = $retractilado5; $datos_presupuesto['entrega_taller'] = $reqData['entrega_taller'] ?? 0; + $resultado_presupuesto['info']['merma'] = $this->calcular_merma($selected_tirada, $POD); @@ -1234,6 +1345,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController if ($presupuesto) { $data['lc'] = $presupuesto->lomo_cubierta; $data['lsc'] = $presupuesto->lomo_sobrecubierta; + $data['eb'] = $presupuesto->envio_base; $data['state'] = intval($presupuesto->estado_id); $data['datosGenerales']['titulo'] = $presupuesto->titulo; $data['datosGenerales']['autor'] = $presupuesto->autor; @@ -1314,7 +1426,6 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController if (intval($presupuesto->recoger_en_taller) == 1) { $data['direcciones']['entrega_taller'] = 1; } else { - $data['direcciones']['entrega_taller'] = 0; $data['direcciones'] = $this->obtenerDireccionesEnvio($id, $presupuesto->cliente_id); } @@ -1481,26 +1592,27 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $peso_envio = $peso_libro * $unidades / 1000.0; $data = $this->getCosteEnvio( - $direccion['id'], + $direccion['direccion'], $peso_libro, $direccion['unidades'], - $direccion['entregaPalets'] == 'false' ? 0 : 1 + $direccion['entregaPalets'] == 'false' ? 0 : 1, + false ); - if (count($data) > 0) { + if (isset($data->coste)) { - $data[0]->presupuesto_id = $presupuestoId; - $data[0]->tarifa_id = $data[0]->id; - unset($data[0]->id); - $data[0]->precio = $data[0]->coste; - unset($data[0]->coste); - $data[0]->entregaPieCalle = $direccion['entregaPalets'] == 'false' ? 0 : 1; - unset($data[0]->tipo); - $data[0]->peso = $peso_envio; - $data[0]->cantidad = $unidades; + $data->presupuesto_id = $presupuestoId; + $data->tarifa_id = $data->id; + unset($data->id); + $data->precio = $data->coste; + unset($data->coste); + $data->entregaPieCalle = $direccion['entregaPalets'] == 'false' ? 0 : 1; + unset($data->tipo); + $data->peso = $peso_envio; + $data->cantidad = $unidades; $model = new PresupuestoDireccionesModel(); - $model->insert($data[0]); + $model->insert($data); } } @@ -1566,18 +1678,17 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } - protected function getCosteEnvio($direccionId = null, $peso, $unidades, $entregaPieCalle) + protected function getCosteEnvio($direccion, $peso, $unidades, $entregaPieCalle, $calcular_envio_base) { + $return_data = $direccion; - if ($direccionId != null) { - $model = model('App\Models\Clientes\ClienteDireccionesModel'); - $data = $model->getDireccion($direccionId); + if ($calcular_envio_base) { + + $pais_id = 1; // españa + $cp = 18000; // envio nacional } else { - $data = []; - array_push($data, (object) [ - 'pais_id' => 1, // españa - 'cp' => 18000, // envio nacional - ]); + $pais_id = $direccion['pais_id']; + $cp = $direccion['cp']; } @@ -1585,44 +1696,43 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $coste = 0; $margen = 0; - if (count($data) > 0) { - $peso_envio = round(floatval($peso * $unidades / 1000.0)); // peso libro * unidades y se pasa a kilogramos - $tarifas_envio = $modelTarifaEnvio->getTarifaEnvio($data[0]->pais_id, $data[0]->cp, $peso_envio, $entregaPieCalle ? 'palets' : 'cajas'); - for ($i = 0; $i < count($tarifas_envio); $i++) { - if ($peso_envio > $tarifas_envio[$i]->peso_max || floatval($tarifas_envio[$i]->precio_max) == 0) { - $tarifas_envio[$i]->precio = number_format(floatval($tarifas_envio[$i]->precio_min) + ($peso_envio - floatval($tarifas_envio[$i]->peso_min)) * floatval($tarifas_envio[$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_envio + $b, 2); - } - $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 { - if (count($tarifas_envio) > 0) - $coste = $tarifas_envio[0]->precio; + $peso_envio = round(floatval(floatval($peso) * floatval($unidades) / 1000.0)); // peso libro * unidades y se pasa a kilogramos + $tarifas_envio = $modelTarifaEnvio->getTarifaEnvio($pais_id, $cp, $peso_envio, $entregaPieCalle ? 'palets' : 'cajas'); + for ($i = 0; $i < count($tarifas_envio); $i++) { + if ($peso_envio > $tarifas_envio[$i]->peso_max || floatval($tarifas_envio[$i]->precio_max) == 0) { + $tarifas_envio[$i]->precio = number_format(floatval($tarifas_envio[$i]->precio_min) + ($peso_envio - floatval($tarifas_envio[$i]->peso_min)) * floatval($tarifas_envio[$i]->precio_adicional), 2); } - } - if (count($data) > 0 && count($tarifas_envio) > 0) { - $data[0]->coste = $coste; - $data[0]->tipo = $entregaPieCalle ? 'palets' : 'cajas'; - $data[0]->margen = $margen; - $data[0]->proveedor = $tarifas_envio[0]->proveedor; - $data[0]->proveedor_id = $tarifas_envio[0]->proveedor_id; + // 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_envio + $b, 2); + } + $margen = $tarifas_envio[$i]->margen; } - return $data; + 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 { + if (count($tarifas_envio) > 0) + $coste = $tarifas_envio[0]->precio; + $margen = $tarifas_envio[0]->margen; + } + + $return_data['coste'] = $coste; + $return_data['tipo'] = $entregaPieCalle ? 'palets' : 'cajas'; + $return_data['margen'] = $margen; + $return_data['proveedor'] = $tarifas_envio[0]->proveedor; + $return_data['proveedor_id'] = $tarifas_envio[0]->proveedor_id; + + return (object) $return_data; } - protected function calcular_presupuesto($datos_entrada, $selected_tirada, $extra_info = false) + protected function calcular_presupuesto($datos_entrada, $selected_tirada, $extra_info = false) { try { $return_data = []; @@ -2618,7 +2728,9 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController { $model = model('App\Models\Presupuestos\PresupuestoDireccionesModel'); $model_direcciones = model('App\Models\Clientes\ClienteDireccionesModel'); - $direcciones = $model->where('presupuesto_id', $id)->findAll(); + $direcciones = $model->where('presupuesto_id', $id)->asArray()->findAll(); + + return $direcciones; $result = []; $temp = []; diff --git a/ci4/app/Controllers/Presupuestos/Presupuestoencuadernaciones.php b/ci4/app/Controllers/Presupuestos/Presupuestoencuadernaciones.php index ace1c37c..c66085b1 100755 --- a/ci4/app/Controllers/Presupuestos/Presupuestoencuadernaciones.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestoencuadernaciones.php @@ -76,18 +76,8 @@ class Presupuestoencuadernaciones extends \App\Controllers\BaseResourceControlle $POD = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('POD')->value; $ancho = $postData['ancho'] ?? 0; $alto = $postData['alto'] ?? 0; - $result = []; - - if (count($datos_tarifas) > 0) { - foreach ($datos_tarifas as $tarifa) { - if ($tarifaModel->isTarifaPorHoras($tarifa['tarifa_id'])) { - $values = $this->model->getPrecioTarifaHoras($tarifa['tarifa_id'], $paginas, $tirada, -1, $POD); - } else { - $values = $this->model->getPrecioTarifa($tarifa['tarifa_id'], $paginas, $tirada, $ancho, $alto, -1, $POD); - } - array_push($result, $values[0]); - } - } + + $result = $this->getServiciosEncuadernacion($datos_tarifas, $tirada, $paginas, $ancho, $alto, $POD); $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); @@ -99,6 +89,26 @@ class Presupuestoencuadernaciones extends \App\Controllers\BaseResourceControlle return $this->respond($data); } + public function getServiciosEncuadernacion($datos_tarifas, $tirada, $paginas, $ancho, $alto, $POD) + { + $result = []; + $tarifaModel = model('App\Models\Tarifas\TarifaEncuadernacionModel'); + $model = model('App\Models\Presupuestos\PresupuestoEncuadernacionesModel'); + + + if (count($datos_tarifas) > 0) { + foreach ($datos_tarifas as $tarifa) { + if ($tarifaModel->isTarifaPorHoras($tarifa['tarifa_id'])) { + $values = $model->getPrecioTarifaHoras($tarifa['tarifa_id'], $paginas, $tirada, -1, $POD); + } else { + $values = $model->getPrecioTarifa($tarifa['tarifa_id'], $paginas, $tirada, $ancho, $alto, -1, $POD); + } + array_push($result, $values[0]); + } + } + return $result; + } + public function datatable() { diff --git a/ci4/app/Controllers/Presupuestos/Presupuestomanipulados.php b/ci4/app/Controllers/Presupuestos/Presupuestomanipulados.php index fb00fe11..f5844851 100755 --- a/ci4/app/Controllers/Presupuestos/Presupuestomanipulados.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestomanipulados.php @@ -95,14 +95,8 @@ class Presupuestomanipulados extends \App\Controllers\BaseResourceController $tarifas = $postData['datos'] ?? []; $tirada = $postData['tirada'] ?? 0; $POD = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('POD')->value; - $result = []; - - if(count($tarifas)>0){ - foreach ($tarifas as $tarifa){ - $values = $this->model->getPrecioTarifa($tarifa, $tirada, $POD); - array_push($result, $values[0]); - } - } + + $result = $this->getServiciosManipulado($tarifas, $tirada, $POD); $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); @@ -113,6 +107,22 @@ class Presupuestomanipulados extends \App\Controllers\BaseResourceController return $this->respond($data); } + + public function getServiciosManipulado($datos_tarifas, $tirada, $POD) + { + $result = []; + $model = model('App\Models\Presupuestos\PresupuestoManipuladosModel'); + + if (count($datos_tarifas) > 0) { + foreach ($datos_tarifas as $tarifa) { + $values = $model->getPrecioTarifa($tarifa['tarifa_id'], $tirada, $POD); + $values[0]->cubierta = $tarifa['cubierta'] ?? 0; + $values[0]->sobrecubierta = $tarifa['sobrecubierta'] ?? 0; + array_push($result, $values[0]); + } + } + return $result; + } public function datatable() diff --git a/ci4/app/Controllers/Presupuestos/Presupuestotiradasalternativas.php b/ci4/app/Controllers/Presupuestos/Presupuestotiradasalternativas.php index 05702a7e..60b5e12f 100644 --- a/ci4/app/Controllers/Presupuestos/Presupuestotiradasalternativas.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestotiradasalternativas.php @@ -82,7 +82,12 @@ class Presupuestotiradasalternativas extends \App\Controllers\BaseResourceContro $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); + $id = $reqData['id'] ?? 0; + $json_data = $reqData['json_tiradas'] ?? null; + $json_data_acabados = $reqData['json_acabados'] ?? null; + $json_data_encuadernacion = $reqData['json_encuadernaciones'] ?? null; + $json_data_manipulado = $reqData['json_manipulado'] ?? null; $cliente_id = $reqData['cliente_id'] ?? 0; $tipo_impresion_id = $reqData['tipo_impresion_id'] ?? 4; @@ -95,7 +100,7 @@ class Presupuestotiradasalternativas extends \App\Controllers\BaseResourceContro foreach ($data as $linea) { // Se obtienen los valores de cada linea para el calculo del precio - $datosPedido = (object)array( + $datosPedido = (object) array( 'paginas' => intval($linea['paginas']) ?? 0, 'tirada' => intval($reqData['tirada']) ?? 0, 'merma' => intval($reqData['merma']) ?? 0, @@ -144,24 +149,24 @@ class Presupuestotiradasalternativas extends \App\Controllers\BaseResourceContro $uso = 'interior'; $tipo = strpos($linea['row_id'], "_bn") !== false ? 'negro' : 'color'; $paginas_negro = isset($linea['numPagColor']) ? intval($datosPedido->paginas) - intval($linea['numPagColor']) : 0; - $paginas_color = $linea['numPagColor'] ?? 0; - $paginas = (object)array( + $paginas_color = $linea['numPagColor'] ?? 0; + $paginas = (object) array( 'negro' => $paginas_negro, 'color' => $paginas_color, ); - $parametrosRotativa = (object)array( + $parametrosRotativa = (object) array( 'a_favor_fibra' => $datosPedido->a_favor_fibra, - 'bnPages' => $paginas->negro, - 'colorPages' => $paginas->color, + 'bnPages' => $paginas->negro, + 'colorPages' => $paginas->color, 'rotativa_gota_negro' => 0, 'rotativa_gota_color' => 0, ); - $parametrosRotativa->rotativa_gota_negro = floatval($linea['gotaNegro']?? 0); - $parametrosRotativa->rotativa_gota_color = floatval($linea['gotaColor']?? 0); - $parametrosRotativa->rotativa_negro = floatval($linea['cobNegro'] ?? 0); - $parametrosRotativa->rotativa_cyan = floatval($linea['cobCyan'] ?? 0); - $parametrosRotativa->rotativa_magenta = floatval($linea['cobMagenta']?? 0); - $parametrosRotativa->rotativa_amarillo = floatval($linea['cobAmarillo']?? 0); + $parametrosRotativa->rotativa_gota_negro = floatval($linea['gotaNegro'] ?? 0); + $parametrosRotativa->rotativa_gota_color = floatval($linea['gotaColor'] ?? 0); + $parametrosRotativa->rotativa_negro = floatval($linea['cobNegro'] ?? 0); + $parametrosRotativa->rotativa_cyan = floatval($linea['cobCyan'] ?? 0); + $parametrosRotativa->rotativa_magenta = floatval($linea['cobMagenta'] ?? 0); + $parametrosRotativa->rotativa_amarillo = floatval($linea['cobAmarillo'] ?? 0); break; case 'lp_cubierta': $uso = 'cubierta'; @@ -194,14 +199,14 @@ class Presupuestotiradasalternativas extends \App\Controllers\BaseResourceContro $datosTipolog = $linea['gotaNegro'] ?? null; if (!is_null($datosTipolog)) { $datosTipolog = []; - $data_temp = (object)array( + $data_temp = (object) array( 'negro' => floatval($linea['cobNegro'] ?? 0), 'cyan' => floatval($linea['cobCyan'] ?? 0), - 'magenta' => floatval($linea['cobMagenta']?? 0), - 'amarillo' => floatval($linea['cobAmarillo']?? 0), + 'magenta' => floatval($linea['cobMagenta'] ?? 0), + 'amarillo' => floatval($linea['cobAmarillo'] ?? 0), 'cg' => floatval($linea['cobCG'] ?? 0), - 'gota_negro' => floatval($linea['gotaNegro']?? 0), - 'gota_color' => floatval($linea['gotaColor']?? 0), + 'gota_negro' => floatval($linea['gotaNegro'] ?? 0), + 'gota_color' => floatval($linea['gotaColor'] ?? 0), ); array_push($datosTipolog, $data_temp); } @@ -213,13 +218,13 @@ class Presupuestotiradasalternativas extends \App\Controllers\BaseResourceContro $datosLinea['datosPedido'] = $datosPedido; $datosLinea['cliente_id'] = $cliente_id; $datosLinea['papel'] = $papel; - if(isset($isColor)) - $datosLinea['isColor'] = $isColor; - if(isset($opciones_papel)) + if (isset($isColor)) + $datosLinea['isColor'] = $isColor; + if (isset($opciones_papel)) $datosLinea['opciones_papel'] = $opciones_papel; - if(isset($parametrosRotativa)) + if (isset($parametrosRotativa)) $datosLinea['parametrosRotativa'] = $parametrosRotativa; - if(isset($paginas)) + if (isset($paginas)) $datosLinea['paginas'] = $paginas; $datosLinea['maquina'] = $maquina; $datosLinea['papel_generico'] = $papel_generico; @@ -257,19 +262,113 @@ class Presupuestotiradasalternativas extends \App\Controllers\BaseResourceContro $linea_coste['total_coste'] += $linea_coste['fields']['precio_tinta']; if (strpos($linea['row_id'], 'lp_rot') === 0) { - $linea_coste['total_coste'] += - $linea_coste['fields']['total_corte']; - } + $linea_coste['total_coste'] += + $linea_coste['fields']['total_corte']; + } } - + $linea_coste['total_margen'] = $linea_coste['fields']['margen_papel_pedido'] + $linea_coste['fields']['margen_impresion_horas'] + $linea_coste['fields']['margen_click_pedido']; - + unset($linea_coste['fields']); array_push($values, $linea_coste); } + + // Calculo de los servicios (presimpresion y extra no dependen de nada) + $servicios = (object) (['coste' => 0.0, 'margen' => 0.0]); + + if ($json_data_acabados) { + $json_data_acabados = json_decode($json_data_acabados, true); + if (count($json_data_acabados) > 0) { + + $acabados = new Presupuestoacabados(); + $POD = (new \App\Models\Configuracion\ConfigVariableModel())->getVariable('POD')->value; + $result = $acabados->getServiciosAcabados($json_data_acabados, $reqData['tirada'], $POD); + if (count($result) > 0) { + foreach ($result as $servicio) { + $coste = round($servicio->total / (1 + $servicio->margen / 100), 2); + $margen = round($servicio->total - $coste, 2); + $servicios->coste += $coste; + $servicios->margen += $margen; + } + } + } + } + + if ($json_data_encuadernacion) { + $json_data_encuadernacion = json_decode($json_data_encuadernacion, true); + if (count($json_data_encuadernacion) > 0) { + + $encuadernacion = new Presupuestoencuadernaciones(); + $POD = (new \App\Models\Configuracion\ConfigVariableModel())->getVariable('POD')->value; + $result = $encuadernacion->getServiciosEncuadernacion($json_data_encuadernacion, $reqData['tirada'], $reqData['paginas'], $reqData['ancho'], $reqData['alto'], $POD); + if (count($result) > 0) { + foreach ($result as $servicio) { + $coste = round($servicio->total / (1 + $servicio->margen / 100), 2); + $margen = round($servicio->total - $coste, 2); + $servicios->coste += $coste; + $servicios->margen += $margen; + } + } + } + } + + if ($json_data_manipulado) { + $json_data_manipulado = json_decode($json_data_manipulado, true); + if (count($json_data_manipulado) > 0) { + $manipulados = new Presupuestomanipulados(); + $POD = (new \App\Models\Configuracion\ConfigVariableModel())->getVariable('POD')->value; + $result = $manipulados->getServiciosManipulado($json_data_manipulado, $reqData['tirada'], $POD); + if (count($result) > 0) { + foreach ($result as $servicio) { + $coste = round($servicio->total / (1 + $servicio->margen / 100), 2); + $margen = round($servicio->total - $coste, 2); + $servicios->coste += $coste; + $servicios->margen += $margen; + } + } + } + } + + $json_envios = $reqData['json_envios'] ?? null; + $coste_envio = 0.0; + $margen_envio = 0.0; + $tirada_base = floatval($reqData['tirada_base']); + $peso_libro = floatval($reqData['peso_libro']); + // el primer envio con la tirada base + $model = model('App\Models\Tarifas\TarifaEnvioModel'); + $envios = $model->getTarifaEnvio(1, 18000, $tirada_base * $peso_libro/1000.0, "cajas"); + $resultado = $this->calcular_envio($envios, $tirada_base * $peso_libro/1000.0); + $coste_envio += $resultado->coste; + $margen_envio += $resultado->margen; + + if ($json_envios) { + $json_envios = json_decode($json_envios, true); + if (count($json_envios) > 0) { + //la primera linea es el envio base + for($i = 1; $i < count($json_envios); $i++) { + + $porcentaje = ($json_envios[$i]['cantidad']) / $tirada_base * 100.0; + $cantidad = floor($reqData['tirada'] * $porcentaje / 100.0); + $peso_envio = $cantidad * $peso_libro / 1000.0; + + $paisId = $json_envios[$i]['pais_id']; + $cp = $json_envios[$i]['cp']; + $tipo_envio = $json_envios[$i]['entregaPieCalle'] == 1 ? 'palets' : 'cajas'; + + $model = model('App\Models\Tarifas\TarifaEnvioModel'); + $envios = $model->getTarifaEnvio($paisId, $cp, $peso_envio, $tipo_envio); + + $resultado = $this->calcular_envio($envios, $peso_envio); + $coste_envio += $resultado->coste; + $margen_envio += $resultado->margen; + } + } + } + + } else { $values = []; } @@ -279,8 +378,36 @@ class Presupuestotiradasalternativas extends \App\Controllers\BaseResourceContro $response[$csrfTokenName] = $newTokenHash; $response['lineas'] = $values; + $response['servicios'] = $servicios; + $response['envios'] = (object) (['coste' => $coste_envio, 'margen' => $margen_envio]); return $this->respond($response); - + + } + + private function calcular_envio($envio, $peso_envio) + { + $coste_envio = 0.0; + $margen_envio = 0.0; + if (count(value: $envio) > 0) { + $envio = $envio[0]; + if ($envio->id != null) { + + if ($peso_envio > $envio->peso_max || floatval($envio->precio_max) == 0) { + $coste_envio += number_format(floatval($envio->precio_min) + ($peso_envio - floatval($envio->peso_min)) * floatval($envio->precio_adicional), 2); + } + // si no se calcula linealmente + else { + $m = (($envio->precio_max - $envio->precio_min) / ($envio->peso_max - $envio->peso_min)); + $b = $envio->precio_max - $m * $envio->peso_max; + $coste_envio = number_format($m * $peso_envio + $b, 2); + + } + + $margen_envio += $coste_envio * $envio->margen / 100.0; + } + } + + return (object) (['coste' => $coste_envio, 'margen' => $margen_envio]); } } diff --git a/ci4/app/Entities/Presupuestos/PresupuestoEntity.php b/ci4/app/Entities/Presupuestos/PresupuestoEntity.php index 660beb08..68de926f 100755 --- a/ci4/app/Entities/Presupuestos/PresupuestoEntity.php +++ b/ci4/app/Entities/Presupuestos/PresupuestoEntity.php @@ -63,6 +63,7 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity "comentarios_pdf" => null, "comentarios_tarifa" => null, "comentarios_produccion" => null, + "comentarios_presupuesto" => null, "lomo_cubierta" => null, "lomo_sobrecubierta" => null, "total_presupuesto" => null, @@ -107,6 +108,7 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity 'paginasCuadernillo' => null, 'lomo_redondo' => null, 'cabezada' => null, + 'envio_base' => null, ]; protected $casts = [ "cliente_id" => "int", diff --git a/ci4/app/Language/es/Presupuestos.php b/ci4/app/Language/es/Presupuestos.php index 92e9a9a3..3404b63a 100755 --- a/ci4/app/Language/es/Presupuestos.php +++ b/ci4/app/Language/es/Presupuestos.php @@ -315,7 +315,7 @@ return [ 'tiradasAlternativas' => 'Tiradas alternativas', 'tiradasInfoIVA' => 'Los precios mostrados no incluyen IVA', 'tiradaMargen' => 'Margen', - 'tiradaEnvio' => 'Coste Envío', + 'tiradaEnvio' => 'Precio Envío', 'tiradaImpresion' => 'Coste Impresión', 'duplicado' => 'DUPLICADO', diff --git a/ci4/app/Models/Presupuestos/PresupuestoModel.php b/ci4/app/Models/Presupuestos/PresupuestoModel.php index 99e01b99..4a80cd50 100755 --- a/ci4/app/Models/Presupuestos/PresupuestoModel.php +++ b/ci4/app/Models/Presupuestos/PresupuestoModel.php @@ -85,6 +85,7 @@ class PresupuestoModel extends \App\Models\BaseModel "comentarios_safekat", "comentarios_pdf", "comentarios_tarifa", + "comentarios_presupuesto", "comentarios_produccion", "lomo_cubierta", "lomo_sobrecubierta", @@ -132,6 +133,7 @@ class PresupuestoModel extends \App\Models\BaseModel 'paginasCuadernillo', 'lomo_redondo', 'cabezada', + 'envio_base', ]; protected $returnType = "App\Entities\Presupuestos\PresupuestoEntity"; @@ -412,6 +414,7 @@ class PresupuestoModel extends \App\Models\BaseModel 'ferro_digital' => $data['ferro_digital'] ? 1 : 0, 'marcapaginas' => $data['marcapaginas'] ? 1 : 0, 'prototipo' => $data['prototipo'] ? 1 : 0, + 'envio_base' => $data['envio_base'], 'papel_formato_id' => is_null($papel_formato_id) ? 0 : $papel_formato_id->id, 'papel_formato_personalizado' => !$papel_formato_id ? 1 : 0, 'papel_formato_ancho' => !$papel_formato_id ? $data['tamanio']['ancho'] : null, diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_datosEnvios.js b/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_datosEnvios.js index 052213a2..0aa5b37c 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_datosEnvios.js +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_datosEnvios.js @@ -73,38 +73,6 @@ async function get_coste_envio_tiradasAlternativas(tirada){ } -function checkInsertar(){ - - var cantidad_total = 0 - $('#tableOfDireccionesEnvio').DataTable().rows().every( function ( rowIdx, tableLoop, rowLoop ) { - var data = this.data(); - cantidad_total += parseInt(data.cantidad ) - } ); - var htmlString = '' - if(cantidad_total < parseInt($('#tirada').val())){ - $('#rowInsertar').css('display', 'flex') - } - else{ - $('#rowInsertar').css('display', 'none') - } - - if(cantidad_total != parseInt($('#tirada').val())){ - htmlString = ` - `; - } - $('#alert-envios').html(htmlString) -} - - async function updateTablaEnvios(tirada_inicial = null, tirada = null){ var peso_total_libro = get_peso_libro(); @@ -201,80 +169,11 @@ $('#insertar_direccion').on('click', function(){ -$(document).on('click', '.delete-add-row', function(e) { - const row = $(this).closest('tr'); - tableEnvios.row( row ) - .remove() - .draw(); - checkInsertar() - //updateTotales(false, false, true) - updatePresupuesto({ - update_lineas: false, - update_servicios: false, - update_envios: false, - update_resumen: true, - update_tiradas_alternativas: true - }) - showBreadCrumbSaveButton(true); - -}) - -$(document).on('click', '.btn-edit-add', function(e) { - const row = $(this).closest('tr'); - var data = tableEnvios.row( row ).data() - - $("#addressForm").attr('action','edit') - $("#addressForm").attr('row', row[0]._DT_RowIndex) - $("#addressForm").attr('presupuestodireccion_id', $(this).attr('data-id')) - var $newAddDialog = $("#addressForm") - var maximaCantidad = parseInt($('#tirada').val()) - $("#add_cantidad").attr("max" , maximaCantidad); - $("#add_cantidad").val( maximaCantidad); - $("#add_cantidad").on('change', function(){ - $("#add_cantidad").val(parseInt($("#add_cantidad").val())>maximaCantidad ? maximaCantidad : $("#add_cantidad").val()) - }) - - cantidad_total = 0 - tableEnvios.rows().every( function ( rowIdx, tableLoop, rowLoop ) { - var data2 = this.data(); - cantidad_total += parseInt(data2.cantidad) - } ); - cantidad_total -= parseInt(data.cantidad) // Si es editar tienes que restar los de la linea actual - $('#add_cantidad').attr('max-value', parseInt($('#tirada').val())-cantidad_total) - $('#add_cantidad').val(parseInt($('#tirada').val())-cantidad_total) - - $('#add_att').val(data.att) - $('#add_direccion').val(data.direccion) - $('#add_email').val(data.email) - $('#add_cp').val(data.cp) - $('#add_municipio').val(data.municipio) - $('#add_provincia').val(data.provincia) - $('#add_pais_id').val(data.paisId) - $('#add_telefono').val(data.telefono) - $('#add_cantidad').val(data.cantidad) - $('#add_entregaPieCalle').prop('checked', data.entregaPieCalle==1?true:false) - - $newAddDialog.modal('show') -}) -$('#recoger_en_taller').change(function(){ - if(this.checked) { - $('#rowTable').css('display', 'none') - $('#rowInsertar').css('display', 'none') - tableEnvios.clear().draw() - } - else{ - $('#rowTable').css('display', 'flex') - $('#rowInsertar').css('display', 'flex') - tableEnvios.columns.adjust(); - } -}) - - @@ -316,43 +215,5 @@ function save_datos_envios(){ } -function load_datos_envios(){ - - window.direccionesList.forEach((linea) => { - tableEnvios.row - .add({ - 'tarifa_id': linea.tarifa_id, - 'cantidad': linea.cantidad, - 'peso': linea.peso, - 'att': linea.att, - 'email': linea.email, - 'direccion': linea.direccion, - 'cp': linea.cp, - 'municipio': linea.municipio, - 'provincia': linea.provincia, - 'paisId': linea.pais_id, - 'telefono': linea.telefono, - 'proveedor': linea.proveedor, - 'proveedor_id': linea.proveedor_id, - 'precio': linea.precio, - 'margen': linea.margen, - 'entregaPieCalle': linea.entregaPieCalle, - 'actionBtns_direcciones': actionBtns_direcciones, - }) - .draw(); - checkInsertar() - - - }); - - updatePresupuesto({ - update_lineas: false, - update_servicios: false, - update_envios: false, - update_resumen: true, - update_tiradas_alternativas: false - }) - -} */ \ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_datosEnvios.php b/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_datosEnvios.php index c83de512..9d3b89e7 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_datosEnvios.php +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_datosEnvios.php @@ -10,6 +10,15 @@
+
+
+ + +
+ +
diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_presupuestoDireccionesForm.php b/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_presupuestoDireccionesForm.php index 1d28d1d9..18e014fd 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_presupuestoDireccionesForm.php +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_presupuestoDireccionesForm.php @@ -2,20 +2,21 @@ - + @@ -48,21 +48,6 @@ - - - -section("additionalInlineJs") ?> - /* window.datatable_lang_url = "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json"; - - window.datatable_TA_url = ""; - window.get_tirada_url = ""; - - window.error_lang_tirada_alt_duplicada = ""; - window.error_lang_tirada_alt_tipo = ""; - */ -endSection() ?> - - diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/viewPresupuestoclienteForm.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/viewPresupuestoclienteForm.php index cdd7b7de..7a23896f 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/viewPresupuestoclienteForm.php +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/viewPresupuestoclienteForm.php @@ -29,6 +29,7 @@ +
diff --git a/httpdocs/assets/js/safekat/components/tarjetaDireccionPresupuesto.js b/httpdocs/assets/js/safekat/components/tarjetaDireccionPresupuesto.js index f7140387..7c555773 100644 --- a/httpdocs/assets/js/safekat/components/tarjetaDireccionPresupuesto.js +++ b/httpdocs/assets/js/safekat/components/tarjetaDireccionPresupuesto.js @@ -8,6 +8,7 @@ class tarjetaDireccion { this.card = this.#generateHTML(id, direccion); this.deleteBtn = this.card.find('.direccion-eliminar'); this.editBtn = this.card.find('.direccion-editar'); + this.direccion = direccion; } @@ -89,13 +90,21 @@ class tarjetaDireccion { return this.id; } + getPaisId() { + return this.direccion.pais_id; + } + + getDireccion() { + return this.direccion; + } + getDireccionId() { return this.direccionId; } getFormData() { return { - id: this.direccionId, + direccion: this.direccion, unidades: this.getUnidades(), entregaPalets: this.getEntregaPalets() }; diff --git a/httpdocs/assets/js/safekat/pages/presupuestoAdmin/presupuestoAdminEdit.js b/httpdocs/assets/js/safekat/pages/presupuestoAdmin/presupuestoAdminEdit.js index 577ba677..b912047f 100644 --- a/httpdocs/assets/js/safekat/pages/presupuestoAdmin/presupuestoAdminEdit.js +++ b/httpdocs/assets/js/safekat/pages/presupuestoAdmin/presupuestoAdminEdit.js @@ -8,6 +8,7 @@ import LineasPresupuesto from './sections/lineasPresupuesto.js'; import PreviewFormasAdmin from './sections/previewFormasAdmin.js'; import Servicios from './sections/servicios.js'; import Envios from './sections/envios.js'; +import TiradasAlernativas from './sections/tiradasAlternativas.js'; class PresupuestoAdminEdit { @@ -40,6 +41,9 @@ class PresupuestoAdminEdit { this.previewFormasAdmin = null; this.servicios = new Servicios(); this.envios = new Envios(); + this.tiradasAlternativas = new TiradasAlernativas({ + getDimensionLibro: this.getDimensionLibro, + }); this.calcularPresupuesto = false; } @@ -69,7 +73,6 @@ class PresupuestoAdminEdit { this.datosLibro.init(); this.comparador.init(); this.lineasPresupuesto.init(); - this.envios.init(); this.previewFormasAdmin = new PreviewFormasAdmin(tipoLibro, this.tipoTapa, { @@ -84,6 +87,8 @@ class PresupuestoAdminEdit { ); this.previewFormasAdmin.init(); this.servicios.init(); + this.envios.init(); + this.tiradasAlternativas.init(); if (window.location.href.includes("edit")) { @@ -128,6 +133,14 @@ class PresupuestoAdminEdit { self.servicios.cargar(response.data.servicios); self.envios.cargar(response.data.direcciones); + + $('#comentariosCliente').val(response.data.comentarios_cliente); + $('#comentariosSafekat').val(response.data.comentarios_safekat); + $('#comentariosPdf').val(response.data.comentarios_presupuesto); + $('#comentariosProduccion').val(response.data.comentarios_produccion); + + self.tiradasAlternativas.cargar(response.data.tiradasAlternativas); + /*self.direcciones.handleChangeCliente(); self.direcciones.cargarDatos(response.data.direcciones, response.data.datosGenerales); diff --git a/httpdocs/assets/js/safekat/pages/presupuestoAdmin/sections/tiradasAlternativas.js b/httpdocs/assets/js/safekat/pages/presupuestoAdmin/sections/tiradasAlternativas.js new file mode 100644 index 00000000..686ec125 --- /dev/null +++ b/httpdocs/assets/js/safekat/pages/presupuestoAdmin/sections/tiradasAlternativas.js @@ -0,0 +1,338 @@ +import { getToken } from "../../../common/common.js"; + +class TiradasAlernativas { + + constructor(functions = {}) { + + this.getDimensionLibro = functions.getDimensionLibro; + + this.csrf_token = getToken(); + this.csrf_hash = $('#mainContainer').find('input[name="' + this.csrf_token + '"]').val(); + + this.addTirada = $('#add_tirada_alt'); + this.tirada = $('#tirada_alt'); + + this.table = null; + } + + init() { + + const self = this; + + this.addTirada.on('click', this.addTiradaAlt.bind(this)); + + this.table = $('#tableTiradas').DataTable({ + + "language": { + "url": "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json" + }, + "paging": false, + "info": false, + "searching": false, + "ordering": true, + "autoWidth": false, + "responsive": true, + "columnDefs": [ + { + orderable: false, + searchable: false, + targets: [$('#tableTiradas').find("tr:first th").length - 1] + }, + ], + "columns": [ + { data: "tirada" }, + { data: 'coste_impresion' }, + { + data: 'coste_envio', + render: function (data, type, row) { + return parseFloat(data).toFixed(2); + }, + }, + { + data: 'margen', + render: function (data, type, row) { + return data + '%'; + } + }, + { + data: 'total_pedido', + render: function (data, type, row) { + return parseFloat(data).toFixed(2); + } + }, + { + data: 'precio_unidad', + render: function (data, type, row) { + return parseFloat(data).toFixed(4); + } + }, + { + data: function (row, type, set, meta) { + return ` + + + `; + }, + className: 'row-edit dt-center' + } + ], + order: [[0, 'asc']] + }); + + // Evento de borrado de una fila de la tabla de tiradas + $(document).on('click', '.btn-delete-tirada', function (e) { + + const row = $(this).closest('tr'); + self.table.row(row) + .remove() + .draw(); + showBreadCrumbSaveButton(true); + }) + } + + + cargar(datos) { + + this.table.clear().draw(); + this.table.rows.add(datos).draw(); + } + + + addTiradaAlt() { + + const self = this; + const id = window.location.href.split('/').pop(); + + const tirada = parseInt(this.tirada.val()); + const tirada_ejemplo = parseInt($('#tirada').val()); + const POD = parseInt($('#POD').val()); + + if ((tirada_ejemplo > POD && tirada <= POD) || + (tirada_ejemplo <= POD && tirada > POD)) { + popErrorAlert('No se pueden mezclar tiradas POD y no POD', 'alert-tiradas_alt'); + return; + } + + if (this.table.rows().count() > 0) { + let tiradas = this.table.rows().data().toArray(); + if (tiradas.find(t => parseInt(t.tirada) == tirada)) { + popErrorAlert('La tirada ya existe', 'alert-tiradas_alt'); + return; + } + } + + const dimension = this.getDimensionLibro(); + + const envios = JSON.stringify($('#tableOfDireccionesEnvio').DataTable().rows().data().toArray()); + + let datos = { + id: id, + tirada: this.tirada.val(), + peso_libro: this.get_peso_libro(), + tirada_base: $('#tirada').val(), + paginas: $('#paginas').val(), + merma: this.getMerma(tirada), + tipo_impresion_id: $('#tipo_impresion_id').val(), + json_tiradas: this.generate_json_lp(), + json_acabados: this.generate_json_servicios('acabados'), + json_encuadernaciones: this.generate_json_servicios('encuadernaciones'), + json_manipulado: this.generate_json_servicios('manipulado'), + json_envios: envios, + ancho: dimension.ancho, + alto: dimension.alto, + cliente_id: $('#clienteId').find(":selected").val(), + solapas_cubierta: $('#solapas').is(':checked') ? 1 : 0, + solapas_cubierta_ancho: $('#solapas').is(':checked') ? parseInt($('#solapas_ancho').val()) : 0, + solapas_sobrecubierta: $('#solapas_sobrecubierta').is(':checked') ? 1 : 0, + solapas_sobrecubierta_ancho: $('#solapas_sobrecubierta').is(':checked') ? parseInt($('#solapas_ancho_sobrecubierta').val()) : 0, + lomo: $('#lomo_cubierta').val(), + }; + + $.ajax({ + type: "POST", + url: '/presupuestotiradasalternativas/datatable_2', + data: datos, + success: async function (data) { + + var coste_total = 0.0; + var margen_total = 0.0; + + var costes_servicios = 0.0; + var margen_servicios = 0.0; + + var coste_envio = 0.0; + var margen_envio = 0.0; + + if (data.lineas.length > 0) { + // Se cogen los valores de la linea con los datos correspondientes + data.lineas.forEach(function (value) { + coste_total += value.total_coste; + margen_total += value.total_margen; + }); + + if (data.servicios) { + costes_servicios += data.servicios.coste; + margen_servicios += data.servicios.margen; + + } + + $('#tableOfServiciosPreimpresion').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { + var rowData = this.data(); + costes_servicios += parseFloat(rowData.coste); + margen_servicios += parseFloat(rowData.precio) - parseFloat(rowData.coste); + }); + + $('#tableOfServiciosExtra').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { + var rowData = this.data(); + costes_servicios += parseFloat(rowData.coste); + margen_servicios += parseFloat(rowData.precio) - parseFloat(rowData.coste); + }); + + if (data.envios) { + coste_envio += data.envios.coste; + margen_envio += data.envios.margen; + + } + + // Se añade la fila a la tabla de tiradas + self.table.row.add({ + tirada: datos.tirada, + coste_impresion: coste_total.toFixed(2), + coste_envio: coste_envio.toFixed(2), + margen: ((margen_total + margen_servicios + margen_envio) / (coste_total + coste_envio) * 100.0).toFixed(2), + total_pedido: (coste_total + costes_servicios + coste_envio).toFixed(2), + precio_unidad: ((coste_total + costes_servicios + coste_envio) / datos.tirada).toFixed(4), + + }).draw(false); + } + + + }, + error: function (e) { } + }); + } + + generate_json_lp() { + + const data = $('#tableLineasPresupuesto').DataTable().data().toArray(); + + let json = this.filterData(data, + ['paginas', + 'numPagColor', + 'paginas_impresion', + 'papel', // papel generico + 'papel_impresion_id', + 'gramaje', + 'maquina_id', + 'aFavorFibra', + 'row_id', + 'check_papel_total', + 'check_impresion_total', + 'cobAmarillo', // tipologia de papel + 'cobCyan', + 'cobMagenta', + 'cobNegro', + 'cobCG', + 'gotaColor', + 'gotaNegro']); + + json.forEach(element => { + element['check_papel_total'] = $('#' + element['row_id'] + '_checkPapel').is(':checked') ? 1 : 0; + element['check_impresion_total'] = $('#' + element['row_id'] + '_checkClicks').is(':checked') ? 1 : 0; + }); + return JSON.stringify(json); + } + + generate_json_servicios(servicios) { + + let json = []; + switch (servicios) { + case 'acabados': + $('#tableOfServiciosAcabado').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { + var rowData = this.data(); + json.push(rowData); + }); + break; + case 'encuadernaciones': + $('#tableOfServiciosEncuadernacion').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { + var rowData = this.data(); + json.push(rowData); + }); + break; + case 'presimpresion': + $('#tableOfServiciosPreimpresion').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { + var rowData = this.data(); + json.push(rowData); + }); + break; + case 'manipulado': + $('#tableOfServiciosManipulado').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { + var rowData = this.data(); + json.push(rowData); + }); + break; + case 'extra': + $('#tableOfServiciosExtra').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { + var rowData = this.data(); + json.push(rowData); + }); + break; + } + return JSON.stringify(json); + } + + get_peso_libro() { + + var peso_total_libro = 0.0 + $('#tableLineasPresupuesto').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { + var rowData = this.data(); + peso_total_libro += parseFloat(rowData.peso) + }) + return peso_total_libro; + } + + getMerma(tirada) { + + let merma = 0; + + if (tirada > parseInt($('#POD').val())) { + + merma = tirada * 0.1 <= 30 ? tirada * 0.1 : 30 + } + else { + let merma_lineas = [] + $('#tableLineasPresupuesto').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) { + var rowData = this.data(); + if (rowData.row_id != 'lp_guardas' && rowData.row_id != 'lp_cubierta' && rowData.row_id != 'lp_sobrecubierta') { + const formas_linea = $('#isCosido').val() == 0 ? parseInt(rowData.formas) : parseInt(rowData.formas) / 2 + if (formas_linea > tirada) + merma_lineas.push(formas_linea - tirada) + else + merma_lineas.push(tirada % formas_linea) + } + }) + + if (merma_lineas.length > 0) + merma = Math.max(...merma_lineas) + else + merma = 0 + } + return merma; + } + + filterData(data, keys) { + + return data.map(obj => { + + const newObj = {}; + keys.forEach(key => { + if (obj.hasOwnProperty(key)) { + newObj[key] = obj[key]; + } + }); + return newObj; + }); + } +} + +export default TiradasAlernativas; \ No newline at end of file diff --git a/httpdocs/assets/js/safekat/pages/presupuestoCliente/direcciones.js b/httpdocs/assets/js/safekat/pages/presupuestoCliente/direcciones.js index 6e6288b3..79025b16 100644 --- a/httpdocs/assets/js/safekat/pages/presupuestoCliente/direcciones.js +++ b/httpdocs/assets/js/safekat/pages/presupuestoCliente/direcciones.js @@ -104,7 +104,7 @@ class Direcciones { for (let i = 0; i < datos.length; i++) { let id = datos[i].id; - let unidades = datos[i].unidades; + let unidades = datos[i].cantidad; let entregaPalets = datos[i].palets; @@ -113,7 +113,22 @@ class Direcciones { if (unidades == null || unidades <= 0 || unidades == undefined) return; - let peticion = new Ajax('/misdirecciones/getDireccionPresupuesto/' + id, {}, {}, + let divId = "dirEnvio-1"; + let direccionesActuales = this.divDirecciones.find('.direccion-cliente'); + if (direccionesActuales.length > 0) { + // the the lass item + let last = direccionesActuales[direccionesActuales.length - 1]; + divId = "dirEnvio-" + (parseInt(last.id.split('-')[1]) + 1); + } + let tarjeta = new tarjetaDireccion(this.divDirecciones, divId, datos[i]); + tarjeta.setUnidades(unidades); + tarjeta.setEntregaPalets(entregaPalets); + tarjeta.card.find('.direccion-editar').on('click', this.#editUnits.bind(self)); + tarjeta.card.find('.direccion-eliminar').on('click', this.#deleteDireccion.bind(self)); + this.divDirecciones.append(tarjeta.card); + this.direcciones.push(tarjeta); + + /*let peticion = new Ajax('/misdirecciones/getDireccionPresupuesto/' + id, {}, {}, (response) => { let divId = "dirEnvio-1"; let direccionesActuales = this.divDirecciones.find('.direccion-cliente'); @@ -134,7 +149,7 @@ class Direcciones { console.error('Error getting address'); }); - peticion.get(); + peticion.get();*/ } } } catch (e) { @@ -226,7 +241,7 @@ class Direcciones { let direcciones = []; this.direcciones.forEach(direccion => { let dir = { - id: direccion.getId(), + direccion: direccion.getDireccion(), unidades: direccion.getUnidades(), entregaPalets: direccion.getEntregaPalets() }; @@ -306,12 +321,23 @@ class Direcciones { total_unidades += parseInt(this.direcciones[i].getUnidades()); } + + if (this.getSelectedTirada() == null) { + popErrorAlert("Tiene que seleccionar una tirada para insertar una dirección"); + return; + } + if (total_unidades + parseInt(unidades) > this.getSelectedTirada()) { popErrorAlert("El total de unidades enviadas tiene que ser menor que " + this.getSelectedTirada()); return; } } else { + if (this.getSelectedTirada() == null) { + popErrorAlert("Tiene que seleccionar una tirada para insertar una dirección"); + return; + } + if (unidades > this.getSelectedTirada()) { popErrorAlert("El total de unidades enviadas tiene que ser menor que " + this.getSelectedTirada()); return; diff --git a/httpdocs/assets/js/safekat/pages/presupuestoCliente/presupuestoCliente.js b/httpdocs/assets/js/safekat/pages/presupuestoCliente/presupuestoCliente.js index 8ae649f8..ab8cb8b5 100644 --- a/httpdocs/assets/js/safekat/pages/presupuestoCliente/presupuestoCliente.js +++ b/httpdocs/assets/js/safekat/pages/presupuestoCliente/presupuestoCliente.js @@ -569,6 +569,9 @@ class PresupuestoCliente { popAlert2Hide(); for (let i = 0; i < response.tiradas.length; i++) { + if(i==0){ + $('#eb').val(response.eb[i]); + } new tarjetaTiradasPrecio( this.divTiradasPrecios, ('precio-tiradas-' + response.tiradas[i]), @@ -677,6 +680,10 @@ class PresupuestoCliente { }, } + if(this.direcciones.getSelectedTirada() != null && this.direcciones.getSelectedTirada() != undefined && this.direcciones.getSelectedTirada() > 0){ + this.datos.selectedTirada = this.direcciones.getSelectedTirada(); + } + this.datos.guardas = this.disenioCubierta.getGuardas(); if (calcularSolapas) { @@ -692,6 +699,7 @@ class PresupuestoCliente { this.datos.retractilado = this.datosGenerales.retractilado.is(':checked') ? 1 : 0; this.datos.retractilado5 = this.datosGenerales.retractilado5.is(':checked') ? 1 : 0; + this.datos.eb = $('#eb').val(); this.datos.cubierta = { tipoCubierta: this.disenioCubierta.disenioCubierta.filter('.selected').attr('id'), @@ -758,6 +766,7 @@ class PresupuestoCliente { referenciaCliente: this.datosGenerales.referenciaCliente.val(), } this.datos.selectedTirada = this.direcciones.getSelectedTirada(); + this.datos } if (window.location.href.includes("edit")) {