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 '----------------------------
'; 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 '
';
                var_dump($linea);
                echo '
'; } } } /** * @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; } }