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 = ` -