diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index d799f4dc..68f8b2ae 100755 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -326,6 +326,7 @@ $routes->group('clientes', ['namespace' => 'App\Controllers\Clientes'], function $routes->match(['get', 'post'], 'edit/(:num)', 'Cliente::edit/$1', ['as' => 'clienteEdit']); $routes->get('delete/(:num)', 'Cliente::delete/$1', ['as' => 'clienteDelete']); $routes->post('datatable', 'Cliente::datatable', ['as' => 'clienteDT']); + $routes->post('menuitems', 'Cliente::menuItems', ['as' => 'menuItemsOfClientes']); }); /* Precios */ @@ -348,7 +349,7 @@ $routes->group('clientes', ['namespace' => 'App\Controllers\Clientes'], function $routes->get('delete/(:num)', 'Cliente::delete/$1', ['as' => 'deleteCliente']); $routes->post('datatable', 'Cliente::datatable', ['as' => 'dataTableOfClientes']); $routes->post('allmenuitems', 'Cliente::allItemsSelect', ['as' => 'select2ItemsOfClientes']); - $routes->post('menuitems', 'Cliente::menuItems', ['as' => 'menuItemsOfClientes']); + }); $routes->resource('cliente', ['namespace' => 'App\Controllers\Clientes', 'controller' => 'Cliente', 'except' => 'show,new,create,update']);*/ @@ -540,6 +541,9 @@ $routes->group('presupuestocliente', ['namespace' => 'App\Controllers\Presupuest $routes->post('datatable', 'Cosidotapablanda::datatable', ['as' => 'tablaPresupuestosCliente']); $routes->post('getgramaje', 'Presupuestocliente::getGramaje', ['as' => 'obtenerGramaje']); $routes->post('presupuesto', 'Presupuestocliente::presupuesto', ['as' => 'presupuestoCliente']); + $routes->post('getDireccionesCliente', 'Presupuestocliente::getDireccionesCliente', ['as' => 'getDirecciones']); + $routes->post('getDatosDireccion', 'Presupuestocliente::getDatosDireccion', ['as' => 'getDatosDireccion']); + $routes->post('getNuevaDireccion', 'Presupuestocliente::getNuevaDireccion', ['as' => 'nuevaDireccion']); }); $routes->resource('presupuestocliente', ['namespace' => 'App\Controllers\Presupuestos', 'controller' => 'Presupuestocliente', 'except' => 'show,new,create,update']); diff --git a/ci4/app/Controllers/Js_loader.php b/ci4/app/Controllers/Js_loader.php index 74153781..8dceddde 100755 --- a/ci4/app/Controllers/Js_loader.php +++ b/ci4/app/Controllers/Js_loader.php @@ -100,5 +100,16 @@ class Js_loader extends BaseController return view('themes/vuexy/form/presupuestos/cliente/disenioLibro.js'); } + function presupuestoClienteDirecciones_js() + { + $this->response->setHeader('Content-Type', 'text/javascript'); + return view('themes/vuexy/form/presupuestos/cliente/direcciones.js'); + } + + function presupuestoClienteResumen_js() + { + $this->response->setHeader('Content-Type', 'text/javascript'); + return view('themes/vuexy/form/presupuestos/cliente/resumen.js'); + } } \ No newline at end of file diff --git a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php index 9e4b0c0a..1806dd70 100755 --- a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php @@ -17,7 +17,7 @@ use App\Models\Presupuestos\PresupuestoServiciosExtraModel; use App\Services\PresupuestoClienteService; use Exception; -class Presupuestocliente extends \App\Controllers\GoBaseResourceController +class Presupuestocliente extends \App\Controllers\BaseResourceController { protected $modelName = "PresupuestoModel"; protected $format = 'json'; @@ -139,7 +139,6 @@ class Presupuestocliente extends \App\Controllers\GoBaseResourceController // Se obtiene el cliente ID a partir del usuario de la sesion $clienteId = 999; // Fijo hasta desarollar clientes usuarios - $presupuestoEntity = isset($sanitizedData) ? new PresupuestoEntity($sanitizedData) : new PresupuestoEntity(); $presupuestoEntity->clienteId = $clienteId; @@ -164,6 +163,8 @@ class Presupuestocliente extends \App\Controllers\GoBaseResourceController $this->viewData['formAction'] = route_to('crearPresupuestoCliente'); + $this->viewData['paisList'] = $this->getPaisListItems(); + $this->viewData['presupuestoEntity'] = $presupuestoEntity; $this->viewData['datosPresupuesto'] = $datosPresupuesto; @@ -600,15 +601,458 @@ class Presupuestocliente extends \App\Controllers\GoBaseResourceController public function presupuesto() { - - if ($this->request->isAJAX()) { $reqData = $this->request->getPost(); - $resultado_lineas = $this->getLineasPresupuesto($reqData); + $newTokenHash = csrf_hash(); + $csrfTokenName = csrf_token(); + + $error = (object)[ + 'interior' => "", + 'cubierta' => "", + 'sobrecubierta' => "", + 'guardas' => "", + 'servicios' => "", + 'serviciosDefecto' => "", + ]; + $coste_servicios = 0.0; + + $POD = model('App\Models\Configuracion\ConfiguracionSistemaModel')->getPOD(); - return $this->respond($resultado_lineas); + $tirada = $reqData['tirada'] ?? 0; + $tamanio = $reqData['tamanio']; + $tipo_impresion_id = $this->getTipoImpresion($reqData['tipo'], $reqData['tapa']); + $precio_u = []; + $peso = []; + + for ($t = 0; $t < count($tirada); $t++) { + $tirada[$t] = intval($tirada[$t]); + + $paginas_color = intval($reqData['paginasColor']) ?? 0; + $is_cosido = (new TipoPresupuestoModel())->get_isCosido($tipo_impresion_id); + + $datosPedido = (object)array( + 'paginas' => intval($reqData['paginas']) ?? 0, + 'tirada' => $tirada[$t], + 'merma' => $tirada[$t] > $POD ? $this->calcular_merma($tirada[$t], $POD) : 0, + 'ancho' => intval($tamanio['ancho']) ?? 100000, + 'alto' => intval($tamanio['alto']) ?? 100000, + 'isCosido' => $is_cosido, + ); + + $papel_generico = [ + 'id' => $reqData['papelInterior'] ?? 0, + 'nombre' => $reqData['papelInteriorNombre'] ?? "", + ]; + $gramaje = $reqData['gramajeInterior'] ?? 0; + $cliente_id = $reqData['clienteId'] ?? -1; + $excluirRotativa = $reqData['excluirRotativa'] ?? 0; + + $input_data = array( + 'uso' => 'interior', + 'tipo_impresion_id' => $tipo_impresion_id, + 'datosPedido' => $datosPedido, + 'papel_generico' => $papel_generico, + 'gramaje' => $gramaje, + 'isColor' => intval($reqData['isColor']) ?? 0, + 'isHq' => intval($reqData['isHq']) ?? 0, + 'cliente_id' => $cliente_id, + 'paginas_color' => $paginas_color, + 'excluirRotativa' => $excluirRotativa, + ); + + $interior = PresupuestoClienteService::obtenerInterior($input_data); + + $costeInterior = 0.0; + $peso_interior = 0.0; + foreach ($interior as $linea) { + if (count($linea) > 0) { + $costeInterior += floatval($linea['total_impresion']); + $peso_interior += floatval($linea['peso']); + } + } + + if ($costeInterior <= 0) { + $error->interior = lang('Presupuestos.errores.noInterior'); + } + + // Si es POD hay que volver a calcular para incluir la merma correcta + if ($tirada[$t] <= $POD) { + $num_formas = []; + foreach ($interior as $linea) { + if (count($linea) > 0) { + $formas_linea = $is_cosido ? intval($linea['num_formas']['value']) / 2 : intval($linea['num_formas']['value']); + array_push($num_formas, $formas_linea); + } + } + $input_data['datosPedido']->merma = $this->calcular_merma($tirada[$t], $POD, $num_formas); + + $interior = PresupuestoClienteService::obtenerInterior($input_data); + } + + $costeInterior = 0.0; + $peso_interior = 0.0; + foreach ($interior as $linea) { + if (count($linea) > 0) { + $costeInterior += floatval($linea['total_impresion']); + $peso_interior += floatval($linea['peso']); + } + } + + if ($costeInterior <= 0) + $error->interior = lang('Presupuestos.errores.noInterior'); + else + $error->interior = ""; + + + // Cubierta + $papel_generico = [ + 'id' => $reqData['papelCubierta'] ?? 0, + 'nombre' => $reqData['papelCubiertaNombre'] ?? "", + ]; + $input_data['papel_generico'] = $papel_generico; + $input_data['gramaje'] = $reqData['gramajeCubierta'] ?? 0; + $input_data['datosPedido']->paginas = intval($reqData['carasCubierta'] ?? 0); + $input_data['paginas_color'] = intval($reqData['carasCubierta'] ?? 0); + $input_data['datosPedido']->solapas_ancho = intval($reqData['solapasCubierta'] ?? 0); + $input_data['datosPedido']->solapas = $input_data['datosPedido']->solapas_ancho > 0 ? 1 : 0; + $input_data['datosPedido']->lomo = $this->calcular_lomo($interior, 0); + $input_data['isColor'] = 1; + $input_data['isHq'] = 1; + $input_data['uso'] = 'cubierta'; + + $cubierta = PresupuestoClienteService::obtenerCubierta($input_data); + $coste_cubierta = 0.0; + $peso_cubierta = 0.0; + if (count($cubierta) > 0) { + $coste_cubierta += floatval($cubierta['total_impresion']); + $peso_cubierta += floatval($cubierta['peso']); + } + if ($coste_cubierta <= 0) + $error->cubierta = lang('Presupuestos.errores.noCubiertaSobrecubierta'); + else + $error->cubierta = ""; + + $tarifaAcabadoCubierta = intval($reqData['acabadoCubierta'] ?? 0); + $acabadoCubierta = []; + if ($tarifaAcabadoCubierta > 0) { + $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); + $acabadoCubierta = $model->getPrecioTarifa($tarifaAcabadoCubierta, $datosPedido->tirada, $POD); + } + if (count($acabadoCubierta) > 0) { + if ($acabadoCubierta[0]->total <= 0) + $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); + $coste_servicios += floatval($acabadoCubierta[0]->total); + } + + // Sobrecubierta + $coste_sobrecubierta = 0.0; + $peso_sobrecubierta = 0.0; + $linea_sobrecubierta = []; + $acabadoSobrecubierta = []; + $sobreCubierta = $reqData["sobrecubierta"] ?? null; + if (!is_null($sobreCubierta)) { + + $papel_generico = [ + 'id' => $sobreCubierta['papel'] ?? 0, + 'nombre' => $sobreCubierta['papel_nombre'] ?? "", + ]; + $input_data['papel_generico'] = $papel_generico; + $input_data['gramaje'] = $sobreCubierta['gramaje'] ?? 0; + $input_data['datosPedido']->paginas = 4; + $input_data['paginas_color'] = 4; + $input_data['datosPedido']->solapas_ancho = intval($sobreCubierta['solapas'] ?? 0); + $input_data['datosPedido']->solapas = $input_data['datosPedido']->solapas_ancho > 0 ? 1 : 0; + $input_data['datosPedido']->lomo = $this->calcular_lomo([$cubierta], $input_data['datosPedido']->lomo); + $input_data['isColor'] = 1; + $input_data['isHq'] = 1; + $input_data['uso'] = 'sobrecubierta'; + + $linea_sobrecubierta = PresupuestoClienteService::obtenerSobrecubierta($input_data); + + if (count($linea_sobrecubierta) > 0) { + $coste_sobrecubierta += floatval($linea_sobrecubierta['total_impresion']); + $peso_sobrecubierta += floatval($linea_sobrecubierta['peso']); + } + if ($coste_sobrecubierta <= 0) + $error->sobrecubierta = lang('Presupuestos.errores.noCubiertaSobrecubierta'); + else + $error->sobrecubierta = ""; + + $tarifaAcabadoSobrecubierta = intval(strlen($sobreCubierta['acabado']) == 0 ? 0 : $sobreCubierta['acabado']); + $acabadoSobrecubierta = []; + if ($tarifaAcabadoSobrecubierta > 0) { + $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); + $acabadoSobrecubierta = $model->getPrecioTarifa($tarifaAcabadoSobrecubierta, $datosPedido->tirada, $POD); + } + if (count($acabadoSobrecubierta) > 0) { + if ($acabadoSobrecubierta[0]->total <= 0) + $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); + $coste_servicios += floatval($acabadoSobrecubierta[0]->total); + } + } + + //Guardas + $guardas = []; + $peso_guardas = 0.0; + $coste_guardas = 0.0; + if ($reqData['guardas'] ?? 0 > 0) { + + $guardas = $reqData['guardas']; + $papel_generico = [ + 'id' => $guardas['papel'] ?? 0, + 'nombre' => $guardas['nombre'] ?? "", + ]; + $input_data['papel_generico'] = $papel_generico; + $input_data['gramaje'] = $guardas['gramaje'] ?? 0; + $input_data['datosPedido']->paginas = 8; + $input_data['paginas_color'] = 8; + $input_data['datosPedido']->paginas_impresion = $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 (count($guardas) > 0) { + $coste_guardas += floatval($guardas['total_impresion']); + $peso_guardas += floatval($guardas['peso']); + } + if ($coste_guardas <= 0) + $error->guardas = lang('Presupuestos.errores.noGuardas'); + else + $error->guardas = ""; + } + + // Servicios defecto + $servDefecto = PresupuestoCLienteService::getServiciosEncuadernacionDefault([ + 'tipo_impresion_id' => $tipo_impresion_id, + 'tirada' => $datosPedido->tirada, + 'paginas' => intval($reqData['paginas']) ?? 0, + 'ancho' => $datosPedido->ancho, + 'alto' => $datosPedido->alto, + 'POD' => $POD, + 'solapas' => intval($reqData['solapasCubierta'] ?? 0) > 0 ? 1 : 0, + ]); + $costeServiciosDefecto = 0.0; + foreach ($servDefecto as $servicio) { + if ($servicio->total <= 0) + $error->serviciosDefecto = lang('Presupuestos.errores.errorPresupuesto'); + + $costeServiciosDefecto += floatval($servicio->total); + } + + // Servicios + $servicios = $reqData['servicios'] ?? []; + if ($reqData['guardas'] ?? 0 > 0) { + array_push($servicios, 62); // Plegado de guardas + } + /* + 'retractilado' => 3, + 'retractilado5' => 5, + 'ferro' => 24, + 'prototipo' => 9, + 'fajaColor' => 16, + 'plegadoGuardas' => 62, + */ + $serviciosAutomaticos = []; + + foreach ($servicios as $servicio) { + if (intval($servicio) == 3 || intval($servicio) == 5 || intval($servicio) == 16) { + // Servicios acabado + $resultado = PresupuestoCLienteService::getServiciosManipulado([ + 'tarifa_id' => $servicio, + 'tirada' => $datosPedido->tirada, + 'POD' => $POD, + ]); + array_push($serviciosAutomaticos, $resultado[0]); + if ($resultado[0]->total <= 0) + $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); + + $coste_servicios += floatval($resultado[0]->total); + } else if (intval($servicio) == 24 || intval($servicio) == 9) { + // Servicios preimpresion + $resultado = PresupuestoCLienteService::getServiciosExtra([ + 'tarifa_id' => $servicio, + ]); + array_push($serviciosAutomaticos, $resultado[0]); + if ($resultado[0]->precio <= 0) + $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); + + $coste_servicios += floatval($resultado[0]->precio); + } else if (intval($servicio) == 62) { + // Servicios manipulado + $resultado = PresupuestoCLienteService::getServiciosManipulado([ + 'tarifa_id' => $servicio, + 'tirada' => $datosPedido->tirada, + 'POD' => $POD, + ]); + array_push($serviciosAutomaticos, $resultado[0]); + if ($resultado[0]->total <= 0) + $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); + + $coste_servicios += floatval($resultado[0]->total); + } + } + + array_push($precio_u, round(($costeInterior + $coste_cubierta + $coste_sobrecubierta + $costeServiciosDefecto + $coste_servicios) / $tirada[$t], 4)); + array_push($peso, round($peso_interior + $peso_cubierta + $peso_sobrecubierta + $peso_guardas, 2)); + foreach ($error as $err) { + if ($err != "") + break; + } + } + + + $return_data = [ + 'errors' => $error, + 'total_lp' => $costeInterior + $coste_cubierta + $coste_sobrecubierta, + 'acabadoCubierta' => $acabadoCubierta, + 'acabadoSobrecubierta' => $acabadoSobrecubierta, + 'total_servicios_defecto' => $costeServiciosDefecto, + 'total_servicios_automaticos' => $coste_servicios, + 'tiradas' => $tirada, + 'precio_u' => $precio_u, + 'peso' => $peso, + + 'interior' => $interior, + 'cubierta' => $cubierta, + 'sobrecubierta' => $linea_sobrecubierta, + 'guardas' => $guardas, + 'serviciosDefecto' => $servDefecto, + 'servicios_automaticos' => $serviciosAutomaticos, + $csrfTokenName => $newTokenHash + ]; + + + return $this->respond($return_data); + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } + + public function getDireccionesCliente() + { + if ($this->request->isAJAX()) { + + $newTokenHash = csrf_hash(); + $csrfTokenName = csrf_token(); + + $reqData = $this->request->getPost(); + $cliente_id = $reqData['id'] ?? 0; + $model = model('App\Models\Clientes\ClienteDireccionesModel'); + $data = $model->getMenuDirecciones($cliente_id); + array_unshift($data, ['id' => 0, 'text' => 'Agregar nueva dirección']); + + return $this->respond([ + 'menu' => $data, + $csrfTokenName => $newTokenHash + ]); + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } + + public function getDatosDireccion() + { + + if ($this->request->isAJAX()) { + + $newTokenHash = csrf_hash(); + $csrfTokenName = csrf_token(); + + $reqData = $this->request->getPost(); + $direccionId = $reqData['id'] ?? 0; + $peso = $reqData['peso'] ?? 0; + $unidades = $reqData['unidades'] ?? 0; + $model = model('App\Models\Clientes\ClienteDireccionesModel'); + $data = $model->getDireccion($direccionId); + + $modelTarifaEnvio = model('App\Models\Tarifas\TarifaEnvioModel'); + $coste = 0; + if ($data > 0) { + $tarifas_envio = $modelTarifaEnvio->getTarifaEnvio($data[0]->pais_id, $peso, $unidades, 'cajas'); + for ($i = 0; $i < count($tarifas_envio); $i++) { + if ($peso > $tarifas_envio[$i]->peso_max) { + $tarifas_envio[$i]->precio = number_format($tarifas_envio[$i]->peso_min + ($peso - $data[$i]->peso_min) * $data[$i]->precio_adicional, 2); + } + // si no se calcula linealmente + else { + $m = (($tarifas_envio[$i]->precio_max - $tarifas_envio[$i]->precio_min) / ($tarifas_envio[$i]->peso_max - $tarifas_envio[$i]->peso_min)); + $b = $tarifas_envio[$i]->precio_max - $m * $tarifas_envio[$i]->peso_max; + $tarifas_envio[$i]->precio = number_format($m * $peso + $b, 2); + } + $tarifas_envio[$i]->margen = $tarifas_envio[$i]->margen; + } + + if(count($tarifas_envio) > 1){ + $tarifa_final = array_reduce($tarifas_envio, function ($previous, $current) { + return $current->precio < $previous->precio ? $current : $previous; + }); + $coste = $tarifa_final->precio; + } + else{ + $coste = $tarifas_envio[0]->precio; + } + + + } + $data[0]->coste = $coste; + + return $this->respond([ + 'data' => $data, + $csrfTokenName => $newTokenHash + ]); + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } + + public function getNuevaDireccion() + { + + if ($this->request->isAJAX()) { + + $newTokenHash = csrf_hash(); + $csrfTokenName = csrf_token(); + + $reqData = $this->request->getPost(); + + $data = [ + 'cliente_id' => $reqData['cliente_id'] ?? 0, + 'alias' => $reqData['alias'] ?? "", + 'att' => $reqData['att'] ?? "", + 'email' => $reqData['email'] ?? "", + 'direccion' => $reqData['direccion'] ?? "", + 'pais_id' => $reqData['pais_id'] ?? 0, + 'municipio' => $reqData['municipio'] ?? "", + 'provincia' => $reqData['provincia'] ?? "", + 'cp' => $reqData['cp'] ?? "", + 'telefono' => $reqData['telefono'] ?? "" + ]; + + $model = model('App\Models\Clientes\ClienteDireccionesModel'); + $id = $model->nuevaDireccion($data); + + $menu = $model->getMenuDirecciones($data['cliente_id']); + + + return $this->respond([ + 'data' => $menu, + $csrfTokenName => $newTokenHash + ]); } else { return $this->failUnauthorized('Invalid request', 403); } @@ -620,270 +1064,8 @@ class Presupuestocliente extends \App\Controllers\GoBaseResourceController * Funciones auxiliares * **********************/ - protected function getLineasPresupuesto($reqData) + protected function calcular_lomo($lineas, $lomo_inicial) { - $error =(object)[ - 'interior' => "", - 'cubierta' => "", - 'sobrecubierta' => "", - 'guardas' => "", - 'servicios' => "", - 'serviciosDefecto' => "", - ]; - $coste_servicios = 0.0; - - $POD = model('App\Models\Configuracion\ConfiguracionSistemaModel')->getPOD(); - - - $tirada = $reqData['tirada'] ?? 0; - $tamanio = $reqData['tamanio']; - $tipo_impresion_id = $this->getTipoImpresion($reqData['tipo'], $reqData['tapa']); - $precio_u = []; - - for($t=0; $tget_isCosido($tipo_impresion_id); - - $datosPedido = (object)array( - 'paginas' => intval($reqData['paginas']) ?? 0, - 'tirada' => $tirada[$t], - 'merma' => $tirada[$t] > $POD ? $this->calcular_merma($tirada[$t], $POD) : 0, - 'ancho' => intval($tamanio['ancho']) ?? 100000, - 'alto' => intval($tamanio['alto']) ?? 100000, - 'isCosido' => $is_cosido, - ); - - $papel_generico = [ - 'id' => $reqData['papelInterior'] ?? 0, - 'nombre' => $reqData['papelInteriorNombre'] ?? "", - ]; - $gramaje = $reqData['gramajeInterior'] ?? 0; - $cliente_id = $reqData['clienteId'] ?? -1; - $excluirRotativa = $reqData['excluirRotativa'] ?? 0; - - $input_data = array( - 'uso' => 'interior', - 'tipo_impresion_id' => $tipo_impresion_id, - 'datosPedido' => $datosPedido, - 'papel_generico' => $papel_generico, - 'gramaje' => $gramaje, - 'isColor' => intval($reqData['isColor']) ?? 0, - 'isHq' => intval($reqData['isHq']) ?? 0, - 'cliente_id' => $cliente_id, - 'paginas_color' => $paginas_color, - 'excluirRotativa' => $excluirRotativa, - ); - - $interior = PresupuestoClienteService::obtenerInterior($input_data); - - $costeInterior = 0.0; - foreach ($interior as $linea) { - if (count($linea) > 0) { - $costeInterior += floatval($linea['total_impresion']); - } - } - - if ($costeInterior <= 0) { - $error->interior = lang('Presupuestos.errores.noInterior'); - } - - // Si es POD hay que volver a calcular para incluir la merma correcta - if ($tirada[$t] <= $POD) { - $num_formas = []; - foreach ($interior as $linea) { - if (count($linea) > 0) { - $formas_linea = $is_cosido ? intval($linea['num_formas']['value']) / 2 : intval($linea['num_formas']['value']); - array_push($num_formas, $formas_linea); - } - } - $input_data['datosPedido']->merma = $this->calcular_merma($tirada[$t], $POD, $num_formas); - - $interior = PresupuestoClienteService::obtenerInterior($input_data); - } - - $costeInterior = 0.0; - foreach ($interior as $linea) { - if (count($linea) > 0) { - $costeInterior += floatval($linea['total_impresion']); - } - } - - if ($costeInterior <= 0) - $error->interior = lang('Presupuestos.errores.noInterior'); - else - $error->interior = ""; - - - // Cubierta - $papel_generico = [ - 'id' => $reqData['papelCubierta'] ?? 0, - 'nombre' => $reqData['papelCubiertaNombre'] ?? "", - ]; - $input_data['papel_generico'] = $papel_generico; - $input_data['gramaje'] = $reqData['gramajeCubierta'] ?? 0; - $input_data['datosPedido']->paginas = intval($reqData['carasCubierta'] ?? 0); - $input_data['paginas_color'] = intval($reqData['carasCubierta'] ?? 0); - $input_data['datosPedido']->solapas_ancho = intval($reqData['solapasCubierta'] ?? 0); - $input_data['datosPedido']->solapas = $input_data['datosPedido']->solapas_ancho>0 ? 1 : 0; - $input_data['datosPedido']->lomo = $this->calcular_lomo($interior, 0); - $input_data['isColor'] = 1; - $input_data['isHq'] = 1; - $input_data['uso'] = 'cubierta'; - - $cubierta = PresupuestoClienteService::obtenerCubierta($input_data); - $coste_cubierta = 0.0; - if (count($cubierta) > 0) { - $coste_cubierta += floatval($cubierta['total_impresion']); - } - if($coste_cubierta <= 0) - $error->cubierta = lang('Presupuestos.errores.noCubiertaSobrecubierta'); - else - $error->cubierta = ""; - - $tarifaAcabadoCubierta = intval($reqData['acabadoCubierta'] ?? 0); - $acabadoCubierta = []; - if($tarifaAcabadoCubierta > 0){ - $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); - $acabadoCubierta = $model->getPrecioTarifa($tarifaAcabadoCubierta, $datosPedido->tirada, $POD); - } - if(count($acabadoCubierta) > 0){ - if($acabadoCubierta[0]->total <= 0 ) - $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); - $coste_servicios += floatval($acabadoCubierta[0]->total); - } - - // Sobrecubierta - $coste_sobrecubierta = 0.0; - $linea_sobrecubierta = []; - $sobreCubierta = $reqData["sobrecubierta"] ?? null; - if(!is_null($sobreCubierta)){ - - $papel_generico = [ - 'id' => $sobreCubierta['papel'] ?? 0, - 'nombre' => $sobreCubierta['papel_nombre'] ?? "", - ]; - $input_data['papel_generico'] = $papel_generico; - $input_data['gramaje'] = $sobreCubierta['gramaje'] ?? 0; - $input_data['datosPedido']->paginas = 4; - $input_data['paginas_color'] = 4; - $input_data['datosPedido']->solapas_ancho = intval($sobreCubierta['solapas'] ?? 0); - $input_data['datosPedido']->solapas = $input_data['datosPedido']->solapas_ancho>0 ? 1 : 0; - $input_data['datosPedido']->lomo = $this->calcular_lomo([$cubierta], $input_data['datosPedido']->lomo); - $input_data['isColor'] = 1; - $input_data['isHq'] = 1; - $input_data['uso'] = 'sobrecubierta'; - - $linea_sobrecubierta = PresupuestoClienteService::obtenerSobrecubierta($input_data); - - if (count($linea_sobrecubierta) > 0) { - $coste_sobrecubierta += floatval($linea_sobrecubierta['total_impresion']); - } - if($coste_sobrecubierta <= 0) - $error->sobrecubierta = lang('Presupuestos.errores.noCubiertaSobrecubierta'); - else - $error->sobrecubierta = ""; - - $tarifaAcabadoSobrecubierta = intval(strlen($sobreCubierta['acabado'])==0 ? 0:$sobreCubierta['acabado']); - $acabadoSobrecubierta = []; - if($tarifaAcabadoSobrecubierta > 0){ - $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); - $acabadoSobrecubierta = $model->getPrecioTarifa($tarifaAcabadoSobrecubierta, $datosPedido->tirada, $POD); - } - if(count($acabadoSobrecubierta) > 0){ - if($acabadoSobrecubierta[0]->total <= 0 ) - $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); - $coste_servicios += floatval($acabadoSobrecubierta[0]->total); - } - } - - //Guardas - if($reqData['guardas'] ?? 0 > 0){ - - $guardas = $reqData['guardas']; - $papel_generico = [ - 'id' => $guardas['papel'] ?? 0, - 'nombre' => $guardas['nombre'] ?? "", - ]; - $input_data['papel_generico'] = $papel_generico; - $input_data['gramaje'] = $guardas['gramaje'] ?? 0; - $input_data['datosPedido']->paginas = 8; - $input_data['paginas_color'] = 8; - $input_data['datosPedido']->paginas_impresion = $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); - $coste_guardas = 0.0; - if (count($guardas) > 0) { - $coste_guardas += floatval($guardas['total_impresion']); - } - if($coste_guardas <= 0) - $error->guardas = lang('Presupuestos.errores.noGuardas'); - else - $error->guardas = ""; - } - - // Servicios defecto - $servDefecto = PresupuestoCLienteService::getServiciosEncuadernacionDefault([ - 'tipo_impresion_id' => $tipo_impresion_id, - 'tirada' => $datosPedido->tirada, - 'paginas' => intval($reqData['paginas']) ?? 0, - 'ancho' => $datosPedido->ancho, - 'alto' => $datosPedido->alto, - 'POD' => $POD, - 'solapas' => intval($reqData['solapasCubierta'] ?? 0)>0?1:0, - ]); - $costeServiciosDefecto = 0.0; - foreach ($servDefecto as $servicio) { - if($servicio->total <= 0 ) - $error->serviciosDefecto = lang('Presupuestos.errores.errorPresupuesto'); - - $costeServiciosDefecto += floatval($servicio->total); - } - - array_push($precio_u, round(($costeInterior + $coste_cubierta + $coste_sobrecubierta + $costeServiciosDefecto + $coste_servicios)/$tirada[$t], 4)); - foreach($error as $err){ - if($err != "") - break; - } - } - - if($reqData['guardas'] ?? 0 > 0){ - } - - return [ - 'errors' => $error, - 'total_lp' => $costeInterior+$coste_cubierta+$coste_sobrecubierta, - 'acabadoCubierta' => $acabadoCubierta, - 'total_servicios_defecto' => $costeServiciosDefecto, - 'tiradas' => $tirada, - 'precio_u' => $precio_u, - - 'interior' => $interior, - 'cubierta' => $cubierta, - 'sobrecubierta' => $linea_sobrecubierta, - 'guardas' => $guardas, - 'serviciosDefecto' => $servDefecto, - ]; - } - - - - protected function calcular_lomo($lineas, $lomo_inicial){ $lomo = $lomo_inicial; foreach ($lineas as $linea) { if (count($linea) > 0) { @@ -991,4 +1173,13 @@ class Presupuestocliente extends \App\Controllers\GoBaseResourceController endif; return $data; } + + protected function getPaisListItems() + { + $paisModel = model('App\Models\Configuracion\PaisModel'); + $onlyActiveOnes = true; + $data = $paisModel->getAllForMenu('id, nombre', 'nombre', $onlyActiveOnes); + + return $data; + } } diff --git a/ci4/app/Models/Clientes/ClienteDireccionesModel.php b/ci4/app/Models/Clientes/ClienteDireccionesModel.php index 8f5e3b97..09d8f385 100755 --- a/ci4/app/Models/Clientes/ClienteDireccionesModel.php +++ b/ci4/app/Models/Clientes/ClienteDireccionesModel.php @@ -141,6 +141,7 @@ class ClienteDireccionesModel extends \App\Models\BaseModel return $builder->get()->getResultObject(); } + public function getMenuDirecciones($cliente_id=-1){ @@ -154,4 +155,11 @@ class ClienteDireccionesModel extends \App\Models\BaseModel return $builder->get()->getResultArray(); } + + public function nuevaDireccion($data) + { + $builder = $this->db->table($this->table); + $builder->insert($data); + return $this->db->insertID(); + } } diff --git a/ci4/app/Services/PresupuestoClienteService.php b/ci4/app/Services/PresupuestoClienteService.php index 39d4e686..18245e3f 100644 --- a/ci4/app/Services/PresupuestoClienteService.php +++ b/ci4/app/Services/PresupuestoClienteService.php @@ -20,11 +20,23 @@ class PresupuestoClienteService extends BaseService $rotativa = PresupuestoClienteService::obtenerPresupuestoClienteInteriorRotativa($data); $total_plana = -1; - if (count($plana[0]) > 0 || count($plana[1]) > 0) { - $total_plana = 0.0; + if($data['isColor']){ + if (count($plana[0]) > 2 && count($plana[1]) > 2) { + $total_plana = 0.0; + foreach ($plana as $linea) { + if (count($linea) > 0) + $total_plana += floatval($linea['total_impresion']); + } + } + } + else{ foreach ($plana as $linea) { if (count($linea) > 0) - $total_plana += floatval($linea['total_impresion']); + if($linea['tipo_linea'] == 'lp_bn' || $linea['tipo_linea'] == 'lp_bnhq'){ + $total_plana = 0.0; + $total_plana = floatval($linea['total_impresion']); + } + } } @@ -331,6 +343,47 @@ class PresupuestoClienteService extends BaseService return $values; } + public static function getServiciosManipulado($data){ + + $tarifa_id = $data['tarifa_id'] ?? -1; + $tirada = $data['tirada'] ?? -1; + $POD = $data['POD'] ?? -1; + + $model = model('App\Models\Presupuestos\PresupuestoManipuladosModel'); + $values = $model->getPrecioTarifa($tarifa_id, $tirada, $POD); + return $values; + } + + public static function getServiciosPreimpresion($data){ + + $tarifa_id = $data['tarifa_id'] ?? -1; + + $model = model('App\Models\Presupuestos\PresupuestoPreimpresionesModel'); + $values = $model->getPrecioTarifa($tarifa_id); + return $values; + } + + + public static function getServiciosExtra($data){ + + $tarifa_id = $data['tarifa_id'] ?? -1; + + $model = model('App\Models\Presupuestos\PresupuestoServiciosExtraModel'); + $values = $model->getPrecioTarifa($tarifa_id); + return $values; + } + + public static function getServiciosAcabados($data){ + + $tarifa_id = $data['tarifa_id'] ?? -1; + $tirada = $data['tirada'] ?? -1; + $POD = $data['POD'] ?? -1; + + $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); + $values = $model->getPrecioTarifa($tarifa_id, $tirada, $POD); + return $values; + } + /** * Obtiene las lineas de rotativa en el presupuesto de cliente * Selecciona entre las más económicas diff --git a/ci4/app/Views/themes/vuexy/form/clientes/cliente/_clienteDireccionesForm.php b/ci4/app/Views/themes/vuexy/form/clientes/cliente/_clienteDireccionesForm.php index 9bdc786b..851428a2 100644 --- a/ci4/app/Views/themes/vuexy/form/clientes/cliente/_clienteDireccionesForm.php +++ b/ci4/app/Views/themes/vuexy/form/clientes/cliente/_clienteDireccionesForm.php @@ -19,7 +19,7 @@
@@ -65,7 +65,7 @@