Metadata-Version: 2.4
Name: mmi-consume-roan
Version: 0.1.2
Summary: Paquete para consumir el webservice de alertas ABCMASMMI (abc+) e insertarlas en base de datos
Author: Angel Rogelio Argonza Roblero
License-Expression: MIT
Keywords: python,mmi,abcmasmmi,alertas,rest
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: pymysql>=1.1
Requires-Dist: requests>=2.31
Requires-Dist: urllib3>=2.0
Requires-Dist: secure-credentials-roan>=0.1.1
Requires-Dist: w-log-roan>=0.1.2
Dynamic: license-file

# mmi-consume-roan

Paquete Python que consume el webservice REST de alertas del sistema **ABCMASMMI**
(abc+) y las inserta en MySQL mediante stored procedures. Se distribuye como paquete
instalable (`pip install -e .`) con un entry point de consola: `mmi-consume`.

## ¿Qué hace?

1. Consulta en MySQL, vía `automcae.sp_selabcmmi`, el listado de sucursales y sus URLs
   de conexión al webservice abc+.
2. Por cada sucursal hace un `GET` HTTPS (con verificación contra un certificado
   `.pem` propio) al webservice y parsea la respuesta JSON.
3. Mapea cada alerta del JSON a un DTO (`DatabaseAlertasDTO`).
4. Inserta cada alerta en MySQL vía el stored procedure
   `automcae.sp_inscaalertasabc`, revisando el parámetro de salida `@paerror` para
   confirmar el éxito de la inserción.
5. Registra el resultado del proceso en el log (vía `w_log_roan`).

El proceso reintenta indefinidamente (`while response == False`) hasta obtener una
respuesta exitosa de `RestAbcMasMMI().getDataFromABC()`.

> **Nota / limitación conocida:** `conn_abcmasmmi.py` tiene un `break` incondicional
> al final del `for` de sucursales, por lo que en la práctica solo procesa la primera
> sucursal devuelta por `sp_selabcmmi`. Es un hallazgo detectado, pendiente de
> confirmación con el autor antes de corregirse.

## Requisitos

- Python >= 3.10 (probado en 3.13).
- MySQL accesible con los stored procedures `automcae.sp_selabcmmi` y
  `automcae.sp_inscaalertasabc` ya creados.
- Certificado SSL (`.pem`) para autenticar el request HTTPS contra abc+.
- Un archivo de texto plano con credenciales de BD (ver sección *Configuración*).

### Dependencias

Dependencias públicas (PyPI), listadas en `pyproject.toml` / `requirements.txt`:

- `requests`
- `urllib3`
- `pymysql`
- `certifi`, `cffi`, `charset-normalizer`, `cryptography`, `idna`, `pycparser`
  (transitivas de las anteriores)

Dependencias privadas, **no publicadas en PyPI** (hay wheels locales en
`package-offline/` para instalación sin conexión):

- `secure-credentials-roan` — cifra/descifra el archivo de credenciales de BD.
- `w-log-roan` — logging propio del proyecto.

Usa la skill `/deps-check` para verificar cuáles de estas están instaladas en tu
intérprete actual.

## Instalación

```powershell
python -m venv .venv
.venv\Scripts\python -m pip install -e .
pip install --index-url https://{username}:{password}@gitea.example.com/api/packages/{owner}/pypi/simple --no-deps {package_name}
```

Si no tienes acceso a PyPI para las dependencias privadas, instala primero los wheels
incluidos en `package-offline/`:

```powershell
.venv\Scripts\python -m pip install package-offline\secure_credentials_roan-0.1.1-py3-none-any.whl
.venv\Scripts\python -m pip install package-offline\w_log_roan-0.1.2-py3-none-any.whl
.venv\Scripts\python -m pip install -e .
```

## Configuración

El paquete busca dos rutas fuera del código, ancladas por defecto a la raíz del
proyecto (o configurables por variable de entorno):

| Recurso | Ruta por defecto | Variable de entorno |
|---|---|---|
| Credenciales BD y certificado | `secure_data_mmi/` (raíz del proyecto) | `MMI_SECURE_DATA_DIR` |
| Certificado SSL | `secure_data_mmi/abcmas_cer.pem` | (usa la misma carpeta anterior) |
| Logs | `C:\logs\<modulo>\` | — (fijo en el código) |

### Credenciales de base de datos

1. Crea `secure_data_mmi/access.txt` con el formato:

   ```
   host=...
   user=...
   password=...
   database=...
   port=...
   ```

2. En la primera ejecución, `secure/secure.py` cifra automáticamente ese archivo
   (genera `credentials.enc` y `secret.key`, y borra `access.txt` en texto plano).
   En ejecuciones posteriores se descifra desde ahí — no vuelvas a crear
   `access.txt` a mano salvo que quieras rotar credenciales.

### Certificado SSL

Coloca el certificado del webservice abc+ en `secure_data_mmi/abcmas_cer.pem`.

> `secure/`, `*.pem`, `access.txt`, `credentials.enc` y `secret.key` son artefactos
> sensibles: trátalos como solo lectura una vez generados, no los subas al repo.

## Uso

Una vez instalado y configurado:

```powershell
mmi-consume
```

Equivalente a ejecutar `python -m mmi_consume_roan.main`. El proceso:

- Corre localmente en Windows, o en un servidor remoto vía tarea programada.
- Escribe logs en `C:\logs\main\`, `C:\logs\conn_abcmasmmi\`, `C:\logs\database\`,
  `C:\logs\dao_db\` y `C:\logs\secure\` (uno por módulo, vía `w_log_roan`).
- Termina cuando logra insertar exitosamente las alertas de la sucursal procesada.

## Tests

```powershell
.venv\Scripts\python -m pytest test/
```

Cubren `conn_abcmasmmi`, `database`, `dao_db`, `dto_database`, `exceptions` y `main`.

## Estructura del proyecto

```
mmi_consume_roan/
├── main.py                    # Entry point (mmi-consume)
├── config/
│   ├── conn_abcmasmmi.py      # Cliente REST hacia abc+
│   └── database.py            # Conexión MySQL (pymysql)
├── data/
│   ├── dao/dao_db.py          # DAOs: alertas y conexiones/sucursales
│   └── dto/dto_database.py    # DTO de alerta
├── secure/secure.py           # Cifrado/descifrado de credenciales
└── src/exceptions/exceptions.py
```

## Licencia

MIT License. Ver [LICENSE](LICENSE).

## Autor

Angel Rogelio Argonza Roblero
