0) { if ($data['datosPedido']->paginas == $data['paginas_color']) { if (count($plana[1]) > 2) $total_plana += floatval($plana[1]['total_impresion']); else return -1; } else { if (count($plana[0]) > 2 && count($plana[1]) > 2) { $total_plana = 0.0; foreach ($plana as $linea) { if (count($linea) > 0) $total_plana += floatval($linea['total_impresion']); } } } } } else { foreach ($plana as $linea) { if (count($linea) > 0) if ($linea['tipo_linea'] == 'lp_bn' || $linea['tipo_linea'] == 'lp_bnhq') { $total_plana = 0.0; $total_plana = floatval($linea['total_impresion']); } } } $total_rotativa = -1; if (!$data['excluirRotativa'] && count($rotativa) > 0 && $rotativa['num_formas']['posicion_formas'] != 'n/a') { $total_rotativa = floatval($rotativa['total_impresion']); } if ($total_plana < 0 && $total_rotativa < 0) return []; else { if ($total_plana > $total_rotativa) return $plana; else return [$rotativa]; } } public static function obtenerCubierta($data, $return_raw=false) { $uso = $data['uso']; $tipo_impresion_id = $data['tipo_impresion_id']; $datosPedido = $data['datosPedido']; $papel_generico = $data['papel_generico']; $gramaje = $data['gramaje']; $isColor = $data['isColor']; $isHq = $data['isHq']; $cliente_id = $data['cliente_id']; $lomoRedondo = $data['lomoRedondo']; $lineas_cubierta = []; for ($i = 0; $i < 2; $i++) { $lineas = PresupuestoService::obtenerComparadorPlana([ 'uso' => $uso, 'tipo_impresion_id' => $tipo_impresion_id, 'datosPedido' => $datosPedido, 'papel_generico' => $papel_generico, 'gramaje' => $gramaje, 'isColor' => $isColor, 'isHq' => $isHq, 'cliente_id' => $cliente_id, 'a_favor_fibra' => $i, 'lomoRedondo' => $lomoRedondo ]); if (count($lineas) > 0) { $lineas_cubierta = array_merge($lineas_cubierta, $lineas); } } if (count($lineas_cubierta) > 0) { if($return_raw){ $lineas_cubierta = array_values(array_unique($lineas_cubierta, SORT_REGULAR)); return[ 'cubierta' => $lineas_cubierta ]; } usort( $lineas_cubierta, function ($a, $b) { $result = 0; if (floatval($a['fields']['total_impresion']) > floatval($b['fields']['total_impresion'])) $result = 1; else if (floatval($a['fields']['total_impresion']) < floatval($b['fields']['total_impresion'])) $result = -1; return $result; } ); $lineas_cubierta = $lineas_cubierta[0]['fields']; $lineas_cubierta['tipo_linea'] = 'lp_cubierta'; } return $lineas_cubierta; } public static function obtenerSobrecubierta($data, $return_raw=false) { $uso = $data['uso']; $tipo_impresion_id = $data['tipo_impresion_id']; $datosPedido = $data['datosPedido']; $papel_generico = $data['papel_generico']; $gramaje = $data['gramaje']; $isColor = $data['isColor']; $isHq = $data['isHq']; $cliente_id = $data['cliente_id']; $paginas_color = $data['paginas_color']; $lineas_sobrecubierta = []; for ($i = 0; $i < 2; $i++) { $lineas = PresupuestoService::obtenerComparadorPlana([ 'uso' => $uso, 'tipo_impresion_id' => $tipo_impresion_id, 'datosPedido' => $datosPedido, 'papel_generico' => $papel_generico, 'gramaje' => $gramaje, 'isColor' => $isColor, 'isHq' => $isHq, 'cliente_id' => $cliente_id, 'a_favor_fibra' => $i ]); if (count($lineas) > 0) { $lineas_sobrecubierta = array_merge($lineas_sobrecubierta, $lineas); } } if (count($lineas_sobrecubierta) > 0) { if($return_raw){ $lineas_sobrecubierta = array_values(array_unique($lineas_sobrecubierta, SORT_REGULAR)); return[ 'sobrecubierta' => $lineas_sobrecubierta ]; } usort( $lineas_sobrecubierta, function ($a, $b) { $result = 0; if (floatval($a['fields']['total_impresion']) > floatval($b['fields']['total_impresion'])) $result = 1; else if (floatval($a['fields']['total_impresion']) < floatval($b['fields']['total_impresion'])) $result = -1; return $result; } ); $lineas_sobrecubierta = $lineas_sobrecubierta[0]['fields']; $lineas_sobrecubierta['tipo_linea'] = 'lp_sobrecubierta'; } return $lineas_sobrecubierta; } public static function obtenerGuardas($data, $return_raw=false) { $uso = $data['uso']; $tipo_impresion_id = $data['tipo_impresion_id']; $datosPedido = $data['datosPedido']; $papel_generico = $data['papel_generico']; $gramaje = $data['gramaje']; $isColor = $data['isColor']; $isHq = $data['isHq']; $cliente_id = $data['cliente_id']; $lineas_guardas = []; for ($i = 0; $i < 2; $i++) { $lineas = PresupuestoService::obtenerComparadorPlana([ 'uso' => $uso, 'tipo_impresion_id' => $tipo_impresion_id, 'datosPedido' => $datosPedido, 'papel_generico' => $papel_generico, 'gramaje' => $gramaje, 'isColor' => $isColor, 'isHq' => $isHq, 'cliente_id' => $cliente_id, 'a_favor_fibra' => $i ]); if (count($lineas) > 0) { $lineas_guardas = array_merge($lineas_guardas, $lineas); } } if (count($lineas_guardas) > 0) { if($return_raw){ $lineas_guardas = array_values(array_unique($lineas_guardas, SORT_REGULAR)); return[ 'guardas' => $lineas_guardas ]; } usort( $lineas_guardas, function ($a, $b) { $result = 0; if (floatval($a['fields']['total_impresion']) > floatval($b['fields']['total_impresion'])) $result = 1; else if (floatval($a['fields']['total_impresion']) < floatval($b['fields']['total_impresion'])) $result = -1; return $result; } ); $lineas_guardas = $lineas_guardas[0]['fields']; $lineas_guardas['tipo_linea'] = 'lp_guardas'; } return $lineas_guardas; } /** * Obtiene las lineas de plana en el presupuesto de cliente * Selecciona entre las más económicas * Parámetros: * - uso: en este caso esta variable está fija a 'interior' * - tipo: tipo de impresión * - datosPedido: datos del pedido * * paginas: número de páginas * * tirada: número de ejemplares * * merma: merma * * ancho: ancho del libro * * alto: alto del libro * * isCosido: si está cosido * - cliente_id: id del cliente * - papel_generico: papel genérico (array con id y nombre) * - isColor: si es a color * - isHq: si es alta calidad * - paginas_color: número de páginas a color */ public static function obtenerPresupuestoClienteInterior($data, $return_raw = false) { $uso = $data['uso']; $tipo_impresion_id = $data['tipo_impresion_id']; $datosPedido = $data['datosPedido']; $paginas_color = $data['paginas_color']; if ($data['papelInteriorDiferente'] == false) $papel_generico = $data['papel_generico']; else { $papel_generico = $data['papel_generico']['negro']; if($paginas_color>0) $papel_generico_color = $data['papel_generico']['color']; } if ($data['papelInteriorDiferente'] == false) $gramaje = $data['gramaje']; else { $gramaje = $data['gramaje']['negro']; if($paginas_color>0) $gramaje_color = $data['gramaje']['color']; } $isColor = $data['isColor']; $isHq = $data['isHq']; $cliente_id = $data['cliente_id']; $paginas_negro = $datosPedido->paginas - $paginas_color; $linea_negro_plana = []; $linea_color_plana = []; // Negro if ($datosPedido->paginas > $paginas_color) { $datosPedido_negro = clone $datosPedido; $datosPedido_negro->paginas = $paginas_negro; for ($i = 0; $i < 2; $i++) { $lineas = PresupuestoService::obtenerComparadorPlana([ 'uso' => $uso, 'tipo_impresion_id' => $tipo_impresion_id, 'datosPedido' => $datosPedido_negro, 'papel_generico' => $papel_generico, 'gramaje' => $gramaje, 'isColor' => false, 'isHq' => $isHq, 'cliente_id' => $cliente_id, 'a_favor_fibra' => $i ]); if (count($lineas) > 0) { $linea_negro_plana = array_merge($linea_color_plana, $lineas); } } if (count($linea_negro_plana) > 0) { /*if($return_raw){ $linea_negro_plana = array_values(array_unique($linea_color_plana, SORT_REGULAR)); return[ 'negro' => $linea_negro_plana ]; }*/ usort( $linea_negro_plana, function ($a, $b) { $result = 0; if (floatval($a['fields']['total_impresion']) > floatval($b['fields']['total_impresion'])) $result = 1; else if (floatval($a['fields']['total_impresion']) < floatval($b['fields']['total_impresion'])) $result = -1; return $result; } ); } } // Color if ($paginas_color > 0) { $datosPedido_color = clone $datosPedido; $datosPedido_color->paginas = $paginas_color; for ($i = 0; $i < 2; $i++) { if ($data['papelInteriorDiferente'] == true) { $papel_generico = $papel_generico_color; $gramaje = $gramaje_color; } $lineas = PresupuestoService::obtenerComparadorPlana([ 'uso' => $uso, 'tipo_impresion_id' => $tipo_impresion_id, 'datosPedido' => $datosPedido_color, 'papel_generico' => $papel_generico, 'gramaje' => $gramaje, 'isColor' => true, 'isHq' => $isHq, 'cliente_id' => $cliente_id, 'a_favor_fibra' => $i ]); if (count($lineas) > 0) { $linea_color_plana = array_merge($linea_color_plana, $lineas); } } if (count($linea_color_plana) > 0) { /*if($return_raw){ $linea_color_plana = array_values(array_unique($linea_color_plana, SORT_REGULAR)); return[ 'color' => $linea_color_plana ]; }*/ usort( $linea_color_plana, function ($a, $b) { $result = 0; if (floatval($a['fields']['total_impresion']) > floatval($b['fields']['total_impresion'])) $result = 1; else if (floatval($a['fields']['total_impresion']) < floatval($b['fields']['total_impresion'])) $result = -1; return $result; } ); } } if($return_raw){ $linea_negro_plana = array_values(array_unique($linea_negro_plana, SORT_REGULAR)); $linea_color_plana = array_values(array_unique($linea_color_plana, SORT_REGULAR)); return[ 'negro' => $linea_negro_plana, 'color' => $linea_color_plana ]; } // Si hay negro y color, y se hace con el mismo papel, hay que buscar la combinación // más económica con la misma máquna if ( $paginas_negro > 0 && $paginas_color > 0 && $data['papelInteriorDiferente'] == 0 && count($linea_negro_plana) > 0 && count($linea_color_plana) > 0 ) { $mejor_combinacion = null; $coste_menor = PHP_INT_MAX; // Iteramos ambos arrays foreach ($linea_color_plana as $color_item) { foreach ($linea_negro_plana as $negro_item) { // Comparar si tienen el mismo 'maquina_id' if ($color_item['fields']['maquina_id'] == $negro_item['fields']['maquina_id']) { // Sumar los 'total_impresion' de ambas líneas $costo_total = $color_item['fields']['total_impresion'] + $negro_item['fields']['total_impresion']; // Verificar si es la combinación más barata hasta ahora if ($costo_total < $coste_menor) { $coste_menor = $costo_total; $mejor_combinacion = [ 'maquina_id' => $color_item['fields']['maquina_id'], 'costo_total' => $costo_total, 'color_item' => $color_item, 'negro_item' => $negro_item, ]; } } } // Retornar la mejor combinación encontrada if ($mejor_combinacion !== null) { return [$mejor_combinacion['negro_item']['fields'], $mejor_combinacion['color_item']['fields']]; } else { return []; } } } else { if (count($linea_negro_plana) > 0) { $linea_negro_plana = $linea_negro_plana[0]['fields']; $linea_negro_plana['tipo_linea'] = $isHq ? 'lp_bnhq' : 'lp_bn'; } if (count($linea_color_plana) > 0) { $linea_color_plana = $linea_color_plana[0]['fields']; $linea_color_plana['tipo_linea'] = $isHq ? 'lp_colorhq' : 'lp_color'; } } return [$linea_negro_plana, $linea_color_plana]; } public static function getServiciosEncuadernacionDefault($data) { $tipo_impresion_id = $data['tipo_impresion_id'] ?? -1; $tirada = $data['tirada'] ?? -1; $paginas = $data['paginas'] ?? -1; $ancho = $data['ancho'] ?? -1; $alto = $data['alto'] ?? -1; $POD = $data['POD'] ?? -1; $solapas = $data['solapas'] ?? -1; $paginasCuadernillo = $data['paginasCuadernillo'] ?? null; $model = model('App\Models\Presupuestos\PresupuestoEncuadernacionesModel'); $values = $model->initPresupuesto($tipo_impresion_id, $solapas, $tirada, $paginas, $ancho, $alto, $POD, $paginasCuadernillo); return $values; } public static function getServiciosManipuladoDefault($data) { $tipo_impresion_id = $data['tipo_impresion_id'] ?? -1; $tirada = $data['tirada'] ?? -1; $POD = $data['POD'] ?? -1; $solapas = $data['solapas'] ?? -1; $model = model('App\Models\Presupuestos\PresupuestoManipuladosModel'); $values = $model->initPresupuesto($tipo_impresion_id, $solapas, $tirada, $POD); return $values; } public static function getServiciosManipulado($data) { $tarifa_id = $data['tarifa_id'] ?? -1; $tirada = $data['tirada'] ?? -1; $POD = $data['POD'] ?? -1; $model = model('App\Models\Presupuestos\PresupuestoManipuladosModel'); $values = $model->getPrecioTarifa($tarifa_id, $tirada, $POD); return $values; } public static function getServiciosPreimpresion($data) { $tarifa_id = $data['tarifa_id'] ?? -1; $model = model('App\Models\Presupuestos\PresupuestoPreimpresionesModel'); $values = $model->getPrecioTarifa($tarifa_id); return $values; } public static function getServiciosExtra($data) { $tarifa_id = $data['tarifa_id'] ?? -1; $model = model('App\Models\Presupuestos\PresupuestoServiciosExtraModel'); $values = $model->getPrecioTarifa($tarifa_id); return $values; } public static function getServiciosAcabados($data) { $tarifa_id = $data['tarifa_id'] ?? -1; $tirada = $data['tirada'] ?? -1; $POD = $data['POD'] ?? -1; $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); $values = $model->getPrecioTarifa($tarifa_id, $tirada, -1, $POD); // proveedor más barato return $values; } /** * Obtiene las lineas de rotativa en el presupuesto de cliente * Selecciona entre las más económicas * Parámetros: * - uso: en este caso esta variable está fija a 'interior' * - tipo: tipo de impresión * - datosPedido: datos del pedido * * paginas: número de páginas * * tirada: número de ejemplares * * merma: merma * * ancho: ancho del libro * * alto: alto del libro * * isCosido: si está cosido * - cliente_id: id del cliente * - papel_generico: papel genérico (array con id y nombre) * - isColor: si es a color * - isHq: si es alta calidad * - paginas_color: número de páginas a color */ public static function obtenerPresupuestoClienteInteriorRotativa($data, $return_raw = false) { $datosPedido = $data['datosPedido']; $papel_generico = $data['papel_generico']; $gramaje = $data['gramaje']; $cliente_id = $data['cliente_id']; $paginas_color = $data['paginas_color']; $paginas = (object) array( 'negro' => $datosPedido->paginas - $paginas_color, 'color' => $paginas_color ); $linea_rotativa = []; for ($i = 0; $i < 2; $i++) { $datosPedido->a_favor_fibra = $i; $lineas = PresupuestoService::obtenerComparadorRotativa([ 'paginas' => $paginas, 'datosPedido' => $datosPedido, 'papel_generico' => $papel_generico, 'gramaje' => $gramaje, 'cliente_id' => $cliente_id, 'datosTipolog' => null ]); if (count($lineas) > 0) { $linea_rotativa = array_merge($linea_rotativa, $lineas); } } $linea_rotativa = array_filter($linea_rotativa, function($item) { return count($item['fields']['num_formas']) > 1; }); if (count($linea_rotativa) > 0) { if($return_raw){ $linea_rotativa = array_values(array_unique($linea_rotativa, SORT_REGULAR)); return[ 'rotativa' => $linea_rotativa, ]; } usort( $linea_rotativa, function ($a, $b) { $result = 0; if (floatval($a['fields']['total_impresion']) > floatval($b['fields']['total_impresion'])) $result = 1; else if (floatval($a['fields']['total_impresion']) < floatval($b['fields']['total_impresion'])) $result = -1; return $result; } ); $linea_rotativa = $linea_rotativa[0]['fields']; $linea_rotativa['tipo_linea'] = $paginas_color > 0 ? 'lp_rot_color' : 'lp_rot_bn'; } return $linea_rotativa; } }