Merge branch 'dev/tiradas_alternativas' into 'main'

Dev/tiradas alternativas

See merge request jjimenez/safekat!176
This commit is contained in:
2024-03-05 11:20:46 +00:00
19 changed files with 1905 additions and 772 deletions

View File

@ -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'],

View File

@ -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');
}
}

View File

@ -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();
}
}

View File

@ -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());
}
}
}

View File

@ -0,0 +1,252 @@
<?php
namespace App\Controllers\Presupuestos;
use App\Controllers\GoBaseResourceController;
use App\Models\Collection;
use App\Services\PresupuestoService;
class Presupuestotiradasalternativas extends \App\Controllers\GoBaseResourceController
{
protected $modelName = PresupuestoManipuladosModel::class;
protected $format = 'json';
protected static $singularObjectName = 'Presupuestos tirada alternativa';
protected static $singularObjectNameCc = 'PresupuestoTiradaAlternativa';
protected static $pluralObjectName = 'Presupuesto tiradas alternativas';
protected static $pluralObjectNameCc = 'PresupuestoTiradasAlternativas';
protected static $controllerSlug = 'presupuesto-tiradas';
protected static $viewPath = 'themes/backend/vuexy/form/presupuestos/';
public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
}
public function edit($requestedId = null)
{
}
public function update($requestedId = null)
{
}
public function datatable()
{
if ($this->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);
}
}

View File

@ -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 '<pre>';
$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 '</pre>';
/*
$linea = PresupuestoService::getCostesLinea('interior', $datosPedido, $maquina, $papel, $opciones_papel, $tarifa);
echo '<pre>';
var_dump($formas);
echo '</pre>';
echo '<pre>';
$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 '</pre>';*/
}
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 '------------------------------------<br>';
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 '</pre>';*/
$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 '</pre>';
@ -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 '<pre>';
var_dump($papel->id);
var_dump($datosTipologias);
echo '</pre>';
$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 '<pre>';
var_dump($maquinas);
echo '</pre>';
// 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 '</pre>';
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 '<pre>';
var_dump($lineas);
echo '</pre>';
}
public static function testLineasSobrecubierta()
@ -581,7 +718,7 @@ class Test extends BaseController
echo '<pre>';
var_dump($maquinas);
echo '</pre>';
// 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 '</pre>';
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 '<pre>';
var_dump($lineas);
echo '</pre>';
}
}

View File

@ -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',
],
];

View File

@ -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")

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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};
}

View File

@ -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( '<?= route_to('dataTableOfPresupuestoDirecciones') ?>',
{
tipo: "get_tarifa",
peso: peso_envio,
paisId: rowData.paisId,
cp: rowData.cp,
tipo_envio: parseInt(rowData.entregaPieCalle)==1?'palets':'cajas',
<?= csrf_token() ?? "token" ?> : <?= csrf_token() ?>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('<?= lang('PresupuestosDirecciones.validation.no_tarifa') ?>', '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('<?= lang('PresupuestosDirecciones.validation.no_tarifa') ?>', 'error-tarifa')
}
})
}
$(document).on('click', '.delete-add-row', function(e) {
@ -411,5 +387,6 @@ function load_datos_envios(){
}
window.url_get_precio_envio = '<?= route_to('processDataDirecciones') ?>';
<?= $this->endSection() ?>

View File

@ -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);
});

View File

@ -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;
}

View File

