From 991a27286b6bedc51bfaf56a21c357c63b27b618 Mon Sep 17 00:00:00 2001 From: Jaime Jimenez Date: Tue, 26 Sep 2023 09:25:40 +0200 Subject: [PATCH] trabajando en generar la tabla bn interior --- .../Presupuestos/Cosidotapablanda.php | 116 +++++--- ci4/app/Models/Configuracion/MaquinaModel.php | 2 +- .../MaquinasTarifasImpresionModel.php | 52 ++-- ci4/app/Services/PresupuestoService.php | 249 ++++++++++-------- 4 files changed, 263 insertions(+), 156 deletions(-) diff --git a/ci4/app/Controllers/Presupuestos/Cosidotapablanda.php b/ci4/app/Controllers/Presupuestos/Cosidotapablanda.php index 520929dc..9f086deb 100644 --- a/ci4/app/Controllers/Presupuestos/Cosidotapablanda.php +++ b/ci4/app/Controllers/Presupuestos/Cosidotapablanda.php @@ -3,13 +3,19 @@ namespace App\Controllers\Presupuestos; use App\Controllers\GoBaseResourceController; - +use App\Entities\Configuracion\Maquina; use App\Models\Collection; use App\Entities\Presupuestos\PresupuestoEntity; use App\Models\Configuracion\PapelGenericoModel; use App\Models\Presupuestos\PresupuestoModel; +use App\Services\PresupuestoService; +use App\Models\Configuracion\PapelImpresionModel; +use App\Models\Configuracion\MaquinaModel; +use App\Models\Configuracion\MaquinasTarifasImpresionModel; + + class Cosidotapablanda extends \App\Controllers\GoBaseResourceController { @@ -397,43 +403,34 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController $order = PresupuestoModel::SORTABLE[$requestedOrder >= 0 ? $requestedOrder : 0]; $dir = $reqData['order']['0']['dir'] ?? 'asc'; - $resourceData = $this->model->getResource($search)->orderBy($order, $dir)->limit($length, $start)->get()->getResultObject(); - foreach ($resourceData as $item) : - if (isset($item->comentarios_pdf) && strlen($item->comentarios_pdf) > 100) : - $item->comentarios_pdf = character_limiter($item->comentarios_pdf, 100); - endif; - if (isset($item->causa_cancelacion) && strlen($item->causa_cancelacion) > 100) : - $item->causa_cancelacion = character_limiter($item->causa_cancelacion, 100); - endif; - if (isset($item->comentarios) && strlen($item->comentarios) > 100) : - $item->comentarios = character_limiter($item->comentarios, 100); - endif; - if (isset($item->comentarios_safekat) && strlen($item->comentarios_safekat) > 100) : - $item->comentarios_safekat = character_limiter($item->comentarios_safekat, 100); - endif; - if (isset($item->comentarios_tarifa) && strlen($item->comentarios_tarifa) > 100) : - $item->comentarios_tarifa = character_limiter($item->comentarios_tarifa, 100); - endif; - if (isset($item->tirada_alternativa_json_data) && strlen($item->tirada_alternativa_json_data) > 100) : - $item->tirada_alternativa_json_data = character_limiter($item->tirada_alternativa_json_data, 100); - endif; - if (isset($item->titulo) && strlen($item->titulo) > 100) : - $item->titulo = character_limiter($item->titulo, 100); - endif; - if (isset($item->paginas_color_posicion) && strlen($item->paginas_color_posicion) > 100) : - $item->paginas_color_posicion = character_limiter($item->paginas_color_posicion, 100); - endif; - if (isset($item->aprobado_json_data) && strlen($item->aprobado_json_data) > 100) : - $item->aprobado_json_data = character_limiter($item->aprobado_json_data, 100); - endif; - if (isset($item->comparador_json_data) && strlen($item->comparador_json_data) > 100) : - $item->comparador_json_data = character_limiter($item->comparador_json_data, 100); - endif; - if (isset($item->ws_externo_json_data) && strlen($item->ws_externo_json_data) > 100) : - $item->ws_externo_json_data = character_limiter($item->ws_externo_json_data, 100); - endif; - endforeach; + $table_type = $reqData['table_type'] ?? null; + if (is_null($table_type)){ + return $this->failNotFound('Table type not found', 404); + } + + switch($table_type){ + case 'comp_int_bn': + + $datosPedido = (object)array( + 'paginas' => $reqData['paginas'] ?? 0, + 'tirada' => $reqData['tirada'] ?? 0, + 'merma' => $reqData['merma'] ?? 0, + 'ancho' => $reqData['alto'] ?? 100000, + 'alto' => $reqData['ancho'] ?? 100000, + 'isCosido' => true, // JJO esto es custom por cada tipo de presupuesto + ); + + $papel_generico_id = $reqData['papel_generico_id'] ?? 0; + $gramaje = $reqData['gramaje'] ?? 0; + + $resourceData = $this->getCompBnData($datosPedido, $papel_generico_id, $gramaje); + break; + + default: + break; + } + return $this->respond(Collection::datatable( $resourceData, $this->model->getResource()->countAllResults(), @@ -444,6 +441,51 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController } } + private function getCompBnData($datosPedido, $papel_generico_id, $gramaje){ + $uso = 'interior'; + $tipo = 'negro'; + + $opciones_papel = array( + 'bn' => 1, + 'cubierta' => 0, + 'sobrecubierta' => 0, + 'rotativa' => 0, + ); + + // Se obtienen los papeles disponibles + $papelimpresionmodel = new PapelImpresionModel(); + $papeles = $papelimpresionmodel->getIdPapelesImpresionForPresupuesto( + papel_generico_id: $papel_generico_id, + gramaje: $gramaje, + options: $opciones_papel + ); + + $resultado = json_encode( + array('data' => array()) + ); + + // Para cada papel, se obtienen las maquinas disponibles + foreach ($papeles as $papel) { + $maquinamodel = new MaquinaModel(); + $maquinas = $maquinamodel->getMaquinaImpresionForPresupuesto( + is_rotativa: $papel->rotativa, + tarifa_tipo: $tipo, + tirada: $datosPedido->tirada + $datosPedido->merma, + papel_impresion_id: $papel->id, + ); + + // Se recorren las máquinas y se calcula el coste de linea por cada una + foreach ($maquinas as $maquina) { + $tarifamodel = new MaquinasTarifasImpresionModel(); + $tarifa = $tarifamodel->getTarifa($maquina->maquina_id, $uso, $tipo); + $linea = PresupuestoService::getCostesLinea($uso, $tipo, $datosPedido, $maquina, $papel, $opciones_papel, $tarifa); + } + } + + return $resultado; + + } + public function allItemsSelect() { if ($this->request->isAJAX()) { diff --git a/ci4/app/Models/Configuracion/MaquinaModel.php b/ci4/app/Models/Configuracion/MaquinaModel.php index 140774fc..3e85761c 100644 --- a/ci4/app/Models/Configuracion/MaquinaModel.php +++ b/ci4/app/Models/Configuracion/MaquinaModel.php @@ -350,7 +350,7 @@ class MaquinaModel extends \App\Models\GoBaseModel ->select( "t1.id AS maquina_id, t1.nombre AS maquina, t1.ancho_impresion AS ancho_impresion, t1.alto_impresion AS alto_impresion, t1.ancho AS ancho, t1.alto AS alto, - t1.is_rotativa AS is rotativa" + t1.is_rotativa AS is rotativa, t1.alto_click AS alto_click" ) ->join("lg_maquinas_tarifas_impresion t2", "t1.id = t2.maquina_id", "left") ->join("lg_maquina_papel_impresion t3", "t1.id = t3.maquina_id", "left") diff --git a/ci4/app/Models/Configuracion/MaquinasTarifasImpresionModel.php b/ci4/app/Models/Configuracion/MaquinasTarifasImpresionModel.php index 62b3e037..2dc1c9f7 100644 --- a/ci4/app/Models/Configuracion/MaquinasTarifasImpresionModel.php +++ b/ci4/app/Models/Configuracion/MaquinasTarifasImpresionModel.php @@ -1,4 +1,5 @@ db ->table($this->table . " t1") @@ -97,24 +98,45 @@ class MaquinasTarifasImpresionModel extends \App\Models\GoBaseModel ); //JJO - $builder->where('maquina_id', $maquina_id); + $builder->where('maquina_id', $maquina_id); $builder->where("t1.is_deleted", 0); - + $builder->join("lg_maquinas t2", "t1.maquina_id = t2.id", "left"); return empty($search) ? $builder : $builder - ->groupStart() - ->like("t1.id", $search) - ->orLike("t1.tipo", $search) - ->orLike("t1.precio", $search) - ->orLike("t1.uso", $search) - ->orLike("t1.id", $search) - ->orLike("t1.maquina_id", $search) - ->orLike("t1.tipo", $search) - ->orLike("t1.precio", $search) - ->orLike("t1.uso", $search) - ->groupEnd(); + ->groupStart() + ->like("t1.id", $search) + ->orLike("t1.tipo", $search) + ->orLike("t1.precio", $search) + ->orLike("t1.uso", $search) + ->orLike("t1.id", $search) + ->orLike("t1.maquina_id", $search) + ->orLike("t1.tipo", $search) + ->orLike("t1.precio", $search) + ->orLike("t1.uso", $search) + ->groupEnd(); + } + + public function getTarifa($maquina_id = -1, $uso = " ", $tipo = " ") + { + $builder = $this->db + ->table($this->table . " t1") + ->select( + "t1.precio AS precio" + ); + + //JJO + $builder->where('maquina_id', $maquina_id); + $builder->where('tipo', $tipo); + $builder->where('uso', $uso); + $builder->where("t1.is_deleted", 0); + + $tarifas = $builder->get()->getResultArray(); + if (count($tarifas)>0){ + return floatval($tarifas[0]['precio']); + } + return $tarifas; } } diff --git a/ci4/app/Services/PresupuestoService.php b/ci4/app/Services/PresupuestoService.php index 339dae09..48173d27 100644 --- a/ci4/app/Services/PresupuestoService.php +++ b/ci4/app/Services/PresupuestoService.php @@ -12,13 +12,24 @@ 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'; - $cantidad = (object)array( + $datosPedido = (object)array( 'paginas' => 200, 'tirada' => 500, 'merma' => 10, 'merma_portada' => 10, + 'ancho' => 165, + 'alto' => 148, + 'isCosido' => true, ); @@ -32,9 +43,6 @@ class PresupuestoService extends BaseService 'rotativa' => 0, ); $papelimpresionmodel = new \App\Models\Configuracion\PapelImpresionModel(); - - echo 'Papeles impresion con gramaje=90'; - $papeles = $papelimpresionmodel->getIdPapelesImpresionForPresupuesto( papel_generico_id: 4, gramaje: 90, @@ -45,93 +53,32 @@ class PresupuestoService extends BaseService $maquinas = $maquina_model->getMaquinaImpresionForPresupuesto( is_rotativa: $papel->rotativa, tarifa_tipo: 'negro', + tirada: $datosPedido->tirada + $datosPedido->merma, papel_impresion_id: $papel->id, - tirada: $cantidad->tirada+$cantidad->merma - ); - echo '
';
-            echo '

Para papel impresion: ' . $papel->nombre . '

'; - echo ''; - var_dump($maquinas); - echo '
'; - } - } - - - /*public static function test2() - { - - $uso = 'interior'; - $tipo = 'negro'; - $cantidad = (object)array( - 'paginas' => 100, - 'tirada' => 50, - 'merma' => 5, - 'merma_portada' => 1, - ); - - - $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: 70, - options: $opciones_papel - ); - foreach ($papeles as $papel) { - echo '-------------------------------'; - $maquinas = $maquina_model->getMaquinaImpresionForPresupuesto( - is_rotativa: $papel->rotativa, - tarifa_tipo: 'negro', - papel_impresion_id: $papel->id ); foreach ($maquinas as $maquina) { - if ($maquina->maquina == 'C1100-ByN') { - - $formas = PresupuestoService::getNumFormasPlanaInterior( - maquina: $maquina, - ancho: 165.0, - alto: 148.0, - isCosido: true - ); - $precio_pliego = PresupuestoService::getPrecioPliego($maquina, $papel); - echo '
';
-                    echo '

Para papel impresion: ' . $papel->nombre . '

'; - echo ''; - var_dump($maquina); - var_dump($formas); - var_dump($precio_pliego); - echo '
'; - } + 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 '
'; } } - }*/ - - public static function test2(){ - - - - $papel = (object) array('id' => 201, 'gramaje'=>70, "precio_tonelada"=>1750); - $maquina = (object) array('alto' => 120, 'ancho'=>200); - echo PresupuestoService::getPrecioPliego($maquina, $papel,2); } + /** * @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 $datos_cantidad + * @param mixed $datosPedido * objeto con la siguiente extructura: * -> paginas: numero de paginas por libro * -> tirada: numero de unidades a imprimir @@ -141,33 +88,101 @@ class PresupuestoService extends BaseService * objeto con la siguiente estructura: * -> id: el id de la maquina * -> nombre: nombre de la maquina - * -> calles: objeto con la configuracion de las calles de la maquina - * -> formas: numero de formas - * -> calle_interna: valor de las calles internas de la maquina - * -> calle_externa: valor de las calles externas 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 function getCostesLinea($uso, $tipo, $datos_cantidad, $maquina, $temp) + public static function getCostesLinea($uso, $tipo, $datosPedido, $maquina, $papel_impresion, $opciones_papel, $tarifa) { + $response['fields'] = []; - $tipo = array_get($args, 'tipo'); - $tirada = array_get($args, 'tirada'); - $merma = array_get($args, 'merma'); - $merma_portada = array_get($args, 'merma_portada'); - $ancho = array_get($args, 'ancho'); - $alto = array_get($args, 'alto'); - $paginas = array_get($args, 'paginas'); - $papel = array_get($args, 'papel'); - $papel_compra = array_get($args, 'papel_compra'); - $gramaje = array_get($args, 'gramaje'); - $maquina = array_get($args, 'maquina'); - $tarifa = array_get($args, 'tarifa'); - $cosido = array_get($args, 'cosido', false); + 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; @@ -193,10 +208,6 @@ class PresupuestoService extends BaseService // solo hay calles para 2 formas o mas if ((($formas_h > $formas_v) ? $h1 : $h2) > 1) { - var_dump($formas_v); - var_dump($formas_h); - var_dump($h1); - var_dump(($formas_h > $formas_v)); $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) + @@ -213,7 +224,7 @@ class PresupuestoService extends BaseService $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) { @@ -225,15 +236,16 @@ class PresupuestoService extends BaseService // 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) { + } 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; @@ -243,12 +255,43 @@ class PresupuestoService extends BaseService private static function getPrecioPliego($maquina, $papel_impresion, $paginas) { $margen = (new \App\Models\Configuracion\PapelImpresionMargenModel())->getMargenFormPags($papel_impresion->id, $paginas); - if(count($margen)>0){ + 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 = $papel_impresion->precio_tonelada * (1 + (floatval($margen[0]['margen']) / 100.0)) / 1000000 * $peso_por_pliego; return round($precio_pliego, 6); } 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; + } }