mirror of
https://git.imnavajas.es/jjimenez/safekat.git
synced 2025-07-25 22:52:08 +00:00
trabajando en presupuesto cubiertas
This commit is contained in:
@ -9,68 +9,11 @@ use CodeIgniter\Config\BaseService;
|
||||
|
||||
class PresupuestoService extends BaseService
|
||||
{
|
||||
/**
|
||||
* CONSTANTES USADAS PARA LOS CALCULOS
|
||||
*/
|
||||
|
||||
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>';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const MARGEN_PAGINAS_ROTATIVA = 15.0;
|
||||
|
||||
|
||||
/**
|
||||
@ -83,7 +26,7 @@ class PresupuestoService extends BaseService
|
||||
* -> 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
|
||||
@ -99,19 +42,9 @@ class PresupuestoService extends BaseService
|
||||
{
|
||||
$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 ($uso!='rotativa') {
|
||||
$formas = PresupuestoService::getNumFormasPlana($uso, $maquina, $datosPedido->ancho, $datosPedido->alto, $datosPedido->isCosido);
|
||||
$response['fields'] = $formas;
|
||||
}
|
||||
|
||||
if ($response['fields']['num_formas']['posicion_formas'] == 'n/a') {
|
||||
@ -155,9 +88,23 @@ class PresupuestoService extends BaseService
|
||||
}
|
||||
// cubierta o sobrecubierta (siempre a color)
|
||||
else if (($cubierta == 1 || $sobrecubierta == 1) && $rotativa == 0) {
|
||||
}
|
||||
// rotativa
|
||||
else if ($rotativa == 1) {
|
||||
// precio papel
|
||||
$pliegos_libro = 1.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::computeLomoPortada($papel_impresion->espesor);
|
||||
|
||||
// peso
|
||||
$ancho_total = $datosPedido->solapas? $datosPedido->ancho + $datosPedido->solapas_ancho:$datosPedido->ancho;
|
||||
$peso = PresupuestoService::computePeso($ancho_total, $datosPedido->alto, $papel_impresion->gramaje);
|
||||
|
||||
// impresion
|
||||
if ($tarifa) {
|
||||
$precio_click = $tarifa;
|
||||
$precio_click_pedido = $pliegos_pedido * $precio_click;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -183,55 +130,179 @@ class PresupuestoService extends BaseService
|
||||
}
|
||||
|
||||
|
||||
private static function getNumFormasPlanaInterior($maquina, $ancho, $alto, $isCosido)
|
||||
/**
|
||||
* Devuelve los calculos para la linea de rotativa.
|
||||
*/
|
||||
public static function getCostesLineaRotativa($maquina, $papel_impresion, $datosPedido, $parametrosRotativa)
|
||||
{
|
||||
$anchoForCalculo = $isCosido ? $ancho * 2 : $ancho;
|
||||
$data = [];
|
||||
|
||||
// horizontales
|
||||
$h1 = floor($maquina->ancho_impresion / $anchoForCalculo);
|
||||
$v1 = floor($maquina->alto_impresion / $alto);
|
||||
$formas_h = $h1 * $v1; //p1
|
||||
$data['resolucion'] = 600;
|
||||
$data['pulgada'] = 1 / 1000000000000.0;
|
||||
$data['superficie'] = round((($datosPedido->ancho / 2.54) / 10) * (($datosPedido->alto / 2.54) / 10), 2);
|
||||
|
||||
// verticales
|
||||
$h2 = floor($maquina->ancho_impresion / $alto);
|
||||
$v2 = floor($maquina->alto_impresion / $anchoForCalculo);
|
||||
$formas_v = $h2 * $v2; //p2
|
||||
// posicionamos paginas en función de a favor de fibra o no
|
||||
|
||||
$anchoLibro = $datosPedido->ancho;
|
||||
$altoLibro = $datosPedido->alto;
|
||||
if (!$parametrosRotativa->a_favor_fibra) {
|
||||
$anchoLibro = $datosPedido->alto;
|
||||
$altoLibro = $datosPedido->ancho;
|
||||
}
|
||||
|
||||
$data['ancho'] = $anchoLibro;
|
||||
$data['alto'] = $altoLibro;
|
||||
|
||||
// si es cosido ancho x 2
|
||||
|
||||
if ($datosPedido->isCosido) {
|
||||
if (!$parametrosRotativa->a_favor_fibra) {
|
||||
$data['alto'] = $data['alto'] * 2;
|
||||
} else {
|
||||
$data['ancho'] = $data['ancho'] * 2;
|
||||
}
|
||||
}
|
||||
|
||||
// calculo de papel y clicks
|
||||
$factor_anchura = round($maquina->ancho_impresion / $data['ancho'], 2);
|
||||
$factor_altura = round($maquina->alto_impresion / ($data['alto'] + self::MARGEN_PAGINAS_ROTATIVA), 2);
|
||||
$factor_altura_click = round($maquina->alto_click / ($data['alto'] + self::MARGEN_PAGINAS_ROTATIVA), 2);
|
||||
|
||||
$multiplicador_pliego = $datosPedido->isCosido ? 4 : 2;
|
||||
$paginas_por_pliego = round(floor($factor_anchura) * $factor_altura * $multiplicador_pliego, 2);
|
||||
$pliegos_libro = round($paginas_por_pliego ? $datosPedido->paginas / $paginas_por_pliego : 0, 2);
|
||||
$metros_papel_libro = round($pliegos_libro * ($maquina->alto_impresion / 1000.0), 2);
|
||||
$metros_papel_total = round($metros_papel_libro * ($datosPedido->tirada + $datosPedido->merma), 2);
|
||||
|
||||
$paginas_por_pliego_click = round(floor($factor_anchura) * $factor_altura_click * $multiplicador_pliego, 2);
|
||||
$pliegos_libro_click = round($paginas_por_pliego_click ? $datosPedido->paginas / $paginas_por_pliego_click : 0, 2);
|
||||
$clicks_libro = round(ceil($pliegos_libro_click) * 2, 2);
|
||||
$clicks_pedido = round($clicks_libro * ($datosPedido->tirada + $datosPedido->merma), 2);
|
||||
|
||||
$data['factor_altura'] = $factor_altura;
|
||||
$data['factor_anchura'] = $factor_anchura;
|
||||
$data['paginas_por_pliego'] = $paginas_por_pliego;
|
||||
$data['pliegos_libro'] = $pliegos_libro;
|
||||
$data['pliegos_pedido'] = $pliegos_libro * ($datosPedido->tirada + $datosPedido->merma);
|
||||
$data['metros_papel_libro'] = $metros_papel_libro;
|
||||
$data['metros_papel_total'] = $metros_papel_total;
|
||||
$data['clicks_libro'] = $clicks_libro;
|
||||
$data['clicks_pedido'] = $clicks_pedido;
|
||||
|
||||
// calculo de tintas
|
||||
$data['num_gotas_negro'] = round($data['superficie'] * $data['resolucion'] * $data['resolucion'] * ($parametrosRotativa->rotativa_negro / 100.0), 0);
|
||||
$data['num_gotas_cyan'] = round($data['superficie'] * $data['resolucion'] * $data['resolucion'] * ($parametrosRotativa->rotativa_cyan / 100.0), 0);
|
||||
$data['num_gotas_magenta'] = round($data['superficie'] * $data['resolucion'] * $data['resolucion'] * ($parametrosRotativa->rotativa_magenta / 100.0), 0);
|
||||
$data['num_gotas_amarillo'] = round($data['superficie'] * $data['resolucion'] * $data['resolucion'] * ($parametrosRotativa->rotativa_amarillo / 100.0), 0);
|
||||
|
||||
$pag_negro = $parametrosRotativa->bnPages;
|
||||
$pag_color = 0;
|
||||
if ($parametrosRotativa->colorPages>0) {
|
||||
$pag_color = $parametrosRotativa->colorPages;
|
||||
}
|
||||
|
||||
// peso tintas
|
||||
$data['peso_gotas_negro'] = round((($data['num_gotas_negro'] * $parametrosRotativa->rotativa_gota_negro * $data['pulgada']) / (17.91 / 20.0)) * $pag_negro * 1000, 6);
|
||||
$data['peso_gotas_cyan'] = round((($data['num_gotas_cyan'] * $parametrosRotativa->rotativa_gota_color * $data['pulgada']) / (17.65 / 20.0)) * $pag_color * 1000, 6);
|
||||
$data['peso_gotas_magenta'] = round((($data['num_gotas_magenta'] * $parametrosRotativa->rotativa_gota_color * $data['pulgada']) / (17.65 / 20.0)) * $pag_color * 1000, 6);
|
||||
$data['peso_gotas_amarillo'] = round((($data['num_gotas_amarillo'] * $parametrosRotativa->rotativa_gota_color * $data['pulgada']) / (17.65 / 20.0)) * $pag_color * 1000, 6);
|
||||
|
||||
// costes de tintas
|
||||
$data['peso_gotas_negro_pedido'] = round($data['peso_gotas_negro'], 2) * ($datosPedido->tirada + $datosPedido->merma);
|
||||
$data['peso_gotas_cyan_pedido'] = round($data['peso_gotas_cyan'], 2) * ($datosPedido->tirada + $datosPedido->merma);
|
||||
$data['peso_gotas_magenta_pedido'] = round($data['peso_gotas_magenta'], 2) * ($datosPedido->tirada + $datosPedido->merma);
|
||||
$data['peso_gotas_amarillo_pedido'] = round($data['peso_gotas_amarillo'], 2) * ($datosPedido->tirada + $datosPedido->merma);
|
||||
|
||||
// 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);
|
||||
|
||||
// precio pagina
|
||||
$data['precio_pagina_negro'] = round($pag_negro ? $data['precio_tinta'] / ($pag_negro * ($datosPedido->tirada + $datosPedido->merma)) : 0, 6);
|
||||
$data['precio_pagina_color'] = round($pag_color ? $data['precio_tinta'] / ($pag_color * ($datosPedido->tirada + $datosPedido->merma)) : 0, 6);
|
||||
|
||||
// calculo de corte
|
||||
$data['tiempo_corte'] = $maquina->velocidad_corte > 0 ? round($metros_papel_total / $maquina->velocidad_corte, 2) : 0;
|
||||
$data['total_corte'] = round(($data['tiempo_corte'] / 60.0) * $maquina->precio_hora_corte, 2);
|
||||
|
||||
$data['mano'] = PresupuestoService::computeLomoInterior($datosPedido->paginas, $papel_impresion->espesor);
|
||||
// ($paginas / 2.0) * (($gramaje / 1000.0) * $papel_compra->mano);
|
||||
|
||||
// peso
|
||||
$data['peso'] = PresupuestoService::computePeso(
|
||||
ancho: $datosPedido->isCosido ? $datosPedido->ancho / 2.0 : $datosPedido->ancho,
|
||||
alto: $datosPedido->alto,
|
||||
gramaje: $papel_impresion->gramaje,
|
||||
paginas: $datosPedido->paginas
|
||||
);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
private static function getNumFormasPlana($uso, $maquina, $ancho, $alto, $isCosido)
|
||||
{
|
||||
if($uso == 'cubierta' || $uso == 'sobrecubierta') {
|
||||
if(property_exists($maquina, 'forzar_num_formas_horizontales_cubierta') &&
|
||||
property_exists($maquina, 'forzar_num_formas_horizontales_cubierta')){
|
||||
|
||||
if($maquina->forzar_num_formas_horizontales_cubierta > 0 &&
|
||||
$maquina->forzar_num_formas_horizontales_cubierta > 0){
|
||||
|
||||
$h1 = $maquina->forzar_num_formas_horizontales_cubierta;
|
||||
$h2 = $maquina->forzar_num_formas_verticales_cubierta;
|
||||
$num_formas = $h1 * $h2;
|
||||
}
|
||||
else{
|
||||
$num_formas == 0;
|
||||
}
|
||||
}
|
||||
else{
|
||||
$num_formas == 0;
|
||||
}
|
||||
}
|
||||
else{
|
||||
|
||||
if($uso != 'cubierta' && $uso != 'sobrecubierta'){
|
||||
$anchoForCalculo = $isCosido ? $ancho * 2 : $ancho;
|
||||
}
|
||||
else{
|
||||
$anchoForCalculo = $ancho;
|
||||
}
|
||||
|
||||
|
||||
// horizontales
|
||||
$h1_temp = floor($maquina->ancho_impresion / $anchoForCalculo);
|
||||
$calles = (new \App\Models\Configuracion\MaquinasCallesModel())->getCallesForMaquina($maquina->maquina_id, $h1_temp);
|
||||
// Si son mas de 2 formas
|
||||
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;
|
||||
|
||||
$v1 = floor($maquina->alto_impresion / $alto);
|
||||
$formas_h = $h1 * $v1; //p1
|
||||
|
||||
// verticales
|
||||
|
||||
$h2_temp = floor($maquina->ancho_impresion / $alto);
|
||||
$calles = (new \App\Models\Configuracion\MaquinasCallesModel())->getCallesForMaquina($maquina->maquina_id, $h2_temp);
|
||||
if(count($calles)>0)
|
||||
$h2 = ($h2_temp * $anchoForCalculo + 2 * $calles[0]->externas + ($h2_temp - 1) * $calles[0]->internas < ($maquina->ancho)) ? $h2_temp : $h2_temp - 1;
|
||||
else
|
||||
$h2 = $h2_temp;
|
||||
$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;
|
||||
}
|
||||
}
|
||||
if($uso != 'cubierta' && $uso != 'sobrecubierta'){
|
||||
$num_formas = $isCosido ? $num_formas * 2 : $num_formas;
|
||||
}
|
||||
// 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) {
|
||||
@ -252,14 +323,14 @@ class PresupuestoService extends BaseService
|
||||
}
|
||||
|
||||
|
||||
private static function getPrecioPliego($maquina, $papel_impresion, $paginas)
|
||||
public 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;
|
||||
$precio_pliego = ($peso_por_pliego * $papel_impresion->precio_tonelada / 1000000.0) * (1 + (floatval($margen[0]['margen']) / 100.0));
|
||||
|
||||
return round($precio_pliego*1.04, 6); // quitar el factor de 1.04 despues de los test
|
||||
return round($precio_pliego, 6);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@ -279,6 +350,14 @@ class PresupuestoService extends BaseService
|
||||
return $lomo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calcula la dimensión del lomo para portada y cubierta
|
||||
*/
|
||||
private static function computeLomoPortada($espesor)
|
||||
{
|
||||
return ($espesor * 2.0) / 1000.0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Devuelve el peso de un pedido.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user