- Add GetProformaIssuanceReadinessUseCase to check proforma issuance readiness. - Create GetProformaIssuanceReadinessController to handle requests and responses. - Introduce request and response DTOs for proforma issuance readiness. - Develop tests for the use case and controller to ensure functionality. - Implement adapter and hooks for integrating issuance readiness in the web application. - Create UI components for displaying issuance readiness alerts and help popover. - Add utility functions for translating blocker messages and details.
4.1 KiB
Payment Methods Backend Design
Scope
PaymentMethod es un catálogo company-scoped del módulo catalogs.
Shape
Campos persistidos y expuestos para administración:
idcompany_idnamedescriptionis_activeis_systemis_defaultsystem_keycreated_atupdated_atdeleted_at
System vs custom
Reglas:
is_system = trueimplicasystem_key != nullis_system = falseimplicasystem_key = nullis_system = trueno se puede editar, desactivar ni eliminar
Identidad estable de métodos del sistema:
cashbank_transfercarddirect_debit
Active and default
Reglas:
is_default = trueimplicais_active = true- un método
defaultno se puede desactivar - un método
defaultno se puede eliminar - el cambio de default solo se realiza mediante
PATCH /catalogs/payment-methods/:payment_method_id/default
La unicidad del default se garantiza mediante servicio transaccional y bloqueo por empresa. No se fuerza con constraint SQL adicional para evitar una solución opaca en MariaDB.
Bootstrap
Endpoint explícito e idempotente:
POST /catalogs/payment-methods/bootstrap-system
Comportamiento:
- crea los cuatro métodos del sistema que falten
- restaura un system method soft-deleted si ya existía por
system_key - resincroniza
name,is_system,is_active,is_default = falseysystem_key - si la empresa no tiene default, establece
cashcomo default inicial
Métodos creados:
EfectivoTransferencia bancariaTarjetaDomiciliación bancaria
Delete policy
Un método solo puede eliminarse si:
is_system === falseis_default === false- no está referenciado por consumidores vivos
Bloqueos actuales:
customers.payment_method_idproformas.payment_method_idsupplier_invoices.payment_method_id
No se bloquea por issued_invoices, porque ese módulo mantiene snapshot histórico suficiente del método de pago emitido.
Reference protection
La arquitectura ideal sería mediante public services consumidores, pero catalogs ya es dependencia de customers y customer-invoices. Para evitar un ciclo de módulos, la protección referencial se implementa en catalogs con un checker de infraestructura específico contra los modelos registrados en Sequelize.
Consumers
Consumidores actuales auditados:
customerscustomer-invoices/proformascustomer-invoices/issued-invoicessupplier-invoicesfactuges
factuges no bloquea delete porque resuelve métodos de pago durante la importación y no mantiene una referencia persistente viva auditada en este flujo.
Emision de Proformas
customer-invoices consume PaymentMethod mediante servicios publicos de catalogs.
Semantica vigente en emision:
- la Proforma mantiene una referencia viva
paymentMethodId; - la Issued Invoice persiste un snapshot historico del metodo de pago emitido;
- si
paymentMethodIdno existe dentro de la company activa, la emision falla; - si el metodo existe pero esta inactivo, la emision falla;
- este bloqueo aplica solo al boundary de emision y no convierte automaticamente
paymentMethodIden obligatorio durante create draft.
Datos copiados al snapshot historico de issued_invoices:
payment_method_idpayment_method_namepayment_method_description
Tras emitir, el detalle historico no depende del catalogo vivo para representar la forma de pago usada.
Frontend Settings
La gestión administrativa frontend vive en:
/settings/general/payment-methods- módulo técnico
catalogs
Características:
- listado administrativo con activos e inactivos
- create/edit mediante dialogs
- cambio de default mediante radio por fila
- activación/desactivación con endpoints específicos
- protección visual para
systemydefault - confirmación de delete con manejo de conflicto
in use
Compatibilidad:
- el listado administrativo reutiliza el catálogo compartido de
payment-methods - los selectores existentes siguen filtrando por
isActive=truedonde ya lo hacían - esta fase no aplica el default automáticamente en Proformas ni Customers