diff --git a/.vscode/sftp.json b/.vscode/sftp.json index 89ef7722..e3778a2f 100755 --- a/.vscode/sftp.json +++ b/.vscode/sftp.json @@ -24,10 +24,15 @@ "username": "sk-dev", "password": "KXvYsubai9v*g61~" }, - "prod":{ + "sk-prod":{ "host": "erp.safekat.es", "username": "erp-demo", "password": "lNkEyukTc1~*3yy9" + }, + "sk-dev":{ + "host": "erp-dev.safekat.es", + "username": "erp-dev", + "password": "snqyxNZIhg8m3!9~" } } diff --git a/ci4/app/Controllers/Importadores/ImportadorCatalogo.php b/ci4/app/Controllers/Importadores/ImportadorCatalogo.php index c77b0fea..ca13df60 100644 --- a/ci4/app/Controllers/Importadores/ImportadorCatalogo.php +++ b/ci4/app/Controllers/Importadores/ImportadorCatalogo.php @@ -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; $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; - $precio_compra = isset($json->fila[4]) ? (float) $json->fila[4] : null; if (empty($isbn)) { 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(); // 1. Buscar por ISBN exacto @@ -214,6 +223,15 @@ class ImportadorCatalogo extends BaseResourceController $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 = [ 'selectedTirada' => $tirada, @@ -237,8 +255,8 @@ class ImportadorCatalogo extends BaseResourceController 'tipo' => "", 'tipo_presupuesto_id' => $libro->encuadernacion_id, 'clienteId' => 251, - 'isColor' => (in_array(strtolower($libro->tipo_impresion), ['color', 'colorhq']) ? 1 : 0), - 'isHq' => (in_array(strtolower($libro->tipo_impresion), ['negrohq', 'colorhq']) ? 1 : 0), + 'isColor' => $isColor, + 'isHq' => $isHq, 'paginas' => $libro->paginas, 'paginasColor' => $colorPaginas, 'papelInteriorDiferente' => $papelInteriorDiferente, @@ -270,6 +288,32 @@ class ImportadorCatalogo extends BaseResourceController '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 // 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 + ] + ]; + } + + + 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 4423e5c5..cf169fce 100644 --- a/httpdocs/assets/js/safekat/pages/importadores/catalogo/catalogo_tool.js +++ b/httpdocs/assets/js/safekat/pages/importadores/catalogo/catalogo_tool.js @@ -173,10 +173,10 @@ document.addEventListener('DOMContentLoaded', function () { if (response.ok && result.status === 200) { const skUrl = result.data?.sk_url?.replace('presupuestocliente', 'presupuestoadmin') ?? null; + const skId = result.data?.sk_id ?? ''; // Actualizar campo "Notas" con el enlace - if (skUrl) { - const skId = result.data?.sk_id ?? ''; + if (skUrl) { const notasHtml = `Ver presupuesto (${skId})`; // La columna de notas es la posición 6 (índice 6) rowData[6] = notasHtml; @@ -184,7 +184,7 @@ document.addEventListener('DOMContentLoaded', function () { } let html = skUrl - ? `La fila se importó exitosamente.

Ver presupuesto` + ? `La fila se importó exitosamente.

Ver presupuesto (${skId})` : 'La fila se importó exitosamente.'; let icon = 'success';