mirror of
https://git.imnavajas.es/jjimenez/safekat.git
synced 2025-07-25 22:52:08 +00:00
615 lines
22 KiB
PHP
Executable File
615 lines
22 KiB
PHP
Executable File
<?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, $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;
|
|
}
|
|
}
|