Merge branch 'fix/importador_rama_tarifa' into 'main'

Fix/importador rama tarifa

See merge request jjimenez/safekat!803
This commit is contained in:
Ignacio Martinez Navajas
2025-05-09 10:32:48 +00:00
3 changed files with 130 additions and 9 deletions

7
.vscode/sftp.json vendored
View File

@ -24,10 +24,15 @@
"username": "sk-dev", "username": "sk-dev",
"password": "KXvYsubai9v*g61~" "password": "KXvYsubai9v*g61~"
}, },
"prod":{ "sk-prod":{
"host": "erp.safekat.es", "host": "erp.safekat.es",
"username": "erp-demo", "username": "erp-demo",
"password": "lNkEyukTc1~*3yy9" "password": "lNkEyukTc1~*3yy9"
},
"sk-dev":{
"host": "erp-dev.safekat.es",
"username": "erp-dev",
"password": "snqyxNZIhg8m3!9~"
} }
} }

View File

@ -132,12 +132,10 @@ class ImportadorCatalogo extends BaseResourceController
]); ]);
} }
// Mapear cada columna a una variable // Mapear cada columna a una variable (debe coincidir con catalogo_tool.js)
$isbn = isset($json->fila[0]) ? trim($json->fila[0]) : null; $isbn = isset($json->fila[0]) ? trim($json->fila[0]) : null;
$refCliente = isset($json->fila[1]) ? trim($json->fila[1]) : null; $refCliente = isset($json->fila[1]) ? trim($json->fila[1]) : null;
//$descripcion = isset($json->fila[2]) ? trim($json->fila[2]) : null;
$tirada = isset($json->fila[3]) ? (float) $json->fila[3] : null; $tirada = isset($json->fila[3]) ? (float) $json->fila[3] : null;
$precio_compra = isset($json->fila[4]) ? (float) $json->fila[4] : null;
if (empty($isbn)) { if (empty($isbn)) {
return $this->response->setJSON([ return $this->response->setJSON([
@ -146,6 +144,17 @@ class ImportadorCatalogo extends BaseResourceController
]); ]);
} }
// 0. Comprobar duplicado en tabla de presupuestos
$presupuestoModel = new PresupuestoModel(); // Usa el modelo real que corresponda
$yaExiste = $presupuestoModel->where('referencia_cliente', $refCliente)->first();
if ($yaExiste) {
return $this->response->setJSON([
'success' => false,
'message' => 'Referencia ya importada'
]);
}
$catalogoModel = new CatalogoLibroModel(); $catalogoModel = new CatalogoLibroModel();
// 1. Buscar por ISBN exacto // 1. Buscar por ISBN exacto
@ -214,6 +223,15 @@ class ImportadorCatalogo extends BaseResourceController
$sobrecubierta['acabado'] = $libro->sobrecubierta_acabado_id; $sobrecubierta['acabado'] = $libro->sobrecubierta_acabado_id;
} }
// Recalcular calidad (isColor y isHq) en funcion del cliente
[$isColor, $isHq] = PresupuestoService::getCalidad(
'importador-rama',
null,
(in_array(strtolower($libro->tipo_impresion), ['color', 'colorhq']) ? 1 : 0),
(in_array(strtolower($libro->tipo_impresion), ['negrohq', 'colorhq']) ? 1 : 0),
intval($tirada ?? 0)
);
$dataToImport = [ $dataToImport = [
'selectedTirada' => $tirada, 'selectedTirada' => $tirada,
@ -237,8 +255,8 @@ class ImportadorCatalogo extends BaseResourceController
'tipo' => "", 'tipo' => "",
'tipo_presupuesto_id' => $libro->encuadernacion_id, 'tipo_presupuesto_id' => $libro->encuadernacion_id,
'clienteId' => 251, 'clienteId' => 251,
'isColor' => (in_array(strtolower($libro->tipo_impresion), ['color', 'colorhq']) ? 1 : 0), 'isColor' => $isColor,
'isHq' => (in_array(strtolower($libro->tipo_impresion), ['negrohq', 'colorhq']) ? 1 : 0), 'isHq' => $isHq,
'paginas' => $libro->paginas, 'paginas' => $libro->paginas,
'paginasColor' => $colorPaginas, 'paginasColor' => $colorPaginas,
'papelInteriorDiferente' => $papelInteriorDiferente, 'papelInteriorDiferente' => $papelInteriorDiferente,
@ -270,6 +288,32 @@ class ImportadorCatalogo extends BaseResourceController
'data' => $dataToImport 'data' => $dataToImport
]);*/ ]);*/
$tarifas = $this->obtenerTarifas();
$precioDesdeTarifa = $this->calcularPrecioDesdeTarifa(
$dataToImport['isColor'],
$libro->encuadernacion_id,
$libro->ancho,
$libro->alto,
$libro->paginas,
$tarifas
);
if (is_null($precioDesdeTarifa)) {
return $this->response->setJSON([
'success' => false,
'message' => 'No se pudo calcular el precio desde las tarifas disponibles.',
'detalle' => [
'tinta' => $dataToImport['isColor'] ? 'color' : 'negro',
'encuadernacion_id' => $libro->encuadernacion_id,
'ancho' => $libro->ancho,
'alto' => $libro->alto,
'paginas' => $libro->paginas
]
]);
}
// Usar precio calculado
$precio_compra = $precioDesdeTarifa;
// Procedemos a intentar guardar el presupuesto // Procedemos a intentar guardar el presupuesto
// Instancia de presupuesto cliente // Instancia de presupuesto cliente
@ -332,6 +376,78 @@ class ImportadorCatalogo extends BaseResourceController
} }
private function calcularPrecioDesdeTarifa($isColor, $encuadernacionId, $ancho, $alto, $paginas, $tarifas)
{
// Solo aplicamos tarifa si la encuadernación es Rústica Fresada (id = 2)
if ((int) $encuadernacionId !== 2) {
return null;
}
$tinta = $isColor ? 'color' : 'negro';
foreach ($tarifas as $tarifa) {
if (
strtolower($tarifa['tinta']) === $tinta &&
strtolower($tarifa['manipulado']) === 'rústica fresada' &&
(int) $tarifa['ancho'] === (int) $ancho &&
(int) $tarifa['alto'] === (int) $alto
) {
return round($tarifa['precio_fijo'] + ($tarifa['precio_variable'] * $paginas), 2);
}
}
return null; // No se encontró tarifa válida
}
private function obtenerTarifas()
{
return [
[
'tinta' => 'color',
'manipulado' => 'Rústica Fresada',
'ancho' => 200,
'alto' => 245,
'precio_fijo' => 1.15,
'precio_variable' => 0.076
],
[
'tinta' => 'negro',
'manipulado' => 'Rústica Fresada',
'ancho' => 200,
'alto' => 245,
'precio_fijo' => 1.15,
'precio_variable' => 0.009724
],
[
'tinta' => 'color',
'manipulado' => 'Rústica Fresada',
'ancho' => 150,
'alto' => 210,
'precio_fijo' => 1.15,
'precio_variable' => 0.03217
],
[
'tinta' => 'negro',
'manipulado' => 'Rústica Fresada',
'ancho' => 150,
'alto' => 210,
'precio_fijo' => 1.15,
'precio_variable' => 0.00572
],
[
'tinta' => 'negro',
'manipulado' => 'Rústica Fresada',
'ancho' => 170,
'alto' => 240,
'precio_fijo' => 1.15,
'precio_variable' => 0.008
]
];
}

