trabajando en añadir tiradas alternativas

This commit is contained in:
2025-01-14 20:33:55 +01:00
parent 28a133f687
commit a4394ed470
20 changed files with 934 additions and 559 deletions

View File

@ -73,17 +73,8 @@ class Presupuestoacabados extends \App\Controllers\BaseResourceController
$datos_tarifas = $postData['datos'] ?? [];
$tirada = $postData['tirada'] ?? 0;
$POD = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('POD')->value;
$result = [];
if (count($datos_tarifas) > 0) {
foreach ($datos_tarifas as $tarifa) {
$proveedor = $tarifa['proveedor_id'] == '' ? -1 : $tarifa['proveedor_id'];
$values = $this->model->getPrecioTarifa($tarifa['tarifa_id'], $tirada, $proveedor, $POD);
$values[0]->cubierta = $tarifa['cubierta'] ?? 0;
$values[0]->sobrecubierta = $tarifa['sobrecubierta'] ?? 0;
array_push($result, $values[0]);
}
}
$result = $this->getServiciosAcabados($datos_tarifas, $tirada, $POD);
$newTokenHash = csrf_hash();
$csrfTokenName = csrf_token();
@ -95,6 +86,23 @@ class Presupuestoacabados extends \App\Controllers\BaseResourceController
return $this->respond($data);
}
public function getServiciosAcabados($datos_tarifas, $tirada, $POD){
$model = model('App\Models\Presupuestos\PresupuestoAcabadosModel');
$result = [];
if (count($datos_tarifas) > 0) {
foreach ($datos_tarifas as $tarifa) {
$proveedor = $tarifa['proveedor_id'] == '' ? -1 : $tarifa['proveedor_id'];
$values = $model->getPrecioTarifa($tarifa['tarifa_id'], $tirada, $proveedor, $POD);
$values[0]->cubierta = $tarifa['cubierta'] ?? 0;
$values[0]->sobrecubierta = $tarifa['sobrecubierta'] ?? 0;
array_push($result, $values[0]);
}
}
return $result;
}
public function cargar()
{
if($this->request->isAJAX()) {

View File

@ -517,6 +517,12 @@ class Presupuestoadmin extends \App\Controllers\BaseResourceController
$data['direcciones'] = $this->obtenerDireccionesEnvio($id, $presupuesto->cliente_id);
}
$data['comentarios_cliente'] = $presupuesto->comentarios_cliente;
$data['comentarios_safekat'] = $presupuesto->comentarios_safekat;
$data['comentarios_presupuesto'] = $presupuesto->comentarios_presupuesto;
$data['comentarios_produccion'] = $presupuesto->comentarios_produccion;
$data['tiradasAlternativas'] = json_decode($presupuesto->tirada_alternativa_json_data);
/*

View File

@ -126,6 +126,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$this->viewData['POD'] = $POD;
$this->viewData['lomo_maximo'] = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('lomo_maximo')->value;
$this->viewData['lomo_minimo_fresado_cosido'] = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('lomo_minimo_fresado_cosido')->value;
$this->viewData['eb'] = 0;
$this->viewData['boxTitle'] = lang('Basic.global.addNew') . ' ' . $this->viewData['pageTitle'] . ' ' . lang('Basic.global.addNewSuffix');
@ -166,6 +167,8 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$this->viewData['POD'] = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('POD')->value;
$this->viewData['lomo_maximo'] = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('lomo_maximo')->value;
$this->viewData['lomo_minimo_fresado_cosido'] = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('lomo_minimo_fresado_cosido')->value;
$this->viewData['eb'] = $presupuestoEntity->envio_base;
// Si se ha llamado a esta funcion porque se ha duplicado el presupuesto
// se actualiza la bbdd para que sólo ejecute algunas funciones una vez
if ($presupuestoEntity->is_duplicado) {
@ -384,7 +387,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
}
$guardas = PresupuestoClienteService::obtenerGuardas($input_data);
foreach ($guardas as $linea) {
if (count($linea) > 0) {
$lomo += floatval($linea['mano']);
@ -403,20 +406,22 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
if ($tipo == 'cosido' || $tipo == 'fresado') {
if ($lomo < $lomo_minimo_fresado_cosido) {
$errors['status'] = 1;
$errors['value'] = 'No se pueden encuadernar libros cosidos o fresados con lomo inferior a '
. $lomo_minimo_fresado_cosido . ' mm. El lomo actual es de ' . $lomo . ' mm. ' .
"Por favor, aumente el número de páginas o el gramaje del papel para que sea encuadernable.";
$errors['value'] = 'No se pueden encuadernar libros cosidos o fresados con lomo inferior a '
. $lomo_minimo_fresado_cosido . ' mm. El lomo actual es de ' . $lomo . ' mm. ' .
"Por favor, aumente el número de páginas o el gramaje del papel para que sea encuadernable.";
}
if ($lomo > $lomo_maximo) {
$errors['status'] = 1;
$errors['value'] = 'No se pueden encuadernar con un lomo superior a '
. $lomo_maximo . ' mm. El lomo actual es de ' . $lomo . ' mm. ' .
"Por favor, disminuya el número de páginas o el gramaje del papel para que sea encuadernable.";
$errors['value'] = 'No se pueden encuadernar con un lomo superior a '
. $lomo_maximo . ' mm. El lomo actual es de ' . $lomo . ' mm. ' .
"Por favor, disminuya el número de páginas o el gramaje del papel para que sea encuadernable.";
}
}
$data = (object) array('lomo' => $lomo,
'errors' => $errors);
$data = (object) array(
'lomo' => $lomo,
'errors' => $errors
);
return $this->respond($data);
} else {
@ -439,6 +444,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$cliente_id = $reqData['clienteId'] ?? -1;
$tirada = $reqData['tirada'] ?? 0;
$selectedTirada = $reqData['selectedTirada'] ?? -1;
$tamanio = $reqData['tamanio'];
$paginas = $reqData['paginas'] ?? 0;
$paginas_color = $reqData['paginasColor'] ?? 0;
@ -551,21 +557,67 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
);
}
if (count($direcciones) > 1) {
// calculo del envio base (tirada_maxima)
$return_data['eb'] = [];
for ($i = 0; $i < count($tirada); $i++) {
$direccion = [];
$coste_direccion = $this->getCosteEnvio(
$direccion,
$return_data['peso'][$i],
$tirada[$i],
false,
true
);
if (!property_exists($coste_direccion, 'coste')) {
$errorModel = new ErrorPresupuesto();
$data['direccion'] = 'Sin direccion';
$data['peso'] = $return_data['peso'][$i];
$data['palets'] = 'Sin direccion';
$errorModel->insertError(
$id,
auth()->user()->id,
'No se ha podido calcular el coste de envío',
$data
);
$return_data = [
'errors' => (object) ([
'status' => 1
]),
];
return $return_data;
} else {
$return_data['eb'][$i] = round($coste_direccion->coste, 2);
}
}
$envio_base = true;
if (count($direcciones) > 0) {
for ($i = 0; $i < count($tirada); $i++) {
$coste_envio = 0.0;
$primer_envio = false;
foreach ($direcciones as $direccion) {
// El primer envio no se calcula ya que se añade el base
if ($envio_base) {
//aporte del envio al precio unidad
$coste_envio += ($return_data['eb'][$i] / $tirada[$i]);
$envio_base = false;
continue;
}
if($selectedTirada > 0){
$unidades = floor($direccion['unidades'] * $tirada[$i] / $selectedTirada);
}
else{
$unidades = $direccion['unidades'];
}
$coste_direccion = $this->getCosteEnvio(
$direccion['id'],
$direccion['direccion'],
$return_data['peso'][$i],
!$primer_envio ? intval($tirada[$i]) : $direccion['unidades'],
$direccion['entregaPalets'] == 'true' ? 1 : 0
)[0];
$primer_envio = true;
$unidades,
$direccion['entregaPalets'] == 'true' ? 1 : 0,
false,
);
if (!property_exists($coste_direccion, 'coste')) {
@ -586,43 +638,22 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
];
return $return_data;
} else {
$coste_envio += $coste_direccion->coste;
//aporte del envio al precio unidad
$coste_envio += ($coste_direccion->coste / $tirada[$i]);
}
}
$return_data['precio_u'][$i] = round(floatval($return_data['precio_u'][$i]) + $coste_envio / $tirada[$i], 4);
$return_data['precio_u'][$i] = round(floatval($return_data['precio_u'][$i]) + $coste_envio, 4);
}
} else {
for ($i = 0; $i < count($tirada); $i++) {
$coste_envio = 0.0;
$coste_direccion = $this->getCosteEnvio(null, $return_data['peso'][$i], $tirada[$i], false)[0];
if (!property_exists($coste_direccion, 'coste')) {
$errorModel = new ErrorPresupuesto();
$data['direccion'] = 'Sin direccion';
$data['peso'] = $return_data['peso'][$i];
$data['palets'] = 'Sin direccion';
$errorModel->insertError(
$id,
auth()->user()->id,
'No se ha podido calcular el coste de envío',
$data
);
$return_data = [
'errors' => (object) ([
'status' => 1
]),
];
return $return_data;
} else {
$coste_envio += $coste_direccion->coste;
}
$return_data['precio_u'][$i] = round(floatval($return_data['precio_u'][$i]) + $coste_envio / $tirada[$i], 4);
$coste_envio += ($return_data['eb'][$i] / $tirada[$i]);
$return_data['precio_u'][$i] = round(floatval($return_data['precio_u'][$i]) + $coste_envio, 4);
}
}
return $this->respond($return_data);
} catch (Exception $e) {
return $this->failServerError($e->getMessage() . ' - ' . $e->getFile() . ' - ' . $e->getLine());
@ -708,16 +739,15 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
}
$anchoTotal = 0;
if(count($interior) == 2) {
if(count($interior[0]) > 0)
$anchoTotal += $interior[0]['mano'];
if(count($interior[1]) > 0)
if (count($interior) == 2) {
if (count($interior[0]) > 0)
$anchoTotal += $interior[0]['mano'];
if (count($interior[1]) > 0)
$anchoTotal += $interior[1]['mano'];
}
else{
if(count($interior) > 0)
$anchoTotal += $interior['mano'];
} else {
if (count($interior) > 0)
$anchoTotal += $interior['mano'];
}
@ -900,17 +930,20 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$datosCabecera = $reqData['datosCabecera'] ?? [];
$confirmar = $reqData['confirmar'] ?? 0;
$confirmar = intval($confirmar);
$cliente_id = $reqData['clienteId'] ?? -1;
$tirada = $reqData['tirada'] ?? 0;
$tirada = $reqData['tirada'] ?? [];
$selected_tirada = $reqData['selectedTirada'] ?? 0;
$tamanio = $reqData['tamanio'];
$paginas = $reqData['paginas'] ?? 0;
$paginas_color = $reqData['paginasColor'] ?? 0;
$envio_base = $reqData['eb'] ?? 0;
$posPaginasColor = $reqData['posPaginasColor'] ?? "";
$paginasColorConsecutivas = $reqData['pagColorConsecutivas'] ?? 0;
$papelInteriorDiferente = $reqData['papelInteriorDiferente'] ?? 0;
@ -1038,43 +1071,120 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
// seleccionamos el peso de la tirada seleccionada
$peso_libro = $resultado_presupuesto['peso'][array_search($selected_tirada, $tirada)];
// calculo del envio base (tirada_maxima)
$resultado_presupuesto['eb'] = [];
$datos_presupuesto['envio_base'] = 0;
for ($i = 0; $i < count($tirada); $i++) {
$direccion = [];
$coste_direccion = $this->getCosteEnvio(
$direccion,
$resultado_presupuesto['peso'][$i],
$tirada[$i],
false,
true
);
if (count($direcciones) > 1) {
for ($i = 0; $i < count($tirada); $i++) {
$resultado_presupuesto['info']['totales'][$i]['coste_envio'] = 0.0;
$resultado_presupuesto['info']['totales'][$i]['margen_envio'] = 0.0;
$coste_envio = 0.0;
foreach ($direcciones as $direccion) {
$precio_envio = $this->getCosteEnvio(
$direccion['id'],
$resultado_presupuesto['peso'][$i],
$direccion['unidades'],
$direccion['entregaPalets'] == 'true' ? 1 : 0
)[0];
$coste_envio += $precio_envio->coste;
$margen_envio = $precio_envio->margen;
$resultado_presupuesto['info']['totales'][$i]['coste_envio'] += $coste_envio - $margen_envio;
$resultado_presupuesto['info']['totales'][$i]['margen_envio'] += $margen_envio;
}
$resultado_presupuesto['precio_u'][$i] = round(floatval($resultado_presupuesto['precio_u'][$i]) + $coste_envio / $tirada[$i], 4);
if(intval($selected_tirada) == intval($tirada[$i])){
$datos_presupuesto['envio_base'] = round($coste_direccion->coste*(1 + $coste_direccion->margen/100.0), 2) ;
}
} else {
for ($i = 0; $i < count($tirada); $i++) {
$coste_envio = 0.0;
$precio_envio = $this->getCosteEnvio(null, $resultado_presupuesto['peso'][$i], $tirada[$i], false)[0];
$coste_envio += $precio_envio->coste;
$margen_envio = $precio_envio->margen;
$resultado_presupuesto['precio_u'][$i] = round(floatval($resultado_presupuesto['precio_u'][$i]) + $coste_envio / $tirada[$i], 4);
$resultado_presupuesto['info']['totales'][$i]['coste_envio'] = $coste_envio - $margen_envio;
$resultado_presupuesto['info']['totales'][$i]['margen_envio'] = $margen_envio;
if (!property_exists($coste_direccion, 'coste')) {
$errorModel = new ErrorPresupuesto();
$data['direccion'] = 'Sin direccion';
$data['peso'] = $resultado_presupuesto['peso'][$i];
$data['palets'] = 'Sin direccion';
$errorModel->insertError(
$id,
auth()->user()->id,
'No se ha podido calcular el coste de envío',
$data
);
$resultado_presupuesto = [
'errors' => (object) ([
'status' => 1
]),
];
return $resultado_presupuesto;
} else {
$resultado_presupuesto['eb'][$i] = round($coste_direccion->coste, 2);
$resultado_presupuesto['eb_margen'][$i] = round($coste_direccion->margen, 2);
}
}
for ($i = 0; $i < count($tirada); $i++) {
$resultado_presupuesto['info']['totales'][$i]['coste_envio'] = 0.0;
$resultado_presupuesto['info']['totales'][$i]['margen_envio'] = 0.0;
}
if (count($direcciones) > 0) {
for ($i = 0; $i < count($tirada); $i++) {
$envio_base = true;
$coste_envio = 0.0;
$margen_envio = 0.0;
foreach ($direcciones as $direccion)
{
// El primer envio no se calcula ya que se añade el base
if ($envio_base) {
//aporte del envio al precio unidad
$coste_envio += ($resultado_presupuesto['eb'][$i] / $tirada[$i]);
$margen_envio += ($resultado_presupuesto['eb_margen'][$i] / $tirada[$i]);
$resultado_presupuesto['info']['totales'][$i]['coste_envio'] += $resultado_presupuesto['eb'][$i] - $resultado_presupuesto['eb_margen'][$i];
$resultado_presupuesto['info']['totales'][$i]['margen_envio'] += $resultado_presupuesto['eb_margen'][$i];
$envio_base = false;
continue;
}
$unidades = floor($direccion['unidades'] * $tirada[$i] / $selected_tirada);
$coste_direccion = $this->getCosteEnvio(
$direccion['direccion'],
$resultado_presupuesto['peso'][$i],
$unidades,
$direccion['entregaPalets'] == 'true' ? 1 : 0,
false,
);
if (!property_exists($coste_direccion, 'coste')) {
$errorModel = new ErrorPresupuesto();
$data['direccion'] = $direccion;
$data['peso'] = $resultado_presupuesto['peso'][$i];
$data['palets'] = $direccion['entregaPalets'] == 'true' ? 1 : 0;
$errorModel->insertError(
$id,
auth()->user()->id,
'No se ha podido calcular el coste de envío',
$data
);
$resultado_presupuesto = [
'errors' => (object) ([
'status' => 1
]),
];
return $resultado_presupuesto;
} else {
//aporte del envio al precio unidad
$coste_envio += ($coste_direccion->coste / $tirada[$i]);
$resultado_presupuesto['info']['totales'][$i]['coste_envio'] += $coste_direccion->coste - $coste_direccion->margen;
$resultado_presupuesto['info']['totales'][$i]['margen_envio'] += $coste_direccion->margen;
}
}
$resultado_presupuesto['precio_u'][$i] = round(floatval($resultado_presupuesto['precio_u'][$i]) + $coste_envio, 4);
}
} else {
for ($i = 0; $i < count($tirada); $i++) {
$coste_envio = 0.0;
$coste_envio += ($resultado_presupuesto['eb'][$i] / $tirada[$i]);
$resultado_presupuesto['info']['totales'][$i]['coste_envio'] = $resultado_presupuesto['eb'][$i] - $resultado_presupuesto['eb_margen'][$i];
$resultado_presupuesto['info']['totales'][$i]['margen_envio'] = $resultado_presupuesto['eb_margen'][$i];
$resultado_presupuesto['precio_u'][$i] = round(floatval($resultado_presupuesto['precio_u'][$i]) + $coste_envio, 4);
}
}
$model_presupuesto = new PresupuestoModel();
$tiradas_alternativas = [];
$resumen_totales = [];
@ -1117,6 +1227,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$datos_presupuesto['retractilado'] = $retractilado;
$datos_presupuesto['retractilado5'] = $retractilado5;
$datos_presupuesto['entrega_taller'] = $reqData['entrega_taller'] ?? 0;
$resultado_presupuesto['info']['merma'] = $this->calcular_merma($selected_tirada, $POD);
@ -1234,6 +1345,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
if ($presupuesto) {
$data['lc'] = $presupuesto->lomo_cubierta;
$data['lsc'] = $presupuesto->lomo_sobrecubierta;
$data['eb'] = $presupuesto->envio_base;
$data['state'] = intval($presupuesto->estado_id);
$data['datosGenerales']['titulo'] = $presupuesto->titulo;
$data['datosGenerales']['autor'] = $presupuesto->autor;
@ -1314,7 +1426,6 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
if (intval($presupuesto->recoger_en_taller) == 1) {
$data['direcciones']['entrega_taller'] = 1;
} else {
$data['direcciones']['entrega_taller'] = 0;
$data['direcciones'] = $this->obtenerDireccionesEnvio($id, $presupuesto->cliente_id);
}
@ -1481,26 +1592,27 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$peso_envio = $peso_libro * $unidades / 1000.0;
$data = $this->getCosteEnvio(
$direccion['id'],
$direccion['direccion'],
$peso_libro,
$direccion['unidades'],
$direccion['entregaPalets'] == 'false' ? 0 : 1
$direccion['entregaPalets'] == 'false' ? 0 : 1,
false
);
if (count($data) > 0) {
if (isset($data->coste)) {
$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['entregaPalets'] == 'false' ? 0 : 1;
unset($data[0]->tipo);
$data[0]->peso = $peso_envio;
$data[0]->cantidad = $unidades;
$data->presupuesto_id = $presupuestoId;
$data->tarifa_id = $data->id;
unset($data->id);
$data->precio = $data->coste;
unset($data->coste);
$data->entregaPieCalle = $direccion['entregaPalets'] == 'false' ? 0 : 1;
unset($data->tipo);
$data->peso = $peso_envio;
$data->cantidad = $unidades;
$model = new PresupuestoDireccionesModel();
$model->insert($data[0]);
$model->insert($data);
}
}
@ -1566,18 +1678,17 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
}
protected function getCosteEnvio($direccionId = null, $peso, $unidades, $entregaPieCalle)
protected function getCosteEnvio($direccion, $peso, $unidades, $entregaPieCalle, $calcular_envio_base)
{
$return_data = $direccion;
if ($direccionId != null) {
$model = model('App\Models\Clientes\ClienteDireccionesModel');
$data = $model->getDireccion($direccionId);
if ($calcular_envio_base) {
$pais_id = 1; // españa
$cp = 18000; // envio nacional
} else {
$data = [];
array_push($data, (object) [
'pais_id' => 1, // españa
'cp' => 18000, // envio nacional
]);
$pais_id = $direccion['pais_id'];
$cp = $direccion['cp'];
}
@ -1585,44 +1696,43 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$coste = 0;
$margen = 0;
if (count($data) > 0) {
$peso_envio = round(floatval($peso * $unidades / 1000.0)); // peso libro * unidades y se pasa a kilogramos
$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_envio > $tarifas_envio[$i]->peso_max || floatval($tarifas_envio[$i]->precio_max) == 0) {
$tarifas_envio[$i]->precio = number_format(floatval($tarifas_envio[$i]->precio_min) + ($peso_envio - floatval($tarifas_envio[$i]->peso_min)) * floatval($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_envio + $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;
$peso_envio = round(floatval(floatval($peso) * floatval($unidades) / 1000.0)); // peso libro * unidades y se pasa a kilogramos
$tarifas_envio = $modelTarifaEnvio->getTarifaEnvio($pais_id, $cp, $peso_envio, $entregaPieCalle ? 'palets' : 'cajas');
for ($i = 0; $i < count($tarifas_envio); $i++) {
if ($peso_envio > $tarifas_envio[$i]->peso_max || floatval($tarifas_envio[$i]->precio_max) == 0) {
$tarifas_envio[$i]->precio = number_format(floatval($tarifas_envio[$i]->precio_min) + ($peso_envio - floatval($tarifas_envio[$i]->peso_min)) * floatval($tarifas_envio[$i]->precio_adicional), 2);
}
}
if (count($data) > 0 && count($tarifas_envio) > 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;
// 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_envio + $b, 2);
}
$margen = $tarifas_envio[$i]->margen;
}
return $data;
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;
$margen = $tarifas_envio[0]->margen;
}
$return_data['coste'] = $coste;
$return_data['tipo'] = $entregaPieCalle ? 'palets' : 'cajas';
$return_data['margen'] = $margen;
$return_data['proveedor'] = $tarifas_envio[0]->proveedor;
$return_data['proveedor_id'] = $tarifas_envio[0]->proveedor_id;
return (object) $return_data;
}
protected function calcular_presupuesto($datos_entrada, $selected_tirada, $extra_info = false)
protected function calcular_presupuesto($datos_entrada, $selected_tirada, $extra_info = false)
{
try {
$return_data = [];
@ -2618,7 +2728,9 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
{
$model = model('App\Models\Presupuestos\PresupuestoDireccionesModel');
$model_direcciones = model('App\Models\Clientes\ClienteDireccionesModel');
$direcciones = $model->where('presupuesto_id', $id)->findAll();
$direcciones = $model->where('presupuesto_id', $id)->asArray()->findAll();
return $direcciones;
$result = [];
$temp = [];

View File

@ -76,18 +76,8 @@ class Presupuestoencuadernaciones extends \App\Controllers\BaseResourceControlle
$POD = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('POD')->value;
$ancho = $postData['ancho'] ?? 0;
$alto = $postData['alto'] ?? 0;
$result = [];
if (count($datos_tarifas) > 0) {
foreach ($datos_tarifas as $tarifa) {
if ($tarifaModel->isTarifaPorHoras($tarifa['tarifa_id'])) {
$values = $this->model->getPrecioTarifaHoras($tarifa['tarifa_id'], $paginas, $tirada, -1, $POD);
} else {
$values = $this->model->getPrecioTarifa($tarifa['tarifa_id'], $paginas, $tirada, $ancho, $alto, -1, $POD);
}
array_push($result, $values[0]);
}
}
$result = $this->getServiciosEncuadernacion($datos_tarifas, $tirada, $paginas, $ancho, $alto, $POD);
$newTokenHash = csrf_hash();
$csrfTokenName = csrf_token();
@ -99,6 +89,26 @@ class Presupuestoencuadernaciones extends \App\Controllers\BaseResourceControlle
return $this->respond($data);
}
public function getServiciosEncuadernacion($datos_tarifas, $tirada, $paginas, $ancho, $alto, $POD)
{
$result = [];
$tarifaModel = model('App\Models\Tarifas\TarifaEncuadernacionModel');
$model = model('App\Models\Presupuestos\PresupuestoEncuadernacionesModel');
if (count($datos_tarifas) > 0) {
foreach ($datos_tarifas as $tarifa) {
if ($tarifaModel->isTarifaPorHoras($tarifa['tarifa_id'])) {
$values = $model->getPrecioTarifaHoras($tarifa['tarifa_id'], $paginas, $tirada, -1, $POD);
} else {
$values = $model->getPrecioTarifa($tarifa['tarifa_id'], $paginas, $tirada, $ancho, $alto, -1, $POD);
}
array_push($result, $values[0]);
}
}
return $result;
}
public function datatable()
{

View File

@ -95,14 +95,8 @@ class Presupuestomanipulados extends \App\Controllers\BaseResourceController
$tarifas = $postData['datos'] ?? [];
$tirada = $postData['tirada'] ?? 0;
$POD = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('POD')->value;
$result = [];
if(count($tarifas)>0){
foreach ($tarifas as $tarifa){
$values = $this->model->getPrecioTarifa($tarifa, $tirada, $POD);
array_push($result, $values[0]);
}
}
$result = $this->getServiciosManipulado($tarifas, $tirada, $POD);
$newTokenHash = csrf_hash();
$csrfTokenName = csrf_token();
@ -113,6 +107,22 @@ class Presupuestomanipulados extends \App\Controllers\BaseResourceController
return $this->respond($data);
}
public function getServiciosManipulado($datos_tarifas, $tirada, $POD)
{
$result = [];
$model = model('App\Models\Presupuestos\PresupuestoManipuladosModel');
if (count($datos_tarifas) > 0) {
foreach ($datos_tarifas as $tarifa) {
$values = $model->getPrecioTarifa($tarifa['tarifa_id'], $tirada, $POD);
$values[0]->cubierta = $tarifa['cubierta'] ?? 0;
$values[0]->sobrecubierta = $tarifa['sobrecubierta'] ?? 0;
array_push($result, $values[0]);
}
}
return $result;
}
public function datatable()

View File

@ -82,7 +82,12 @@ class Presupuestotiradasalternativas extends \App\Controllers\BaseResourceContro
$newTokenHash = csrf_hash();
$csrfTokenName = csrf_token();
$id = $reqData['id'] ?? 0;
$json_data = $reqData['json_tiradas'] ?? null;
$json_data_acabados = $reqData['json_acabados'] ?? null;
$json_data_encuadernacion = $reqData['json_encuadernaciones'] ?? null;
$json_data_manipulado = $reqData['json_manipulado'] ?? null;
$cliente_id = $reqData['cliente_id'] ?? 0;
$tipo_impresion_id = $reqData['tipo_impresion_id'] ?? 4;
@ -95,7 +100,7 @@ class Presupuestotiradasalternativas extends \App\Controllers\BaseResourceContro
foreach ($data as $linea) {
// Se obtienen los valores de cada linea para el calculo del precio
$datosPedido = (object)array(
$datosPedido = (object) array(
'paginas' => intval($linea['paginas']) ?? 0,
'tirada' => intval($reqData['tirada']) ?? 0,
'merma' => intval($reqData['merma']) ?? 0,
@ -144,24 +149,24 @@ class Presupuestotiradasalternativas extends \App\Controllers\BaseResourceContro
$uso = 'interior';
$tipo = strpos($linea['row_id'], "_bn") !== false ? 'negro' : 'color';
$paginas_negro = isset($linea['numPagColor']) ? intval($datosPedido->paginas) - intval($linea['numPagColor']) : 0;
$paginas_color = $linea['numPagColor'] ?? 0;
$paginas = (object)array(
$paginas_color = $linea['numPagColor'] ?? 0;
$paginas = (object) array(
'negro' => $paginas_negro,
'color' => $paginas_color,
);
$parametrosRotativa = (object)array(
$parametrosRotativa = (object) array(
'a_favor_fibra' => $datosPedido->a_favor_fibra,
'bnPages' => $paginas->negro,
'colorPages' => $paginas->color,
'bnPages' => $paginas->negro,
'colorPages' => $paginas->color,
'rotativa_gota_negro' => 0,
'rotativa_gota_color' => 0,
);
$parametrosRotativa->rotativa_gota_negro = floatval($linea['gotaNegro']?? 0);
$parametrosRotativa->rotativa_gota_color = floatval($linea['gotaColor']?? 0);
$parametrosRotativa->rotativa_negro = floatval($linea['cobNegro'] ?? 0);
$parametrosRotativa->rotativa_cyan = floatval($linea['cobCyan'] ?? 0);
$parametrosRotativa->rotativa_magenta = floatval($linea['cobMagenta']?? 0);
$parametrosRotativa->rotativa_amarillo = floatval($linea['cobAmarillo']?? 0);
$parametrosRotativa->rotativa_gota_negro = floatval($linea['gotaNegro'] ?? 0);
$parametrosRotativa->rotativa_gota_color = floatval($linea['gotaColor'] ?? 0);
$parametrosRotativa->rotativa_negro = floatval($linea['cobNegro'] ?? 0);
$parametrosRotativa->rotativa_cyan = floatval($linea['cobCyan'] ?? 0);
$parametrosRotativa->rotativa_magenta = floatval($linea['cobMagenta'] ?? 0);
$parametrosRotativa->rotativa_amarillo = floatval($linea['cobAmarillo'] ?? 0);
break;
case 'lp_cubierta':
$uso = 'cubierta';
@ -194,14 +199,14 @@ class Presupuestotiradasalternativas extends \App\Controllers\BaseResourceContro
$datosTipolog = $linea['gotaNegro'] ?? null;
if (!is_null($datosTipolog)) {
$datosTipolog = [];
$data_temp = (object)array(
$data_temp = (object) array(
'negro' => floatval($linea['cobNegro'] ?? 0),
'cyan' => floatval($linea['cobCyan'] ?? 0),
'magenta' => floatval($linea['cobMagenta']?? 0),
'amarillo' => floatval($linea['cobAmarillo']?? 0),
'magenta' => floatval($linea['cobMagenta'] ?? 0),
'amarillo' => floatval($linea['cobAmarillo'] ?? 0),
'cg' => floatval($linea['cobCG'] ?? 0),
'gota_negro' => floatval($linea['gotaNegro']?? 0),
'gota_color' => floatval($linea['gotaColor']?? 0),
'gota_negro' => floatval($linea['gotaNegro'] ?? 0),
'gota_color' => floatval($linea['gotaColor'] ?? 0),
);
array_push($datosTipolog, $data_temp);
}
@ -213,13 +218,13 @@ class Presupuestotiradasalternativas extends \App\Controllers\BaseResourceContro
$datosLinea['datosPedido'] = $datosPedido;
$datosLinea['cliente_id'] = $cliente_id;
$datosLinea['papel'] = $papel;
if(isset($isColor))
$datosLinea['isColor'] = $isColor;
if(isset($opciones_papel))
if (isset($isColor))
$datosLinea['isColor'] = $isColor;
if (isset($opciones_papel))
$datosLinea['opciones_papel'] = $opciones_papel;
if(isset($parametrosRotativa))
if (isset($parametrosRotativa))
$datosLinea['parametrosRotativa'] = $parametrosRotativa;
if(isset($paginas))
if (isset($paginas))
$datosLinea['paginas'] = $paginas;
$datosLinea['maquina'] = $maquina;
$datosLinea['papel_generico'] = $papel_generico;
@ -257,19 +262,113 @@ class Presupuestotiradasalternativas extends \App\Controllers\BaseResourceContro
$linea_coste['total_coste'] +=
$linea_coste['fields']['precio_tinta'];
if (strpos($linea['row_id'], 'lp_rot') === 0) {
$linea_coste['total_coste'] +=
$linea_coste['fields']['total_corte'];
}
$linea_coste['total_coste'] +=
$linea_coste['fields']['total_corte'];
}
}
$linea_coste['total_margen'] = $linea_coste['fields']['margen_papel_pedido'] +
$linea_coste['fields']['margen_impresion_horas'] +
$linea_coste['fields']['margen_click_pedido'];
unset($linea_coste['fields']);
array_push($values, $linea_coste);
}
// Calculo de los servicios (presimpresion y extra no dependen de nada)
$servicios = (object) (['coste' => 0.0, 'margen' => 0.0]);
if ($json_data_acabados) {
$json_data_acabados = json_decode($json_data_acabados, true);
if (count($json_data_acabados) > 0) {
$acabados = new Presupuestoacabados();
$POD = (new \App\Models\Configuracion\ConfigVariableModel())->getVariable('POD')->value;
$result = $acabados->getServiciosAcabados($json_data_acabados, $reqData['tirada'], $POD);
if (count($result) > 0) {
foreach ($result as $servicio) {
$coste = round($servicio->total / (1 + $servicio->margen / 100), 2);
$margen = round($servicio->total - $coste, 2);
$servicios->coste += $coste;
$servicios->margen += $margen;
}
}
}
}
if ($json_data_encuadernacion) {
$json_data_encuadernacion = json_decode($json_data_encuadernacion, true);
if (count($json_data_encuadernacion) > 0) {
$encuadernacion = new Presupuestoencuadernaciones();
$POD = (new \App\Models\Configuracion\ConfigVariableModel())->getVariable('POD')->value;
$result = $encuadernacion->getServiciosEncuadernacion($json_data_encuadernacion, $reqData['tirada'], $reqData['paginas'], $reqData['ancho'], $reqData['alto'], $POD);
if (count($result) > 0) {
foreach ($result as $servicio) {
$coste = round($servicio->total / (1 + $servicio->margen / 100), 2);
$margen = round($servicio->total - $coste, 2);
$servicios->coste += $coste;
$servicios->margen += $margen;
}
}
}
}
if ($json_data_manipulado) {
$json_data_manipulado = json_decode($json_data_manipulado, true);
if (count($json_data_manipulado) > 0) {
$manipulados = new Presupuestomanipulados();
$POD = (new \App\Models\Configuracion\ConfigVariableModel())->getVariable('POD')->value;
$result = $manipulados->getServiciosManipulado($json_data_manipulado, $reqData['tirada'], $POD);
if (count($result) > 0) {
foreach ($result as $servicio) {
$coste = round($servicio->total / (1 + $servicio->margen / 100), 2);
$margen = round($servicio->total - $coste, 2);
$servicios->coste += $coste;
$servicios->margen += $margen;
}
}
}
}
$json_envios = $reqData['json_envios'] ?? null;
$coste_envio = 0.0;
$margen_envio = 0.0;
$tirada_base = floatval($reqData['tirada_base']);
$peso_libro = floatval($reqData['peso_libro']);
// el primer envio con la tirada base
$model = model('App\Models\Tarifas\TarifaEnvioModel');
$envios = $model->getTarifaEnvio(1, 18000, $tirada_base * $peso_libro/1000.0, "cajas");
$resultado = $this->calcular_envio($envios, $tirada_base * $peso_libro/1000.0);
$coste_envio += $resultado->coste;
$margen_envio += $resultado->margen;
if ($json_envios) {
$json_envios = json_decode($json_envios, true);
if (count($json_envios) > 0) {
//la primera linea es el envio base
for($i = 1; $i < count($json_envios); $i++) {
$porcentaje = ($json_envios[$i]['cantidad']) / $tirada_base * 100.0;
$cantidad = floor($reqData['tirada'] * $porcentaje / 100.0);
$peso_envio = $cantidad * $peso_libro / 1000.0;
$paisId = $json_envios[$i]['pais_id'];
$cp = $json_envios[$i]['cp'];
$tipo_envio = $json_envios[$i]['entregaPieCalle'] == 1 ? 'palets' : 'cajas';
$model = model('App\Models\Tarifas\TarifaEnvioModel');
$envios = $model->getTarifaEnvio($paisId, $cp, $peso_envio, $tipo_envio);
$resultado = $this->calcular_envio($envios, $peso_envio);
$coste_envio += $resultado->coste;
$margen_envio += $resultado->margen;
}
}
}
} else {
$values = [];
}
@ -279,8 +378,36 @@ class Presupuestotiradasalternativas extends \App\Controllers\BaseResourceContro
$response[$csrfTokenName] = $newTokenHash;
$response['lineas'] = $values;
$response['servicios'] = $servicios;
$response['envios'] = (object) (['coste' => $coste_envio, 'margen' => $margen_envio]);
return $this->respond($response);
}
private function calcular_envio($envio, $peso_envio)
{
$coste_envio = 0.0;
$margen_envio = 0.0;
if (count(value: $envio) > 0) {
$envio = $envio[0];
if ($envio->id != null) {
if ($peso_envio > $envio->peso_max || floatval($envio->precio_max) == 0) {
$coste_envio += number_format(floatval($envio->precio_min) + ($peso_envio - floatval($envio->peso_min)) * floatval($envio->precio_adicional), 2);
}
// si no se calcula linealmente
else {
$m = (($envio->precio_max - $envio->precio_min) / ($envio->peso_max - $envio->peso_min));
$b = $envio->precio_max - $m * $envio->peso_max;
$coste_envio = number_format($m * $peso_envio + $b, 2);
}
$margen_envio += $coste_envio * $envio->margen / 100.0;
}
}
return (object) (['coste' => $coste_envio, 'margen' => $margen_envio]);
}
}