diff --git a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php index a93bb9bd..4a92cd16 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) { @@ -308,7 +311,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $datosPedido = (object) array( 'paginas' => $paginas, 'tirada' => $tirada[0], - 'merma' => $tirada[0] > $POD ? $this->calcular_merma($tirada[0], $POD) : 0, + 'merma' => $this->calcular_merma($tirada[0], $POD), 'ancho' => intval($tamanio['ancho']) ?? 100000, 'alto' => intval($tamanio['alto']) ?? 100000, 'isCosido' => $is_cosido, @@ -345,6 +348,51 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $lomo += floatval($linea['mano']); } } + + //Guardas + $guardas = $reqData['guardas'] ?? []; + if ($guardas != "false" && $guardas != null) { + $datos_guardas = [ + 'papel' => $modelPapelGenerico->getIdFromCode($guardas['papel']), + 'gramaje' => intval($guardas['gramaje']), + 'caras' => intval($guardas['caras']), + ]; + } else + $datos_guardas = false; + $guardas = []; + $peso_guardas = 0.0; + $coste_guardas = 0.0; + if ($datos_guardas != 0) { + if (count($datos_guardas) != 0 && $datos_guardas) { + + $guardas = $datos_guardas; + $input_data['papel_generico'] = $datos_guardas['papel'] ?? 0; + $input_data['gramaje'] = $datos_guardas['gramaje'] ?? 0; + $input_data['datosPedido']->paginas = 8; + $input_data['paginas_color'] = 8; + $input_data['datosPedido']->paginas_impresion = $datos_guardas['caras'] ?? 0; + $input_data['datosPedido']->solapas_ancho = 0; + $input_data['datosPedido']->solapas = 0; + $input_data['isColor'] = 1; + $input_data['isHq'] = 1; + $input_data['uso'] = 'guardas'; + + // Para el caso de Fresado y Cosido tapa dura, las guardas son un diptico + // y hay que imprimirlas como "cosido" (dos hojas pegadas). En el caso de espiral + // o wire-o tapa dura, las guardas se imprimen como hojas sueltas + if ($tipo_impresion_id == 1 || $tipo_impresion_id == 3) { + $input_data['datosPedido']->isCosido = true; + } else if ($tipo_impresion_id == 5 || $tipo_impresion_id == 7) { + $input_data['datosPedido']->isCosido = false; + } + + $guardas = PresupuestoClienteService::obtenerGuardas($input_data); + + if ($guardas != null && count($guardas) > 0) { + $lomo += floatval($guardas['mano']); + } + } + } $lomo = round($lomo, 2); $errors = [ 'status' => 0, @@ -385,19 +433,24 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController if ($this->request->isAJAX()) $reqData = $this->request->getPost(); } else { - if($data == -1){ + if ($data == -1) { return "Error: sin datos"; } $reqData = $data; } + try { + + $reqData = $this->request->getPost(); $modelPapelGenerico = new PapelGenericoModel(); + $id = $reqData['id'] ?? 0; $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; @@ -510,21 +563,66 @@ 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')) { @@ -545,61 +643,36 @@ 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); } } - if($this->request){ - if($this->request->isAJAX()) + if ($this->request) { + if ($this->request->isAJAX()) return $this->respond($return_data); - } - else{ + } else { return $return_data; } } catch (Exception $e) { - if($this->request){ - if($this->request->isAJAX()) - return $this->failServerError($e->getMessage() . ' - ' . $e->getFile() . ' - ' . $e->getLine()); - } - else{ + if ($this->request) { + if ($this->request->isAJAX()) + return $this->failServerError($e->getMessage() . ' - ' . $e->getFile() . ' - ' . $e->getLine()); + } else { return "Error: " . $e->getMessage(); } } - } + } public function calcularMaxSolapas() @@ -621,7 +694,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $excluirRotativa = $reqData['excluirRotativa'] ?? 0; $excluirRotativa = intval($excluirRotativa); - $tipo = $reqData['tipo']; + $tipo = $reqData['tipo'] ??'cosido'; $tipoCubierta = 'blanda'; // solapas sólo tapa blanda y sobre cubierta $isColor = intval($reqData['isColor']) ?? 0; @@ -675,7 +748,20 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController if ($interior == null) { return $this->failServerError('Error al calcular el interior'); } - $anchoTotal = $interior[0]['mano']; + + $anchoTotal = 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[0]['mano']; + } + + // le añadimos 2*ancho libro $anchoTotal += 2 * $datosPedido->ancho; // le añadimos los dobleces de las solapas @@ -855,17 +941,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; @@ -993,43 +1082,119 @@ 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 = []; @@ -1073,6 +1238,9 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $datos_presupuesto['retractilado5'] = $retractilado5; $datos_presupuesto['entrega_taller'] = $reqData['entrega_taller'] ?? 0; + + $resultado_presupuesto['info']['merma'] = $this->calcular_merma($selected_tirada, $POD); + $id = $model_presupuesto->insertarPresupuestoCliente( $id, $selected_tirada, @@ -1090,17 +1258,17 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $this->borrarRelacionesPresupuesto($id); } - foreach ($resultado_presupuesto['info']['interior'] as $linea) { + foreach ($resultado_presupuesto['values']['interior'] as $linea) { if (count($linea) > 0) $this->guardarLineaPresupuesto($id, $linea); } - if (count($resultado_presupuesto['info']['cubierta']) > 0) - $this->guardarLineaPresupuesto($id, $resultado_presupuesto['info']['cubierta']); - if (count($resultado_presupuesto['info']['sobrecubierta']) > 0) - $this->guardarLineaPresupuesto($id, $resultado_presupuesto['info']['sobrecubierta']); - if (count($resultado_presupuesto['info']['guardas']) > 0) - $this->guardarLineaPresupuesto($id, $resultado_presupuesto['info']['guardas']); + if (count($resultado_presupuesto['values']['cubierta']) > 0) + $this->guardarLineaPresupuesto($id, $resultado_presupuesto['values']['cubierta']); + if (count($resultado_presupuesto['values']['sobrecubierta']) > 0) + $this->guardarLineaPresupuesto($id, $resultado_presupuesto['values']['sobrecubierta']); + if (count($resultado_presupuesto['values']['guardas']) > 0) + $this->guardarLineaPresupuesto($id, $resultado_presupuesto['values']['guardas']); // Servicios if ($sobrecubierta) { @@ -1126,26 +1294,75 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } } - foreach ($resultado_presupuesto['info']['serviciosDefecto']['encuadernacion'] as $servicio) { + foreach ($resultado_presupuesto['values']['serviciosDefecto']['encuadernacion'] as $servicio) { $this->guardarServicio($id, $servicio, 'encuadernacion'); } - foreach ($resultado_presupuesto['info']['serviciosDefecto']['manipulado'] as $servicio) { + foreach ($resultado_presupuesto['values']['serviciosDefecto']['manipulado'] as $servicio) { $this->guardarServicio($id, $servicio, 'manipulado'); } - foreach ($resultado_presupuesto['info']['servicios_automaticos'] as $servicio) { - if ($servicio->tarifa_id == 3 || $servicio->tarifa_id == 5 || $servicio->tarifa_id == 16) { + $servicio_ferro = (object) [ + 'nombre' => 'ferro', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_ferro')->value + ]; + $servicio_prototipo = (object) [ + 'nombre' => 'prototipo', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_prototipo')->value + ]; + $servicio_retractilado = (object) [ + 'nombre' => 'retractilado', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_retractilado')->value + ]; + $servicio_retractilado5 = (object) [ + 'nombre' => 'retractilado5', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_retractilado5')->value + ]; + $servicio_plegado_guardas = (object) [ + 'nombre' => 'plegado_guardas', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_plegado_guardas')->value + ]; + $servicio_solapas_cubierta = (object) [ + 'nombre' => 'solapas_cubierta', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('servicio_solapas_cubierta')->value + ]; + $servicio_solapas_sobrecubierta = (object) [ + 'nombre' => 'solapas_sobrecubierta', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('servicio_solapas_sobrecubierta')->value + ]; + $servicio_solapas_faja = (object) [ + 'nombre' => 'solapas_faja', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('servicio_solapas_faja')->value + ]; + $servicio_solapas_grandes_cubierta = (object) [ + 'nombre' => 'solapas_grandes_cubierta', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_plegado_exceso_solapas_cubierta')->value + ]; + $servicio_solapas_grandes_sobrecubierta = (object) [ + 'nombre' => 'solapas_grandes_sobrecubierta', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_plegado_exceso_solapas_sobrecubierta')->value + ]; + $servicio_solapas_grandes_faja = (object) [ + 'nombre' => 'solapas_grandes_faja', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_plegado_exceso_solapas_faja')->value + ]; + + foreach ($resultado_presupuesto['values']['servicios_automaticos'] as $servicio) { + if ($servicio->tarifa_id == $servicio_retractilado->id || $servicio->tarifa_id == $servicio_retractilado5->id) { // Servicios acabado $this->guardarServicio($id, $servicio, 'acabado'); - } else if ($servicio->tarifa_id == 24) { - // Servicios preimpresion - $this->guardarServicio($id, $servicio, 'preimpresion'); - } else if ($servicio->tarifa_id == 9) { + } else if ($servicio->tarifa_id == $servicio_ferro->id || $servicio->tarifa_id == $servicio_prototipo->id) { // Servicios extra $this->guardarServicio($id, $servicio, 'extra'); - } else if ($servicio->tarifa_id == 62) { + } else if ($servicio->tarifa_id == $servicio_plegado_guardas->id) { // Servicios manipulado $this->guardarServicio($id, $servicio, 'manipulado'); - } else if ($servicio->tarifa_id == 73) { + } else if ( + $servicio->tarifa_id == $servicio_solapas_cubierta->id || + $servicio->tarifa_id == $servicio_solapas_sobrecubierta->id || + $servicio->tarifa_id == $servicio_solapas_faja->id || + $servicio->tarifa_id == $servicio_solapas_grandes_cubierta->id || + $servicio->tarifa_id == $servicio_solapas_grandes_sobrecubierta->id || + $servicio->tarifa_id == $servicio_solapas_grandes_faja->id + ) { // Servicios manipulado $this->guardarServicio($id, $servicio, 'manipulado'); } @@ -1187,6 +1404,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; @@ -1196,6 +1414,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $data['datosGenerales']['paginas'] = $presupuesto->paginas; $data['datosGenerales']['paginasCuadernillo'] = $presupuesto->paginasCuadernillo; $data['datosGenerales']['tirada'] = $presupuesto->tirada; + $data['datosGenerales']['selectedTirada'] = $presupuesto->tirada; $data['datosGenerales']['ivaReducido'] = $presupuesto->iva_reducido; $data['datosGenerales']['excluirRotativa'] = $presupuesto->excluir_rotativa; $data['datosGenerales']['clienteId'] = $presupuesto->cliente_id; @@ -1221,9 +1440,17 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $data['datosGenerales']['retractilado5'] = $presupuesto->retractilado5; $datos_papel = $this->obtenerDatosPapel($presupuesto->id); - $data['interior'] = $datos_papel['interior'] ? $datos_papel['interior'] : []; + if (array_key_exists('interior', $datos_papel)) { + $data['interior'] = $datos_papel['interior']; + } else { + $data['interior'] = []; + } - $data['cubierta'] = $datos_papel['cubierta'] ? $datos_papel['cubierta'] : []; + if (array_key_exists('cubierta', $datos_papel)) { + $data['cubierta'] = $datos_papel['cubierta']; + } else { + $data['cubierta'] = []; + } $data['cubierta']['tapa'] = $this->obtenerTipoTapa($presupuesto->tipo_impresion_id ?? null); $data['cubierta']['lomoRedondo'] = $presupuesto->lomo_redondo ? 1 : 0; $data['cubierta']['solapas'] = $presupuesto->solapas ? 1 : 0; @@ -1259,7 +1486,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); } @@ -1329,12 +1555,14 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $presupuesto_id = $_POST['presupuesto_id']; $old_files = json_decode($_POST['oldFiles']); + $ftp = new SafekatFtpClient(); // Comprobar si se han subido archivos if (!empty($_FILES['file']) || !empty($old_files)) { // Borrar los archivos existentes del presupuesto + $ftp->removeFiles($presupuesto_id); $model->deleteFiles($presupuesto_id, $old_files); if (!empty($_FILES['file'])) { @@ -1358,13 +1586,14 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController if (!is_null($new_name)) { $path = WRITEPATH . 'uploads/presupuestos/' . $new_name; move_uploaded_file($tmp_name, $path); - $ftp = new SafekatFtpClient(); - $ftp->uploadFilePresupuesto($presupuesto_id); + } } + $ftp->uploadFilePresupuesto($presupuesto_id); } } else { // Borrar los archivos existentes del presupuesto + $ftp->removeFiles($presupuesto_id); $model->deleteFiles($presupuesto_id); } } @@ -1426,26 +1655,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); } } @@ -1511,18 +1741,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']; } @@ -1530,41 +1759,40 @@ 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) @@ -1646,7 +1874,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $datosPedido = (object) array( 'paginas' => $paginas, 'tirada' => $tirada[$t], - 'merma' => $tirada[$t] > $POD ? $this->calcular_merma($tirada[$t], $POD) : 0, + 'merma' => $this->calcular_merma($tirada[$t], $POD), 'ancho' => intval($tamanio['ancho']) ?? 100000, 'alto' => intval($tamanio['alto']) ?? 100000, 'isCosido' => $is_cosido, @@ -2108,40 +2336,88 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } // Servicios - - - /* - 'retractilado' => 3, - 'prototipo' => 9, - */ $serviciosAutomaticos = []; $servicios = []; + + $servicio_ferro = (object) [ + 'nombre' => 'ferro', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_ferro')->value + ]; + $servicio_prototipo = (object) [ + 'nombre' => 'prototipo', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_prototipo')->value + ]; + $servicio_retractilado = (object) [ + 'nombre' => 'retractilado', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_retractilado')->value + ]; + $servicio_retractilado5 = (object) [ + 'nombre' => 'retractilado5', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_retractilado5')->value + ]; + $servicio_plegado_guardas = (object) [ + 'nombre' => 'plegado_guardas', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_plegado_guardas')->value + ]; + $servicio_solapas_cubierta = (object) [ + 'nombre' => 'solapas_cubierta', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('servicio_solapas_cubierta')->value + ]; + $servicio_solapas_sobrecubierta = (object) [ + 'nombre' => 'solapas_sobrecubierta', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('servicio_solapas_sobrecubierta')->value + ]; + $servicio_solapas_faja = (object) [ + 'nombre' => 'solapas_faja', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('servicio_solapas_faja')->value + ]; + $servicio_solapas_grandes_cubierta = (object) [ + 'nombre' => 'solapas_grandes_cubierta', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_plegado_exceso_solapas_cubierta')->value + ]; + $servicio_solapas_grandes_sobrecubierta = (object) [ + 'nombre' => 'solapas_grandes_sobrecubierta', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_plegado_exceso_solapas_sobrecubierta')->value + ]; + $servicio_solapas_grandes_faja = (object) [ + 'nombre' => 'solapas_grandes_faja', + 'id' => model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_plegado_exceso_solapas_faja')->value + ]; + // se comprueba si $datos guardas es un array if (is_array($datos_guardas)) { if (count($datos_guardas) > 0) { - array_push($servicios, 62); // Plegado de guardas + array_push($servicios, $servicio_plegado_guardas); // Plegado de guardas } } else { if ($datos_guardas > 0) { - array_push($servicios, 62); // Plegado de guardas + array_push($servicios, $servicio_plegado_guardas); // Plegado de guardas } } + if ($datos_entrada['servicios']['retractilado']) // acabado - array_push($servicios, 3); + array_push($servicios, $servicio_retractilado); if ($datos_entrada['servicios']['retractilado5']) // acabado - array_push($servicios, 98); + array_push($servicios, $servicio_retractilado5); if ($datos_entrada['servicios']['prototipo']) // extra - array_push($servicios, 9); + array_push($servicios, $servicio_prototipo); if ($datos_entrada['servicios']['ferro']) // extra - array_push($servicios, 30); - /*if ($datos_entrada['servicios']['ferroDigital']) - array_push($servicios, 29);*/ // Es gratis + array_push($servicios, $servicio_ferro); + if ($input_data['datosPedido']->solapas_ancho > 0) + array_push($servicios, $servicio_solapas_cubierta); + if (!is_null($sobreCubierta) && $sobreCubierta) // Si hay sobrecubierta, siempre con solapas + array_push($servicios, $servicio_solapas_sobrecubierta); + /* TO-DO + if (!is_null($faja) && $faja) // Si hay faja, siempre con solapas + array_push($servicios, $servicio_solapas_faja); + */ + foreach ($servicios as $servicio) { - if (intval($servicio) == 3 || intval($servicio) == 98) { + if ($servicio->nombre == "retractilado" || $servicio->nombre == "retractilado5") { // Servicios acabado $resultado = PresupuestoCLienteService::getServiciosAcabados([ - 'tarifa_id' => $servicio, + 'tarifa_id' => intval($servicio->id), 'tirada' => $datosPedido->tirada, 'POD' => $POD, ]); @@ -2169,12 +2445,12 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $totalServicios += floatval($resultado[0]->total); $margenServicios += floatval($resultado[0]->total) * floatval($resultado[0]->margen) / 100.0; } - } else if (intval($servicio) == 9 || intval($servicio) == 30 || intval($servicio) == 29) { + } else if ($servicio->nombre == "ferro" || $servicio->nombre == "prototipo") { // Extra $resultado = PresupuestoCLienteService::getServiciosExtra([ - 'tarifa_id' => $servicio, + 'tarifa_id' => intval($servicio->id), ]); - array_push($serviciosAutomaticos, $resultado[0]); + if ($resultado[0]->precio <= 0) { $errorModel = new ErrorPresupuesto(); @@ -2192,6 +2468,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController return $return_data; } + array_push($serviciosAutomaticos, $resultado[0]); $coste_servicios += floatval($resultado[0]->precio); if ($extra_info) { @@ -2199,21 +2476,49 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $margenServicios += floatval($resultado[0]->precio) * floatval($resultado[0]->margen) / 100.0; } } + else if ($servicio->nombre == 'solapas_cubierta' || $servicio->nombre == 'solapas_sobrecubierta' || $servicio->nombre == 'solapas_faja'){ + // Servicios manipulado + $resultado = PresupuestoCLienteService::getServiciosManipulado([ + 'tarifa_id' => intval($servicio->id), + 'tirada' => $datosPedido->tirada, + 'POD' => $POD, + ]); + + if ($resultado[0]->total <= 0) { + + $errorModel = new ErrorPresupuesto(); + $errorModel->insertError( + $datos_entrada['id'], + auth()->user()->id, + 'No se puede obtener servicio de manupulado con ' . ((string) $servicio->nombre), + $input_data + ); + $return_data = [ + 'errors' => (object) ([ + 'status' => 1 + ]), + ]; + return $return_data; + } else { + array_push($serviciosAutomaticos, $resultado[0]); + } + + $coste_servicios += floatval($resultado[0]->total); + if ($extra_info) { + $totalServicios += floatval($resultado[0]->total); + $margenServicios += floatval($resultado[0]->total) * floatval($resultado[0]->margen) / 100.0; + } + } } // Plegado de solapas grandes - if ( - (intval($solapasCubierta) > 0 && intval($cubierta['dimension_desarrollo']['ancho']) > 630) || - (is_array($sobreCubierta) && ($sobreCubierta['solapas'] > 0 && intval($linea_sobrecubierta['dimension_desarrollo']['ancho']) > 630)) - ) { - - // Servicios acabado + if (intval($solapasCubierta) > 0 && intval($cubierta['dimension_desarrollo']['ancho']) > 630) { + // Servicios manipulado $resultado = PresupuestoCLienteService::getServiciosManipulado([ - 'tarifa_id' => 73, + 'tarifa_id' => intval($servicio_solapas_grandes_cubierta->id), 'tirada' => $datosPedido->tirada, 'POD' => $POD, ]); - array_push($serviciosAutomaticos, $resultado[0]); if ($resultado[0]->total <= 0) { @@ -2221,7 +2526,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $errorModel->insertError( $datos_entrada['id'], auth()->user()->id, - 'No se puede obtener servicio de manupulado con id ' . ((string) $servicio), + 'No se puede obtener servicio de manupulado con ' . ((string) $servicio->nombre), $input_data ); $return_data = [ @@ -2230,6 +2535,8 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController ]), ]; return $return_data; + } else { + array_push($serviciosAutomaticos, $resultado[0]); } $coste_servicios += floatval($resultado[0]->total); @@ -2237,9 +2544,45 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $totalServicios += floatval($resultado[0]->total); $margenServicios += floatval($resultado[0]->total) * floatval($resultado[0]->margen) / 100.0; } - } + if (is_array($sobreCubierta) && ($sobreCubierta['solapas'] > 0 && intval($linea_sobrecubierta['dimension_desarrollo']['ancho']) > 630)) { + + // Servicios manipulado + $resultado = PresupuestoCLienteService::getServiciosManipulado([ + 'tarifa_id' => intval($servicio_solapas_grandes_sobrecubierta->id), + 'tirada' => $datosPedido->tirada, + 'POD' => $POD, + ]); + + if ($resultado[0]->total <= 0) { + + $errorModel = new ErrorPresupuesto(); + $errorModel->insertError( + $datos_entrada['id'], + auth()->user()->id, + 'No se puede obtener servicio de manupulado ' . ((string) $servicio->nombre), + $input_data + ); + $return_data = [ + 'errors' => (object) ([ + 'status' => 1 + ]), + ]; + return $return_data; + } else { + array_push($serviciosAutomaticos, $resultado[0]); + } + + $coste_servicios += floatval($resultado[0]->total); + if ($extra_info) { + $totalServicios += floatval($resultado[0]->total); + $margenServicios += floatval($resultado[0]->total) * floatval($resultado[0]->margen) / 100.0; + } + } + + // TO-DO Faja + array_push($precio_u, round(($costeInterior + $coste_cubierta + $coste_sobrecubierta + $costeServiciosDefecto + $coste_servicios) / $tirada[$t], 4)); array_push($peso, round($peso_interior + $peso_cubierta + $peso_sobrecubierta + $peso_guardas, 2)); @@ -2277,15 +2620,15 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $return_data['info'] = $info; - if ($extra_info) { // && $tirada[$t] == $selected_tirada) { + if ($extra_info && ($tirada[$t] == $selected_tirada)) { - $return_data['info']['interior'] = $interior; - $return_data['info']['cubierta'] = $cubierta; - $return_data['info']['sobrecubierta'] = $linea_sobrecubierta; - $return_data['info']['guardas'] = $guardas; - $return_data['info']['serviciosDefecto']['encuadernacion'] = $servDefectoEnc; - $return_data['info']['serviciosDefecto']['manipulado'] = $servDefectoMan; - $return_data['info']['servicios_automaticos'] = $serviciosAutomaticos; + $return_data['values']['interior'] = $interior; + $return_data['values']['cubierta'] = $cubierta; + $return_data['values']['sobrecubierta'] = $linea_sobrecubierta; + $return_data['values']['guardas'] = $guardas; + $return_data['values']['serviciosDefecto']['encuadernacion'] = $servDefectoEnc; + $return_data['values']['serviciosDefecto']['manipulado'] = $servDefectoMan; + $return_data['values']['servicios_automaticos'] = $serviciosAutomaticos; } } @@ -2400,7 +2743,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $merma = 0; if ($tirada > $POD) { - $merma = $tirada * 0.1 <= 30 ? $tirada * 0.1 : 30; + $merma = $tirada * 0.1; } else { $merma_lineas = []; foreach ($formas_lineas_interior as $formas_linea) { @@ -2563,7 +2906,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 = [];