diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index 202315e1..0fb09796 100755 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -552,8 +552,16 @@ $routes->group('serviciospreimpresiones', ['namespace' => 'App\Controllers\Presu $routes->group('presupuestodirecciones', ['namespace' => 'App\Controllers\Presupuestos'], function ($routes) { $routes->post('datatable', 'Presupuestodirecciones::datatable', ['as' => 'dataTableOfPresupuestoDirecciones']); + $routes->post('datatable_2', 'Presupuestodirecciones::datatable_2', ['as' => 'processDataDirecciones']); }); +$routes->group('presupuestotiradasalternativas', ['namespace' => 'App\Controllers\Presupuestos'], function ($routes) { + $routes->post('datatable', 'Presupuestotiradasalternativas::datatable', ['as' => 'dataTableOfPresupuestoTiradasAlternativas']); + $routes->post('datatable_2', 'Presupuestotiradasalternativas::datatable_2', ['as' => 'getTiradaData']); +}); + + + $routes->group( 'printpresupuestos', ['namespace' => 'App\Controllers\Pdf'], diff --git a/ci4/app/Controllers/Js_loader.php b/ci4/app/Controllers/Js_loader.php index 543ec711..d6600618 100755 --- a/ci4/app/Controllers/Js_loader.php +++ b/ci4/app/Controllers/Js_loader.php @@ -27,6 +27,23 @@ class Js_loader extends BaseController return view('themes/backend/vuexy/form/presupuestos/cosidotapablanda/previews.js'); } + function tiradasAlternativas_js() + { + $this->response->setHeader('Content-Type', 'text/javascript'); + return view('themes/backend/vuexy/form/presupuestos/cosidotapablanda/_tiradasAlternativasItems.js'); + } + + function datosServicios_js() + { + $this->response->setHeader('Content-Type', 'text/javascript'); + return view('themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.js'); + } + + function datosEnvios_js() + { + $this->response->setHeader('Content-Type', 'text/javascript'); + return view('themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.js'); + } } \ No newline at end of file diff --git a/ci4/app/Controllers/Presupuestos/Cosidotapablanda.php b/ci4/app/Controllers/Presupuestos/Cosidotapablanda.php index 30bfd835..851bc0bf 100755 --- a/ci4/app/Controllers/Presupuestos/Cosidotapablanda.php +++ b/ci4/app/Controllers/Presupuestos/Cosidotapablanda.php @@ -53,7 +53,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $this->soft_delete = true; // Se indica el flag para los ficheros borrados $this->delete_flag = 1; - + $this->viewData = ['usingServerSideDataTable' => true]; // JJO parent::initController($request, $response, $logger); @@ -72,11 +72,11 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController 'tipo_impresion_id' => $tipo_impresion_id ]; - $viewData = array_merge($viewData, $this->getStringsFromTipoImpresion($tipo_impresion_id)); + $viewData = array_merge($viewData, $this->getStringsFromTipoImpresion($tipo_impresion_id)); $viewData = array_merge($this->viewData, $viewData); // merge any possible values from the parent controller class - - + + return view(static::$viewPath . 'viewCosidotapablandaList', $viewData); } @@ -102,7 +102,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController if (!isset($sanitizedData['papel_formato_id']) || $sanitizedData['papel_formato_id'] == null) { $sanitizedData['papel_formato_id'] = 0; - } + } $noException = true; if ($successfulResult = $this->canValidate($this->model->validationRulesAdd, $this->model->validationMessagesAdd)) : // if ($successfulResult = $this->validate($this->formValidationRules) ) : @@ -157,7 +157,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $this->viewData['formAction'] = route_to('createCosidotapablanda', $tipo_impresion_id); - $this->viewData = array_merge($this->viewData, $this->getStringsFromTipoImpresion($tipo_impresion_id)); + $this->viewData = array_merge($this->viewData, $this->getStringsFromTipoImpresion($tipo_impresion_id)); $this->viewData['boxTitle'] = lang('Basic.global.addNew') . ' ' . $this->viewData['pageTitle'] . ' ' . lang('Basic.global.addNewSuffix'); @@ -167,7 +167,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController public function edit($requestedId = null) { - // JJO + // JJO $session = session(); if ($requestedId == null) : @@ -193,7 +193,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $sanitizedData = $this->sanitized($postData, $nullIfEmpty); - + // JJO $sanitizedData['user_updated_id'] = $session->id_user; @@ -202,7 +202,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController } if ($this->request->getPost('retractilado5') == null) { $sanitizedData['retractilado5'] = false; - } + } if ($this->request->getPost('ferro') == null) { $sanitizedData['ferro'] = false; } @@ -234,8 +234,10 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController } $noException = true; - if($sanitizedData['papel_formato_id'] == null && $sanitizedData['papel_formato_ancho'] == null - && $sanitizedData['papel_formato_alto'] == null){ + if ( + $sanitizedData['papel_formato_id'] == null && $sanitizedData['papel_formato_ancho'] == null + && $sanitizedData['papel_formato_alto'] == null + ) { if ($this->request->isAJAX()) { $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); @@ -244,14 +246,11 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $csrfTokenName => $newTokenHash ]; return $this->respond($data); - - } - else{ + } else { $this->session->setFlashData('errorMessage', lang('Presupuestos.errores.formato_papel')); } $successfulResult = false; - } - else{ + } else { if ($successfulResult = $this->canValidate()) : // if ($successfulResult = $this->validate($this->formValidationRules) ) @@ -292,11 +291,10 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $csrfTokenName => $newTokenHash ]; return $this->respond($data); - } - else{ + } else { return $this->redirect2listView('sweet-success', $message); } - + endif; else : if ($this->request->isAJAX()) { @@ -307,8 +305,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $csrfTokenName => $newTokenHash ]; return $this->respond($data); - } - else{ + } else { $this->session->setFlashData('sweet-success', $message); } endif; @@ -322,7 +319,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $this->viewData['isCosido'] = (new TipoPresupuestoModel())->get_isCosido($presupuestoEntity->tipo_impresion_id); $this->viewData['isTapaDura'] = (new TipoPresupuestoModel())->get_isTapaDura($presupuestoEntity->tipo_impresion_id); - if(!is_null($presupuestoEntity->comparador_json_data)) + if (!is_null($presupuestoEntity->comparador_json_data)) $this->viewData['comp_data'] = json_decode($presupuestoEntity->comparador_json_data); else $this->viewData['comp_data'] = ""; @@ -362,7 +359,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $this->viewData['serviciosPreimpresionList'] = (new PresupuestoPreimpresionesModel())->getResource($id)->get()->getResultObject(); // Direciones presupuesto - $this->viewData['presupuestoDirecciones'] = (new PresupuestoDireccionesModel())->getResource("",$id)->get()->getResultObject(); + $this->viewData['presupuestoDirecciones'] = (new PresupuestoDireccionesModel())->getResource("", $id)->get()->getResultObject(); $this->viewData['POD'] = $this->getPOD(); @@ -373,11 +370,11 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController 'prototipo' => 9, 'fajaColor' => 16, 'plegadoGuardas' => 62, - ]; + ]; $this->viewData['tipo_impresion_id'] = $presupuestoEntity->tipo_impresion_id; // Cosido tapa blanda JJO - $this->viewData = array_merge($this->viewData, $this->getStringsFromTipoImpresion($presupuestoEntity->tipo_impresion_id)); + $this->viewData = array_merge($this->viewData, $this->getStringsFromTipoImpresion($presupuestoEntity->tipo_impresion_id)); $this->viewData['formAction'] = route_to('updateCosidotapablanda', $id); @@ -395,7 +392,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $reqData = $this->request->getPost(); $type = $reqData['type'] ?? null; - + if (is_null($type)) { if (!isset($reqData['draw']) || !isset($reqData['columns'])) { $errstr = 'No data available in response to this specific request.'; @@ -406,7 +403,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController } $start = $reqData['start'] ?? 0; $length = $reqData['length'] ?? 5; - + $requestedOrder1 = $reqData['order']['0']['column'] ?? 0; $order1 = PresupuestoModel::SORTABLE[$requestedOrder1 >= 0 ? $requestedOrder1 : 0]; $dir1 = $reqData['order']['0']['dir'] ?? 'asc'; @@ -423,7 +420,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController if (is_null($type)) { $searchValues = get_filter_datatables_columns($reqData); - + $resourceData = $this->model->getResource($searchValues, $tipo_impresion_id)->orderBy($order1, $dir1)->orderBy($order2, $dir2) ->orderBy($order3, $dir3)->limit($length, $start)->get()->getResultObject(); foreach ($resourceData as $item) : @@ -468,7 +465,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $isColor = $reqData['color'] ?? false; $isHq = $reqData['hq'] ?? false; - + $datosPedido = (object)array( 'paginas' => intval($reqData['paginas']) ?? 0, 'tirada' => intval($reqData['tirada']) ?? 0, @@ -483,17 +480,17 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController 'id' => $reqData['papel_generico_id'] ?? 0, 'nombre' => $reqData['papel_generico'] ?? "", ]; - + $gramaje = $reqData['gramaje'] ?? 0; $cliente_id = $reqData['cliente_id'] ?? -1; - - - if ($type=='interior' || $type=='guardas') { + + + if ($type == 'interior' || $type == 'guardas') { $datosTipolog = $reqData['negro'] ?? null; - if(!is_null($datosTipolog)){ + if (!is_null($datosTipolog)) { $datosTipolog = []; $data = (object)array( 'negro' => floatval($reqData['negro']) ?? 0, @@ -503,37 +500,35 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController 'cg' => floatval($reqData['cg']) ?? 0, 'gota_negro' => intval($reqData['gota_negro']) ?? 0, 'gota_color' => intval($reqData['gota_color']) ?? 0, - ); + ); array_push($datosTipolog, $data); } - if ($type=='guardas') { + if ($type == 'guardas') { $datosPedido->paginas_impresion = intval($reqData['paginas_impresion']) ?? 0; // 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){ + if ($tipo_impresion_id == 1 || $tipo_impresion_id == 3) { $datosPedido->isCosido = true; - }else if ($tipo_impresion_id == 5 || $tipo_impresion_id == 7){ + } else if ($tipo_impresion_id == 5 || $tipo_impresion_id == 7) { $datosPedido->isCosido = false; } - } - + $a_favor_fibra = $reqData['a_favor_fibra'] ?? false; $resourceData = $this->getCompIntData($type, $datosPedido, $papel_generico, $gramaje, $isColor, $isHq, $cliente_id, $datosTipolog, $a_favor_fibra); - + $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); $data = [ 'lineas' => $resourceData, $csrfTokenName => $newTokenHash ]; - + return $this->respond($data); - } - else if ($type=='interior_rot') { + } else if ($type == 'interior_rot') { $paginas = (object)array( 'negro' => intval($reqData['paginas_negro']) ?? 0, @@ -541,7 +536,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController ); $datosTipolog = $reqData['negro'] ?? null; - if(!is_null($datosTipolog)){ + if (!is_null($datosTipolog)) { $datosTipolog = []; $data = (object)array( 'negro' => floatval($reqData['negro']) ?? 0, @@ -550,23 +545,22 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController 'amarillo' => floatval($reqData['amarillo']) ?? 0, 'gota_negro' => intval($reqData['gota_negro']) ?? 0, 'gota_color' => intval($reqData['gota_color']) ?? 0, - ); + ); array_push($datosTipolog, $data); } $resourceData = $this->getCompIntRotData($datosPedido, $papel_generico, $gramaje, $paginas, $cliente_id, $datosTipolog); - + $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); $data = [ 'lineas' => $resourceData, $csrfTokenName => $newTokenHash ]; - + return $this->respond($data); - } - else if ($type=='cubierta' || $type=='sobrecubierta') { - + } else if ($type == 'cubierta' || $type == 'sobrecubierta') { + $datosPedido->solapas = $reqData['solapas']; $datosPedido->solapas_ancho = $reqData['solapas_ancho']; $datosPedido->lomo = $reqData['lomo']; @@ -575,17 +569,16 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $datosPedido->altoExteriores = PresupuestoService::getAltoTotalExteriores($type, $tipo_impresion_id, $datosPedido); // Cubierta y sobrecubierta siempre color HQ $resourceData = $this->getCompIntData($type, $datosPedido, $papel_generico, $gramaje, $isColor, 1, $cliente_id); - + $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); $data = [ 'lineas' => $resourceData, $csrfTokenName => $newTokenHash ]; - + return $this->respond($data); } - } return $this->respond(Collection::datatable( @@ -605,18 +598,18 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $reqData = $this->request->getPost(); $tipo = $reqData['tipo'] ?? ''; - - if($tipo=='lineasPresupuesto'){ - + + if ($tipo == 'lineasPresupuesto') { + $model = model('App\Models\Presupuestos\PresupuestoLineaModel'); - + $datos = $reqData['datos'] ?? null; - + $presupuesto_id = $reqData['presupuesto_id'] ?? -1; $model->where("presupuesto_id", $presupuesto_id)->delete(); - if($datos != null){ + if ($datos != null) { $model->insertLineasPresupuesto($presupuesto_id, $datos); } @@ -625,7 +618,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $data = [ $csrfTokenName => $newTokenHash ]; - + return $this->respond($data); } @@ -634,21 +627,21 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $data = [ $csrfTokenName => $newTokenHash ]; - - return $this->respond($data); + return $this->respond($data); } else { return $this->failUnauthorized('Invalid request', 403); } } - private function getStringsFromTipoImpresion($tipo_impresion_id){ - + private function getStringsFromTipoImpresion($tipo_impresion_id) + { + $breadcrumbTitle = ""; - switch ($tipo_impresion_id){ + switch ($tipo_impresion_id) { - // Fresado tapa dura + // Fresado tapa dura case 1: $viewData['pageTitle'] = lang('Presupuestos.moduleTitleFresadoTD'); $viewData['isCosido'] = 0; @@ -656,15 +649,15 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $breadcrumbTitle = lang("App.menu_libros_fresasdo_tapa_dura"); break; - // Fresado tapa blanda + // Fresado tapa blanda case 2: $viewData['pageTitle'] = lang('Presupuestos.moduleTitleFresadoTB'); $viewData['isCosido'] = 0; $viewData['isTapaDura'] = 0; - $breadcrumbTitle = lang("App.menu_libros_fresasdo_tapa_blanda"); + $breadcrumbTitle = lang("App.menu_libros_fresasdo_tapa_blanda"); break; - // Cosido tapa dura + // Cosido tapa dura case 3: $viewData['pageTitle'] = lang('Presupuestos.moduleTitleCosidoTD'); $viewData['isCosido'] = 1; @@ -672,7 +665,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $breadcrumbTitle = lang("App.menu_libros_cosido_tapa_dura"); break; - // Cosido tapa blanda + // Cosido tapa blanda case 4: $viewData['pageTitle'] = lang('Presupuestos.moduleTitleCosidoTB'); $viewData['isCosido'] = 1; @@ -682,7 +675,6 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController default: return "A IMPLEMENTAR!"; - } // Breadcrumbs @@ -697,42 +689,10 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController public function getCompIntData($uso, $datosPedido, $papel_generico, $gramaje, $isColor, $isHq, $cliente_id, $datosTipolog = null, $a_favor_fibra = false) { - $tipo = $isColor? ($isHq?'colorhq':'color'): ($isHq?'negrohq':'negro'); + $tipo = $isColor ? ($isHq ? 'colorhq' : 'color') : ($isHq ? 'negrohq' : 'negro'); + + $opciones_papel = PresupuestoService::get_opciones_papel($uso, $isColor); - if( $uso == 'cubierta' ){ - $opciones_papel = array( - 'cubierta' => 1, - //'color' => 1, - 'rotativa' => 0, - ); - } - else if ( $uso == 'sobrecubierta' ){ - $opciones_papel = array( - 'sobrecubierta' => 1, - //'color' => 1, - 'rotativa' => 0, - ); - } - else if ( $uso == 'guardas' ){ - $opciones_papel = array( - 'guardas' => 1, - //'color' => 1, - 'rotativa' => 0, - ); - } - else if( $isColor ){ - $opciones_papel = array( - 'color' => 1, - 'rotativa' => 0, - ); - } - else{ - $opciones_papel = array( - 'bn' => 1, - 'rotativa' => 0, - ); - } - // Se obtienen los papeles disponibles $papelimpresionmodel = new PapelImpresionModel(); $papeles = $papelimpresionmodel->getIdPapelesImpresionForPresupuesto( @@ -749,7 +709,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $maquinas = $maquinamodel->getMaquinaImpresionForPresupuesto( is_rotativa: 0, tarifa_tipo: $tipo, - uso_tarifa: ($uso=='guardas')?'interior':$uso, + uso_tarifa: ($uso == 'guardas') ? 'interior' : $uso, tirada: $datosPedido->tirada + $datosPedido->merma, papel_impresion_id: $papel->id, ); @@ -757,145 +717,25 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController // Se recorren las máquinas y se calcula el coste de linea por cada una foreach ($maquinas as $maquina) { - if($maquina->is_inkjet){ - $parametrosInkjet = (object)array( - 'a_favor_fibra' => $a_favor_fibra, // este parametro se cambia para comprobar - // en las dos direcciones (menos en rustica fresada que es siempre 1) - 'bnPages' => $isColor?0:$datosPedido->paginas, - 'colorPages' => ($uso == 'guardas')?$datosPedido->paginas_impresion:($isColor?$datosPedido->paginas:0), - 'rotativa_gota_negro' => 0, - 'rotativa_gota_color' => 0, - ); - - $papelImpresionTipologiaModel = new \App\Models\Configuracion\PapelImpresionTipologiaModel(); - if(is_null($datosTipolog)){ - $datosTipologias = $papelImpresionTipologiaModel - ->findTipologiasForPapelImpresion($papel->id, $parametrosInkjet->colorPages>0?'color':'negro') - ->get()->getResultObject(); - - if(count($datosTipologias)==0){ - continue; - } - } - else{ - $datosTipologias = $datosTipolog; - } - $parametrosInkjet->rotativa_gota_negro = $datosTipologias[0]->gota_negro; - $parametrosInkjet->rotativa_gota_color = $datosTipologias[0]->gota_color; - $parametrosInkjet->rotativa_negro = $datosTipologias[0]->negro; - $parametrosInkjet->rotativa_cyan = $datosTipologias[0]->cyan; - $parametrosInkjet->rotativa_magenta = $datosTipologias[0]->magenta; - $parametrosInkjet->rotativa_amarillo = $datosTipologias[0]->amarillo; - $parametrosInkjet->rotativa_cg = $datosTipologias[0]->cg; - } + $data['uso'] = $uso; + $data['tipo'] = $tipo; + $data['datosPedido'] = $datosPedido; + $data['cliente_id'] = $cliente_id; + $data['papel'] = $papel; + $data['opciones_papel'] = $opciones_papel; + $data['maquina'] = $maquina; + $data['papel_generico'] = $papel_generico; + $data['isColor'] = $isColor; + $data['a_favor_fibra'] = $a_favor_fibra; + $data['datosTipolog'] = $datosTipolog; + $data['gramaje'] = $gramaje; - $tarifamodel = new MaquinasTarifasImpresionModel(); - - [$tarifaId, $tarifa, $tarifa_margen] = $tarifamodel->getTarifa($maquina->maquina_id, ($uso=='guardas')?'interior':$uso, $tipo); - - - if(!is_float($tarifa)){ + $linea = PresupuestoService::getLineaPresupuestoPlana($data); + + if(empty($linea)) continue; - } - if($maquina->is_inkjet){ - $linea = PresupuestoService::getCostesLinea($uso, $datosPedido, $maquina, $papel, $opciones_papel, $tarifa, $tarifa_margen, $parametrosInkjet->a_favor_fibra); - } - else{ - $linea = PresupuestoService::getCostesLinea($uso, $datosPedido, $maquina, $papel, $opciones_papel, $tarifa, $tarifa_margen); - } - - if(array_key_exists('error', $linea)){ - //array_push($lineas, $linea); for debug - continue; - } - - if($maquina->is_inkjet){ - // calculo de tintas - $linea['fields'] = array_merge($linea['fields'], PresupuestoService::calculoCosteTintas($maquina, $datosPedido, $parametrosInkjet)); - } - - $linea['fields']['tarifa_impresion_id'] = $tarifaId; - $linea['fields']['maquina'] = $maquina->maquina; - $linea['fields']['maquina_id'] = $maquina->maquina_id; - $linea['fields']['maquina_velocidad'] = $maquina->velocidad; - $linea['fields']['papel_impresion'] = $papel->nombre; - $linea['fields']['papel_impresion_id'] = $papel->id; - $linea['fields']['paginas'] = $datosPedido->paginas; - $linea['fields']['gramaje'] = $gramaje; - $linea['fields']['papel_generico_id'] = $papel_generico['id']; - $linea['fields']['papel_generico'] = $papel_generico['nombre']; - - $linea['fields']['tiempo_maquina'] = PresupuestoService::getTiempoMaquina( - $linea['fields']['precio_click_pedido'], - $linea['fields']['precio_click'], - $maquina->velocidad); - - $clientePreciosModel = new ClientePreciosModel(); - $config = (object)[ - "tipo" => ($uso=='guardas')?'interior':$uso, - "tipo_maquina" => $maquina->is_inkjet?'inkjet':'toner', - "tipo_impresion" => $tipo - ]; - $tiempo = PresupuestoService::getHorasMaquina( - $linea['fields']['precio_click_pedido'], - $linea['fields']['precio_click'], - $maquina->velocidad); - [$precio_hora, $margen_precio_hora] = $clientePreciosModel->get_precio_hora($cliente_id, $config, $tiempo); - - - if(is_null($precio_hora)){ - continue; - } - - $linea['fields']['tipo_maquina'] = $maquina->is_inkjet?'inkjet':'toner'; - $linea['fields']['precio_hora'] = $precio_hora*(1+$margen_precio_hora/100.0); - $linea['fields']['precio_hora_margen'] = $precio_hora*($margen_precio_hora/100.0); - $linea['fields']['horas_maquina'] = $tiempo; - $linea['fields']['precio_impresion_horas'] = $linea['fields']['precio_hora']*$tiempo; - $linea['fields']['margen_impresion_horas'] = $linea['fields']['precio_hora_margen']*$tiempo; - - // para guardas - if(\property_exists($datosPedido, 'paginas_impresion')){ - $linea['fields']['paginas_impresion'] = $datosPedido->paginas_impresion; - } - - if($maquina->is_inkjet){ - $linea['fields']['a_favor_fibra'] = $parametrosInkjet->a_favor_fibra; - $linea['fields']['paginas_color'] = $isColor?$datosPedido->paginas:0; - $linea['fields']['totalClicksPedido'] = $linea['fields']['precio_click_pedido']; - if( $uso != 'guardas' ){ - $linea['fields']['clicks_libro'] = round(ceil($linea['fields']['pliegos_libro']) * 2, 2); - } - else{ - if($datosPedido->paginas_impresion == 4) - $linea['fields']['clicks_libro'] = round(ceil($linea['fields']['pliegos_libro']), 2); - else if($datosPedido->paginas_impresion == 8) - $linea['fields']['clicks_libro'] = round(ceil($linea['fields']['pliegos_libro'])*2, 2); - else - $linea['fields']['clicks_libro'] = 0; - } - $linea['fields']['clicks_pedido'] = round($linea['fields']['clicks_libro'] * ($datosPedido->tirada + $datosPedido->merma), 2); - [$ancho, $alto] = PresupuestoService::calculoDimForma($datosPedido, $parametrosInkjet); - $linea['fields']['factor_anchura'] = round($maquina->ancho_impresion / $ancho, 2); - $linea['fields']['factor_altura'] = round($maquina->alto_impresion / ($alto + PresupuestoService::MARGEN_PAGINAS_ROTATIVA), 2); - $linea['fields']['paginas_por_pliego'] = ($datosPedido->isCosido)?$linea['fields']['num_formas']['value']*2:$linea['fields']['num_formas']['value'] * 2; // Se multiplica *2 porque es doble cara - $linea['fields']['datosTipologias'] = $datosTipologias[0]; - $linea['fields']['total_impresion'] = - floatval($linea['fields']['precio_pedido']) + // papel - floatval($linea['fields']['precio_impresion_horas']) + // horas de maquina - floatval($linea['fields']['precio_click_pedido']) + // precio clicks del pedido - floatval($linea['fields']['precio_tinta']); // tinta - } - else{ - $linea['fields']['total_impresion'] = floatval($linea['fields']['precio_pedido']) + // papel - floatval($linea['fields']['precio_click_pedido']) + // precio clicks del pedido - floatval($linea['fields']['precio_impresion_horas']) ; // horas de maquina - } - - - array_push($lineas, $linea); } } @@ -908,11 +748,11 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController { $uso = 'interior'; - $tipo = $paginas->color>0? 'color': 'negro'; + $tipo = $paginas->color > 0 ? 'color' : 'negro'; $parametrosRotativa = (object)array( - 'a_favor_fibra' => $datosPedido->a_favor_fibra, + 'a_favor_fibra' => $datosPedido->a_favor_fibra, 'bnPages' => $paginas->negro, 'colorPages' => $paginas->color, 'rotativa_gota_negro' => 0, @@ -924,15 +764,15 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController ); $tipo = array(); - if( $paginas->color > 0 ){ + if ($paginas->color > 0) { $tipo = 'color'; $opciones_papel['color'] = 1; } - if( $paginas->negro > 0 ){ + if ($paginas->negro > 0) { $opciones_papel['bn'] = 1; $tipo = 'negro'; } - + // Se obtienen los papeles disponibles $papelimpresionmodel = new PapelImpresionModel(); $papeles = $papelimpresionmodel->getIdPapelesImpresionForPresupuesto( @@ -946,33 +786,32 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController foreach ($papeles as $papel) { $papelImpresionTipologiaModel = new \App\Models\Configuracion\PapelImpresionTipologiaModel(); - if(is_null($datosTipolog)){ + if (is_null($datosTipolog)) { $datosTipologias = $papelImpresionTipologiaModel - ->findTipologiasForPapelImpresion($papel->id, $parametrosRotativa->colorPages>0?'color':'negro') + ->findTipologiasForPapelImpresion($papel->id, $parametrosRotativa->colorPages > 0 ? 'color' : 'negro') ->get()->getResultObject(); - - if(count($datosTipologias)==0){ + + if (count($datosTipologias) == 0) { continue; } - } - else{ + } else { $datosTipologias = $datosTipolog; } - + $parametrosRotativa->rotativa_gota_negro = $datosTipologias[0]->gota_negro; $parametrosRotativa->rotativa_gota_color = $datosTipologias[0]->gota_color; $parametrosRotativa->rotativa_negro = $datosTipologias[0]->negro; $parametrosRotativa->rotativa_cyan = $datosTipologias[0]->cyan; $parametrosRotativa->rotativa_magenta = $datosTipologias[0]->magenta; $parametrosRotativa->rotativa_amarillo = $datosTipologias[0]->amarillo; - + $maquinamodel = new MaquinaModel(); - + $maquinas = $maquinamodel->getMaquinaImpresionForPresupuesto( is_rotativa: 1, tarifa_tipo: $tipo, - uso_tarifa: $uso, + uso_tarifa: $uso, tirada: $datosPedido->tirada + $datosPedido->merma, papel_impresion_id: $papel->id, ); @@ -981,24 +820,24 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController foreach ($maquinas as $maquina) { $tarifamodel = new MaquinasTarifasImpresionModel(); - [$tarifaId, $tarifa, $tarifa_margen] = $tarifamodel->getTarifa($maquina->maquina_id, $uso, is_array($tipo)?'color':$tipo); - if(!is_float($tarifa)){ + [$tarifaId, $tarifa, $tarifa_margen] = $tarifamodel->getTarifa($maquina->maquina_id, $uso, is_array($tipo) ? 'color' : $tipo); + if (!is_float($tarifa)) { continue; } - + // precio del pliego de impresion $linea['fields'] = PresupuestoService::getCostesLineaRotativa($maquina, $papel, $datosPedido, $parametrosRotativa); - + [$precio_pliego_impresion, $margen_pliego_impresion] = PresupuestoService::getPrecioPliego($maquina, $papel, $datosPedido->paginas); - + $linea['fields']['tarifa_impresion_id'] = $tarifaId; - $linea['fields']['precios_pliegos'] = $precio_pliego_impresion+$margen_pliego_impresion; + $linea['fields']['precios_pliegos'] = $precio_pliego_impresion + $margen_pliego_impresion; $linea['fields']['precio_libro'] = $linea['fields']['pliegos_libro'] * $linea['fields']['precios_pliegos']; // Precio papel pedido - $linea['fields']['precio_pedido'] = $linea['fields']['precio_libro'] * ($datosPedido->tirada + $datosPedido->merma); - $linea['fields']['margen_papel_pedido'] = $linea['fields']['pliegos_libro']*$margen_pliego_impresion* ($datosPedido->tirada + $datosPedido->merma); ; + $linea['fields']['precio_pedido'] = $linea['fields']['precio_libro'] * ($datosPedido->tirada + $datosPedido->merma); + $linea['fields']['margen_papel_pedido'] = $linea['fields']['pliegos_libro'] * $margen_pliego_impresion * ($datosPedido->tirada + $datosPedido->merma);; $linea['fields']['a_favor_fibra'] = $parametrosRotativa->a_favor_fibra; $linea['fields']['maquina'] = $maquina->maquina; @@ -1017,20 +856,21 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $linea['fields']['num_formas_horizontales'] = floor($linea['fields']['factor_anchura']); $linea['fields']['num_formas_verticales'] = floor($linea['fields']['factor_altura']); - + $linea['fields']['datosTipologias'] = $datosTipologias[0]; // impresion - $linea['fields']['precio_click'] = $tarifa *(1+ $tarifa_margen/100.0); - $linea['fields']['precio_click_margen'] = $tarifa *($tarifa_margen/100.0); + $linea['fields']['precio_click'] = $tarifa * (1 + $tarifa_margen / 100.0); + $linea['fields']['precio_click_margen'] = $tarifa * ($tarifa_margen / 100.0); $linea['fields']['precio_click_pedido'] = $linea['fields']['clicks_pedido'] * $linea['fields']['precio_click']; $linea['fields']['margen_click_pedido'] = $linea['fields']['clicks_pedido'] * $linea['fields']['precio_click_margen']; $linea['fields']['tiempo_maquina'] = PresupuestoService::getTiempoMaquina( - $linea['fields']['precio_click_pedido'], - $linea['fields']['precio_click'], - $maquina->velocidad); + $linea['fields']['precio_click_pedido'], + $linea['fields']['precio_click'], + $maquina->velocidad + ); $clientePreciosModel = new ClientePreciosModel(); @@ -1040,30 +880,31 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController "tipo_impresion" => $tipo ]; $tiempo = PresupuestoService::getHorasMaquina( - $linea['fields']['precio_click_pedido'], - $linea['fields']['precio_click'], - $maquina->velocidad); + $linea['fields']['precio_click_pedido'], + $linea['fields']['precio_click'], + $maquina->velocidad + ); [$precio_hora, $margen_precio_hora] = $clientePreciosModel->get_precio_hora($cliente_id, $config, $tiempo); - if(is_null($precio_hora)){ + if (is_null($precio_hora)) { continue; } - $linea['fields']['precio_hora'] = $precio_hora*(1+$margen_precio_hora/100.0); - $linea['fields']['precio_hora_margen'] = $precio_hora*($margen_precio_hora/100.0); - $linea['fields']['horas_maquina'] = $tiempo; - $linea['fields']['precio_impresion_horas'] = $linea['fields']['precio_hora']*$tiempo; - $linea['fields']['margen_impresion_horas'] = $linea['fields']['precio_hora_margen']*$tiempo; + $linea['fields']['precio_hora'] = $precio_hora * (1 + $margen_precio_hora / 100.0); + $linea['fields']['precio_hora_margen'] = $precio_hora * ($margen_precio_hora / 100.0); + $linea['fields']['horas_maquina'] = $tiempo; + $linea['fields']['precio_impresion_horas'] = $linea['fields']['precio_hora'] * $tiempo; + $linea['fields']['margen_impresion_horas'] = $linea['fields']['precio_hora_margen'] * $tiempo; // total linea rotativa //$linea['fields']['total_impresion'] = $linea['fields']['precio_pedido'] + $linea['fields']['precio_click_pedido'] + $linea['fields']['precio_tinta'] + // $linea['fields']['total_corte']; - $linea['fields']['total_impresion'] = - floatval($linea['fields']['precio_pedido']) + // papel - floatval($linea['fields']['precio_click_pedido']) + // precio clicks del pedido - floatval($linea['fields']['precio_impresion_horas']) + // horas de maquina - floatval($linea['fields']['precio_tinta']) + // tinta - floatval($linea['fields']['total_corte']); // corte + $linea['fields']['total_impresion'] = + floatval($linea['fields']['precio_pedido']) + // papel + floatval($linea['fields']['precio_click_pedido']) + // precio clicks del pedido + floatval($linea['fields']['precio_impresion_horas']) + // horas de maquina + floatval($linea['fields']['precio_tinta']) + // tinta + floatval($linea['fields']['total_corte']); // corte array_push($lineas, $linea); } @@ -1099,7 +940,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController if ($this->request->isAJAX()) { $reqData = $this->request->getPost(); - try{ + try { $tipo = $reqData['tipo'] ?? null; $uso = $reqData['uso'] ?? null; @@ -1114,39 +955,35 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $tirada = $reqData['tirada'] ?? 0; $merma = $reqData['merma'] ?? 0; $model = new PapelGenericoModel(); - $menu = $model->getGramajeComparador($datos, $uso, intval($tirada+$merma) ); + $menu = $model->getGramajeComparador($datos, $uso, intval($tirada + $merma)); $data = [ 'menu' => $menu, $csrfTokenName => $newTokenHash ]; - } - elseif ($tipo == 'gramajeLineasPresupuesto') { + } elseif ($tipo == 'gramajeLineasPresupuesto') { $tipoLinea = $reqData['tipoLinea'] ?? null; // En este caso contiene el id del papel generico $model = new PapelGenericoModel(); - $menu = $model->getGramajeLineasPresupuesto($datos, $tipoLinea, $uso ); + $menu = $model->getGramajeLineasPresupuesto($datos, $tipoLinea, $uso); $data = [ 'menu' => $menu, $csrfTokenName => $newTokenHash ]; - } - elseif ($tipo == 'papelImpresion') { + } elseif ($tipo == 'papelImpresion') { $gramaje = $reqData['gramaje'] ?? null; $tipoLinea = $reqData['tipoLinea'] ?? null; // En este caso contiene el nombre del papel generico // Uso: negro, negrohq, color, colorhq, rot_bn, rot_color, $model = new PapelImpresionModel(); - $menu = $model->getPapelesImpresionForMenu($datos, $gramaje, $tipoLinea, $uso ); + $menu = $model->getPapelesImpresionForMenu($datos, $gramaje, $tipoLinea, $uso); $data = [ 'menu' => $menu, $csrfTokenName => $newTokenHash ]; - } - - elseif ($tipo == 'maquina') { + } elseif ($tipo == 'maquina') { $is_rotativa = $reqData['is_rotativa'] ?? null; $papel_impresion = $reqData['papel_impresion'] ?? null; $tipo_linea = $reqData['tipoLinea'] ?? null; @@ -1156,13 +993,13 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController // uso: negro, negrohq, color, colorhq, $uso_tarifa = $reqData['uso_tarifa'] ?? 'interior'; $model = new MaquinaModel(); - $maquinas = $model->getMaquinaImpresionForPresupuesto($is_rotativa, $uso, $uso_tarifa ,$datos, $papel_impresion ); + $maquinas = $model->getMaquinaImpresionForPresupuesto($is_rotativa, $uso, $uso_tarifa, $datos, $papel_impresion); $menu = []; - foreach ($maquinas as $maquina){ - + foreach ($maquinas as $maquina) { + $formas = PresupuestoService::getNumFormasPlana($tipo_linea, $maquina, floatval($ancho), floatval($alto), true); - - if($formas['num_formas'] != 'n/a'){ + + if ($formas['num_formas'] != 'n/a') { array_push($menu, $maquina); } } @@ -1171,26 +1008,21 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController 'menu' => $menu, $csrfTokenName => $newTokenHash ]; - } + } else { - else{ - $data = [ 'tipo' => $tipo, $csrfTokenName => $newTokenHash ]; } - } - catch(Exception $e){ + } catch (Exception $e) { $data = [ 'error' => $e, $csrfTokenName => $newTokenHash ]; - } - finally{ + } finally { return $this->respond($data); } - } else { return $this->failUnauthorized('Invalid request', 403); } @@ -1398,5 +1230,4 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $model = model('App\Models\Configuracion\ConfiguracionSistemaModel'); return $model->getPOD(); } - } diff --git a/ci4/app/Controllers/Presupuestos/Presupuestodirecciones.php b/ci4/app/Controllers/Presupuestos/Presupuestodirecciones.php index a8ac762c..d6ab6590 100755 --- a/ci4/app/Controllers/Presupuestos/Presupuestodirecciones.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestodirecciones.php @@ -140,5 +140,32 @@ class Presupuestodirecciones extends \App\Controllers\GoBaseResourceController } } + public function datatable_2(){ + + $reqData = $this->request->getJSON(); + + if($reqData->tipo=='get_tarifa'){ + $peso = $reqData->peso ?? 0; + $paisId = $reqData->paisId ?? 0; + $cp = $reqData->cp ?? 0; + $tipo_envio = $reqData->tipo_envio ?? 'cajas'; + + $model = model('App\Models\Tarifas\TarifaEnvioModel'); + $newTokenHash = csrf_hash(); + $csrfTokenName = csrf_token(); + $values = $model->getTarifaEnvio($paisId, $cp, $peso, $tipo_envio); + $data = [ + 'data' => count($values)>0?$values[0]:[], + $csrfTokenName => $newTokenHash + ]; + + return $this->respond($data); + } + else if($reqData->tipo=='clear_lineas'){ + + $presupuesto_id = $reqData->presupuesto_id ?? 0; + return $this->respond($this->model->where('presupuesto_id', $presupuesto_id)->delete()); + } + } } diff --git a/ci4/app/Controllers/Presupuestos/Presupuestotiradasalternativas.php b/ci4/app/Controllers/Presupuestos/Presupuestotiradasalternativas.php new file mode 100644 index 00000000..794a9484 --- /dev/null +++ b/ci4/app/Controllers/Presupuestos/Presupuestotiradasalternativas.php @@ -0,0 +1,252 @@ +request->isAJAX()) { + $reqData = $this->request->getPost(); + + $tarifa_manipulado_id = $reqData['tarifa_manipulado_id'] ?? 0; + $tirada = $reqData['tirada'] ?? 0; + $POD = $reqData['POD'] ?? 0; + $tipo = $reqData['tipo'] ?? null; + + + $newTokenHash = csrf_hash(); + $csrfTokenName = csrf_token(); + + if (is_null($tipo)) { + $values = $this->model->getPrecioTarifa($tarifa_manipulado_id, $tirada, $POD); + } else { + $solapas = $reqData['solapas'] ?? -1; + $tipo_impresion_id = $reqData['tipo_impresion_id'] ?? 4; + $values = $this->model->initPresupuesto($tipo_impresion_id, $solapas, $tirada, $POD); + } + + $data = [ + 'values' => $values, + $csrfTokenName => $newTokenHash + ]; + + return $this->respond($data); + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } + + // Esta funcion se usa para obtener los datos de la tabla de la vista de presupuestos + public function datatable_2() + { + + $reqData = $this->request->getPost(); + + $newTokenHash = csrf_hash(); + $csrfTokenName = csrf_token(); + + $json_data = $reqData['json_tiradas'] ?? null; + $cliente_id = $reqData['cliente_id'] ?? 0; + + $tipo_impresion_id = $reqData['tipo_impresion_id'] ?? 4; + + $values = []; + + if ($json_data) { + + $data = json_decode($json_data, true); + + foreach ($data as $linea) { + // Se obtienen los valores de cada linea para el calculo del precio + $datosPedido = (object)array( + 'paginas' => intval($linea['paginas']) ?? 0, + 'tirada' => intval($reqData['tirada']) ?? 0, + 'merma' => intval($reqData['merma']) ?? 0, + 'ancho' => intval($reqData['ancho']) ?? 100000, + 'alto' => intval($reqData['alto']) ?? 100000, + 'a_favor_fibra' => $linea['aFavorFibra'] ?? 1, + 'isCosido' => (new \App\Models\Configuracion\TipoPresupuestoModel())->get_isCosido($tipo_impresion_id), // JJO esto es custom por cada tipo de presupuesto + ); + + if ($linea['row_id'] == 'lp_guardas') { + $datosPedido->paginas_impresion = intval($linea['paginas_impresion']) ?? 0; + // 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) { + $datosPedido->isCosido = true; + } else if ($tipo_impresion_id == 5 || $tipo_impresion_id == 7) { + $datosPedido->isCosido = false; + } + } else if ($linea['row_id'] == 'lp_sobrecubierta' || $linea['row_id'] == 'lp_cubierta') { + $datosPedido->solapas = + $linea['row_id'] == 'lp_cubierta' ? $reqData['solapas_cubierta'] : $reqData['solapas_sobrecubierta']; + $datosPedido->solapas_ancho = + $linea['row_id'] == 'lp_cubierta' ? $reqData['solapas_cubierta_ancho'] : $reqData['solapas_sobrecubierta_ancho']; + $datosPedido->lomo = $reqData['lomo']; + + $type = $linea['row_id'] == 'lp_cubierta' ? 'cubierta' : 'sobrecubierta'; + + $datosPedido->anchoExteriores = PresupuestoService::getAnchoTotalExteriores($type, $tipo_impresion_id, $datosPedido); + $datosPedido->altoExteriores = PresupuestoService::getAltoTotalExteriores($type, $tipo_impresion_id, $datosPedido); + } + + + $maquina = (new \App\Models\Configuracion\MaquinaModel())->find($linea['maquina_id']); + $papel = (new \App\Models\Configuracion\PapelImpresionModel())->find($linea['papel_impresion_id']); + $pg = (new \App\Models\Configuracion\PapelGenericoModel())->find($linea['papel']); + + $papel_generico['id'] = $pg->id; + $papel_generico['nombre'] = $pg->nombre; + + $maquina->maquina_id = $maquina->id; + unset($maquina->id); + + switch ($linea['row_id']) { + case 'lp_rot_bn': + case 'lp_rot_color': + $uso = 'rotativa'; + $tipo = strpos($linea['row_id'], "_bn") !== false ? 'negro' : 'color'; + break; + case 'lp_cubierta': + $uso = 'cubierta'; + break; + case 'lp_sobrecubierta': + $uso = 'sobrecubierta'; + break; + case 'lp_guardas': + $uso = 'guardas'; + break; + default: + $uso = 'interior'; + $isHq = strpos($linea['row_id'], "hq") !== false ? true : false; + $isColor = strpos($linea['row_id'], "_color") !== false ? true : false; + $tipo = $isColor ? ($isHq ? 'colorhq' : 'color') : ($isHq ? 'negrohq' : 'negro'); + break; + } + + if ($uso == 'cubierta' || $uso == 'sobrecubierta' || $uso == 'guardas') { + $isColor = true; + $isHq = true; + $tipo = 'colorhq'; + } + + + + $opciones_papel = PresupuestoService::get_opciones_papel($uso, $isColor); + + $datosTipolog = $linea['gotaNegro'] ?? null; + if (!is_null($datosTipolog)) { + $datosTipolog = []; + $data = (object)array( + 'negro' => intval($linea['cobNegro']) ?? 0, + 'cyan' => intval($linea['cobCyan']) ?? 0, + 'magenta' => intval($linea['cobMagenta']) ?? 0, + 'amarillo' => intval($linea['cobAmarillo']) ?? 0, + 'cg' => intval($linea['cobCG']) ?? 0, + 'gota_negro' => intval($linea['gotaNegro']) ?? 0, + 'gota_color' => intval($linea['gotaColor']) ?? 0, + ); + array_push($datosTipolog, $data); + } + + $data['uso'] = $uso; + $data['tipo'] = $tipo; + $data['datosPedido'] = $datosPedido; + $data['cliente_id'] = $cliente_id; + $data['papel'] = $papel; + $data['opciones_papel'] = $opciones_papel; + $data['maquina'] = $maquina; + $data['papel_generico'] = $papel_generico; + $data['isColor'] = $isColor; + $data['a_favor_fibra'] = $linea['aFavorFibra'] ?? null; + $data['datosTipolog'] = $datosTipolog; + $data['gramaje'] = $linea['gramaje'] ?? 0; + + if ($linea['row_id'] != 'lp_rot_bn' && $linea['row_id'] != 'lp_rot_color') { + $linea_coste = PresupuestoService::getLineaPresupuestoPlana($data); + } else { + $linea_coste = [0]; + } + + if (empty($linea)) + continue; + + if ($linea['check_papel_total'] == 0) { + $linea_coste['fields']['precio_pedido'] = 0; + } + if ($linea['check_impresion_total'] == 0) { + $linea_coste['fields']['precio_impresion_horas'] = 0; + $linea_coste['fields']['precio_click_pedido'] = 0; + if ($linea_coste['fields']['tipo_maquina'] == 'inkjet') { + $linea_coste['fields']['precio_tinta'] = 0; + $linea_coste['fields']['totalCorte'] = 0; + } + } + $linea_coste['total_coste'] = $linea_coste['fields']['precio_pedido'] + + $linea_coste['fields']['precio_impresion_horas'] + + $linea_coste['fields']['precio_click_pedido']; + if ($linea_coste['fields']['tipo_maquina'] == 'inkjet') { + $linea_coste['total_coste'] += + $linea_coste['fields']['precio_tinta'] + + $linea_coste['fields']['totalCorte']; + } + + $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); + } + } else { + $values = []; + } + + $newTokenHash = csrf_hash(); + $csrfTokenName = csrf_token(); + + $response[$csrfTokenName] = $newTokenHash; + $response['lineas'] = $values; + + return $this->respond($response); + + } +} diff --git a/ci4/app/Controllers/Test.php b/ci4/app/Controllers/Test.php index 581eca3b..0938429f 100755 --- a/ci4/app/Controllers/Test.php +++ b/ci4/app/Controllers/Test.php @@ -12,37 +12,166 @@ class Test extends BaseController { function __construct() { - } public function index() { + $json_text = '[{"paginas":"150","paginas_impresion":0,"papel":"3","papel_impresion_id":"45","gramaje":"90.00","maquina_id":"33","row_id":"lp_bnhq"},{"paginas":"150","paginas_impresion":0,"papel":"3","papel_impresion_id":"45","gramaje":"90.00","maquina_id":"97","row_id":"lp_colorhq"},{"paginas":"2","paginas_impresion":0,"papel":"5","papel_impresion_id":"49","gramaje":"270.00","maquina_id":"55","row_id":"lp_cubierta"},{"paginas":"4","paginas_impresion":0,"papel":"1","papel_impresion_id":"91","gramaje":"200.00","maquina_id":"55","row_id":"lp_sobrecubierta"}]'; echo '
';
-        $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel');
-        $tarifas = [
-            (object)['tarifa_id'=>1, "cubierta"=>0, "sobrecubierta"=>0]
-        ];
-        var_dump($model->deleteServiciosNotInArray(44, $tarifas));
+        var_dump($this->test_get_tirada_alt(
+            tirada: 200,
+            merma: 20,  
+            tipo_impresion_id: 4,
+            json_data: $json_text,
+            cliente_id: 685,
+            ancho: 150,
+            alto: 210,
+            solapas_cubierta: 0,
+            solapas_ancho_cubierta: 0,
+            solapas_sobrecubierta: 0,
+            solapas_ancho_sobrecubierta: 0,
+            lomo: 16.53
+        ));
         echo '
'; - /* - - $linea = PresupuestoService::getCostesLinea('interior', $datosPedido, $maquina, $papel, $opciones_papel, $tarifa); - - echo '
';
-        
-        var_dump($formas);
-
-        echo '
'; - echo '
';
-        $tarifa_value = $this->get_tarifa_enc(18,150,22,150,210);
-        var_dump($tarifa_value[0]);
-        $model = model('App\Models\Presupuestos\PresupuestoEncuadernacionesModel');
-        $result = $model->calcularTarifa($tarifa_value[0], 150, true);
-        var_dump($result);
-        echo '
';*/ } + + private function test_get_tirada_alt($tirada, $merma, $tipo_impresion_id, + $json_data, $cliente_id, $ancho, $alto, + $solapas_cubierta, $solapas_ancho_cubierta, $solapas_sobrecubierta, $solapas_ancho_sobrecubierta, $lomo) + { + $values = []; + + if ($json_data) { + + $data = json_decode($json_data, true); + + foreach ($data as $linea) { + echo '------------------------------------
'; + var_dump($linea); + // Se obtienen los valores de cada linea para el calculo del precio + $datosPedido = (object)array( + 'paginas' => intval($linea['paginas']) ?? 0, + 'tirada' => intval($tirada) ?? 0, + 'merma' => intval($merma) ?? 0, + 'ancho' => intval($ancho) ?? 100000, + 'alto' => intval($alto) ?? 100000, + 'a_favor_fibra' => $linea['aFavorFibra'] ?? 1, + 'isCosido' => (new \App\Models\Configuracion\TipoPresupuestoModel())->get_isCosido($tipo_impresion_id), // JJO esto es custom por cada tipo de presupuesto + ); + + if ($linea['row_id'] == 'lp_guardas') { + $datosPedido->paginas_impresion = intval($linea['paginas_impresion']) ?? 0; + // 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) { + $datosPedido->isCosido = true; + } else if ($tipo_impresion_id == 5 || $tipo_impresion_id == 7) { + $datosPedido->isCosido = false; + } + } else if ($linea['row_id'] == 'lp_sobrecubierta' || $linea['row_id'] == 'lp_cubierta') { + $datosPedido->solapas = + $linea['row_id'] == 'lp_cubierta' ? $solapas_cubierta : $solapas_sobrecubierta; + $datosPedido->solapas_ancho = + $linea['row_id'] == 'lp_cubierta' ? $solapas_ancho_cubierta : $solapas_ancho_sobrecubierta; + $datosPedido->lomo = $lomo; + + $type = $linea['row_id'] == 'lp_cubierta' ? 'cubierta' : 'sobrecubierta'; + + $datosPedido->anchoExteriores = PresupuestoService::getAnchoTotalExteriores($type, $tipo_impresion_id, $datosPedido); + $datosPedido->altoExteriores = PresupuestoService::getAltoTotalExteriores($type, $tipo_impresion_id, $datosPedido); + } + + $maquina = (new \App\Models\Configuracion\MaquinaModel())->find($linea['maquina_id']); + $papel = (new \App\Models\Configuracion\PapelImpresionModel())->find($linea['papel_impresion_id']); + $pg = (new \App\Models\Configuracion\PapelGenericoModel())->find($linea['papel']); + $papel_generico['id'] = $pg->id; + $papel_generico['nombre'] = $pg->nombre; + + $maquina->maquina_id = $maquina->id; + unset($maquina->id); + + switch ($linea['row_id']) { + case 'lp_rot_bn': + case 'lp_rot_color': + $uso = 'rotativa'; + $tipo = strpos($linea['row_id'], "_bn") !== false ? 'negro' : 'color'; + break; + case 'lp_cubierta': + $uso = 'cubierta'; + break; + case 'lp_sobrecubierta': + $uso = 'sobrecubierta'; + break; + case 'lp_guardas': + $uso = 'guardas'; + break; + default: + $uso = 'interior'; + $isHq = strpos($linea['row_id'], "hq") !== false ? true : false; + $isColor = strpos($linea['row_id'], "_color") !== false ? true : false; + $tipo = $isColor ? ($isHq ? 'colorhq' : 'color') : ($isHq ? 'negrohq' : 'negro'); + break; + } + + if ($uso == 'cubierta' || $uso == 'sobrecubierta' || $uso == 'guardas') { + $isColor = true; + $isHq = true; + $tipo = 'colorhq'; + } + + + + $opciones_papel = PresupuestoService::get_opciones_papel($uso, $isColor); + + $datosTipolog = $linea['gotaNegro'] ?? null; + if (!is_null($datosTipolog)) { + $datosTipolog = []; + $data = (object)array( + 'negro' => intval($linea['cobNegro']) ?? 0, + 'cyan' => intval($linea['cobCyan']) ?? 0, + 'magenta' => intval($linea['cobMagenta']) ?? 0, + 'amarillo' => intval($linea['cobAmarillo']) ?? 0, + 'cg' => intval($linea['cobCG']) ?? 0, + 'gota_negro' => intval($linea['gotaNegro']) ?? 0, + 'gota_color' => intval($linea['gotaColor']) ?? 0, + ); + array_push($datosTipolog, $data); + } + + $data['uso'] = $uso; + $data['tipo'] = $tipo; + $data['datosPedido'] = $datosPedido; + $data['cliente_id'] = $cliente_id; + $data['papel'] = $papel; + $data['opciones_papel'] = $opciones_papel; + $data['maquina'] = $maquina; + $data['papel_generico'] = (array)$papel_generico; + $data['isColor'] = $isColor; + $data['a_favor_fibra'] = $linea['aFavorFibra'] ?? null; + $data['datosTipolog'] = $datosTipolog; + $data['gramaje'] = $linea['gramaje'] ?? 0; + + + if ($linea['row_id'] != 'lp_rot_bn' && $linea['row_id'] != 'lp_rot_color') { + $linea_coste = PresupuestoService::getLineaPresupuestoPlana($data); + var_dump($linea_coste); + } + + if (empty($linea)) + continue; + + array_push($values, $linea_coste); + } + } else { + $values = []; + } + + } + + private function asignar_tarifa_defecto_todos_usuarios() { @@ -59,9 +188,9 @@ class Test extends BaseController $clientes = $clienteModel->getResource()->get()->getResultObject(); - foreach ($clientes as $cliente){ + foreach ($clientes as $cliente) { - foreach ($plantillaDefecto as $plantillaDefectoLinea){ + foreach ($plantillaDefecto as $plantillaDefectoLinea) { $data = [ 'plantilla_id' => $plantillaDefectoId, @@ -83,137 +212,149 @@ class Test extends BaseController echo '';*/ $builder->insert($data); - - } //break; } - } - public function init_presupuesto_encuadernacion($tipo_presupuesto, $solapas, $paginas, $tirada, $ancho, $alto, $POD){ + public function init_presupuesto_encuadernacion($tipo_presupuesto, $solapas, $paginas, $tirada, $ancho, $alto, $POD) + { $model = model('App\Models\Presupuestos\PresupuestoEncuadernacionesModel'); return $model->initPresupuesto($tipo_presupuesto, $solapas, $paginas, $tirada, $ancho, $alto, $POD); } - public function get_precio_tarifa($tarifa_encuadernacion_id, $paginas, $tirada, $ancho, $alto, $proveedor_id, $POD){ + public function get_precio_tarifa($tarifa_encuadernacion_id, $paginas, $tirada, $ancho, $alto, $proveedor_id, $POD) + { $model = model('App\Models\Presupuestos\PresupuestoEncuadernacionesModel'); return $model->getPrecioTarifa($tarifa_encuadernacion_id, $paginas, $tirada, $ancho, $alto, $proveedor_id, $POD); } - public function get_precio_tarifa_acabado($tarifa_id, $tirada, $POD){ + public function get_precio_tarifa_acabado($tarifa_id, $tirada, $POD) + { $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); return $model->getPrecioTarifa($tarifa_id, $tirada, $POD); } - public function get_precio_tarifa_horas($tarifa_encuadernacion_id, $paginas, $tirada, $proveedor_id, $POD){ + public function get_precio_tarifa_horas($tarifa_encuadernacion_id, $paginas, $tirada, $proveedor_id, $POD) + { $model = model('App\Models\Presupuestos\PresupuestoEncuadernacionesModel'); return $model->getPrecioTarifaHoras($tarifa_encuadernacion_id, $paginas, $tirada, $proveedor_id, $POD); } - - public function get_tarifa_enc($tarifa_id, $paginas, $tirada, $ancho, $alto){ + + public function get_tarifa_enc($tarifa_id, $paginas, $tirada, $ancho, $alto) + { $model = model('App\Models\Tarifas\TarifaEncuadernacionModel'); return $model->getTarifaPresupuestoEncuadernacion($tarifa_id, $paginas, $tirada, $ancho, $alto); } - public function getProveedoresForSelector_enc($tarifa_id, $paginas, $tirada, $ancho, $alto){ + public function getProveedoresForSelector_enc($tarifa_id, $paginas, $tirada, $ancho, $alto) + { $model = model('App\Models\Presupuestos\PresupuestoEncuadernacionesModel'); return $model->getProveedoresForSelector($tarifa_id, $paginas, $tirada, $ancho, $alto); } - public function get_dimensiones_enc(){ + public function get_dimensiones_enc() + { $dimensionModel = model('App\Models\Tarifas\TarifaEncuadernacionDimensionesModel'); $dimensiones = $dimensionModel->getDimensiones(); var_dump($dimensiones); - foreach($dimensiones as $dim){ - $dim->label= lang("TarifaEncuadernacionLineas." . $dim->label); + foreach ($dimensiones as $dim) { + $dim->label = lang("TarifaEncuadernacionLineas." . $dim->label); } var_dump($dimensiones); } - public function get_tarifas_encuadernacion($tipo_presupuesto, $solapas){ + public function get_tarifas_encuadernacion($tipo_presupuesto, $solapas) + { $model = model('App\Models\Presupuestos\TipoPresupuestoTarifaEncuadernacionModel'); - return $model->get_tarifas($tipo_presupuesto,$solapas); - } + return $model->get_tarifas($tipo_presupuesto, $solapas); + } - public function timeToSeconds(){ + public function timeToSeconds() + { $time = '99:59:59'; - + $time_parts = explode(":", $time); $seconds = $time_parts[2] + $time_parts[1] * 60 + $time_parts[0] * 3600; echo "Time in seconds: " . $seconds; } - public function getLP(){ + public function getLP() + { $lp_model = model('App\Models\Presupuestos\PresupuestoLineaModel'); $data = $lp_model->getLineasPresupuesto(8); $papel_imp_model = model('App\Models\Configuracion\PapelImpresionModel'); $maquina_model = model('App\Models\Configuracion\MaquinaModel'); - foreach($data as $linea){ + foreach ($data as $linea) { //$linea->papel_impresion_id = $papel_imp_model->getValue_Nombre($linea->papel_impresion_id)[0]; //$linea->maquina_id = $maquina_model->getValue_Nombre($linea->maquina_id)[0]; var_dump($linea->papel_impresion_id); var_dump($linea->maquina_id); } - } - public function createLP(){ + public function createLP() + { $lp_model = model('App\Models\Presupuestos\PresupuestoLineaModel'); $lp_model->createForPresupuesto(8); } - public function getPapelesHQ(){ + public function getPapelesHQ() + { $model = model('App\Models\Configuracion\PapelGenericoModel'); $data = $model->getPapelForComparador('colorhq', false, false); var_dump($data); } - public function getPapelesCubierta(){ + public function getPapelesCubierta() + { $model = model('App\Models\Configuracion\PapelGenericoModel'); $data = $model->getPapelForComparador('colorhq', true, false); var_dump($data); } - public function getPapelesSobrecubierta(){ + public function getPapelesSobrecubierta() + { $model = model('App\Models\Configuracion\PapelGenericoModel'); $data = $model->getPapelForComparador('colorhq', false, true, false); var_dump($data); } - public function getPapelesGuardas(){ + public function getPapelesGuardas() + { $model = model('App\Models\Configuracion\PapelGenericoModel'); $data = $model->getPapelForComparador('color', false, false, false, true); var_dump($data); } - public function getGramaje(){ + public function getGramaje() + { $model = new PapelGenericoModel(); - $data = $model->getGramajeComparador("AHUESADO OFFSET", "bnhq" ); + $data = $model->getGramajeComparador("AHUESADO OFFSET", "bnhq"); var_dump($data); } public function testGetPrecioPliegoRotativa() { - $paginas=240; - + $paginas = 240; + $papel_impresion = (object)array( 'id' => 198, 'gramaje' => 90, - 'precio_tonelada'=> 1600 + 'precio_tonelada' => 1600 ); - + $maquina = (object)array( //'id' => 48, @@ -222,9 +363,8 @@ class Test extends BaseController ); $precio = PresupuestoService::getPrecioPliego($maquina, $papel_impresion, $paginas); - + var_dump($precio); - } public function testGetMaquinasFromTarifas() @@ -340,9 +480,8 @@ class Test extends BaseController var_dump($papel->nombre); $tarifa = (new \App\Models\Configuracion\MaquinasTarifasImpresionModel())->getTarifa($maquina->maquina_id, $uso, $tipo); $linea = PresupuestoService::getCostesLinea($uso, $datosPedido, $maquina, $papel, $opciones_papel, $tarifa); - + var_dump($linea); - } } echo ''; @@ -391,18 +530,18 @@ class Test extends BaseController options: $opciones_papel ); - + foreach ($papeles as $papel) { $papelImpresionTipologiaModel = new \App\Models\Configuracion\PapelImpresionTipologiaModel(); $datosTipologias = $papelImpresionTipologiaModel - ->findTipologiasForPapelImpresion($papel->id, $parametrosRotativa->colorPages>0?'color':'negro') + ->findTipologiasForPapelImpresion($papel->id, $parametrosRotativa->colorPages > 0 ? 'color' : 'negro') ->get()->getResultObject(); echo '
';
             var_dump($papel->id);
             var_dump($datosTipologias);
             echo '
'; - + $parametrosRotativa->rotativa_gota_negro = $datosTipologias[0]->gota_negro; $parametrosRotativa->rotativa_gota_color = $datosTipologias[0]->gota_color; $parametrosRotativa->rotativa_negro = $datosTipologias[0]->negro; @@ -488,7 +627,7 @@ class Test extends BaseController echo '
';
             var_dump($maquinas);
             echo '
'; - + // Se recorren las máquinas y se calcula el coste de linea por cada una foreach ($maquinas as $maquina) { @@ -503,7 +642,7 @@ class Test extends BaseController var_dump($tarifa); echo ''; - if(!is_float($tarifa)){ + if (!is_float($tarifa)) { continue; } $linea = PresupuestoService::getCostesLinea($uso, $datosPedido, $maquina, $papel, $opciones_papel, $tarifa); @@ -519,12 +658,10 @@ class Test extends BaseController array_push($lineas, $linea); } } - + echo '
';
         var_dump($lineas);
         echo '
'; - - } public static function testLineasSobrecubierta() @@ -581,7 +718,7 @@ class Test extends BaseController echo '
';
             var_dump($maquinas);
             echo '
'; - + // Se recorren las máquinas y se calcula el coste de linea por cada una foreach ($maquinas as $maquina) { @@ -596,7 +733,7 @@ class Test extends BaseController var_dump($tarifa); echo ''; - if(!is_float($tarifa)){ + if (!is_float($tarifa)) { continue; } $linea = PresupuestoService::getCostesLinea($uso, $datosPedido, $maquina, $papel, $opciones_papel, $tarifa); @@ -612,12 +749,9 @@ class Test extends BaseController array_push($lineas, $linea); } } - + echo '
';
         var_dump($lineas);
         echo '
'; - - } } - \ No newline at end of file diff --git a/ci4/app/Language/es/Presupuestos.php b/ci4/app/Language/es/Presupuestos.php index 904b71d8..b208a914 100755 --- a/ci4/app/Language/es/Presupuestos.php +++ b/ci4/app/Language/es/Presupuestos.php @@ -226,7 +226,7 @@ return [ // Servicios 'precio' => 'Precio', - 'precioUnidad' => 'Precio unitario', + 'precioUnidad' => 'Precio unidad', 'precioTotal' => 'Precio total', 'serviciosDefault' => 'Servicios por defecto', 'tarifa' => 'Tarifa', @@ -239,6 +239,14 @@ return [ 'cantidad' => 'Cantidad', + + //Tiradas alternativas + 'tiradasAlternativas' => 'Tiradas alternativas', + 'tiradasInfoIVA' => 'Los precios mostrados no incluyen IVA', + 'tiradaMargen' => 'Margen', + 'tiradaEnvio' => 'Coste Envío', + 'tiradaImpresion' => 'Coste Impresión', + 'validation' => [ 'decimal' => 'El campo {field} debe contener un número decimal.', @@ -257,8 +265,9 @@ return [ 'errorRotColor' => 'Papeles y gramajes deben ser iguales en color y BN', 'error_servicios_anadidos' => 'Hay servicios sin datos', 'error_servicios_duplicados' => 'El servicio seleccionado ya está añadido', - 'formato_papel' => 'Debe seleccionar un formato de papel' + 'formato_papel' => 'Debe seleccionar un formato de papel', + 'tirada_alt_duplicada' => 'Ya existe una tirada alternativa para ese valor', + 'tirada_alt_tipo' => 'No se puede calcular una tirada alternativa POD para una presupuesto no POD o viceversa', ], - ]; diff --git a/ci4/app/Models/Configuracion/MaquinasTarifasImpresionModel.php b/ci4/app/Models/Configuracion/MaquinasTarifasImpresionModel.php index 4d349f86..25fce102 100755 --- a/ci4/app/Models/Configuracion/MaquinasTarifasImpresionModel.php +++ b/ci4/app/Models/Configuracion/MaquinasTarifasImpresionModel.php @@ -121,7 +121,7 @@ class MaquinasTarifasImpresionModel extends \App\Models\GoBaseModel ->groupEnd(); } - public function getTarifa($maquina_id = -1, $uso = " ", $tipo = " ") + public function getTarifa($maquina_id = -1, $uso = "", $tipo = "") { $builder = $this->db ->table($this->table . " t1") diff --git a/ci4/app/Models/Presupuestos/PresupuestoEncuadernacionesModel.php b/ci4/app/Models/Presupuestos/PresupuestoEncuadernacionesModel.php index 7d6d6ca3..57ab549d 100755 --- a/ci4/app/Models/Presupuestos/PresupuestoEncuadernacionesModel.php +++ b/ci4/app/Models/Presupuestos/PresupuestoEncuadernacionesModel.php @@ -224,7 +224,7 @@ class PresupuestoEncuadernacionesModel extends \App\Models\GoBaseModel 'proveedor' => lang('Presupuestos.no_disponible'), 'precio_unidad'=> 0, 'total'=> 0, - 'marge'=> 0, + 'margen'=> 0, ]; return $ret_array; } diff --git a/ci4/app/Services/PresupuestoService.php b/ci4/app/Services/PresupuestoService.php index 57b322c5..926e0572 100755 --- a/ci4/app/Services/PresupuestoService.php +++ b/ci4/app/Services/PresupuestoService.php @@ -18,6 +18,162 @@ class PresupuestoService extends BaseService const SANGRE_FORMAS_CUBIERTA = 20.0; + public static function getLineaPresupuestoPlana($data) + { + + $uso = $data['uso']; + $tipo = $data['tipo']; + $datosPedido = $data['datosPedido']; + $cliente_id = $data['cliente_id']; + $papel = $data['papel']; + $opciones_papel = $data['opciones_papel']; + $maquina = $data['maquina']; + $papel_generico = $data['papel_generico']; + $isColor = $data['isColor']; + $a_favor_fibra = $data['a_favor_fibra']; + $datosTipolog = $data['datosTipolog']; + $gramaje = $data['gramaje']; + + + if ($maquina->is_inkjet) { + $parametrosInkjet = (object)array( + 'a_favor_fibra' => $a_favor_fibra, // este parametro se cambia para comprobar + // en las dos direcciones (menos en rustica fresada que es siempre 1) + 'bnPages' => $isColor ? 0 : $datosPedido->paginas, + 'colorPages' => ($uso == 'guardas') ? $datosPedido->paginas_impresion : ($isColor ? $datosPedido->paginas : 0), + 'rotativa_gota_negro' => 0, + 'rotativa_gota_color' => 0, + ); + + $papelImpresionTipologiaModel = new \App\Models\Configuracion\PapelImpresionTipologiaModel(); + if (is_null($datosTipolog)) { + $datosTipologias = $papelImpresionTipologiaModel + ->findTipologiasForPapelImpresion($papel->id, $parametrosInkjet->colorPages > 0 ? 'color' : 'negro') + ->get()->getResultObject(); + + + if (count($datosTipologias) == 0) { + return []; + } + } else { + $datosTipologias = $datosTipolog; + } + $parametrosInkjet->rotativa_gota_negro = $datosTipologias[0]->gota_negro; + $parametrosInkjet->rotativa_gota_color = $datosTipologias[0]->gota_color; + $parametrosInkjet->rotativa_negro = $datosTipologias[0]->negro; + $parametrosInkjet->rotativa_cyan = $datosTipologias[0]->cyan; + $parametrosInkjet->rotativa_magenta = $datosTipologias[0]->magenta; + $parametrosInkjet->rotativa_amarillo = $datosTipologias[0]->amarillo; + $parametrosInkjet->rotativa_cg = $datosTipologias[0]->cg; + } + + $tarifamodel = new \App\Models\Configuracion\MaquinasTarifasImpresionModel(); + $datos_tarifa = $tarifamodel->getTarifa($maquina->maquina_id, ($uso == 'guardas') ? 'interior' : $uso, $tipo); + if (count($datos_tarifa) > 0) { + $tarifaId = $datos_tarifa[0]; + $tarifa = $datos_tarifa[1]; + $tarifa_margen = $datos_tarifa[2]; + } else { + return []; + } + + if ($maquina->is_inkjet) { + $linea = PresupuestoService::getCostesLinea($uso, $datosPedido, $maquina, $papel, $opciones_papel, $tarifa, $tarifa_margen, $parametrosInkjet->a_favor_fibra); + } else { + $linea = PresupuestoService::getCostesLinea($uso, $datosPedido, $maquina, $papel, $opciones_papel, $tarifa, $tarifa_margen); + } + + if (array_key_exists('error', $linea)) { + //array_push($lineas, $linea); for debug + return []; + } + + if ($maquina->is_inkjet) { + // calculo de tintas + $linea['fields'] = array_merge($linea['fields'], PresupuestoService::calculoCosteTintas($maquina, $datosPedido, $parametrosInkjet)); + } + + $linea['fields']['tarifa_impresion_id'] = $tarifaId; + $linea['fields']['maquina'] = $maquina->maquina; + $linea['fields']['maquina_id'] = $maquina->maquina_id; + $linea['fields']['maquina_velocidad'] = $maquina->velocidad; + $linea['fields']['papel_impresion'] = $papel->nombre; + $linea['fields']['papel_impresion_id'] = $papel->id; + $linea['fields']['paginas'] = $datosPedido->paginas; + $linea['fields']['gramaje'] = $gramaje; + $linea['fields']['papel_generico_id'] = $papel_generico['id']; + $linea['fields']['papel_generico'] = $papel_generico['nombre']; + + $linea['fields']['tiempo_maquina'] = PresupuestoService::getTiempoMaquina( + $linea['fields']['precio_click_pedido'], + $linea['fields']['precio_click'], + $maquina->velocidad + ); + + $clientePreciosModel = new \App\Models\Clientes\ClientePreciosModel(); + $config = (object)[ + "tipo" => ($uso == 'guardas') ? 'interior' : $uso, + "tipo_maquina" => $maquina->is_inkjet ? 'inkjet' : 'toner', + "tipo_impresion" => $tipo + ]; + $tiempo = PresupuestoService::getHorasMaquina( + $linea['fields']['precio_click_pedido'], + $linea['fields']['precio_click'], + $maquina->velocidad + ); + [$precio_hora, $margen_precio_hora] = $clientePreciosModel->get_precio_hora($cliente_id, $config, $tiempo); + + + if (is_null($precio_hora)) { + return []; + } + + $linea['fields']['tipo_maquina'] = $maquina->is_inkjet ? 'inkjet' : 'toner'; + $linea['fields']['precio_hora'] = $precio_hora * (1 + $margen_precio_hora / 100.0); + $linea['fields']['precio_hora_margen'] = $precio_hora * ($margen_precio_hora / 100.0); + $linea['fields']['horas_maquina'] = $tiempo; + $linea['fields']['precio_impresion_horas'] = $linea['fields']['precio_hora'] * $tiempo; + $linea['fields']['margen_impresion_horas'] = $linea['fields']['precio_hora_margen'] * $tiempo; + + // para guardas + if (\property_exists($datosPedido, 'paginas_impresion')) { + $linea['fields']['paginas_impresion'] = $datosPedido->paginas_impresion; + } + + if ($maquina->is_inkjet) { + $linea['fields']['a_favor_fibra'] = $parametrosInkjet->a_favor_fibra; + $linea['fields']['paginas_color'] = $isColor ? $datosPedido->paginas : 0; + $linea['fields']['totalClicksPedido'] = $linea['fields']['precio_click_pedido']; + if ($uso != 'guardas') { + $linea['fields']['clicks_libro'] = round(ceil($linea['fields']['pliegos_libro']) * 2, 2); + } else { + if ($datosPedido->paginas_impresion == 4) + $linea['fields']['clicks_libro'] = round(ceil($linea['fields']['pliegos_libro']), 2); + else if ($datosPedido->paginas_impresion == 8) + $linea['fields']['clicks_libro'] = round(ceil($linea['fields']['pliegos_libro']) * 2, 2); + else + $linea['fields']['clicks_libro'] = 0; + } + $linea['fields']['clicks_pedido'] = round($linea['fields']['clicks_libro'] * ($datosPedido->tirada + $datosPedido->merma), 2); + [$ancho, $alto] = PresupuestoService::calculoDimForma($datosPedido, $parametrosInkjet); + $linea['fields']['factor_anchura'] = round($maquina->ancho_impresion / $ancho, 2); + $linea['fields']['factor_altura'] = round($maquina->alto_impresion / ($alto + PresupuestoService::MARGEN_PAGINAS_ROTATIVA), 2); + $linea['fields']['paginas_por_pliego'] = ($datosPedido->isCosido) ? $linea['fields']['num_formas']['value'] * 2 : $linea['fields']['num_formas']['value'] * 2; // Se multiplica *2 porque es doble cara + $linea['fields']['datosTipologias'] = $datosTipologias[0]; + $linea['fields']['total_impresion'] = + floatval($linea['fields']['precio_pedido']) + // papel + floatval($linea['fields']['precio_impresion_horas']) + // horas de maquina + floatval($linea['fields']['precio_click_pedido']) + // precio clicks del pedido + floatval($linea['fields']['precio_tinta']); // tinta + } else { + $linea['fields']['total_impresion'] = floatval($linea['fields']['precio_pedido']) + // papel + floatval($linea['fields']['precio_click_pedido']) + // precio clicks del pedido + floatval($linea['fields']['precio_impresion_horas']); // horas de maquina + } + + + return $linea; + } /** * @param mixed $uso * contiene algun parametro de la lista ['interior,'cubierta','sobrecubierta'] @@ -44,14 +200,14 @@ class PresupuestoService extends BaseService { $response['fields'] = []; - if ($uso!='rotativa') { + if ($uso != 'rotativa') { - $ancho_calculo = ($uso=='cubierta' || $uso=='sobrecubierta') ? $datosPedido->anchoExteriores : $datosPedido->ancho; - $alto_calculo = ($uso=='cubierta' || $uso=='sobrecubierta') ? $datosPedido->altoExteriores : $datosPedido->alto; + $ancho_calculo = ($uso == 'cubierta' || $uso == 'sobrecubierta') ? $datosPedido->anchoExteriores : $datosPedido->ancho; + $alto_calculo = ($uso == 'cubierta' || $uso == 'sobrecubierta') ? $datosPedido->altoExteriores : $datosPedido->alto; $formas = PresupuestoService::getNumFormasPlana($uso, $maquina, $ancho_calculo, $alto_calculo, $datosPedido->isCosido, $forzar_a_favor_fibra); $response['fields'] = $formas; } - + if ($response['fields']['num_formas']['posicion_formas'] == 'n/a') { $response['error']['value'] = true; @@ -61,7 +217,7 @@ class PresupuestoService extends BaseService // precio del pliego de impresion [$precio_pliego_impresion, $margen_pliego_impresion] = PresupuestoService::getPrecioPliego($maquina, $papel_impresion, $datosPedido->paginas); - + $precio_click = 0; $precio_click_pedido = 0; $margen_click_pedido = 0; @@ -79,10 +235,10 @@ class PresupuestoService extends BaseService if ($cubierta == 0 && $sobrecubierta == 0 && $rotativa == 0) { // precio papel $pliegos_libro = ceil(($datosPedido->paginas / 2.0) / $response['fields']['num_formas']['value']); - if($pliegos_libro<1) + if ($pliegos_libro < 1) $pliegos_libro = 1; $pliegos_pedido = $pliegos_libro * ($datosPedido->tirada + $datosPedido->merma); - $precio_libro = $pliegos_libro * ($precio_pliego_impresion+$margen_pliego_impresion); + $precio_libro = $pliegos_libro * ($precio_pliego_impresion + $margen_pliego_impresion); $margen_papel_pedido = $pliegos_libro * $margen_pliego_impresion * ($datosPedido->tirada + $datosPedido->merma); $precio_pedido = $precio_libro * ($datosPedido->tirada + $datosPedido->merma); @@ -94,38 +250,35 @@ class PresupuestoService extends BaseService alto: $datosPedido->alto, gramaje: $papel_impresion->gramaje, paginas: $datosPedido->paginas - ); + ); // impresion - if($uso=='guardas'){ - if(floatval($datosPedido->paginas_impresion)==0) + if ($uso == 'guardas') { + if (floatval($datosPedido->paginas_impresion) == 0) $precio_click_pedido = 0; - elseif (floatval($datosPedido->paginas_impresion)==4){ // Una cara + elseif (floatval($datosPedido->paginas_impresion) == 4) { // Una cara $precio_click_pedido = $pliegos_pedido * $precio_click; $margen_click_pedido = $pliegos_pedido * $margen_click; + } else { // dos caras (impresion normal) + $precio_click_pedido = $pliegos_pedido * 2 * $precio_click; + $margen_click_pedido = $pliegos_pedido * 2 * $margen_click; } - else{ // dos caras (impresion normal) - $precio_click_pedido = $pliegos_pedido * 2 * $precio_click; - $margen_click_pedido = $pliegos_pedido * 2 * $margen_click; - } - } - else { - $precio_click_pedido = $pliegos_pedido * 2 * $precio_click; - $margen_click_pedido = $pliegos_pedido * 2 * $margen_click; + } else { + $precio_click_pedido = $pliegos_pedido * 2 * $precio_click; + $margen_click_pedido = $pliegos_pedido * 2 * $margen_click; } - } // cubierta o sobrecubierta (siempre a color) else if (($cubierta == 1 || $sobrecubierta == 1) && $rotativa == 0) { // precio papel $pliegos_libro = 1.0 / $response['fields']['num_formas']['value']; // En cubierta y sobrecubierta siempre el mínimo pliego es 1 - $pliegos_libro = $pliegos_libro<1?1:$pliegos_libro; + $pliegos_libro = $pliegos_libro < 1 ? 1 : $pliegos_libro; $pliegos_pedido = $pliegos_libro * ($datosPedido->tirada + $datosPedido->merma); $precio_libro = $pliegos_libro * ($precio_pliego_impresion + $margen_pliego_impresion); $margen_papel_pedido = $pliegos_libro * $margen_pliego_impresion * ($datosPedido->tirada + $datosPedido->merma); $precio_pedido = $precio_libro * ($datosPedido->tirada + $datosPedido->merma); - + $mano = PresupuestoService::computeLomoPortada($papel_impresion->espesor); // peso @@ -138,9 +291,9 @@ class PresupuestoService extends BaseService $margen_click_pedido = $pliegos_pedido * $margen_click; // dos caras - if($datosPedido->paginas > 2) { - $precio_click_pedido *= 2.0; - $margen_click_pedido *= 2.0; + if ($datosPedido->paginas > 2) { + $precio_click_pedido *= 2.0; + $margen_click_pedido *= 2.0; } } } @@ -149,7 +302,7 @@ class PresupuestoService extends BaseService // response $response['fields']['pliegos_libro'] = $pliegos_libro; $response['fields']['pliegos_pedido'] = $pliegos_pedido; - $response['fields']['precios_pliegos'] = $precio_pliego_impresion+$margen_pliego_impresion; + $response['fields']['precios_pliegos'] = $precio_pliego_impresion + $margen_pliego_impresion; $response['fields']['precio_libro'] = $precio_libro; $response['fields']['margen_papel_pedido'] = $margen_papel_pedido; $response['fields']['precio_pedido'] = $precio_pedido; @@ -168,7 +321,7 @@ class PresupuestoService extends BaseService } - + /** * Devuelve los calculos para la linea de rotativa. */ @@ -206,7 +359,7 @@ class PresupuestoService extends BaseService // calculo de tintas $data = array_merge($data, PresupuestoService::calculoCosteTintas($maquina, $datosPedido, $parametrosRotativa)); - + // calculo de corte $data['velocidad_corte'] = $maquina->velocidad_corte; $data['precio_hora_corte'] = $maquina->precio_hora_corte; @@ -219,11 +372,11 @@ class PresupuestoService extends BaseService // peso $data['peso'] = PresupuestoService::computePeso( ancho: $datosPedido->isCosido ? $datosPedido->ancho / 2.0 : $datosPedido->ancho, - alto: $datosPedido->alto, - gramaje: $papel_impresion->gramaje, - paginas: $datosPedido->paginas - ); - + alto: $datosPedido->alto, + gramaje: $papel_impresion->gramaje, + paginas: $datosPedido->paginas + ); + $data['dimensiones_maquina'] = [$maquina->ancho, $maquina->alto]; $data['dimensiones_maquina_impresion'] = [$maquina->ancho_impresion, $maquina->alto_impresion]; $data['dimensiones_maquina_click'] = [$maquina->ancho_impresion, $maquina->alto_click]; @@ -232,11 +385,12 @@ class PresupuestoService extends BaseService $data['alto_click'] = $maquina->alto_click; $formas = PresupuestoService::getNumFormasRot( - $maquina, - $datosPedido->ancho, - $datosPedido->alto, - $datosPedido->isCosido, - $parametrosRotativa->a_favor_fibra); + $maquina, + $datosPedido->ancho, + $datosPedido->alto, + $datosPedido->isCosido, + $parametrosRotativa->a_favor_fibra + ); $data['num_formas'] = $formas; return $data; @@ -246,13 +400,13 @@ class PresupuestoService extends BaseService /** * Devuelve los calculos de las dimensiones de la forma */ - public static function calculoDimForma($datosPedido, $parametros){ + public static function calculoDimForma($datosPedido, $parametros) + { // posicionamos paginas en función de a favor de fibra o no if (!$parametros->a_favor_fibra) { $anchoLibro = $datosPedido->alto; $altoLibro = $datosPedido->ancho; - } - else{ + } else { $anchoLibro = $datosPedido->ancho; $altoLibro = $datosPedido->alto; } @@ -288,7 +442,7 @@ class PresupuestoService extends BaseService $pag_negro = $parametros->bnPages; $pag_color = 0; - if ($parametros->colorPages>0) { + if ($parametros->colorPages > 0) { $pag_color = $parametros->colorPages; } @@ -308,16 +462,17 @@ class PresupuestoService extends BaseService // precio tinta $data['precio_tinta'] = round( round(($data['peso_gotas_negro_pedido'] / 1000.0) * $maquina->precio_tinta_negro, 2) + - round(($data['peso_gotas_cyan_pedido'] / 1000.0) * $maquina->precio_tinta_color, 2) + - round(($data['peso_gotas_magenta_pedido'] / 1000.0) * $maquina->precio_tinta_color, 2) + - round(($data['peso_gotas_amarillo_pedido'] / 1000.0) * $maquina->precio_tinta_color, 2) - , 2); - - - if($maquina->is_inkjet){ + round(($data['peso_gotas_cyan_pedido'] / 1000.0) * $maquina->precio_tinta_color, 2) + + round(($data['peso_gotas_magenta_pedido'] / 1000.0) * $maquina->precio_tinta_color, 2) + + round(($data['peso_gotas_amarillo_pedido'] / 1000.0) * $maquina->precio_tinta_color, 2), + 2 + ); + + + if ($maquina->is_inkjet) { $data['num_gotas_cg'] = round($data['superficie'] * $data['resolucion'] * $data['resolucion'] * ($parametros->rotativa_cg / 100.0), 0); - $data['peso_gotas_cg'] = round((($data['num_gotas_cg'] * $parametros->rotativa_gota_color * $data['pulgada']) / (17.65 / 20.0)) * $pag_color * 1000, 6) + - round((($data['num_gotas_cg'] * $parametros->rotativa_gota_negro * $data['pulgada']) / (17.65 / 20.0)) * $pag_negro * 1000, 6); + $data['peso_gotas_cg'] = round((($data['num_gotas_cg'] * $parametros->rotativa_gota_color * $data['pulgada']) / (17.65 / 20.0)) * $pag_color * 1000, 6) + + round((($data['num_gotas_cg'] * $parametros->rotativa_gota_negro * $data['pulgada']) / (17.65 / 20.0)) * $pag_negro * 1000, 6); $data['peso_gotas_cg_pedido'] = round($data['peso_gotas_cg'], 2) * ($datosPedido->tirada + $datosPedido->merma); $data['precio_tinta'] += round(($data['peso_gotas_cg_pedido'] / 1000.0) * $maquina->precio_tinta_cg, 2); @@ -329,24 +484,24 @@ class PresupuestoService extends BaseService return $data; } - + public static function getNumFormasRot($maquina, $ancho, $alto, $isCosido, $a_favor_fibra = true) { // El ancho si es cosido es el doble $anchoForCalculo = $isCosido ? $ancho * 2 : $ancho; - + $altoForCalculo = $alto; - - $h1_temp = floor($maquina->ancho_impresion / $anchoForCalculo); + + $h1_temp = floor($maquina->ancho_impresion / $anchoForCalculo); $h2_temp = floor($maquina->ancho_impresion / $altoForCalculo); - + // horizontales - if($a_favor_fibra){ + if ($a_favor_fibra) { $calles = (new \App\Models\Configuracion\MaquinasCallesModel())->getCallesForMaquina($maquina->maquina_id, $h1_temp); // Si son mas de 2 formas - if(count($calles)>0) + if (count($calles) > 0) $h1 = ($h1_temp * $anchoForCalculo + 2 * $calles[0]->externas + ($h1_temp - 1) * $calles[0]->internas < ($maquina->ancho)) ? $h1_temp : $h1_temp - 1; else $h1 = $h1_temp; @@ -355,10 +510,10 @@ class PresupuestoService extends BaseService $formas_h = $h1 * $v1; //p1 } // verticales - else{ - + else { + $calles = (new \App\Models\Configuracion\MaquinasCallesModel())->getCallesForMaquina($maquina->maquina_id, $h2_temp); - if(count($calles)>0) + if (count($calles) > 0) $h2 = ($h2_temp * $altoForCalculo + 2 * $calles[0]->externas + ($h2_temp - 1) * $calles[0]->internas < ($maquina->ancho)) ? $h2_temp : $h2_temp - 1; else $h2 = $h2_temp; @@ -368,8 +523,8 @@ class PresupuestoService extends BaseService $num_formas = $a_favor_fibra ? $formas_h : $formas_v; $num_formas = $isCosido ? $num_formas * 2 : $num_formas; - - + + // si no hay formas se devuelve n/a if ($num_formas == 0) { $response['posicion_formas'] = 'n/a'; // not available @@ -394,16 +549,16 @@ class PresupuestoService extends BaseService $h2_temp = 0; // El ancho si es cosido es el doble - if($uso != 'cubierta' && $uso != 'sobrecubierta'){ + if ($uso != 'cubierta' && $uso != 'sobrecubierta') { $anchoForCalculo = $isCosido ? $ancho * 2 : $ancho; - } - else{ + } else { $anchoForCalculo = $ancho; } $altoForCalculo = $alto; + /* - Log ancho y alto de impresion y libro + //Log ancho y alto de impresion y libro $info = [ 'ancho' => $anchoForCalculo, 'alto' => $altoForCalculo, @@ -411,104 +566,117 @@ class PresupuestoService extends BaseService 'maquina_alto' => $maquina->alto_impresion, ]; - if($uso == 'cubierta' ) - log_message('error', 'ancho:{ancho} --- alto:{alto} --- ancho2:{maquina_ancho} --- alto2:{maquina_alto} ---', $info);*/ + if ($uso == 'cubierta') + log_message('error', 'ancho:{ancho} --- alto:{alto} --- ancho_m:{maquina_ancho} --- alto_m:{maquina_alto} ---', $info); + */ - if($uso == 'cubierta' || $uso == 'sobrecubierta') { - if(property_exists($maquina, 'forzar_num_formas_horizontales_cubierta') && - property_exists($maquina, 'forzar_num_formas_verticales_cubierta')){ + if ($uso == 'cubierta' || $uso == 'sobrecubierta') { + if ( + !is_null($maquina->forzar_num_formas_horizontales_cubierta) && + !is_null($maquina->forzar_num_formas_verticales_cubierta) + + ) { + + if ( + $maquina->forzar_num_formas_horizontales_cubierta > 0 && + $maquina->forzar_num_formas_verticales_cubierta > 0 + ) { - if($maquina->forzar_num_formas_horizontales_cubierta > 0 && - $maquina->forzar_num_formas_verticales_cubierta > 0){ - // Hay que comprobar que entran $h1_temp = $maquina->forzar_num_formas_horizontales_cubierta; $h2_temp = $maquina->forzar_num_formas_verticales_cubierta; //$num_formas = $h1_temp * $h2_temp; } } - } // No es cubierta ni sobrecubierta - else{ + else { // horizontales - $h1_temp = floor(floatval($maquina->ancho_impresion) / $anchoForCalculo); + $h1_temp = floor(floatval($maquina->ancho_impresion) / $anchoForCalculo); $h2_temp = floor(floatval($maquina->ancho_impresion) / $altoForCalculo); } - - + + // horizontales $calles = (new \App\Models\Configuracion\MaquinasCallesModel())->getCallesForMaquina($maquina->maquina_id, $h1_temp); // Si son mas de 2 formas - if(count($calles)>0) + if (count($calles) > 0) $h1 = ($h1_temp * $anchoForCalculo + 2 * $calles[0]->externas + ($h1_temp - 1) * $calles[0]->internas < ($maquina->ancho)) ? $h1_temp : $h1_temp - 1; - else{ - $h1 = $anchoForCalculo<=$maquina->ancho_impresion?$h1_temp:0; + else { + $h1 = $anchoForCalculo <= $maquina->ancho_impresion ? $h1_temp : 0; } - + $v1 = floor($maquina->alto_impresion / $altoForCalculo); $formas_h = $h1 * $v1; //p1 + /* + //Log ancho y alto de impresion y libro + $info = [ + 'h1' => $h1, + 'v1' => $v1, + 'num_formas' => $formas_h, + 'h1_temp' => $h1_temp, + + ]; + + if($uso == 'cubierta' ) + log_message('error', 'h1:{h1} --- v1:{v1} --- num_formas:{num_formas} --- h1_temp:{h1_temp}', $info); + */ // verticales $calles = (new \App\Models\Configuracion\MaquinasCallesModel())->getCallesForMaquina($maquina->maquina_id, $h2_temp); - if(count($calles)>0) + if (count($calles) > 0) $h2 = ($h2_temp * $altoForCalculo + 2 * $calles[0]->externas + ($h2_temp - 1) * $calles[0]->internas < ($maquina->ancho)) ? $h2_temp : $h2_temp - 1; - else{ - $h2 = $altoForCalculo<=$maquina->ancho_impresion?$h2_temp:0; + else { + $h2 = $altoForCalculo <= $maquina->ancho_impresion ? $h2_temp : 0; } - + $v2 = floor($maquina->alto_impresion / $anchoForCalculo); $formas_v = $h2 * $v2; //p2 - + // Se calcula el numero de formas - if($uso != 'cubierta' && $uso != 'sobrecubierta' && !$forzar_a_favor_fibra){ + if ($uso != 'cubierta' && $uso != 'sobrecubierta' && !$forzar_a_favor_fibra) { $num_formas = ($formas_h > $formas_v) ? $formas_h : $formas_v; $num_formas = $isCosido ? $num_formas * 2 : $num_formas; - } - else if ($forzar_a_favor_fibra){ + } else if ($forzar_a_favor_fibra) { $num_formas = $formas_h; $num_formas = $isCosido ? $num_formas * 2 : $num_formas; + } else { - } - else{ - - $num_formas = $h1*$v1; + $num_formas = $h1 * $v1; } - + // si no hay formas se devuelve n/a if ($num_formas == 0) { $response['num_formas']['posicion_formas'] = 'n/a'; // not available - } - else{ + } else { if ($formas_h > $formas_v || $forzar_a_favor_fibra && $formas_h != 0) { $response['num_formas']['posicion_formas'] = 'h'; $response['num_formas']['num_formas_horizontales'] = $h1; $response['num_formas']['num_formas_verticales'] = $v1; $response['num_formas']['value'] = $num_formas; - } - else { - if($formas_v != 0){ + } else { + if ($formas_v != 0) { $response['num_formas']['posicion_formas'] = 'v'; $response['num_formas']['num_formas_horizontales'] = $h2; $response['num_formas']['num_formas_verticales'] = $v2; $response['num_formas']['value'] = $num_formas; } } - - if(($uso == 'cubierta' || $uso == 'sobrecubierta') && $num_formas>0) { - if(property_exists($maquina, 'forzar_num_formas_horizontales_cubierta') && - property_exists($maquina, 'forzar_num_formas_horizontales_cubierta')){ + + if (($uso == 'cubierta' || $uso == 'sobrecubierta') && $num_formas > 0) { + if ( + property_exists($maquina, 'forzar_num_formas_horizontales_cubierta') && + property_exists($maquina, 'forzar_num_formas_horizontales_cubierta') + ) { $response['num_formas']['num_formas_verticales'] = $h2_temp; } } - - } return $response; @@ -520,38 +688,38 @@ class PresupuestoService extends BaseService $margen = (new \App\Models\Configuracion\PapelImpresionMargenModel())->getMargenFormPags($papel_impresion->id, $paginas); if (count($margen) > 0) { $peso_por_pliego = $maquina->alto * $maquina->ancho * $papel_impresion->gramaje / 1000000; - $precio_pliego = ($peso_por_pliego * $papel_impresion->precio_tonelada / 1000000.0) ; + $precio_pliego = ($peso_por_pliego * $papel_impresion->precio_tonelada / 1000000.0); $margen_pliego = ($peso_por_pliego * $papel_impresion->precio_tonelada / 1000000.0) * (floatval($margen[0]['margen']) / 100.0); return [round($precio_pliego, 6), round($margen_pliego, 6)]; } return -1; } - public static function getTiempoMaquina($totalClicks, $precioClick, $velocidadMaquina) { + public static function getTiempoMaquina($totalClicks, $precioClick, $velocidadMaquina) + { try { - - if($precioClick>0 && $velocidadMaquina>0) - $minutos = (1.0*$totalClicks/$precioClick)/$velocidadMaquina; + + if ($precioClick > 0 && $velocidadMaquina > 0) + $minutos = (1.0 * $totalClicks / $precioClick) / $velocidadMaquina; else $minutos = 0; - - return gmdate("H:i:s", round($minutos*60,0)); - + + return gmdate("H:i:s", round($minutos * 60, 0)); } catch (Exception $e) { - return gmdate("H:i:s", round(0,0)); + return gmdate("H:i:s", round(0, 0)); } } - public static function getHorasMaquina($totalClicks, $precioClick, $velocidadMaquina) { + public static function getHorasMaquina($totalClicks, $precioClick, $velocidadMaquina) + { try { - - if($precioClick>0 && $velocidadMaquina>0) - $horas = (1.0*$totalClicks/$precioClick)/$velocidadMaquina/60.0; + + if ($precioClick > 0 && $velocidadMaquina > 0) + $horas = (1.0 * $totalClicks / $precioClick) / $velocidadMaquina / 60.0; else $horas = 0; - + return $horas; - } catch (Exception $e) { return 0; } @@ -562,39 +730,38 @@ class PresupuestoService extends BaseService * Devuelve el ancho de la cubierta/sobrecubierta, incluido el lomo. * El $uso tiene que ser "cubierta" o "sobrecubierta" */ - public static function getAnchoTotalExteriores($uso="cubierta", $tipo_impresion_id, $datosPedido=null) + public static function getAnchoTotalExteriores($uso = "cubierta", $tipo_impresion_id = 1, $datosPedido = null) { $ancho_total = 0; if ($datosPedido) { // Tapa blanda (cosido y fresado) - if($tipo_impresion_id == 2 || $tipo_impresion_id == 4){ - $ancho_total = floatval($datosPedido->ancho)*2 + floatval($datosPedido->lomo); - + if ($tipo_impresion_id == 2 || $tipo_impresion_id == 4) { + $ancho_total = floatval($datosPedido->ancho) * 2 + floatval($datosPedido->lomo); + // añadimos ancho de las solapas // si se añaden solapas hay que sumar 3mm de los dobleces if ($datosPedido->solapas) { $ancho_total += (floatval($datosPedido->solapas_ancho) * 2) + 6; } // En cualquier otro caso se le suma 5mm de sangre por cada lado - $ancho_total += (2*self::SANGRE_FORMAS); + $ancho_total += (2 * self::SANGRE_FORMAS); } // Tapa dura cosido y fresado - else if($tipo_impresion_id == 1 || $tipo_impresion_id == 3){ - $ancho_total = floatval($datosPedido->ancho)*2 + floatval($datosPedido->lomo); + else if ($tipo_impresion_id == 1 || $tipo_impresion_id == 3) { + $ancho_total = floatval($datosPedido->ancho) * 2 + floatval($datosPedido->lomo); // si es cubierta // Se añaden 20mm de sangre por cada lado + 2 * 7mm de vuelo portada y contraportada -> total 52 // por último se añaden 7mm para tener en cuenta el ancho del carton - if($uso=="cubierta") - $ancho_total += (2*7 + 2*self::SANGRE_FORMAS_CUBIERTA + 7); + if ($uso == "cubierta") + $ancho_total += (2 * 7 + 2 * self::SANGRE_FORMAS_CUBIERTA + 7); // si es sobrecubierta // Se añaden 5mm de sangre por cada lado + 2 * 7mm de vuelo portada y contraportada -> total 52 else - $ancho_total += (2*7 + 2*self::SANGRE_FORMAS) + 7; - } - else{ + $ancho_total += (2 * 7 + 2 * self::SANGRE_FORMAS) + 7; + } else { // En cualquier otro caso se le suma 5mm de sangre por cada lado - $ancho_total += (2*self::SANGRE_FORMAS); + $ancho_total += (2 * self::SANGRE_FORMAS); } } return $ancho_total; @@ -603,31 +770,69 @@ class PresupuestoService extends BaseService /** * Devuelve el alto de la cubierta/sobrecubierta */ - public static function getAltoTotalExteriores($uso="cubierta", $tipo_impresion_id, $datosPedido=null) + public static function getAltoTotalExteriores($uso = "cubierta", $tipo_impresion_id = 1, $datosPedido = null) { $alto_total = 0; if ($datosPedido) { $alto_total = floatval($datosPedido->alto); // Tapa dura (cosido y fresado) - if($tipo_impresion_id == 1 || $tipo_impresion_id == 3){ + if ($tipo_impresion_id == 1 || $tipo_impresion_id == 3) { // Se añaden 20mm de sangre por cada lado + 7mm extra que sobresale -> total 47 - if($uso=="cubierta") - $alto_total += (7+2*self::SANGRE_FORMAS_CUBIERTA); + if ($uso == "cubierta") + $alto_total += (7 + 2 * self::SANGRE_FORMAS_CUBIERTA); // si es sobrecubierta // Se añaden 5mm de sangre por cada lado + 7mm de vuelo -> total 52 else - $alto_total += (7+2*self::SANGRE_FORMAS); - + $alto_total += (7 + 2 * self::SANGRE_FORMAS); } // En cualquier otro caso se le suma 5mm de sangre por cada lado - else{ - $alto_total += (2*self::SANGRE_FORMAS); + else { + $alto_total += (2 * self::SANGRE_FORMAS); } } return $alto_total; } + + public static function get_opciones_papel($uso, $isColor) + { + + $opciones_papel = []; + + if ($uso == 'cubierta') { + $opciones_papel = array( + 'cubierta' => 1, + //'color' => 1, + 'rotativa' => 0, + ); + } else if ($uso == 'sobrecubierta') { + $opciones_papel = array( + 'sobrecubierta' => 1, + //'color' => 1, + 'rotativa' => 0, + ); + } else if ($uso == 'guardas') { + $opciones_papel = array( + 'guardas' => 1, + //'color' => 1, + 'rotativa' => 0, + ); + } else if ($isColor) { + $opciones_papel = array( + 'color' => 1, + 'rotativa' => 0, + ); + } else { + $opciones_papel = array( + 'bn' => 1, + 'rotativa' => 0, + ); + } + + return $opciones_papel; + } + /** * Devuelve la dimensión del lomo interior. */ @@ -666,6 +871,4 @@ class PresupuestoService extends BaseService return $peso; } - - } diff --git a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.js b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.js new file mode 100644 index 00000000..5d584c1d --- /dev/null +++ b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.js @@ -0,0 +1,71 @@ +// Funcion para obtener el peso total del libro +function get_peso_libro(){ + + var peso_total_libro = 0.0 + $('#tableLineasPresupuesto').DataTable().rows().every( function ( rowIdx, tableLoop, rowLoop ) { + var rowData = this.data(); + peso_total_libro += parseFloat(rowData.peso) + }) + return peso_total_libro; +} + + +async function get_precio_envio(peso, paisId, cp, tipo_envio){ + + data = { + tipo: 'get_tarifa', + peso: peso, + paisId: paisId, + cp: cp, + tipo_envio: tipo_envio, + } + data = Object.assign(data, window.token_ajax); + + const response = await fetch(window.location.origin + window.url_get_precio_envio , { + method: "POST", + body: JSON.stringify(data), + headers: { + "Content-type": "application/json; charset=UTF-8", + } + }); + + const values = await response.json(); + yeniden(values[window.csrf_token]); + return values.data; +} + + +async function get_coste_envio_tiradasAlternativas(tirada){ + + var peso_libro = get_peso_libro(); + var tirada_inicial = parseInt($('#tirada').val()); + var coste = 0.0; + var margen = 0.0; + + const table = $('#tableOfDireccionesEnvio').DataTable(); + const rows = table.rows().nodes(); + + for (let i = 0; i < rows.length; i++) { + const rowData = table.row(rows[i]).data(); + const porcentaje = parseInt(rowData.cantidad)/tirada_inicial*100.0; + const cantidad = Math.floor(tirada*porcentaje/100.0); + const peso_envio = cantidad*peso_libro/1000.0; + const datos_tarifa = await get_precio_envio(peso_envio, rowData.paisId, rowData.cp, parseInt(rowData.entregaPieCalle)==1?'palets':'cajas'); + + if(datos_tarifa.id!=null){ + + if(peso_envio>parseFloat(datos_tarifa.peso_max)){ + coste += parseFloat(datos_tarifa.peso_min) + (peso_envio-parseFloat(datos_tarifa.peso_min))*parseFloat(datos_tarifa.precio_adicional); + } + // si no se calcula linealmente + else{ + m=((parseFloat(datos_tarifa.precio_max)-parseFloat(datos_tarifa.precio_min))/(parseFloat(datos_tarifa.peso_max)-parseFloat(datos_tarifa.peso_min))); + b=parseFloat(datos_tarifa.precio_max)-m*parseFloat(datos_tarifa.peso_max); + coste += parseFloat(m*peso_envio+b); + } + } + margen += coste*datos_tarifa.margen/100.0; + } + + return {coste, margen}; +} \ No newline at end of file diff --git a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.php b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.php index 8c51e735..bd065c65 100755 --- a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.php +++ b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.php @@ -92,87 +92,63 @@ const actionBtns_direcciones = function(data) { function updateTablaEnvios(){ - var peso_total_libro = 0 - tableLineasPresupuesto.rows().every( function ( rowIdx, tableLoop, rowLoop ) { - var rowData = this.data(); - peso_total_libro += parseFloat(rowData.peso) - - }) + var peso_total_libro = get_peso_libro(); - tableEnvios.rows().every( function ( rowIdx, tableLoop, rowLoop ) { + tableEnvios.rows().every(async function ( rowIdx, tableLoop, rowLoop ) { + var rowData = this.data(); - const peso_envio = peso_total_libro*parseInt(rowData.cantidad)/1000.0 + const peso_envio = peso_total_libro*parseInt(rowData.cantidad)/1000.0; + var datos_tarifa = await get_precio_envio(peso_envio, rowData.paisId, rowData.cp, parseInt(rowData.entregaPieCalle)==1?'palets':'cajas'); + - $.post( '', - { - tipo: "get_tarifa", - peso: peso_envio, - paisId: rowData.paisId, - cp: rowData.cp, - tipo_envio: parseInt(rowData.entregaPieCalle)==1?'palets':'cajas', - : v, - }) - .done(function( data ) { - if(data.length >0){ - - var precios = [] - for (var i = 0; i < data.length; i++) { - if(peso_envio>data[i].peso_max){ - data[i].precio = (data[i].peso_min + (peso_envio-data[i].peso_min)*data[i].precio_adicional).toFixed(2); - } - // si no se calcula linealmente - else{ - m=((data[i].precio_max-data[i].precio_min)/(data[i].peso_max-data[i].peso_min)) - b=data[i].precio_max-m*data[i].peso_max - data[i].precio = (m*peso_envio+b).toFixed(2); - } - data[i].margen = data[i].margen - } - - const tarifa_final = data.reduce((previous, current) => { - return current.precio < previous.precio ? current : previous; - }); - tarifa_final.cantidad=parseInt($('#add_cantidad').val()) - tarifa_final.peso=peso_envio - - - tableEnvios.row(rowIdx) - .data({ - 'tarifa_id': tarifa_final.id, - 'cantidad': rowData.cantidad, - 'peso': tarifa_final.peso.toFixed(3), - 'att': rowData.att, - 'email': rowData.email, - 'direccion': rowData.direccion, - 'cp': rowData.cp, - 'municipio': rowData.municipio, - 'provincia': rowData.provincia, - 'paisId': rowData.paisId, - 'telefono': rowData.telefono, - 'proveedor': tarifa_final.proveedor, - 'proveedor_id': tarifa_final.proveedor_id, - 'precio': tarifa_final.precio, - 'margen': tarifa_final.margen, - 'entregaPieCalle': rowData.entregaPieCalle, - 'actionBtns_direcciones': actionBtns_direcciones, - }) - .draw(); - - - checkInsertar() - updateTotales(false, false, true) - + if(datos_tarifa.id!=null){ + + if(peso_envio>parseFloat(datos_tarifa.peso_max)){ + datos_tarifa.precio = parseFloat(datos_tarifa.peso_min) + (peso_envio-parseFloat(datos_tarifa.peso_min))*parseFloat(datos_tarifa.precio_adicional); } - else{ - popErrorAlert('', 'error-tarifa') + // si no se calcula linealmente + else{ + m=((parseFloat(datos_tarifa.precio_max)-parseFloat(datos_tarifa.precio_min))/(parseFloat(datos_tarifa.peso_max)-parseFloat(datos_tarifa.peso_min))); + b=parseFloat(datos_tarifa.precio_max)-m*parseFloat(datos_tarifa.peso_max); + datos_tarifa.precio = parseFloat(m*peso_envio+b); } - }); - }) + + datos_tarifa.cantidad = parseInt($('#add_cantidad').val()); + datos_tarifa.peso = peso_envio; + console.log(datos_tarifa.precio) - - + tableEnvios.row(rowIdx) + .data({ + 'tarifa_id': datos_tarifa.id, + 'cantidad': rowData.cantidad, + 'peso': datos_tarifa.peso.toFixed(3), + 'att': rowData.att, + 'email': rowData.email, + 'direccion': rowData.direccion, + 'cp': rowData.cp, + 'municipio': rowData.municipio, + 'provincia': rowData.provincia, + 'paisId': rowData.paisId, + 'telefono': rowData.telefono, + 'proveedor': datos_tarifa.proveedor, + 'proveedor_id': datos_tarifa.proveedor_id, + 'precio': datos_tarifa.precio.toFixed(2), + 'margen': datos_tarifa.margen, + 'entregaPieCalle': rowData.entregaPieCalle, + 'actionBtns_direcciones': actionBtns_direcciones, + }) + .draw(); + + checkInsertar() + updateTotales(false, false, true) + + } + else{ + popErrorAlert('', 'error-tarifa') + } + }) } $(document).on('click', '.delete-add-row', function(e) { @@ -411,5 +387,6 @@ function load_datos_envios(){ } +window.url_get_precio_envio = ''; endSection() ?> \ No newline at end of file diff --git a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.test.js b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.test.js new file mode 100644 index 00000000..c9224499 --- /dev/null +++ b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios.test.js @@ -0,0 +1,44 @@ +// Test case 1: Valid inputs +const peso = 10; +const paisId = 1; +const cp = "12345"; +const tipo_envio = "express"; + +get_precio_envio(peso, paisId, cp, tipo_envio) + .then(data => { + console.log("Test case 1 - Result:", data); + // Add your assertions here + }) + .catch(error => { + console.error("Test case 1 - Error:", error); + }); + +// Test case 2: Invalid inputs +const peso = -5; +const paisId = 0; +const cp = ""; +const tipo_envio = "standard"; + +get_precio_envio(peso, paisId, cp, tipo_envio) + .then(data => { + console.log("Test case 2 - Result:", data); + // Add your assertions here + }) + .catch(error => { + console.error("Test case 2 - Error:", error); + }); + +// Test case 3: Network error +const peso = 20; +const paisId = 2; +const cp = "54321"; +const tipo_envio = "priority"; + +get_precio_envio(peso, paisId, cp, tipo_envio) + .then(data => { + console.log("Test case 3 - Result:", data); + // Add your assertions here + }) + .catch(error => { + console.error("Test case 3 - Error:", error); + }); \ No newline at end of file diff --git a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.js b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.js new file mode 100644 index 00000000..1d467018 --- /dev/null +++ b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.js @@ -0,0 +1,266 @@ +/**************************************************************************************** + * Seccion para los servicios de acabado + ***************************************************************************************/ +function get_datos_acabado(){ + + var datosAcabado = [] + if($('#tableOfServiciosAcabado').DataTable().rows().count()>0){ + $("#tableOfServiciosAcabado tr").each(function (index,tr) { + var values = {} + $(this).find("td").each(function (index2) { + + switch (index2) { + case 0: + values['tarifa_id'] = $(this).text() + break + case 1: + if($(this).text().includes(' '+ lang_text_cubierta)) + values['cubierta'] = 1 + else + values['cubierta'] = 0 + if($(this).text().includes(' '+ lang_text_sobrecubierta)) + values['sobrecubierta'] = 1 + else + values['sobrecubierta'] = 0 + break + case 2: + values['precio_unidad'] = $(this).text() + break + case 3: + values['precio_total'] = $(this).children(":first").val() + break + case 4: + values['margen'] = $(this).text() + break + } + }) + if(Object.keys(values).length>0) + datosAcabado.push(values) + }) + } + return datosAcabado +} + + +async function get_servAcabados_tiradasAlternativas(tirada){ + serviciosAcabados ={ + coste: 0.0, + margen: 0.0, + } + json_data = { + datos: get_datos_acabado(), + tirada: parseInt(tirada), + POD: $('#POD').val() + } + json_data = Object.assign(json_data, window.token_ajax); + + const response = await fetch(window.location.origin + "/presupuestos/presupuestoacabados/update/" + id , { + method: "POST", + body: JSON.stringify(json_data), + headers: { + "Content-type": "application/json; charset=UTF-8" + } + }) + const values = await response.json(); + yeniden(values[window.csrf_token]); + values.lines.forEach((line) => { + + serviciosAcabados.coste += parseFloat(line[0].total); + serviciosAcabados.margen += parseFloat(line[0].total)*parseFloat(line[0].margen)/100.0; + }); + return serviciosAcabados; +} + + +/**************************************************************************************** + * Seccion para los servicios de encuadernación + ***************************************************************************************/ +function get_datos_encuadernacion(){ + + var datosEnc = [] + if($("#tableOfServiciosEncuadernacion").DataTable().rows().count()>0){ + $("#tableOfServiciosEncuadernacion tr").each(function (index,tr) { + var values = {} + $(this).find("td").each(function (index2) { + + switch (index2) { + case 0: + values['tarifa_id'] = $(this).text() + break + case 2: + values['proveedor_id'] = $(this).children(":first").select2('data')[0].id + break + case 3: + values['precio_unidad'] = $(this).text() + break + case 4: + values['precio_total'] = $(this).children(":first").val() + break + case 5: + values['margen'] = $(this).text() + break + } + }) + if(Object.keys(values).length>0) + datosEnc.push(values) + }) + } + + return datosEnc +} + + +async function get_servEncuadernacion_tiradasAlternativas(tirada, paginas, ancho, alto){ + serviciosEncuadernacion ={ + coste: 0.0, + margen: 0.0, + } + json_data = { + datos: get_datos_encuadernacion(), + tirada: parseInt(tirada), + paginas: parseInt(paginas), + ancho: ancho, + alto: alto, + POD: $('#POD').val() + } + json_data = Object.assign(json_data, window.token_ajax); + + const response = await fetch(window.location.origin + "/presupuestos/presupuestoencuadernaciones/update/" + id , { + method: "POST", + body: JSON.stringify(json_data), + headers: { + "Content-type": "application/json; charset=UTF-8" + } + }) + const values = await response.json(); + yeniden(values[window.csrf_token]); + values.lines.forEach((line) => { + serviciosEncuadernacion.coste += parseFloat(line[0].total); + serviciosEncuadernacion.margen += parseFloat(line[0].total)*parseFloat(line[0].margen)/100.0; + }); + return serviciosEncuadernacion; +} + + +/**************************************************************************************** + * Seccion para los servicios de manipulado + ***************************************************************************************/ +function get_datos_manipulado(){ + + var datosManipulado = [] + if($("#tableOfServiciosManipulado").DataTable().rows().count()>0){ + + $("#tableOfServiciosManipulado tr").each(function (index,tr) { + var values = {} + $(this).find("td").each(function (index2) { + + switch (index2) { + case 0: + values['tarifa_id'] = $(this).text() + break + case 2: + values['precio_unidad'] = $(this).text() + break + case 3: + values['precio_total'] = $(this).children(":first").val() + break + case 4: + values['margen'] = $(this).text() + break + } + }) + if(Object.keys(values).length>0) + datosManipulado.push(values) + }) + } + + return datosManipulado +} + + +async function get_servManipulado_tiradasAlternativas(tirada){ + serviciosManipulado ={ + coste: 0.0, + margen: 0.0, + } + json_data = { + datos: get_datos_manipulado(), + tirada: parseInt(tirada), + POD: $('#POD').val() + } + json_data = Object.assign(json_data, window.token_ajax); + + const response = await fetch(window.location.origin + "/presupuestos/presupuestomanipulados/update/" + id , { + method: "POST", + body: JSON.stringify(json_data), + headers: { + "Content-type": "application/json; charset=UTF-8" + } + }) + const values = await response.json(); + yeniden(values[window.csrf_token]); + values.lines.forEach((line) => { + serviciosManipulado.coste += parseFloat(line[0].total); + serviciosManipulado.margen += parseFloat(line[0].total)*parseFloat(line[0].margen)/100.0; + }); + return serviciosManipulado; +} + +/**************************************************************************************** + * Seccion para los servicios de preimpresión + ***************************************************************************************/ +function get_datos_preimpresion(){ + + var datosPreimpresion = [] + if($("#tableOfServiciosPreimpresion").DataTable().rows().count()>0){ + + $("#tableOfServiciosPreimpresion tr").each(function (index,tr) { + var values = {} + $(this).find("td").each(function (index2) { + + switch (index2) { + case 0: + values['tarifa_id'] = $(this).text() + break + case 2: + values['precio'] = $(this).children(":first").val() + break + case 3: + values['margen'] = $(this).text() + break + } + }) + if(Object.keys(values).length>0) + datosPreimpresion.push(values) + }) + } + + return datosPreimpresion +} + +async function get_servPreimpresion_tiradasAlternativas(){ + serviciosPreimpresion ={ + coste: 0.0, + margen: 0.0, + } + json_data = { + datos: get_datos_preimpresion(), + POD: $('#POD').val() + } + json_data = Object.assign(json_data, window.token_ajax); + + const response = await fetch(window.location.origin + "/presupuestos/presupuestopreimpresiones/update/" + id , { + method: "POST", + body: JSON.stringify(json_data), + headers: { + "Content-type": "application/json; charset=UTF-8" + } + }) + const values = await response.json(); + yeniden(values[window.csrf_token]); + values.lines.forEach((line) => { + serviciosPreimpresion.coste += parseFloat(line[0].total); + serviciosPreimpresion.margen += parseFloat(line[0].total)*parseFloat(line[0].margen)/100.0; + }); + return serviciosPreimpresion; +} \ No newline at end of file diff --git a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.php b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.php index adf918a1..c0420c1e 100755 --- a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.php +++ b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosServiciosItems.php @@ -710,47 +710,7 @@ } - function get_datos_acabado(){ - - var datosAcabado = [] - if(tableServiciosAcabado.rows().count()>0){ - $("#tableOfServiciosAcabado tr").each(function (index,tr) { - var values = {} - $(this).find("td").each(function (index2) { - - switch (index2) { - case 0: - values['tarifa_id'] = $(this).text() - break - case 1: - if($(this).text().includes(' ()')) - values['cubierta'] = 1 - else - values['cubierta'] = 0 - if($(this).text().includes(' ()')) - values['sobrecubierta'] = 1 - else - values['sobrecubierta'] = 0 - break - case 2: - values['precio_unidad'] = $(this).text() - break - case 3: - values['precio_total'] = $(this).children(":first").val() - break - case 4: - values['margen'] = $(this).text() - break - } - }) - if(Object.keys(values).length>0) - datosAcabado.push(values) - }) - } - - return datosAcabado - } - + init_servicio_acabado() endSection() ?> @@ -1026,41 +986,6 @@ check_serv_enc_error() }) - function get_datos_encuadernacion(){ - - var datosEnc = [] - if(tableServiciosEnc.rows().count()>0){ - $("#tableOfServiciosEncuadernacion tr").each(function (index,tr) { - var values = {} - $(this).find("td").each(function (index2) { - - switch (index2) { - case 0: - values['tarifa_id'] = $(this).text() - break - case 2: - values['proveedor_id'] = $(this).children(":first").select2('data')[0].id - break - case 3: - values['precio_unidad'] = $(this).text() - break - case 4: - values['precio_total'] = $(this).children(":first").val() - break - case 5: - values['margen'] = $(this).text() - break - } - }) - if(Object.keys(values).length>0) - datosEnc.push(values) - }) - } - - return datosEnc - } - - init_servicio_encuadernado() endSection() ?> @@ -1200,38 +1125,7 @@ check_serv_manipulado_error() }) - function get_datos_manipulado(){ - - var datosManipulado = [] - if(tableServiciosManipulado.rows().count()>0){ - - $("#tableOfServiciosManipulado tr").each(function (index,tr) { - var values = {} - $(this).find("td").each(function (index2) { - - switch (index2) { - case 0: - values['tarifa_id'] = $(this).text() - break - case 2: - values['precio_unidad'] = $(this).text() - break - case 3: - values['precio_total'] = $(this).children(":first").val() - break - case 4: - values['margen'] = $(this).text() - break - } - }) - if(Object.keys(values).length>0) - datosManipulado.push(values) - }) - } - - return datosManipulado - } - + function servicioGuardas(add_service = false){ if(add_service){ $('#add_servicio_manipulado_list').val() @@ -1403,35 +1297,12 @@ check_serv_preimpresion_error() }) - function get_datos_preimpresion(){ - - var datosPreimpresion = [] - if(tableServiciosPreimpresion.rows().count()>0){ - - $("#tableOfServiciosPreimpresion tr").each(function (index,tr) { - var values = {} - $(this).find("td").each(function (index2) { - - switch (index2) { - case 0: - values['tarifa_id'] = $(this).text() - break - case 2: - values['precio'] = $(this).children(":first").val() - break - case 3: - values['margen'] = $(this).text() - break - } - }) - if(Object.keys(values).length>0) - datosPreimpresion.push(values) - }) - } - - return datosPreimpresion - } - + init_servicio_preimpresion() + + // Definición de varibles para el js (actualizar el lang) + lang_text_cubierta = ''; + lang_text_sobrecubierta = ''; + endSection() ?> diff --git a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_resumenPresupuestoItems.php b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_resumenPresupuestoItems.php index a50443fc..4a1b1bde 100755 --- a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_resumenPresupuestoItems.php +++ b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_resumenPresupuestoItems.php @@ -1,4 +1,4 @@ -
+

@@ -223,6 +222,9 @@ function updateTotales(updateLP=true, updateServicios=true, updateEnvio=true){ $('#totalCostes').text((totalCostes).toFixed(2) + '€') $('#totalMargenes').text((totalMargenes).toFixed(2) + '€') + if($('#total_descuentoPercent').val()<0){ + $('#total_descuentoPercent').val(0) + } var totalAntesDescuento = totalCostes + totalMargenes var totalDescuento = totalAntesDescuento * parseInt($('#total_descuentoPercent').val())/100 var totalPresupuesto = totalAntesDescuento - totalDescuento diff --git a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_tiradasAlternativasItems.js b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_tiradasAlternativasItems.js new file mode 100644 index 00000000..2061eea2 --- /dev/null +++ b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_tiradasAlternativasItems.js @@ -0,0 +1,321 @@ +// Selección de la última columna de la tabla de tiradas +const lastColNr_tiradasAlt = $('#tableTiradas').find("tr:first th").length - 1; + + +// Función para generar los botones de acción de la tabla de tiradas +const actionBtns_tiradasAlt = function (data) { + return ` + + `; +}; + + +// Inicializaciones de la tabla de tiradas +var tableTiradas; + + +// Espera a que todas las variables necesarias estén definidas +(async () => { + + while (!window.hasOwnProperty("datatable_lang_url") && !window.hasOwnProperty("datatable_TA_url")) + await new Promise(resolve => setTimeout(resolve, 200)); + initTableTiradas(); + fill_tiradas_alternativas(); + +})(); + + +// Evento de añadir una tirada alternativa +$('#add_tirada_alt').on('click', function () { + + // se comprueba que la tirada no existe ya en la tabla + const tirada_alt = parseInt($('#tirada_alt').val()); + const exists = tableTiradas.rows().data().toArray().some(row => row.tirada == tirada_alt); + const isPOD = parseInt($('#tirada').val())<= parseInt($('#POD').val()); + + const typeIsOk = tirada_alt <= parseInt($('#POD').val()) && isPOD || tirada_alt > parseInt($('#POD').val()) && !isPOD; + + if (!exists && typeIsOk) { + + const dimension = getDimensionLibro(); + + let datos = { + tirada: $('#tirada_alt').val(), + merma: get_merma_tirada_alternativa($('#tirada_alt').val()), + tipo_impresion_id: $('#tipo_impresion_id').val(), + json_tiradas: generate_json_tiradas(), + ancho: dimension.ancho, + alto: dimension.alto, + cliente_id: $('#clienteId').find(":selected").val(), + solapas_cubierta: $('#solapas').is(':checked')?1:0, + solapas_cubierta_ancho: $('#solapas').is(':checked')?parseInt($('#solapas_ancho').val()):0, + solapas_sobrecubierta: $('#solapas_sobrecubierta').is(':checked')?1:0, + solapas_sobrecubierta_ancho: $('#solapas_sobrecubierta').is(':checked')?parseInt($('#solapas_ancho_sobrecubierta').val()):0, + lomo: getLomoExterior(), + }; + + datos = Object.assign(datos, window.token_ajax); + + // Se realiza la petición AJAX + $.ajax({ + type: "POST", + url: window.get_tirada_url, + data: datos, + success: async function (data) { + + var coste_total = 0.0; + var margen_total = 0.0; + + var costes_servicios = 0.0; + var margen_servicios = 0.0; + + var coste_envio = 0.0; + var margen_envio = 0.0; + + if(data.lineas.length >0){ + // Se cogen los valores de la linea con los datos correspondientes + $.each(data.lineas, function(key, value) { + + coste_total += value.total_coste; + margen_total += value.total_margen; + }); + + // Se obtiene el precio de los servicios + const valueAcabados = await get_servAcabados_tiradasAlternativas(parseInt(datos.tirada)); + costes_servicios += valueAcabados.coste; + margen_servicios += valueAcabados.margen; + + const valueEncuadernacion = await get_servEncuadernacion_tiradasAlternativas( + parseInt(datos.tirada), parseInt( $('#paginas').val()), parseInt(dimension.ancho), parseInt(dimension.alto)); + costes_servicios += valueEncuadernacion.coste; + margen_servicios += valueEncuadernacion.margen; + + const valueManipulado = await get_servManipulado_tiradasAlternativas(parseInt(datos.tirada)); + costes_servicios += valueManipulado.coste; + margen_servicios += valueManipulado.margen; + + const valuePreimpresion = await get_servPreimpresion_tiradasAlternativas(parseInt(datos.tirada)); + costes_servicios += valuePreimpresion.coste; + margen_servicios += valuePreimpresion.margen; + + const valueTransporte = await get_coste_envio_tiradasAlternativas(parseInt(datos.tirada)); + coste_envio = valueTransporte.coste; + margen_envio = valueTransporte.margen; + + + // Se añade la fila a la tabla de tiradas + tableTiradas.row.add({ + tirada: datos.tirada, + coste_impresion: coste_total.toFixed(2), + coste_envio: coste_envio.toFixed(2), + margen: ((margen_total + margen_servicios + margen_envio)/(coste_total+coste_envio)*100.0).toFixed(2), + total_pedido: (coste_total + costes_servicios + coste_envio).toFixed(2), + precio_unidad: ((coste_total + costes_servicios + coste_envio) / datos.tirada).toFixed(2), + + }).draw(false); + } + + yeniden(data[window.csrf_token]); + + }, + error: function(e){} + }); + } + else { + var htmlString = ''; + if(!typeIsOk){ + htmlString = ` + `; + } + + else{ + htmlString = ` + `; + } + $('#alert-tiradas_alt').html(htmlString); + } +}); + + +// Función para obtener el lomo exterior +function getLomoExterior(){ + let lomoTotal = 0 + try{ + $('#tableLineasPresupuesto').DataTable().rows().every( function ( rowIdx, tableLoop, rowLoop ) { + var rowData = this.data(); + if(rowData.row_id != 'lp_cubierta' && rowData.tipo != 'lp_sobrecubierta') + lomoTotal += parseFloat(rowData.lomo) + }) + } + catch(error){ + lomoTotal = 0 + } + return lomoTotal +} + + +// Inicialización de la tabla de tiradas +function initTableTiradas() { + tableTiradas = $('#tableTiradas').DataTable({ + "language": { + "url": window.datatable_lang_url + }, + "paging": false, + "info": false, + "searching": false, + "ordering": false, + "autoWidth": false, + "responsive": true, + "columnDefs": [ + { + orderable: false, + searchable: false, + targets: [lastColNr_tiradasAlt] + }, + ], + "columns": [ + { data: "tirada" }, + { data: 'coste_impresion' }, + { data: 'coste_envio' }, + { data: 'margen' , + render: function ( data, type, row ) { + return data + '%'; + } + }, + { data: 'total_pedido' }, + { data: 'precio_unidad' }, + { + data: actionBtns_tiradasAlt, + className: 'row-edit dt-center' + } + ], + }); +} + +// Evento de borrado de una fila de la tabla de tiradas +$(document).on('click', '.btn-delete-tirada', function (e) { + + const row = $(this).closest('tr'); + tableTiradas.row(row) + .remove() + .draw(); +}) + + +// Función para generar el JSON de las lineas de presupuesto para calcular las tiradas +function generate_json_tiradas() { + + const data = $('#tableLineasPresupuesto').DataTable().data().toArray(); + + //return data; // For debugging purposes + json = filterData(data, + ['paginas', + 'numPagColor', + 'paginas_impresion', + 'papel', // papel generico + 'papel_impresion_id', + 'gramaje', + 'maquina_id', + 'aFavorFibra', + 'row_id', + 'check_papel_total', + 'check_impresion_total', + 'cobAmarillo', // tipologia de papel + 'cobCyan', + 'cobMagenta', + 'cobNegro', + 'cobCG', + 'gotaColor', + 'gotaNegro']); + + json.forEach(element => { + element['check_papel_total'] = $('#' + element['row_id'] + '_checkPapel').is(':checked') ? 1 : 0; + element['check_impresion_total'] = $('#' + element['row_id'] + '_checkClicks').is(':checked') ? 1 : 0; + }); + return JSON.stringify(json); +} + + +// Función para filtrar las columnas de la tabla de tiradas +function filterData(data, keys) { + return data.map(obj => { + const newObj = {}; + keys.forEach(key => { + if (obj.hasOwnProperty(key)) { + newObj[key] = obj[key]; + } + }); + return newObj; + }); +} + + +// Función para obtener la merma de la tirada alternativa +function get_merma_tirada_alternativa(tirada){ + + var merma = 0 + + if(tirada>parseInt($('#POD').val())){ + + merma = tirada*0.1<=30 ? tirada*0.1 : 30 + } + else{ + merma_lineas = [] + $('#tableLineasPresupuesto').DataTable().rows().every( function ( rowIdx, tableLoop, rowLoop ) { + var rowData = this.data(); + if(rowData.row_id != 'lp_guardas' && rowData.row_id != 'lp_cubierta' && rowData.row_id != 'lp_sobrecubierta'){ + const formas_linea = $('#isCosido').val()==0?parseInt(rowData.formas):parseInt(rowData.formas)/2 + if(formas_linea > tirada) + merma_lineas.push(formas_linea-tirada) + else + merma_lineas.push(tirada%formas_linea) + } + }) + + if(merma_lineas.length>0) + merma = Math.max(...merma_lineas) + else + merma = 0 + } + return merma; +} + + +function fill_tiradas_alternativas(){ + tableTiradas.clear().draw(); + const text = $('#tirada_alternativa_json_data').val() + if(text.length>0){ + + const data = JSON.parse(text); + if(data.length>0){ + $.each(data, function(key, value) { + tableTiradas.row.add({ + tirada: value.tirada, + coste_impresion: value.coste_impresion, + coste_envio: value.coste_envio, + margen: value.margen, + total_pedido: value.total_pedido, + precio_unidad: value.precio_unidad, + }).draw(false); + }); + } + } +} + + + + \ No newline at end of file diff --git a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_tiradasAlternativasItems.php b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_tiradasAlternativasItems.php new file mode 100644 index 00000000..4077d49a --- /dev/null +++ b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/_tiradasAlternativasItems.php @@ -0,0 +1,70 @@ +
+
+

+ +

+ +
+
+
+ +
+
+

+ '> +
+ + +
+ + + + + + + + + + + + + + + + +
+ + +
+
+ +
+
+
+
+ + + + +section("additionalInlineJs") ?> + window.datatable_lang_url = "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json"; + + window.datatable_TA_url = ""; + window.get_tirada_url = ""; + + window.error_lang_tirada_alt_duplicada = ""; + window.error_lang_tirada_alt_tipo = ""; + +endSection() ?> + + + + + + + diff --git a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/viewCosidotapablandaForm.php b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/viewCosidotapablandaForm.php index 5d395b27..594f467f 100755 --- a/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/viewCosidotapablandaForm.php +++ b/ci4/app/Views/themes/backend/vuexy/form/presupuestos/cosidotapablanda/viewCosidotapablandaForm.php @@ -15,6 +15,10 @@ getErrors()) ? $validation->listErrors("bootstrap_style") : "" ?> + + @@ -25,7 +29,8 @@ - + + @@ -187,11 +192,19 @@ const url_parts = url.split('/'); section("additionalInlineJs") ?> + // funcion que genera un JSON con la tabla de tiradas alternativas + function generate_json_tiradas() { + const data = tableTiradas.rows().data().toArray(); + $('#tirada_alternativa_json_data').val(JSON.stringify(data)); + } + + if (url_parts[url_parts.length - 2] == 'edit') { id = url_parts[url_parts.length - 1]; } else { id = -1; } + $('#presupuestoForm').on("submit", function(event) { event.preventDefault(); @@ -200,6 +213,7 @@ const url_parts = url.split('/'); $.when(fill_bbdd_from_lp(id).then(function(data, textStatus, jqXHR) { generateCompJSON() + generate_json_tiradas() form = $('#presupuestoForm').serialize() form += getValuesResumenForm() @@ -226,9 +240,22 @@ const url_parts = url.split('/'); return false; //stop the actual form post !important! }); + endSection() ?> + + + + + + + + section("additionalInlineJs") ?> + + window.token_ajax= {: v}; + window.csrf_token = ''; endSection() ?> + @@ -249,6 +276,9 @@ const url_parts = url.split('/'); + + + endSection() ?>