# Utilerias RECON 2 Sistema de utilerias 2.0 para automatizacion de procesos aduaneros SCAII + DataStage. Construido sobre Voila (Jupyter widgets) con backend dual: SQL Server (SCAII) + PostgreSQL (DataStage en Docker). ## Pestanas - **Conexion** — selecciona la base SCAII a conectar. - **Descargas** — procesa facturas de exportacion contra saldos IMPO (paso 9/10). - **Analisis Saldos** — graficas y pivotes de SSaldoTem. - **Sustitutos NLP** — propone sustitutos en SPartesSustitutos via TF-IDF. - **Descarga % KGS** — analiza cobertura de descargas en KGS. - **CTM** — reasigna descargas de Cambio de Regimen a CTM. - **Saldos Vencidos** — prorratea saldos IMPO vencidos en descargas EXPO. - **DataStage** — carga archivos .asc del SAAI a tablas Registro* en Postgres. - **Estructuras SCAII** — reportes CAT/Pedimentos/Facturas/Partidas a Excel. - **Valores** — ajusta VALORTOTALME/MN de SPartidasExpo por prorrateo. ## Stack | Capa | Tecnologia | |---|---| | UI | Voila + ipywidgets | | Backend | Python 3.11+ (pandas, scikit-learn, pyodbc, psycopg2, sqlalchemy) | | BD aduanera | SQL Server (SCAII) | | BD DataStage | PostgreSQL 16 (en Docker) | | Reportes | openpyxl, python-docx | ## Requisitos del servidor - Windows 10 / 11 / Server con PowerShell. - **Python 3.11+** con "Add to PATH" durante instalacion. - **Docker Desktop** (para el contenedor de Postgres). - **ODBC Driver 18 for SQL Server** (para conectar a SCAII). - Acceso de red al servidor SQL Server donde vive SCAII. ## Configuracion inicial ### 1. Variables de entorno Copia `.env.example` a `.env` y completa los valores reales: ```bash cp .env.example .env ``` Edita `.env` con tu editor favorito y completa: - `DB_*` — credenciales del Postgres local (las que va a usar el contenedor). - `SCAII_*` — credenciales del SQL Server donde vive SCAII. > Importante: `.env` NO se sube al repo (esta en `.gitignore`). ### 2. Levantar Postgres en Docker ```powershell cd app docker compose --env-file ..\.env up -d postgres-datastage ``` Espera unos segundos. Verifica con: ```powershell docker ps ``` Debes ver `postgres-datastage` con estatus `Up X seconds (healthy)`. ### 3. Aplicar el schema de las tablas Registro* ```powershell docker cp schema_registro.sql postgres-datastage:/tmp/schema.sql docker exec -it postgres-datastage psql -U servicemanager -d dbSat -f /tmp/schema.sql ``` (Ajusta `servicemanager` y `dbSat` segun tu `.env`.) Verifica: ```powershell docker exec -it postgres-datastage psql -U servicemanager -d dbSat -c "\dt" ``` Debes ver 27 tablas: `Registro501`, `Registro551`, `Registro701`, ..., `base_numpartes`. ### 4. Arrancar la app ```powershell .\run_dev.bat ``` La primera vez tarda 2-3 minutos (crea `.venv`, instala dependencias). Cuando termine, abre el navegador en: ``` http://127.0.0.1:8866/ ``` ## Comandos utiles ```powershell # Estado del contenedor docker compose ps # Logs en vivo docker compose logs -f postgres-datastage # Detener Postgres docker compose stop # Volver a iniciar docker compose start # Eliminar contenedor (mantiene los datos) docker compose down # Eliminar contenedor + DATOS (CUIDADO) docker compose down -v ``` ## Estructura del proyecto ``` . ├── .env.example ├── .gitignore ├── README.md └── app/ ├── app.ipynb # notebook principal ├── launcher.py # lanzador Voila ├── run_dev.bat # script de arranque ├── requirements.txt # deps Python ├── docker-compose.yml # contenedor Postgres ├── schema_registro.sql # DDL tablas Registro* ├── Manual_*.docx # manuales de usuario └── generar_manual_*.py # generadores de manuales ``` ## Manuales Los `.docx` en `app/` son los manuales de usuario por modulo: - `Manual_GENPACT_V2.docx` — manual general (Conexion, Descargas, Analisis, NLP, KGS). - `Manual_CTM.docx` — modulo CTM. - `Manual_SaldosVencidos.docx` — modulo Saldos Vencidos. - `Manual_DataStage.docx` — modulo DataStage. - `Manual_EstructurasSCAII.docx` — modulo Estructuras SCAII. - `Manual_Valores.docx` — modulo Valores. Para regenerarlos despues de editar el script correspondiente: ```powershell python app\generar_manual_valores.py # (y los demas generar_manual_*.py segun el caso) ``` ## Soporte Para problemas o cambios, abre un PR en este repositorio. No hagas push directo a `main`.