@ -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(' (<?= lang("Presupuestos.cubierta") ?>)'))
values['cubierta'] = 1
else
values['cubierta'] = 0
if($(this).text().includes(' (<?= lang("Presupuestos.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
}
init_servicio_acabado()
<?= $this->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()
<?= $this->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(<?php echo $serviciosAutomaticos['plegadoGuardas'] ?>)
@ -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("Presupuestos.cubierta") ?>';
lang_text_sobrecubierta = '<?= lang("Presupuestos.sobrecubierta") ?>';
<?= $this->endSection() ?>

View File

@ -1,4 +1,4 @@
<div class="accordion accordion-bordered mt-3 col-xl-6" id="accordionResumen">
<div class="accordion accordion-bordered mt-3 col-xl-4" id="accordionResumen">
<div class="card accordion-item active">
<h2 class="accordion-header" id="headingOne">
<button type="button" class="accordion-button" data-bs-toggle="collapse"
@ -16,52 +16,51 @@
<div class="border rounded p-4 mb-3 pb-3">
<!-- Price Details -->
<h6>Detalles del presupuesto</h6>
<dl class="row mb-0">
<dt class="col-6 py-1 fw-normal text-end">Coste papel</dt>
<dt class="col-5 py-1 fw-normal text-end">Coste papel</dt>
<dd id="totalCostePapel" class="py-1 col-6 text-end"><?= old('0', $presupuestoEntity->total_coste_papel) ?>€</dd>
<dt class="col-6 py-1 fw-normal text-end">Margen papel</dt>
<dd id="porcentajeMargenPapel" class="col-4 text-end py-1"><?= old('0', $presupuestoEntity->total_margenPercent_papel) ?>%</dd>
<dd id="margenPapel" class="col-2 text-end py-1"><?= old('0', $presupuestoEntity->total_margen_papel) ?>€</dd>
<dt class="col-5 py-1 fw-normal text-end">Margen papel</dt>
<dd id="porcentajeMargenPapel" class="col-3 text-end py-1"><?= old('0', $presupuestoEntity->total_margenPercent_papel) ?>%</dd>
<dd id="margenPapel" class="col-3 text-end py-1"><?= old('0', $presupuestoEntity->total_margen_papel) ?>€</dd>
<dt class="col-6 fw-normal text-end">Coste impresión</dt>
<dt class="col-5 fw-normal text-end">Coste impresión</dt>
<dd id="totalCosteImpresion" class="col-6 text-end"><?= old('0', $presupuestoEntity->total_coste_impresion) ?>€</dd>
<dt class="col-6 py-1 fw-normal text-end">Margen impresión</dt>
<dd id="porcentajeMargenImpresion" class="col-4 text-end py-1"><?= old('0', $presupuestoEntity->total_margenPercent_impresion) ?>%</dd>
<dd id="margenImpresion" class="col-2 py-1 text-end"><?= old('0', $presupuestoEntity->total_margen_impresion) ?>€</dd>
<dt class="col-5 py-1 fw-normal text-end">Margen impresión</dt>
<dd id="porcentajeMargenImpresion" class="col-3 text-end py-1"><?= old('0', $presupuestoEntity->total_margenPercent_impresion) ?>%</dd>
<dd id="margenImpresion" class="col-3 py-1 text-end"><?= old('0', $presupuestoEntity->total_margen_impresion) ?>€</dd>
<dt class="col-6 fw-normal text-end">Coste servicios</dt>
<dt class="col-5 fw-normal text-end">Coste servicios</dt>
<dd id="totalServicios" class="col-6 text-end py-1"><?= old('0', $presupuestoEntity->total_coste_servicios) ?>€</dd>
<dt class="col-6 fw-normal text-end">Margen servicios</dt>
<dd id="porcentajeMargenServicios" class="col-4 text-end py-1"><?= old('0', $presupuestoEntity->total_margenPercent_servicios) ?>%</dd>
<dd id="margenServicios" class="col-2 text-end py-1"><?= old('0', $presupuestoEntity->total_margen_servicios) ?>€</dd>
<dt class="col-5 fw-normal text-end">Margen servicios</dt>
<dd id="porcentajeMargenServicios" class="col-3 text-end py-1"><?= old('0', $presupuestoEntity->total_margenPercent_servicios) ?>%</dd>
<dd id="margenServicios" class="col-3 text-end py-1"><?= old('0', $presupuestoEntity->total_margen_servicios) ?>€</dd>
<dt class="col-6 fw-normal text-end">Coste de envío</dt>
<dt class="col-5 fw-normal text-end">Coste de envío</dt>
<dd id="totalEnvios"class="col-6 text-end py-1"><?= old('0', $presupuestoEntity->total_coste_envios) ?>€</dd>
<dt class="col-6 fw-normal text-end">Margen envío</dt>
<dt class="col-5 fw-normal text-end">Margen envío</dt>
<dd id="margenEnvios" class="col-6 text-end py-1"><?= old('0', $presupuestoEntity->total_margen_envios) ?>€</dd>
</dl>
<hr class="mx-n4">
<dl class="row mb-0">
<dt class="col-6 fw-normal text-end">Total Costes</dt>
<dt class="col-5 fw-normal text-end">Total Costes</dt>
<dd id="totalCostes" class="col-6 text-end"><?= old('0', $presupuestoEntity->total_costes) ?>€</dd>
<dt class="col-6 fw-normal text-end">Total Margen</dt>
<dt class="col-5 fw-normal text-end">Total Margen</dt>
<dd id="totalMargenes" class="col-6 text-end"><?= old('0', $presupuestoEntity->total_margenes) ?>€</dd>
</dl>
<hr class="mx-n4">
<dl class="row mb-0">
<dt class="col-6 fw-normal text-end">Total</dt>
<dt class="col-5 fw-normal text-end">Total</dt>
<dd id="totalAntesDescuento" class="col-6 text-end"><?= old('0', $presupuestoEntity->total_antes_descuento) ?>€</dd>
<dt class="col-6 py-1 fw-normal text-end">Descuento</dt>
<div class="d-flex col-4 flex-row-reverse"><input id="total_descuentoPercent" type='number' value="<?= old('0', $presupuestoEntity->total_descuentoPercent) ?>" class="update-totales form-control" style="width:50% !important;"></div>
<dd id="descuentoTotal" class="col-2 py-1 text-end"><?= old('0', $presupuestoEntity->total_descuento) ?>€</dd>
<dt class="col-6 text-end">Total presupuesto</dt>
<dt class="col-5 py-1 fw-normal text-end">Descuento</dt>
<dd id="dd" class="col-3 text-end py-1"><input id="total_descuentoPercent" type="number" value="<?= old('0', $presupuestoEntity->total_descuentoPercent) ?>" class="update-totales form-control" style="width:100% !important;"></dd>
<dd id="descuentoTotal" class="col-3 py-1 text-end"><?= old('0', $presupuestoEntity->total_descuento) ?>€</dd>
<dt class="col-5 text-end">Total presupuesto</dt>
<dd id="totalDespuesDecuento" class="col-6 fw-semibold text-end"><?= old('0', $presupuestoEntity->total_presupuesto) ?>€</dd>
<dt class="col-6 fw-normal text-end">Precio unidad</dt>
<dt class="col-5 fw-normal text-end">Precio unidad</dt>
<dd id="precioUnidadPresupuesto" class="col-6 text-end mb-0"><?= old('0', $presupuestoEntity->total_precio_unidad) ?>€</dd>
</dl>
</div>
@ -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

View File

@ -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 `
<a href="javascript:void(0);"><i class="ti ti-trash ti-sm btn-delete-tirada mx-2" data-id="${data.row_id}"></i></a>
`;
};
// 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 = `
<div class="alert alert-warning d-flex align-items-baseline" role="alert">
<span class="alert-icon alert-icon-lg text-primary me-2">
<i class="ti ti-bell ti-sm"></i>
</span>
<div class="d-flex flex-column ps-1">
<h5 class="alert-heading mb-2"><?= lang("Presupuestos.errores.tirada_alt_duplicada") ?></h5>
</div>
</div>`;
}
else{
htmlString = `
<div class="alert alert-warning d-flex align-items-baseline" role="alert">
<span class="alert-icon alert-icon-lg text-primary me-2">
<i class="ti ti-bell ti-sm"></i>
</span>
<div class="d-flex flex-column ps-1">
<h5 class="alert-heading mb-2"><?= lang("Presupuestos.errores.tirada_alt_tipo") ?></h5>
</div>
</div>`;
}
$('#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);
});
}
}
}

View File

@ -0,0 +1,70 @@
<div class="accordion accordion-bordered mt-3 col-xl-8" id="accordionTiradas">
<div class="card accordion-item active">
<h2 class="accordion-header" id="headingOne">
<button type="button" class="accordion-button" data-bs-toggle="collapse"
data-bs-target="#accordionTiradasTip" aria-expanded="false"
aria-controls="accordionTiradasTip">
<h4><?= lang("Presupuestos.tiradasAlternativas") ?></h4>
</button>
</h2>
<div id="accordionTiradasTip" class="accordion-collapse collapse show"
data-bs-parent="#accordionTiradas">
<div class="accordion-body">
<div id='alert-tiradas_alt'></div>
<div class="col-xl-12">
<div class="border rounded p-4 mb-3 pb-3">
<p><?= lang('Presupuestos.tiradasInfoIVA') ?></p>
<input type="hidden" name="tirada_alternativa_json_data" id="tirada_alternativa_json_data" class="form-control" value='<?= isset($presupuestoEntity->tirada_alternativa_json_data)?$presupuestoEntity->tirada_alternativa_json_data:'' ?>'></input>
<div class='d-flex justify-content-end '>
<input id="tirada_alt" type="number" style="width: 10% !important; display: inline-flex !important" class="form-control" value="1" min="1" step="1">
<button id="add_tirada_alt" type="button" class="btn btn-secondary waves-effect waves-light"><i class="ti ti-circle-plus"></i></button>
</div>
<table id="tableTiradas" class="comparator-table table dt-responsive dataTable" style="width: 100%;">
<thead>
<tr>
<th><?= lang('Presupuestos.tirada') ?></th>
<th><?= lang('Presupuestos.tiradaImpresion') ?></th>
<th><?= lang('Presupuestos.tiradaEnvio') ?></th>
<th><?= lang('Presupuestos.tiradaMargen') ?></th>
<th><?= lang('Presupuestos.totalPedido') ?></th>
<th><?= lang('Presupuestos.precioUnidad') ?></th>
<th></th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div> <!-- //.accordion-body -->
</div> <!-- //.accordion-collapse -->
</div> <!-- //.accordion-item -->
</div> <!-- //.accordion -->
<!------------------------------------------------------->
<!-- Código JS comportamiento ?????. -->
<!------------------------------------------------------->
<?= $this->section("additionalInlineJs") ?>
window.datatable_lang_url = "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json";
window.datatable_TA_url = "<?= route_to('dataTableOfPresupuestoTiradasAlternativas') ?>";
window.get_tirada_url = "<?= route_to('getTiradaData') ?>";
window.error_lang_tirada_alt_duplicada = "<?= lang('Presupuestos.errores.tirada_alt_duplicada') ?>";
window.error_lang_tirada_alt_tipo = "<?= lang('Presupuestos.errores.tirada_alt_tipo') ?>";
<?= $this->endSection() ?>

View File

@ -15,6 +15,10 @@
<?= !empty($validation->getErrors()) ? $validation->listErrors("bootstrap_style") : "" ?>
<input type="hidden" name="tipo_impresion_id" id="tipo_impresion_id" class="form-control"
value="<?= $tipo_impresion_id ?>"></input>
<input type="hidden" name="isCosido" id="isCosido" class="form-control"
value="<?= $isCosido ?>"></input>
<input type="hidden" name="POD" id="POD" class="form-control"
value="<?= $POD ?>"></input>
<?= view("themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosPresupuestoItems") ?>
<?= view("themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosLibroItems") ?>
<?php if (str_contains($formAction, 'edit')): ?>
@ -25,7 +29,8 @@
<?= view("themes/backend/vuexy/form/presupuestos/cosidotapablanda/_datosEnvios") ?>
<?= view("themes/backend/vuexy/form/presupuestos/cosidotapablanda/_comentariosItems") ?>
<?= view("themes/backend/vuexy/form/presupuestos/cosidotapablanda/_resumenPresupuestoItems") ?>
<?php else: ?>
<?= view("themes/backend/vuexy/form/presupuestos/cosidotapablanda/_tiradasAlternativasItems") ?>
<?php else: ?>
<input type="hidden" name="total_presupuesto" id="total_presupuesto" class="form-control"
value="0.0"></input>
<?php endif; ?>
@ -187,11 +192,19 @@ const url_parts = url.split('/');
<?php if (str_contains($formAction, 'edit')): ?>
<?= $this->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!
});
<?= $this->endSection() ?>
<?php endif; ?>
<!------------------------------------------->
<!-- Variables generales usadas en los ficheros js -->
<!------------------------------------------->
<?php if (str_contains($formAction, 'edit')): ?>
<?= $this->section("additionalInlineJs") ?>
window.token_ajax= {<?= csrf_token() ?? "token" ?>: <?= csrf_token() ?>v};
window.csrf_token = '<?= csrf_token() ?>';
<?= $this->endSection() ?>
<?php endif; ?>
@ -249,6 +276,9 @@ const url_parts = url.split('/');
<?php if (str_contains($formAction, 'edit')): ?>
<script src="<?= site_url('js_loader/comparadorCosidoTapaBlanda_js') ?>"></script>
<script src="<?= site_url('js_loader/previsualizador_js') ?>"></script>
<script src="<?= site_url('js_loader/tiradasAlternativas_js') ?>"></script>
<script src="<?= site_url('js_loader/datosServicios_js') ?>"></script>
<script src="<?= site_url('js_loader/datosEnvios_js') ?>"></script>
<script src="<?= site_url('themes/vuexy/vendor/libs/two/two.js') ?>"></script>
<?php endif; ?>
<?= $this->endSection() ?>