falta guardar tiradas

This commit is contained in:
2024-05-16 14:52:18 +02:00
parent fdb1fe77db
commit b110fd063c
12 changed files with 21745 additions and 186 deletions

View File

@ -17,6 +17,8 @@ use App\Models\Presupuestos\PresupuestoServiciosExtraModel;
use App\Services\PresupuestoClienteService;
use Exception;
use function PHPUnit\Framework\containsOnly;
class Presupuestocliente extends \App\Controllers\BaseResourceController
{
protected $modelName = "PresupuestoModel";
@ -669,7 +671,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
'servicios' => $servicios,
);
$return_data = $this->calcular_presupuesto($datos_presupuesto);
$return_data = $this->calcular_presupuesto($datos_presupuesto, true); //TRUE FOR DEBUG
array_merge($return_data, [$csrfTokenName => $newTokenHash]);
return $this->respond($return_data);
@ -713,41 +715,8 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$peso = $reqData['peso'] ?? 0;
$unidades = $reqData['unidades'] ?? 0;
$entregaPieCalle = $reqData['entregaPieCalle'] ?? 0;
$model = model('App\Models\Clientes\ClienteDireccionesModel');
$data = $model->getDireccion($direccionId);
$modelTarifaEnvio = model('App\Models\Tarifas\TarifaEnvioModel');
$coste = 0;
if ($data > 0) {
$tarifas_envio = $modelTarifaEnvio->getTarifaEnvio($data[0]->pais_id, $peso, $unidades, $entregaPieCalle ? 'palets' : 'cajas');
for ($i = 0; $i < count($tarifas_envio); $i++) {
if ($peso > $tarifas_envio[$i]->peso_max) {
$tarifas_envio[$i]->precio = number_format($tarifas_envio[$i]->peso_min + ($peso - $tarifas_envio[$i]->peso_min) * $tarifas_envio[$i]->precio_adicional, 2);
}
// si no se calcula linealmente
else {
$m = (($tarifas_envio[$i]->precio_max - $tarifas_envio[$i]->precio_min) / ($tarifas_envio[$i]->peso_max - $tarifas_envio[$i]->peso_min));
$b = $tarifas_envio[$i]->precio_max - $m * $tarifas_envio[$i]->peso_max;
$tarifas_envio[$i]->precio = number_format($m * $peso + $b, 2);
}
$tarifas_envio[$i]->margen = $tarifas_envio[$i]->margen;
}
if (count($tarifas_envio) > 1) {
$tarifa_final = array_reduce($tarifas_envio, function ($previous, $current) {
return $current->precio < $previous->precio ? $current : $previous;
});
$coste = $tarifa_final->precio;
} else {
if (count($tarifas_envio) > 0)
$coste = $tarifas_envio[0]->precio;
}
}
if (count($data) > 0) {
$data[0]->coste = $coste;
$data[0]->tipo = $entregaPieCalle ? 'palets' : 'cajas';
}
$data = $this->calcular_coste_envio($direccionId, $peso, $unidades, $entregaPieCalle);
return $this->respond([
'data' => $data,
@ -786,7 +755,6 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$menu = $model->getMenuDirecciones($data['cliente_id']);
return $this->respond([
'data' => $menu,
$csrfTokenName => $newTokenHash
@ -809,6 +777,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$tirada = $reqData['datos_libro']['tirada'] ?? 0;
$selected_tirada = $reqData['tirada'] ?? 0;
$peso_libro = $reqData['peso'] ?? 0;
$tamanio = $reqData['datos_libro']['tamanio'];
$tipo_impresion_id = $this->getTipoImpresion($reqData['datos_libro']['tipo'], $reqData['datos_libro']['tapa']);
$cliente_id = $reqData['datos_libro']['clienteId'] ?? -1;
@ -842,6 +811,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$datos_guardas = $reqData['datos_libro']['guardas'] ?? 0;
$servicios = $reqData['datos_libro']['servicios'] ?? [];
$iva_reducido = $reqData['iva_reducido'];
$datos_presupuesto = array(
'tirada' => $tirada,
@ -890,14 +860,100 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
]);
}
//$model_presupuesto = new PresupuestoModel();
//$id = $model_presupuesto->insertarPresupuestoCliente($selected_tirada, $datos_presupuesto, $datosCabecera, $resultado_presupuesto['info']);
$iva_reducido = $reqData['iva_reducido'];
foreach ($reqData['direcciones'] as $direccion){
$this->guardarLineaEnvio($id, $direccion);
for ($i=0; $i<count($tirada); $i++) {
$resultado_presupuesto['totales'][$i]['coste_envio'] = 0.0;
$resultado_presupuesto['totales'][$i]['margen_envio'] = 0.0;
foreach ($reqData['direcciones'] as $direccion){
$proporcion = intval($direccion['unidades'])/$selected_tirada*100.0;
$unidades_calculo = floor($tirada[$i] * $proporcion / 100.0);
$peso_calculo = $peso_libro / $selected_tirada * $unidades_calculo;
$coste_envio = $this->calcular_coste_envio(
$direccion['id'], $peso_calculo, $unidades_calculo, $direccion['tipo']=='cajas'?0:1);
if(count($coste_envio)> 0){
$coste = $coste_envio[0]->coste;
$margen = ($coste_envio[0]->coste * $coste_envio[0]->margen)/100.0;
$coste -= $margen;
$resultado_presupuesto['totales'][$i]['coste_envio'] += $coste;
$resultado_presupuesto['totales'][$i]['margen_envio'] += $margen;
}
}
}
$model_presupuesto = new PresupuestoModel();
$tiradas_alternativas = [];
$resumen_totales = [];
for ($i=0; $i<count($tirada); $i++) {
if($tirada[$i] != $selected_tirada){
$coste_total = $resultado_presupuesto['totales'][$i]['totalImpresion'] + $resultado_presupuesto['totales'][$i]['totalPapel'] +
$resultado_presupuesto['totales'][$i]['margenImpresion'] + $resultado_presupuesto['totales'][$i]['margenPapel'];
$coste_envio = $resultado_presupuesto['totales'][$i]['coste_envio'] + $resultado_presupuesto['totales'][$i]['margen_envio'];
$margen_total = round(($resultado_presupuesto['totales'][$i]['margenImpresion'] +
$resultado_presupuesto['totales'][$i]['margenPapel'] +
$resultado_presupuesto['totales'][$i]['margen_envio'])/($coste_total+$coste_envio)*100.0, 2);
$total_pedido =round(($coste_total + $resumen_totales['totalServicios']+$resumen_totales['margenServicios'] + $coste_envio), 2);
$precio_u = round(($coste_total + $resumen_totales['totalServicios']+$resumen_totales['margenServicios'] + $coste_envio)/$tirada[$i], 4);
array_push($tiradas_alternativas, (object)array(
'tirada' => $tirada[$i],
'coste_impresion' => round($coste_total, 2),
'coste_envio' => $coste_envio,
'margen' => $margen_total,
'total_pedido' => $total_pedido,
'precio_unidad' => $precio_u,
));
}
else{
$resumen_totales = $resultado_presupuesto['totales'][$i];
}
}
$id = $model_presupuesto->insertarPresupuestoCliente(
$selected_tirada, $datos_presupuesto, $datosCabecera, $resultado_presupuesto['info'],
$resumen_totales, $iva_reducido, $tiradas_alternativas);
// Lineas Presupuesto
/*
foreach ($resultado_presupuesto['info']['interior'] as $linea){
if(count($linea) > 0)
$this->guardarLineaPresupuesto($id, $linea);
}
if(count($resultado_presupuesto['info']['cubierta']) > 0)
$this->guardarLineaPresupuesto($id, $resultado_presupuesto['info']['cubierta']);
if(count($resultado_presupuesto['info']['sobrecubierta']) > 0)
$this->guardarLineaPresupuesto($id, $resultado_presupuesto['info']['sobrecubierta']);
if(count($resultado_presupuesto['info']['guardas']) > 0)
$this->guardarLineaPresupuesto($id, $resultado_presupuesto['info']['guardas']);
// Servicios
foreach ($resultado_presupuesto['info']['serviciosDefecto'] as $servicio){
$this->guardarServicio($id, $servicio, 'encuadernacion');
}
foreach ($resultado_presupuesto['info']['servicios_automaticos'] as $servicio){
if ($servicio->tarifa_id == 3 || $servicio->tarifa_id == 5 || $servicio->tarifa_id == 16) {
// Servicios acabado
$this->guardarServicio($id, $servicio, 'acabado');
} else if ($servicio->tarifa_id == 24 || $servicio->tarifa_id == 9) {
// Servicios extra
$this->guardarServicio($id, $servicio, 'extra');
} else if ($servicio->tarifa_id == 62) {
// Servicios manipulado
$this->guardarServicio($id, $servicio, 'manipulado');
}
}
*/
foreach ($reqData['direcciones'] as $direccion){
$this->guardarLineaEnvio($id, $direccion, $peso_libro);
}
return $this->respond([
'value' => $id,
@ -915,10 +971,133 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
* Funciones auxiliares
*
**********************/
protected function guardarLineaEnvio($presupuestoId, $direccion){
protected function guardarLineaPresupuesto($presupuestoId, $linea){
$model = new PresupuestoLineaModel();
$model->insertLPFromBackend($presupuestoId, $linea);
}
protected function guardarLineaEnvio($presupuestoId, $direccion, $peso_libro){
$data = $this->calcular_coste_envio($direccion['id'], $peso_libro, $direccion['unidades'], $direccion['tipo']=='cajas'?0:1);
if(count($data)>0){
$data[0]->presupuesto_id = $presupuestoId;
$data[0]->tarifa_id = $data[0]->id;
unset($data[0]->id);
$data[0]->precio = $data[0]->coste;
unset($data[0]->coste);
$data[0]->entregaPieCalle = $direccion['tipo']=='cajas'?0:1;
unset($data[0]->tipo);
$model = new PresupuestoDireccionesModel();
$model->insert($data[0]);
}
}
protected function guardarTiradas($presupuestoId, $direccion){
}
protected function guardarServicio($presupuestoId, $servicio, $tipo){
if($tipo == 'encuadernacion'){
$model = new PresupuestoEncuadernacionesModel();
$data = [
'presupuesto_id' => $presupuestoId,
'tarifa_encuadernado_id' => $servicio->tarifa_id,
'proveedor_id' => $servicio->proveedor_id,
'tiempo' => $servicio->tiempo,
'precio_total' => $servicio->total,
'precio_unidad' => $servicio->precio_unidad,
'margen' => $servicio->margen,
];
$model->insert($data);
}
else if($tipo == 'extra'){
$model = new PresupuestoServiciosExtraModel();
$data = [
'presupuesto_id' => $presupuestoId,
'tarifa_extra_id' => $servicio->tarifa_id,
'precio_total' => $servicio->total,
'precio_unidad' => $servicio->precio_unidad,
'margen' => $servicio->margen,
];
$model->insert($data);
}
else if($tipo == 'acabado'){
$model = new PresupuestoAcabadosModel();
$data = [
'presupuesto_id' => $presupuestoId,
'tarifa_acabado_id' => $servicio->tarifa_id,
'precio_total' => $servicio->total,
'precio_unidad' => $servicio->precio_unidad,
'margen' => $servicio->margen,
];
$model->insert($data);
}
else if($tipo == 'manipulado'){
$model = new PresupuestoManipuladosModel();
$data = [
'presupuesto_id' => $presupuestoId,
'tarifa_manipulado_id' => $servicio->tarifa_id,
'precio_total' => $servicio->total,
'precio_unidad' => $servicio->precio_unidad,
'margen' => $servicio->margen,
];
$model->insert($data);
}
}
protected function calcular_coste_envio($direccionId, $peso, $unidades, $entregaPieCalle){
$model = model('App\Models\Clientes\ClienteDireccionesModel');
$data = $model->getDireccion($direccionId);
$modelTarifaEnvio = model('App\Models\Tarifas\TarifaEnvioModel');
$coste = 0;
$margen = 0;
if ($data > 0) {
$peso_envio = $peso * $unidades / 1000.0; // peso libro * unidades y se pasa a gramos
$tarifas_envio = $modelTarifaEnvio->getTarifaEnvio($data[0]->pais_id, $data[0]->cp, $peso_envio, $entregaPieCalle ? 'palets' : 'cajas');
for ($i = 0; $i < count($tarifas_envio); $i++) {
if ($peso > $tarifas_envio[$i]->peso_max) {
$tarifas_envio[$i]->precio = number_format($tarifas_envio[$i]->peso_min + ($peso - $tarifas_envio[$i]->peso_min) * $tarifas_envio[$i]->precio_adicional, 2);
}
// si no se calcula linealmente
else {
$m = (($tarifas_envio[$i]->precio_max - $tarifas_envio[$i]->precio_min) / ($tarifas_envio[$i]->peso_max - $tarifas_envio[$i]->peso_min));
$b = $tarifas_envio[$i]->precio_max - $m * $tarifas_envio[$i]->peso_max;
$tarifas_envio[$i]->precio = number_format($m * $peso + $b, 2);
}
$margen = $tarifas_envio[$i]->margen;
}
if (count($tarifas_envio) > 1) {
$tarifa_final = array_reduce($tarifas_envio, function ($previous, $current) {
return $current->precio < $previous->precio ? $current : $previous;
});
$coste = $tarifa_final->precio;
} else {
if (count($tarifas_envio) > 0)
$coste = $tarifas_envio[0]->precio;
}
}
if (count($data) > 0) {
$data[0]->coste = $coste;
$data[0]->tipo = $entregaPieCalle ? 'palets' : 'cajas';
$data[0]->margen = $margen;
$data[0]->proveedor = $tarifas_envio[0]->proveedor;
$data[0]->proveedor_id = $tarifas_envio[0]->proveedor_id;
}
return $data;
}
protected function calcular_presupuesto($datos_entrada , $extra_info =false)
{
@ -1285,7 +1464,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
foreach ($servicios as $servicio) {
if (intval($servicio) == 3 || intval($servicio) == 5 || intval($servicio) == 16) {
// Servicios acabado
$resultado = PresupuestoCLienteService::getServiciosManipulado([
$resultado = PresupuestoCLienteService::getServiciosAcabados([
'tarifa_id' => $servicio,
'tirada' => $datosPedido->tirada,
'POD' => $POD,
@ -1364,7 +1543,6 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
}
}
$return_data = [
'errors' => $error,
'total_lp' => $costeInterior + $coste_cubierta + $coste_sobrecubierta,
@ -1377,20 +1555,20 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
'peso' => $peso,
'lomo_cubierta' => $lomo,
'lomo_sobrecubierta'=> $lomo_sobrecubierta,
'totales' => $totales,
'interior' => $interior,
'cubierta' => $cubierta,
'sobrecubierta' => $linea_sobrecubierta,
'guardas' => $guardas,
'serviciosDefecto' => $servDefecto,
'servicios_automaticos' => $serviciosAutomaticos,
];
if($extra_info){
$info['lomo_cubierta'] = $lomo;
$info['lomo_sobrecubierta'] = $lomo_sobrecubierta;
$return_data['info'] = $info;
$return_data['info']['interior'] = $interior;
$return_data['info']['cubierta'] = $cubierta;
$return_data['info']['sobrecubierta'] = $linea_sobrecubierta;
$return_data['info']['guardas'] = $guardas;
$return_data['info']['serviciosDefecto'] = $servDefecto;
$return_data['info']['servicios_automaticos'] = $serviciosAutomaticos;
$return_data['totales'] = $totales;
}
return $return_data;