View File

@ -173,10 +173,10 @@ document.addEventListener('DOMContentLoaded', function () {
if (response.ok && result.status === 200) { if (response.ok && result.status === 200) {
const skUrl = result.data?.sk_url?.replace('presupuestocliente', 'presupuestoadmin') ?? null; const skUrl = result.data?.sk_url?.replace('presupuestocliente', 'presupuestoadmin') ?? null;
const skId = result.data?.sk_id ?? '';
// Actualizar campo "Notas" con el enlace // Actualizar campo "Notas" con el enlace
if (skUrl) { if (skUrl) {
const skId = result.data?.sk_id ?? '';
const notasHtml = `<a href="${skUrl}" target="_blank" class="btn btn-sm btn-secondary">Ver presupuesto (${skId})</a>`; const notasHtml = `<a href="${skUrl}" target="_blank" class="btn btn-sm btn-secondary">Ver presupuesto (${skId})</a>`;
// La columna de notas es la posición 6 (índice 6) // La columna de notas es la posición 6 (índice 6)
rowData[6] = notasHtml; rowData[6] = notasHtml;
@ -184,7 +184,7 @@ document.addEventListener('DOMContentLoaded', function () {
} }
let html = skUrl let html = skUrl
? `La fila se importó exitosamente.<br><br><a href="${skUrl}" target="_blank" class="btn btn-primary mt-2">Ver presupuesto</a>` ? `La fila se importó exitosamente.<br><br><a href="${skUrl}" target="_blank" class="btn btn-primary mt-2">Ver presupuesto (${skId})</a>`
: 'La fila se importó exitosamente.'; : 'La fila se importó exitosamente.';
let icon = 'success'; let icon = 'success';