# LicenciasMIG

Sistema de licencias para clientes MIG. Reemplaza a `179.50.90.179/MIGREGISTROEMPRESAS` y `MIGEMPRESAS`.

- **Backend**: Flask + SQLAlchemy + spyne (SOAP) + pyodbc
- **Frontend**: HTML + Bootstrap 5 + JS vanilla
- **BD**: SQL Server (LicenciasMIG en el VPS)
- **Server**: Apache + mod_wsgi en `194.163.45.32:95`

## Estructura

```
LicenciasMIG/
├── app.py                    # Flask app principal
├── app.wsgi                  # entrada WSGI para Apache
├── models.py                 # SQLAlchemy ORM
├── crypto.py                 # AES Rijndael (compatible cliente MIG)
├── soap_service.py           # SOAP con 6 metodos del WSDL viejo
├── routes/
│   ├── auth.py               # /login, /logout, /api/v1/auth/*
│   ├── empresas.py           # /api/v1/empresas/*
│   ├── licencias.py          # /api/v1/licencias/*
│   ├── usuarios.py           # /api/v1/usuarios/*
│   ├── logs.py               # /api/v1/logs/*
│   └── pages.py              # rutas HTML
├── templates/                # Jinja2 + Bootstrap
├── static/{css,js,img}/      # assets
├── sql/                      # scripts BD + migracion ETL
├── deploy/                   # vhost Apache + deploy.sh
├── requirements.txt
├── .env.example
└── README.md
```

## Endpoints

### Web admin
| Ruta | Descripcion |
|---|---|
| `GET  /`             | Redirige a /login o /dashboard |
| `GET  /login`        | Login del panel |
| `POST /login`        | Procesa login |
| `GET  /dashboard`    | KPIs y ultimos logs |
| `GET  /empresas`     | Listado y CRUD de empresas |
| `GET  /licencias`    | Listado, activar/bloquear/regenerar clavemes |
| `GET  /usuarios`     | Gestion de usuarios admin |
| `GET  /logs`         | Logs del SOAP |

### REST API (JSON, requiere sesion)
- `GET/POST/PUT/DELETE /api/v1/empresas`
- `PATCH /api/v1/empresas/<id>/{mensualidad,regulariza}`
- `GET/POST/PATCH/DELETE /api/v1/licencias`
- `PATCH /api/v1/licencias/<id>/{activar,bloquear}`
- `POST  /api/v1/licencias/<id>/regenerar-clavemes`
- `GET/POST/PUT/DELETE /api/v1/usuarios`
- `GET   /api/v1/logs`

### SOAP compatible cliente MIG
URL base: `http://194.163.45.32:95/LicenciasService.asmx`

Metodos (mismos nombres que el WSDL viejo, compatibles 1:1 con `WSMIG.RibiSoft`):
- `RegistrarEmpresa(usuario, contrasenia, nit, razonsocial, ...)`
- `IngresoEmpresa(...)`
- `ValidarEmpresa(usuario, contrasenia, nit)`
- `RegistrarLicencia(...)`
- `ValidarLicenciaMensual(usuario, contrasenia, nit)` -> `Encrypt(nit + MM)`
- `InactivarLicencia(usuario, contrasenia, nit)`

WSDL: `http://194.163.45.32:95/LicenciasService.asmx?wsdl`

## Instalacion en el VPS

```bash
# 1) Subir el proyecto
scp -r LicenciasMIG root@194.163.45.32:/tmp/

# 2) Conectarse y desplegar
ssh root@194.163.45.32
bash /tmp/LicenciasMIG/deploy/deploy.sh

# 3) Editar .env con credenciales reales
nano /var/www/html/LicenciasMIG/.env
systemctl reload apache2

# 4) Crear BD y tablas (desde el VPS o cualquier cliente SQL)
sqlcmd -S localhost -U sa -P '...' -i /var/www/html/LicenciasMIG/sql/01_create_database.sql
sqlcmd -S localhost -U sa -P '...' -i /var/www/html/LicenciasMIG/sql/02_create_tables.sql

# 5) Inicializar admin
curl http://127.0.0.1:95/init-db
# -> usuario admin / contrasena admin123 (CAMBIAR al primer login)

# 6) Migrar datos viejos (opcional)
cd /var/www/html/LicenciasMIG
SRC_PASSWORD='...' DEST_PASSWORD='...' venv/bin/python sql/migrate_from_clientesmig.py
```

## Cambios necesarios en el cliente MIG

Una vez desplegado, hay que actualizar `MIGSERVERVS2015\MIG`:

1. **Eliminar Web Reference vieja**: `Web References\WSMIG\` (que contiene `RibiService.wsdl`).
2. **Agregar Web Reference nueva**:
   - URL: `http://194.163.45.32:95/LicenciasService.asmx?wsdl`
   - Nombre: `WSLicencias`
3. **Search & Replace global** en todos los `.cs`:
   - `WSMIG.RibiSoft` -> `WSLicencias.LicenciasService`
   - `RibiService` -> `LicenciasService`
   - URL hardcoded `http://179.50.90.179/MIGREGISTROEMPRESAS/` ->
     `http://194.163.45.32:95/LicenciasService.asmx`

## Variables de entorno (.env)

| Variable | Default | Notas |
|---|---|---|
| `DB_SERVER`     | localhost                       | SQL Server destino |
| `DB_DATABASE`   | LicenciasMIG                    | |
| `DB_USERNAME`   | sa                              | |
| `DB_PASSWORD`   | -                               | obligatoria |
| `FLASK_SECRET_KEY` | -                            | string aleatorio largo |
| `SOAP_USER`     | admin                           | credencial que envia el cliente MIG |
| `SOAP_PASSWORD` | 123*/                           | id |
| `AES_PASSWORD`  | luc1an@1210                     | NO cambiar (compatibilidad) |
| `AES_SALT`      | r1b1s0f7                        | NO cambiar |
| `AES_IV`        | @1B2c3D4e5F6g7H8                | NO cambiar |

## Health check

```bash
curl http://194.163.45.32:95/health
# {"ok": true, "ts": "2026-..."}
```

## Logs

- Apache: `/var/log/apache2/LicenciasMIG_error.log`
- Auditoria SOAP: tabla `dbo.WebServiceLogs` (visible en /logs)
