# updatev12.dkl

## Descripción General

El programa `updatev12.dkl` tiene como objetivo mantener actualizados los paquetes V12 instalados en una base de datos, así como sincronizar el código fuente y estructura de cada paquete V12 con respecto al repositorio central de instalación.

El sistema valida versiones de paquetes, versiones de esquema (`schema_ver`) y versión del manifiesto disponibles en un repositorio remoto para determinar si un paquete requiere:

- Actualización de código fuente (Deploy)
- Instalación o actualización estructural (Install)

---

# Nombre del Programa

```text
updatev12.dkl
```

---

# Argumentos

| Argumento | Tipo | Descripción |
|---|---|---|
| `from` | string | URL desde donde se descargará el archivo `manifest.json`. |
| `db` | string | Nombre de la conexión a la base de datos donde se encuentran los paquetes instalados. |

---

# URL por Defecto

Si no se especifica el argumento `from`, el sistema utilizará la siguiente URL por defecto:

```text
https://install-v12.induxsoft.net/
```

---

# Funcionalidad General

El programa realiza las siguientes operaciones:

1. Obtiene los paquetes instalados en la base de datos.
2. Descarga el archivo `manifest.json` desde la URL configurada.
3. Busca el archivo `.manifest` correspondiente a cada paquete instalado.
4. Compara versiones locales y remotas.
5. Determina si un paquete requiere:
   - Deploy
   - Instalación
6. Ejecuta la actualización correspondiente.

---

# Flujo General del Proceso

```text
Inicio
   │
   ├── Leer argumentos
   │
   ├── Obtener paquetes instalados desde la BD
   │
   ├── Descargar manifest.json remoto
   |
   ├── Obtener manifest remoto del paquete
   │
   ├── Para cada paquete instalado:
   │      │
   │      ├── Buscar archivo .manifest local
   │      │
   │      ├── Si no existe:
   │      │      └── Buscar paquete en catalog.json
   |      |               └── Obtener .manifiesto de cada paquete v12 y comparar las versiones
   │      │
   │      │
   │      ├── Comparar versiones
   │      │
   │      ├── Comparar schema_ver
   │      │
   │      ├── Si versión remota > versión local:
   │      │      └── Ejecutar Deploy
   │      │
   │      ├── Si schema_ver remoto > schema_ver BD:
   │      │      └── Ejecutar Install
   │
   └── Fin
```

---

# Obtención de Paquetes Instalados

El sistema consulta la base de datos configurada mediante el argumento `db` para obtener la lista de paquetes instalados.

Información mínima requerida:

| Campo | Descripción |
|---|---|
| `pack_id` | Identificador único del paquete |
| `version` | Versión instalada |
| `schema_ver` | Versión de esquema instalada |

---

# Descarga de `manifest.json`

El sistema descarga el archivo:

```text
manifest.json
```

desde:

```text
{from}/manifest.json
```

o desde:

```text
https://install-v12.induxsoft.net/manifest.json
```

---

# Estructura Esperada de `manifest.json`

Ejemplo:

```json
{
  "dbext": 
  {
    "id": "dbext",
    "version": "1.0.100",
    "schema_ver": "1.0.10",
    "installable":["dbext"]
  }
}
```

---

# Búsqueda de Archivos `.manifest`

Para cada paquete instalado:

1. Se busca el archivo `.manifest` asociado al paquete con base al ID de paquete `pack_id`.
2. Si no se encuentra:
   - Se consulta `catalog.json`.
   - Se obtiene la lista de paquetes relacionados.
   - Se localiza el manifiesto correspondiente del paquete.

---

# Uso de `catalog.json`

El archivo `catalog.json` funciona como respaldo para localizar paquetes cuyo archivo `.manifest` no exista localmente con nombre `{pack_id}.manifest`.

Ejemplo:

```json
pack_id = inventario

catalog.json
{
  "inventario": ["movinv.zip"]
}

El manifiesto del paquete se nombre `movinv.manifest`

- Se toma el arreglo con el id de paquete y se recorre para buscar el archivo `.manifest` del paquete.

```

---

# Comparación de Versiones

El sistema compara:

| Comparación | Acción |
|---|---|
| `manifest.version > local.version` | Ejecutar Deploy |
| `manifest.schema_ver > db.schema_ver` | Ejecutar Install |

---

# Lógica de Validación

## Validación de Versiones

Ejemplo:

| Local | Remota | Acción |
|---|---|---|
| 1.0.10 | 1.0.11 | Deploy |
| 1.0.10 | 1.0.10 | Ninguna |
| 1.0.10 | 1.0.9 | Ninguna |

---

## Validación de `schema_ver`

Ejemplo:

| BD | Remota | Acción |
|---|---|---|
| 1.0.10 | 1.0.11 | Install |
| 1.0.10 | 1.0.10 | Ninguna |

---
## Escenarios contemplados

| Error | Acción |
|---|---|
| No existe `manifest.json` | Cancelar proceso |
| No existe `.manifest` local | Buscar en `catalog.json` |
| Error de conexión a BD | Finalizar ejecución |
| Manifest inválido | Registrar error |
| Error en deploy/install | Registrar y continuar |

---

# Resultado Esperado

Al finalizar la ejecución:

- Todos los paquetes V12 instalados estarán sincronizados.
- El código fuente estará actualizado.
- La estructura de base de datos estará alineada con las versiones publicadas.
- Los manifiestos locales estarán actualizados respecto al repositorio remoto.


```
Ejemplo de uso:

./dkl updatev12.dkl "qname=conexion@app" "from=URL (opcional)"

```