# Vtiger Module ZIP Maker

Herramienta local para crear modulos vtlib y exportar ZIPs importables desde el Module Manager de Vtiger CRM open source 8.4.

El flujo principal usa el exportador oficial de Vtiger, `Vtiger_Package`, en una VM generadora que tenga un Vtiger instalado. La herramienta crea el modulo temporalmente en ese Vtiger, llama al export oficial y luego puede limpiar el modulo temporal.

## Arquitectura

```text
vtiger-module-maker/
  module-maker.php
  module-maker.config.php.example
  src/ModuleMaker.php
  public/
    index.php
    assets/app.js
    assets/style.css
  examples/equipos.json
  dist/
```

La VM generadora necesita:

- PHP CLI.
- PHP Zip.
- Un root local de Vtiger 8.4 funcional, con base de datos conectada.
- Permisos de escritura sobre `modules/` y `languages/` del Vtiger generador.

## Instalacion En La VM Generadora

Ubuntu/Debian:

```bash
sudo apt update
sudo apt install php-cli php-zip unzip
```

Copiar config:

```bash
cd vtiger-module-maker
cp module-maker.config.php.example module-maker.config.php
```

Editar:

```php
<?php

return array(
    'vtiger_root' => '/var/www/html/vtigercrm',
    'dist_dir' => __DIR__ . '/dist',
    'cleanup_after_export' => true,
    'auth_enabled' => true,
    'auth_user' => 'admin',
    'auth_password_hash' => password_hash('cambiar-esta-clave', PASSWORD_DEFAULT),
);
```

Para generar un hash fijo:

```bash
php -r "echo password_hash('TuClaveLarga', PASSWORD_DEFAULT), PHP_EOL;"
```

Y luego usar:

```php
'auth_password_hash' => '$2y$10$...',
```

Levantar GUI local:

```bash
php -S 127.0.0.1:8090 -t public
```

Abrir:

```text
http://127.0.0.1:8090
```

Completar el formulario y presionar `Generar ZIP importable`. El resultado queda en `dist/<Modulo>.zip`.

## Hostear Para Otra Persona

Si un amigo lo va a usar remoto, no expongas esta app sin proteccion. Puede escribir archivos en el Vtiger generador y crear/borrar metadata temporal.

Opcion recomendada: VPN privada, por ejemplo Tailscale/WireGuard, y servidor escuchando solo en la IP privada:

```bash
php -S 100.x.y.z:8090 -t public
```

Opcion muy segura para una sola persona: tunel SSH. En la VM:

```bash
php -S 127.0.0.1:8090 -t public
```

Tu amigo abre el tunel desde su maquina:

```bash
ssh -L 8090:127.0.0.1:8090 usuario@tu-vm
```

Y entra a:

```text
http://127.0.0.1:8090
```

Si lo publicas con dominio, ponelo detras de Nginx/Apache con HTTPS, firewall, auth activa y, si podes, allowlist de IPs.

## Flujo Con Dos VMs

VM 1, generadora:

```bash
cd vtiger-module-maker
php -S 127.0.0.1:8090 -t public
```

Generas `dist/Equipos.zip`.

Copiar a VM 2:

```bash
scp dist/Equipos.zip usuario@vm-vtiger:/tmp/
```

VM 2, destino:

1. Entrar a Vtiger como admin.
2. Ir a `Settings > Module Manager`.
3. Usar `Import Module From Zip`.
4. Subir `/tmp/Equipos.zip`.

## CLI

Validar definicion:

```bash
php module-maker.php validate examples/equipos.json --vtiger-root=/var/www/html/vtigercrm
```

Generar ZIP importable por Module Manager:

```bash
php module-maker.php package examples/equipos.json --vtiger-root=/var/www/html/vtigercrm --zip=dist/Equipos.zip
```

Conservar el modulo instalado en la VM generadora:

```bash
php module-maker.php package examples/equipos.json --vtiger-root=/var/www/html/vtigercrm --zip=dist/Equipos.zip --keep-installed
```

ZIP manual con `install_*.php`, no recomendado para Module Manager:

```bash
php module-maker.php script-package examples/equipos.json --output=build/Equipos --zip=dist/Equipos-manual.zip
```

## Formato JSON

Campos soportados:

```text
text, textarea, integer, decimal, date, datetime, picklist, checkbox, email, phone, url, reference, assigned_user_id
```

Reglas:

- `module.name` debe estar en PascalCase.
- `field.name` y `field.column` deben estar en snake_case.
- Debe existir exactamente un campo `assigned_user_id`.
- `picklist.values` no puede estar vacio.
- `reference.related_modules` debe contener modulos validos en PascalCase.
- Con `--vtiger-root`, las referencias se validan contra `modules/<Modulo>`.
- `module.entity_identifier` debe apuntar a un campo real que no sea `assigned_user_id`.

Ejemplo completo: `examples/equipos.json`.

## Rollback En La VM Generadora

Si `cleanup_after_export` esta activo, la herramienta elimina el modulo temporal despues de exportar y borra las tablas base/custom generadas.

Si lo conservaste con `--keep-installed`, puedes desinstalarlo desde la CLI manual:

```bash
php module-maker.php cleanup examples/equipos.json --vtiger-root=/var/www/html/vtigercrm --drop-tables
```

## Riesgos

- La GUI debe correr protegida; no la expongas a Internet.
- El export oficial requiere un Vtiger generador real porque `Vtiger_Package` lee metadata desde la base de datos.
- Si el modulo ya existe en la VM generadora, el export aborta para no pisar metadata existente.
- Vtiger 7.x y 8.x mantienen vtlib, pero pueden cambiar detalles de runtime PHP, menus y permisos. Probar primero en staging.
