Comportamiento
El alta pública de Difactu guarda sus condiciones versionadas enhpc_difactu_privacy_acceptance. No necesita una fila con ID 3 en el catálogo
hpc_contractmodel de Nubidoc. La creación administrativa de clientes conserva
su aceptación de contrato anterior.
Las validaciones de aceptación siguen siendo obligatorias. Si falla la escritura
de la evidencia, el alta se revierte. No se modifican los textos contractuales.
Incidente de PROD — 16 de septiembre de 2026
A las 00:18:03, el alta falló con «Error al crear cliente» porque el catálogo de contratos legado estaba vacío. Cliente y usuario se revirtieron. Se aplicó un parche limitado aApi_CustomerController::createAction(), con copia previa,
validación PHP 7.4 y comprobación del archivo desplegado. No se escribieron datos
de clientes ni se crearon cuentas de prueba durante la intervención.
La comprobación aislada supera el fallo original y conserva la llamada de evidencia.
PROD también rechaza por HTTP 400 una petición pública sin aceptación de condiciones.
Juan confirmó posteriormente que la cuenta se creó. El siguiente ajuste unifica
la confirmación con el PIN que solicita la app.
QA pendiente
QA no se ha modificado en esta intervención. Su próxima actualización debe incluir la corrección del registro público. Antes de aplicarla, comprobar su versión y crear su propia copia de seguridad; no trasladar hashes ni configuración de PROD.- Verificar que el bloque de
hpc_usercontractestá condicionado a!$isPublicDifactuRegistration. - Conservar
recordOnboardingTermsAcceptance()dentro de la transacción. - Ejecutar el test
difactu-signup-contract-acceptance.phpy PHP lint. - Completar un alta con una cuenta de prueba autorizada y comprobar evidencia, módulo y acceso por PIN, además del rechazo cuando falta la aceptación.
docs/fixes/FIX_DIFACTU_REGISTRATION_LEGACY_CONTRACT.md del repositorio de código.
Confirmación y acceso por PIN
Las nuevas altas públicas quedan pendientes (status=0), sin código de enlace y
sin el correo de Nubidoc. El correo «Tu PIN de Difactu» indica el código que se
introduce en la app para confirmar el correo y entrar. No pide una contraseña.
Las cuentas existentes pueden solicitar otro PIN sin repetir el registro.
La entrega es directa, sin esperar al despachador de notificaciones. Un fallo de
SMTP responde auth_pin_delivery_failed. La validación consume el PIN y activa
la cuenta con una actualización SQL condicional antes de emitir JWT; un reenvío,
consumo simultáneo, bloqueo o borrado impide reutilizar la lectura anterior.
Los controles de cliente activo y módulo Difactu permanecen obligatorios.
QA pendiente: desplegar primero AuthController y después CustomerController.
Verificar entrega, estado pendiente hasta introducir el PIN, activación y acceso,
reenvío, caducidad, reutilización y fallo SMTP. El arnés de controlador/SQLite pasa,
pero la entrega real y el ciclo en el móvil requieren comprobación del usuario.
Detalle: docs/fixes/FIX_DIFACTU_PIN_ONBOARDING.md del repositorio de código.
El envío por WhatsApp es una mejora pendiente en
el issue #89 de Difactu.
Las rutas antiguas que puede seleccionar MCP (/api/requestpin, /api/verifypin
y /api/refresh) se reenvían internamente al mismo controlador en instalaciones
Difactu. Incluir también application/controllers/ApiController.php en QA, tras
AuthController, y comprobar las rutas antiguas además de /api/auth/*.
confirmcode es NOT NULL en PROD: la ausencia de enlace se representa con una
cadena vacía, sin migración de esquema.
