# Bases de datos de demo — diccionario

XPERT_SAPB1 es un sistema **mono-empresa** (ver `src/controllers/CompanyController.php`):
cada base de datos solo puede tener **una** empresa cargada. Para tener varios rubros de
demo disponibles (autopartes, ferretería, etc.) sin pisarse entre sí, cada rubro vive en
su **propia base de datos**, corriendo el mismo código (`/var/www/XPERT_SAPB1` en el
server `xpert-wms-dev`), resuelto por la variable de entorno `DB_DATABASE`
(`src/config/app.php`).

## Diccionario (base de datos ↔ demo)

| Base de datos | Empresa (`companies.code`) | Rubro | Puerto propio | Seed |
|---|---|---|---|---|
| `xpert_sapb1` | CENMOTOR — Central Motor S.A. | Autopartes / repuestos, lubricantes, filtros | 8083 (default del código) | `scripts/seed_centralmotor.php` |
| `xpert_sapb1_ferreteria` | FERREINTER — FERRE INTER S.A. | Ferretería / herramientas de mano y eléctricas, tornillería | **8085** | `scripts/seed_ferreteria.php` |

Ambas: login `admin` / `admin123`, mismo checkout de código, MariaDB del mismo server,
usuario de base `xpertsapb1_user` con acceso otorgado a ambas.

### ⚠️ El mock SAP (:8090) tiene que moverse junto con la app

El mock SAP propio de XPERT_SAPB1 (`mock/`, vhost `xpertsapb1_mock.conf`, puerto
**8090**) es **un solo proceso compartido**, igual que la app — también resuelve su
dataset fijo (`mock_dataset_file()` en `mock/store.php`) por `DB_DATABASE`, y **tiene
su propio `SetEnv` independiente del de la app**. Si cambiás a qué base apunta `:8083`
(o `:8085`) pero te olvidás de cambiar también `xpertsapb1_mock.conf`, vas a ver la
app con un rubro y "Importar de SAP" con el otro — pasó el 2026-08-13 al armar la demo
de ferretería. **Los dos `SetEnv DB_DATABASE` (el de la app y el del mock) siempre
tienen que decir lo mismo.**

### ⚠️ Estado actual (última actualización: 2026-08-13)

**:8083** (app) y **:8090** (mock SAP) tienen `SetEnv DB_DATABASE xpert_sapb1_ferreteria`
— quedaron apuntados a **FERRE INTER (ferretería)** para una demo, no a la base por
defecto (`xpert_sapb1`, Central Motor). El puerto **8085** sigue apuntado a ferretería
también (sin cambios), así que ahora mismo **:8083 y :8085 muestran lo mismo**.

Para volver todo a Central Motor: en `xpert-wms-dev`, editar
`/etc/apache2/sites-enabled/xpertsapb1.conf` **y**
`/etc/apache2/sites-enabled/xpertsapb1_mock.conf`, borrar (o cambiar a `xpert_sapb1`)
la línea `SetEnv DB_DATABASE` en **ambos**, `sudo apache2ctl configtest`,
`sudo systemctl reload apache2` — y actualizar esta nota.

Además: `mock/mock_data.json` (overlay de documentos de prueba creados a mano desde
el panel admin del mock) es independiente de `DB_DATABASE` — si tiene datos de un
rubro viejo mezclados, conviene resetearlo a
`{"sales_orders":[],"purchase_orders":[],"transfer_requests":[],"purchase_invoices":[],"purchase_credit_notes":[],"purchase_return_requests":[]}`
al cambiar de rubro, para no ver documentos de prueba de la demo anterior mezclados.

**Esta sección es la única fuente de verdad de "qué está sirviendo cada puerto ahora
mismo"** — la tabla de arriba es el catálogo de bases que existen, no necesariamente
lo que está activo en cada puerto en este momento (ver "cambio en duro" más abajo).

**Actualizar esta tabla cada vez que se cree una base de demo nueva** — es la única
fuente de verdad de qué existe.

## Cómo se separan hoy (puerto dedicado por demo)

Cada rubro tiene su propio vhost de Apache, en su propio puerto, cada uno con
`SetEnv DB_DATABASE <base>` fijo:

```
# /etc/apache2/sites-enabled/xpertsapb1.conf            (puerto 8083)
<VirtualHost *:8083>
    DocumentRoot /var/www/XPERT_SAPB1/public
    # sin SetEnv DB_DATABASE -> usa el default de src/config/app.php: xpert_sapb1
</VirtualHost>

# /etc/apache2/sites-enabled/xpertsapb1_ferreteria.conf  (puerto 8085)
<VirtualHost *:8085>
    DocumentRoot /var/www/XPERT_SAPB1/public
    SetEnv DB_DATABASE xpert_sapb1_ferreteria
</VirtualHost>
```

Con este esquema, para ver un rubro u otro alcanza con entrar a un puerto distinto —
no hace falta tocar nada. Es lo que ya está andando.

## Cambio en duro (redirigir un vhost existente a otra base)

Si en cambio querés que **una URL fija** (ej. siempre `:8083`, la que ya le pasaste a
un cliente) muestre un rubro distinto según el caso, se cambia el `SetEnv DB_DATABASE`
de ese vhost puntual y se recarga Apache:

```bash
ssh xpert-wms-dev
sudo nano /etc/apache2/sites-enabled/xpertsapb1.conf
# agregar o editar la línea:  SetEnv DB_DATABASE xpert_sapb1_ferreteria
sudo apache2ctl configtest   # valida sintaxis antes de aplicar
sudo systemctl reload apache2
```

Para volver a Central Motor: mismo procedimiento, `SetEnv DB_DATABASE xpert_sapb1`
(o borrar la línea directamente, ya que `xpert_sapb1` es el default si no se especifica).

**Importante:** esto no mueve ni copia datos — el vhost simplemente empieza a leer y
escribir en la otra base. Los datos de la base anterior quedan intactos, esperando a
que se vuelva a apuntar ahí.

## Crear una base de demo nueva (nuevo rubro)

1. Base: `CREATE DATABASE xpert_sapb1_<rubro>` + otorgar acceso a `xpertsapb1_user`
   (requiere usuario con privilegio de creación, ej. `sudo mysql`).
2. Esquema: correr todas las migraciones (`database/migrations/*.sql`, en orden) contra
   la base nueva.
3. Seed: escribir `scripts/seed_<rubro>.php` (adaptar `scripts/seed_centralmotor.php` o
   `scripts/seed_ferreteria.php` como plantilla) + sus scripts de simulación de
   recepción/picking-levels si corresponde. Todo se corre con
   `DB_DATABASE=xpert_sapb1_<rubro> php scripts/seed_<rubro>.php --confirm`.
4. Sucursales (opcional): `scripts/create_branch_warehouse_maps.php` es genérico —
   deriva las familias de racks del propio CD de la base contra la que corre, no hace
   falta tocarlo por rubro.
5. Exposición: o bien un vhost/puerto nuevo (agregar `Listen <puerto>` en
   `/etc/apache2/ports.conf` + un `.conf` en `sites-available` como el de ferretería),
   o reusar un vhost existente vía el "cambio en duro" de arriba.
6. **Actualizar la tabla del diccionario en este documento.**
