mirror of
https://git.imnavajas.es/jjimenez/safekat.git
synced 2025-07-25 22:52:08 +00:00
298 lines
11 KiB
PHP
298 lines
11 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use CodeIgniter\Config\BaseService;
|
|
|
|
|
|
|
|
|
|
class PresupuestoService extends BaseService
|
|
{
|
|
|
|
public static function test()
|
|
{
|
|
$tarifa = (new \App\Models\Configuracion\MaquinasTarifasImpresionModel())->getTarifa(8, "interior", "negro");
|
|
var_dump($tarifa);
|
|
}
|
|
|
|
|
|
public static function test2()
|
|
{
|
|
|
|
$uso = 'interior';
|
|
$tipo = 'negro';
|
|
$datosPedido = (object)array(
|
|
'paginas' => 200,
|
|
'tirada' => 500,
|
|
'merma' => 10,
|
|
'merma_portada' => 10,
|
|
'ancho' => 165,
|
|
'alto' => 148,
|
|
'isCosido' => true,
|
|
);
|
|
|
|
|
|
$maquina_model = new \App\Models\Configuracion\MaquinaModel();
|
|
|
|
|
|
$opciones_papel = array(
|
|
'bn' => 1,
|
|
'cubierta' => 0,
|
|
'sobrecubierta' => 0,
|
|
'rotativa' => 0,
|
|
);
|
|
$papelimpresionmodel = new \App\Models\Configuracion\PapelImpresionModel();
|
|
$papeles = $papelimpresionmodel->getIdPapelesImpresionForPresupuesto(
|
|
papel_generico_id: 4,
|
|
gramaje: 90,
|
|
options: $opciones_papel
|
|
);
|
|
foreach ($papeles as $papel) {
|
|
echo '-------------------------------';
|
|
$maquinas = $maquina_model->getMaquinaImpresionForPresupuesto(
|
|
is_rotativa: $papel->rotativa,
|
|
tarifa_tipo: 'negro',
|
|
tirada: $datosPedido->tirada + $datosPedido->merma,
|
|
papel_impresion_id: $papel->id,
|
|
);
|
|
|
|
foreach ($maquinas as $maquina) {
|
|
|
|
echo '----------------------------<br>';
|
|
var_dump($maquina->maquina);
|
|
var_dump($papel->nombre);
|
|
$tarifa = (new \App\Models\Configuracion\MaquinasTarifasImpresionModel())->getTarifa($maquina->maquina_id, $uso, $tipo);
|
|
$linea = PresupuestoService::getCostesLinea($uso, $tipo, $datosPedido, $maquina, $papel, $opciones_papel, $tarifa);
|
|
echo '<pre>';
|
|
var_dump($linea);
|
|
echo '</pre>';
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* @param mixed $uso
|
|
* contiene algun parametro de la lista ['interior,'cubierta','sobrecubierta']
|
|
* @param mixed $tipo
|
|
* contiene algun parametro de la lista ['negro','color','negrohq','bicolor','colorhq']
|
|
* @param mixed $datosPedido
|
|
* objeto con la siguiente extructura:
|
|
* -> paginas: numero de paginas por libro
|
|
* -> tirada: numero de unidades a imprimir
|
|
* -> merma: unidades que se añaden a la tirada
|
|
* -> merma_portada: unidades de merma para la portada
|
|
* @param mixed $maquina
|
|
* objeto con la siguiente estructura:
|
|
* -> id: el id de la maquina
|
|
* -> nombre: nombre de la maquina
|
|
* -> ancho_impresion: valor maximo del ancho para imprimir
|
|
* -> alto_impresion: valor maximo del alto para imprimir
|
|
* @param mixed $papel_impresion
|
|
* @param mixed $tarifa
|
|
*
|
|
* @return [type]
|
|
*/
|
|
public static function getCostesLinea($uso, $datosPedido, $maquina, $papel_impresion, $opciones_papel, $tarifa)
|
|
{
|
|
$response['fields'] = [];
|
|
|
|
switch ($uso) {
|
|
case 'interior':
|
|
$formas = PresupuestoService::getNumFormasPlanaInterior($maquina, $datosPedido->ancho, $datosPedido->alto, $datosPedido->isCosido);
|
|
$response['fields'] = $formas;
|
|
break;
|
|
|
|
case 'cubierta':
|
|
case 'sobrecubierta':
|
|
break;
|
|
|
|
case 'rotativa':
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if ($response['fields']['num_formas']['posicion_formas'] == 'n/a') {
|
|
$response['error']['value'] = true;
|
|
$response['error']['message'] = 'no_formas_disponibles';
|
|
return $response;
|
|
}
|
|
|
|
// precio del pliego de impresion
|
|
$precio_pliego_impresion = PresupuestoService::getPrecioPliego($maquina, $papel_impresion, $datosPedido->paginas);
|
|
$precio_click = 0;
|
|
$precio_click_pedido = 0;
|
|
$pliegos_libro = 0;
|
|
|
|
$cubierta = array_key_exists('cubierta', $opciones_papel) ? $opciones_papel['cubierta'] : 0;
|
|
$sobrecubierta = array_key_exists('sobrecubierta', $opciones_papel) ? $opciones_papel['sobrecubierta'] : 0;
|
|
$rotativa = array_key_exists('rotativa', $opciones_papel) ? $opciones_papel['rotativa'] : 0;
|
|
|
|
//interior (bn o color)
|
|
if ($cubierta == 0 && $sobrecubierta == 0 && $rotativa == 0) {
|
|
// precio papel
|
|
$pliegos_libro = ($datosPedido->paginas / 2.0) / $response['fields']['num_formas']['value'];
|
|
$pliegos_pedido = $pliegos_libro * ($datosPedido->tirada + $datosPedido->merma);
|
|
$precio_libro = $pliegos_libro * $precio_pliego_impresion;
|
|
$precio_pedido = $precio_libro * ($datosPedido->tirada + $datosPedido->merma);
|
|
|
|
$mano = PresupuestoService::computeLomoInterior($datosPedido->paginas, $papel_impresion->espesor);
|
|
|
|
// peso
|
|
$peso = PresupuestoService::computePeso(
|
|
ancho: $datosPedido->isCosido ? $datosPedido->ancho / 2.0 : $datosPedido->ancho,
|
|
alto: $datosPedido->alto,
|
|
gramaje: $papel_impresion->gramaje,
|
|
paginas: $datosPedido->paginas
|
|
);
|
|
|
|
// impresion
|
|
$precio_click = $tarifa;
|
|
$precio_click_pedido = $pliegos_pedido * 2 * $precio_click;
|
|
|
|
}
|
|
// cubierta o sobrecubierta (siempre a color)
|
|
else if (($cubierta == 1 || $sobrecubierta == 1) && $rotativa == 0) {
|
|
}
|
|
// rotativa
|
|
else if ($rotativa == 1) {
|
|
}
|
|
|
|
|
|
// response
|
|
$response['fields']['pliegos_libro'] = $pliegos_libro;
|
|
$response['fields']['pliegos_pedido'] = $pliegos_pedido;
|
|
$response['fields']['precios_pliegos'] = $precio_pliego_impresion;
|
|
$response['fields']['precio_libro'] = $precio_libro;
|
|
$response['fields']['precio_pedido'] = $precio_pedido;
|
|
$response['fields']['mano'] = $mano;
|
|
$response['fields']['peso'] = $peso;
|
|
$response['fields']['precio_click'] = $precio_click;
|
|
$response['fields']['precio_click_pedido'] = $precio_click_pedido;
|
|
|
|
$response['fields']['dimensiones_maquina'] = [$maquina->ancho, $maquina->alto];
|
|
$response['fields']['dimensiones_maquina_impresion'] = [$maquina->ancho_impresion, $maquina->alto_impresion];
|
|
$response['fields']['dimensiones_maquina_click'] = [$maquina->ancho_impresion, $maquina->alto_click];
|
|
$response['fields']['dimensiones_libro'] = [$datosPedido->ancho, $datosPedido->alto];
|
|
|
|
//$response['fields']['datos_rotativa'] = $datos_rotativa;
|
|
|
|
return $response;
|
|
}
|
|
|
|
|
|
private static function getNumFormasPlanaInterior($maquina, $ancho, $alto, $isCosido)
|
|
{
|
|
$anchoForCalculo = $isCosido ? $ancho * 2 : $ancho;
|
|
|
|
// horizontales
|
|
$h1 = floor($maquina->ancho_impresion / $anchoForCalculo);
|
|
$v1 = floor($maquina->alto_impresion / $alto);
|
|
$formas_h = $h1 * $v1; //p1
|
|
|
|
// verticales
|
|
$h2 = floor($maquina->ancho_impresion / $alto);
|
|
$v2 = floor($maquina->alto_impresion / $anchoForCalculo);
|
|
$formas_v = $h2 * $v2; //p2
|
|
|
|
// hay que iterar hasta que las formas entren o el num_formas sean ==0
|
|
// se checkea que entran en el numero de calles
|
|
// se obtiene la configuracion de las calles para esa maquina
|
|
$good_configuration = false;
|
|
do {
|
|
$num_formas = ($formas_h > $formas_v) ? $formas_h : $formas_v;
|
|
$num_formas = $isCosido ? $num_formas * 2 : $num_formas;
|
|
|
|
// solo hay calles para 2 formas o mas
|
|
if ((($formas_h > $formas_v) ? $h1 : $h2) > 1) {
|
|
|
|
$calles = (new \App\Models\Configuracion\MaquinasCallesModel())->getCallesForMaquina($maquina->maquina_id, ($formas_h > $formas_v) ? $h1 : $h2)[0];
|
|
// se calcula el tamaño necesario para el numero de formas + el numero de calles internas
|
|
$size_needed = (($formas_h > $formas_v) ? $anchoForCalculo : $alto) * (($formas_h > $formas_v) ? $h1 : $h2) +
|
|
((($formas_h > $formas_v) ? $h1 : $h2) - 1) * $calles->internas;
|
|
|
|
// si el tamaño calculado entra en el area de impresion
|
|
if ($size_needed <= $maquina->ancho_impresion)
|
|
$good_configuration = true;
|
|
// en caso contrario se resta una forma donde corresponda para iterar otra vez
|
|
else {
|
|
if ($formas_h > $formas_v) {
|
|
$formas_h = ($formas_h - 1 > 0) ? $formas_h - 1 : 0;
|
|
} else {
|
|
$formas_v = ($formas_v - 1 > 0) ? $formas_v - 1 : 0;
|
|
}
|
|
}
|
|
}
|
|
// Si solo hay una forma, tiene que entrar en el ancho de impresion
|
|
else if ((($formas_h > $formas_v) ? $h1 : $h2) == 1) {
|
|
if ((($formas_h > $formas_v) ? $h1 : $h2) < $maquina->ancho_impresion) {
|
|
$good_configuration = true;
|
|
}
|
|
}
|
|
} while ($num_formas != 0 && !$good_configuration);
|
|
|
|
// si no hay formas se devuelve n/a
|
|
if ($num_formas == 0) {
|
|
$response['num_formas']['posicion_formas'] = 'n/a'; // not available
|
|
} else if ($formas_h > $formas_v) {
|
|
$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 {
|
|
$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;
|
|
}
|
|
|
|
return $response;
|
|
}
|
|
|
|
|
|
private static function getPrecioPliego($maquina, $papel_impresion, $paginas)
|
|
{
|
|
$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 = $papel_impresion->precio_tonelada * (1 + (floatval($margen[0]['margen']) / 100.0)) / 1000000 * $peso_por_pliego;
|
|
|
|
return round($precio_pliego*1.04, 6); // quitar el factor de 1.04 despues de los test
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/**
|
|
* Devuelve la dimensión del lomo interior.
|
|
*/
|
|
private static function computeLomoInterior($paginas = null, $espesor = null)
|
|
{
|
|
$lomo = 0;
|
|
|
|
if (!is_null($paginas) && !is_null($espesor)) {
|
|
|
|
$lomo += (($espesor * $paginas / 2.0) + 1) / 1000.0;
|
|
}
|
|
|
|
return $lomo;
|
|
}
|
|
|
|
/**
|
|
* Devuelve el peso de un pedido.
|
|
*/
|
|
private static function computePeso($ancho, $alto, $gramaje, $paginas = null)
|
|
{
|
|
$peso = ($ancho / 1000.0) * ($alto / 1000.0) * $gramaje;
|
|
|
|
if (!is_null($paginas)) {
|
|
if ($paginas > 0) {
|
|
$peso *= ($paginas / 2.0);
|
|
}
|
|
}
|
|
|
|
return $peso;
|
|
}
|
|
}
|