# Auditoría de credenciales de facturación por tenant

> Última verificación: 2026-08-25, después del deploy `6f32fc49`.
> Fuente: lectura directa de las bases de producción. No se imprimieron valores secretos.

## Regla operativa

Cada tenant que facture electrónicamente debe revisarse en `companies`:

| Campo | Significado | ¿Se guarda el valor en esta documentación? |
|---|---|---|
| `soap_username` | Usuario secundario/SOL u OSE configurado | No |
| `soap_password` | Contraseña del usuario secundario/SOL u OSE | No |
| `certificate` | Nombre del certificado digital asociado | No |

Además, el archivo asociado al certificado debe existir en el almacenamiento privado:
`storage/app/certificates/`.

Nunca se deben registrar en Git, tickets, capturas ni reportes los valores de usuario,
contraseña, certificado, token o contenido PEM/PFX. La auditoría solo debe indicar si el
campo está presente (`1`) o vacío (`0`).

## Estados observados en producción

| Estado | Tenants |
|---|---|
| Usuario + contraseña + certificado | `miangelito`, `sanfrancisco`, `miangelito1`, `angelito`, `boticadiaz`, `boticapedrito`, `cuidarte`, `imperial`, `biosalud`, `feypaz`, `vitaloxa`, `farmaperu`, `vidafarma` |
| Usuario + contraseña; sin certificado | `boticabienestar`, `medic`, `mqn`, `santdofar`, `lizfarma`, `mininojesus` |
| Usuario; sin contraseña ni certificado | `demo`, `vifarma` |
| Sin usuario, contraseña ni certificado | `shaddai`, `adela`, `larco`, `georga`, `ariel` |

El almacenamiento privado tenía 30 archivos de certificado y 612 KB en total al momento
de la revisión. La existencia de un archivo debe cruzarse siempre con el nombre guardado en
`companies.certificate`; contar archivos por sí solo no demuestra que todos estén asociados.

## Interpretación

- Los tenants de control interno pueden quedar sin certificado si no emitirán comprobantes;
  deben estar identificados como tales y no probar facturación electrónica.
- Un tenant que sí factura necesita, como mínimo, usuario y contraseña válidos. Si el flujo
  firma localmente, también necesita certificado digital y archivo asociado.
- Si un tenant cambia de certificado o contraseña, se debe validar una operación de prueba
  controlada y revisar que el comprobante no quede duplicado antes de reintentar envíos.
- El despliegue, las migraciones y la limpieza de caché no deben borrar ni reemplazar estos
  campos. Antes de cualquier operación destructiva se conserva el backup de bases y del
  directorio de certificados.

## Consulta segura de presencia

La consulta debe devolver únicamente indicadores, nunca los valores:

```sql
SELECT
    number,
    IF(NULLIF(TRIM(soap_username), '') IS NULL, 0, 1) AS has_soap_username,
    IF(NULLIF(TRIM(soap_password), '') IS NULL, 0, 1) AS has_soap_password,
    IF(NULLIF(TRIM(certificate), '') IS NULL, 0, 1) AS has_certificate
FROM <tenant>.companies;
```

Para un cambio de certificado se debe verificar también, de forma privada, que el archivo
referenciado exista y que el proceso FPM pueda leerlo. No se debe mostrar el contenido del
certificado en consola ni en la interfaz.
