diff --git a/ci4/app/Controllers/Importadores/ImportadorCatalogo.php b/ci4/app/Controllers/Importadores/ImportadorCatalogo.php
index 678aebf0..c77b0fea 100644
--- a/ci4/app/Controllers/Importadores/ImportadorCatalogo.php
+++ b/ci4/app/Controllers/Importadores/ImportadorCatalogo.php
@@ -3,6 +3,7 @@ namespace App\Controllers\Importadores;
use App\Controllers\BaseResourceController;
use App\Entities\Catalogo\CatalogoLibroEntity;
+use App\Models\Presupuestos\PresupuestoModel;
use App\Models\Catalogo\CatalogoLibroModel;
use App\Controllers\Presupuestos\Presupuestocliente;
use App\Services\PresupuestoService;
@@ -45,7 +46,7 @@ class ImportadorCatalogo extends BaseResourceController
$viewData = [
'pageSubTitle' => lang('Basic.global.ManageAllRecords', [lang('Importador.importadorCatalogoTitle')]),
-
+
];
$viewData = array_merge($this->viewData, $viewData); // merge any possible values from the parent controller class
@@ -58,37 +59,51 @@ class ImportadorCatalogo extends BaseResourceController
{
$json = $this->request->getJSON();
- if (!$json || !isset($json->fila[0])) {
+ // Validación inicial del JSON y del ISBN
+ if (!$json || !isset($json->fila[0]) || empty(trim($json->fila[0]))) {
return $this->response->setJSON([
'apto' => false,
- 'reason' => 'Datos inválidos'
+ 'reason' => 'ISBN no proporcionado o datos inválidos'
]);
}
- $input = trim($json->fila[0]); // Asumimos que 'input' es el primer campo de la fila
+ $input = trim($json->fila[0]); // ISBN
+ $refCliente = isset($json->fila[1]) ? trim($json->fila[1]) : null;
- if (empty($input)) {
+ // Validar formato del refCliente (esperado: idpedido-idlinea)
+ if (empty($refCliente) || strpos($refCliente, '-') === false) {
return $this->response->setJSON([
'apto' => false,
- 'reason' => 'ISBN no proporiconado'
+ 'reason' => 'Ref. cliente inválido'
+ ]);
+ }
+
+ // 1. 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([
+ 'apto' => false,
+ 'reason' => 'Referencia ya importada'
]);
}
$catalogoModel = new CatalogoLibroModel();
- // 1. Buscar por ISBN exacto
+ // 2. Buscar por ISBN exacto
$libroPorIsbn = $catalogoModel->where('isbn', $input)->first();
-
if ($libroPorIsbn) {
return $this->response->setJSON([
'apto' => true
]);
}
- // 2. Buscar por EAN sin guiones
+ // 3. Buscar por EAN sin guiones
$eanLimpio = str_replace('-', '', $input);
-
- $libroPorEan = $catalogoModel->where('REPLACE(ean, "-", "")', $eanLimpio)->first();
+ $libroPorEan = $catalogoModel
+ ->where('REPLACE(ean, "-", "")', $eanLimpio, false) // false para evitar escapado automático
+ ->first();
if ($libroPorEan) {
return $this->response->setJSON([
@@ -96,7 +111,7 @@ class ImportadorCatalogo extends BaseResourceController
]);
}
- // No encontrado
+ // 4. No encontrado
return $this->response->setJSON([
'apto' => false,
'reason' => 'No encontrado en catálogo'
@@ -105,6 +120,7 @@ class ImportadorCatalogo extends BaseResourceController
+
public function importarFila()
{
$json = $this->request->getJSON();
@@ -248,11 +264,11 @@ class ImportadorCatalogo extends BaseResourceController
'entrega_taller' => 1,
];
- return $this->response->setJSON([
+ /*return $this->response->setJSON([
'success' => true,
'message' => 'Libro encontrado y preparado para importar.',
'data' => $dataToImport
- ]);
+ ]);*/
// Procedemos a intentar guardar el presupuesto
@@ -287,7 +303,7 @@ class ImportadorCatalogo extends BaseResourceController
$response['data']['sk_id'],
$precio_compra,
$tirada,
- null,
+ null,
true
);
if ($respuesta_ajuste['warning'] == true) {
diff --git a/httpdocs/assets/js/safekat/pages/importadores/catalogo/catalogo_tool.js b/httpdocs/assets/js/safekat/pages/importadores/catalogo/catalogo_tool.js
index 5b9e19c8..4423e5c5 100644
--- a/httpdocs/assets/js/safekat/pages/importadores/catalogo/catalogo_tool.js
+++ b/httpdocs/assets/js/safekat/pages/importadores/catalogo/catalogo_tool.js
@@ -57,7 +57,8 @@ document.addEventListener('DOMContentLoaded', function () {
headerMap[name.toLowerCase()] = idx;
});
- const missing = TABLE_COLUMNS.filter(col => !(col in headerMap));
+ const requiredColumns = ["idpedido", ...TABLE_COLUMNS];
+ const missing = requiredColumns.filter(col => !(col in headerMap));
if (missing.length > 0) {
Swal.fire({
title: 'Error',
@@ -73,7 +74,19 @@ document.addEventListener('DOMContentLoaded', function () {
const rows = [];
for (let i = 1; i < data.length; i++) {
- const rowData = TABLE_COLUMNS.map(col => data[i][headerMap[col]] ?? '');
+ // Leer columnas necesarias desde Excel
+ const input = data[i][headerMap["input"]] ?? '';
+ const idlinea = data[i][headerMap["idlinea"]] ?? '';
+ const idpedido = data[i][headerMap["idpedido"]] ?? ''; // aunque no esté en TABLE_COLUMNS, lo usamos aquí
+ const descripcion = data[i][headerMap["descripcion"]] ?? '';
+ const cnt_pedida = data[i][headerMap["cnt_pedida"]] ?? '';
+ const precio_compra = data[i][headerMap["precio_compra"]] ?? '';
+
+ // Componer Ref. Cliente
+ const refCliente = `${idpedido}-${idlinea}`;
+
+ // Solo mostramos las columnas necesarias (como en el orden de DataTable HTML)
+ const rowData = [input, refCliente, descripcion, cnt_pedida, precio_compra];
// Llamar backend para validar la fila
const result = await validarFila(rowData);
@@ -163,7 +176,8 @@ document.addEventListener('DOMContentLoaded', function () {
// Actualizar campo "Notas" con el enlace
if (skUrl) {
- const notasHtml = `Ver presupuesto`;
+ const skId = result.data?.sk_id ?? '';
+ const notasHtml = `Ver presupuesto (${skId})`;
// La columna de notas es la posición 6 (índice 6)
rowData[6] = notasHtml;
dataTable.row($row).data(rowData).draw(false); // Redibujar la fila SIN perder scroll ni filtros
@@ -176,7 +190,7 @@ document.addEventListener('DOMContentLoaded', function () {
if (result.price_warning) {
html = skUrl ? `La fila se importó exitosamente, pero el precio se ha ajustado debajo de costes.
Ver presupuesto`
- : 'La fila se importó exitosamente, pero el precio se ha ajustado debajo de costes.';
+ : 'La fila se importó exitosamente, pero el precio se ha ajustado debajo de costes.';
icon = 'warning';
}
@@ -284,10 +298,12 @@ document.addEventListener('DOMContentLoaded', function () {
idsNoAjustados.push(result.data.sk_id);
}
+ const skId = result.data?.sk_id ?? '';
+
if (skUrl) {
- fila.rowData[6] = `Ver presupuesto`;
+ fila.rowData[6] = `Ver presupuesto (${skId})`;
} else {
- fila.rowData[6] = `Importado`;
+ fila.rowData[6] = `Importado (${skId})`;
}
} else {
fila.rowData[6] = `${result.message ?? 'Error desconocido'}`;