Files
safekat/ci4/app/Services/PresupuestoClienteService.php

605 lines
21 KiB
PHP

<?php
namespace App\Services;
use CodeIgniter\Config\BaseService;
use App\Services\PresupuestoService;
class PresupuestoClienteService extends BaseService
{
public static function obtenerInterior($data)
{
$rotativa = [];
$plana = [];
// no se busca en plana cuando es estándar (no Premium)
if ($data['isHq'])
$plana = PresupuestoClienteService::obtenerPresupuestoClienteInterior($data);
if (!$data['excluirRotativa'] && !$data['isHq'])
$rotativa = PresupuestoClienteService::obtenerPresupuestoClienteInteriorRotativa($data);
$total_plana = -1;
$hay_plana = false;
if ($data['isColor']) {
if (count($plana) > 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)
{
$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) {
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->paginas = $paginas_negro;
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' => 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->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,
'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;
}
}