Appearance
Vista de Reconciliacion de Pagos del Portal
Modulo: CtaCte (o Membresias — ver Consideraciones) Tipo: View Estado: Planificado Fecha: 2026-04-22
Descripcion
Vista en Bautista ERP donde el operador ve los pagos realizados por clientes a traves del Portal de Clientes y genera manualmente el recibo correspondiente en la cuenta corriente. Es el punto de entrada para la reconciliacion de pagos online con el sistema de ctacte.
Por que existe: Cuando un cliente paga online, el webhook del gateway solo actualiza portal_payments.status = 'approved'. La creacion del recibo en ordcta no es automatica — requiere intervencion manual del operador. Esta vista cierra ese gap. Ver Gap: Reconciliacion de Pagos Portal.
Frontend
Vistas
- Listado de pagos pendientes de conciliacion: Pagos con
status = 'approved'que no tienenrecibo_idasociado. - Historial de pagos conciliados: Pagos ya conciliados (
approvedconrecibo_id).
Ambas vistas pueden vivir como tabs dentro de la misma pantalla de "Pagos Portal".
Columnas del listado
| Columna | Origen | Descripcion |
|---|---|---|
| Fecha | portal_payments.created_at | Fecha en que se realizo el pago |
| Cliente | ordcon.cnom + ordcon.ccui | Nombre y DNI/CUIT del cliente |
| Monto | portal_payments.amount | Monto total pagado |
| Facturas | portal_payments.facturas_pagadas | Comprobantes incluidos en el pago |
| Gateway | portal_payments.gateway | Gateway usado: paypertic o mercadopago |
| Estado | portal_payments.status | Estado del pago en el gateway |
| Recibo | portal_payments.recibo_id | Nro. de recibo si ya fue conciliado, o "Pendiente" |
Filtros disponibles
- Por sucursal (si el operador tiene acceso a multiples sucursales)
- Por periodo (fecha desde / fecha hasta)
- Por cliente (nombre o DNI/CUIT)
Interacciones del usuario
- El operador abre la vista de "Pagos Portal" desde CtaCte (o Membresias).
- Ve el listado de pagos
approvedsin recibo (tab "Pendientes de conciliacion"). - Selecciona una fila y hace click en "Generar Recibo".
- Se abre el flujo de creacion de recibo con los datos del pago precargados:
- Cliente
- Monto
- Facturas / comprobantes incluidos
- El operador confirma la creacion del recibo.
- El sistema crea el recibo en
ordcta(y movimiento en caja si corresponde) y actualizaportal_payments.recibo_id. - El pago desaparece del tab "Pendientes" y aparece en el tab "Historial".
Permisos
| Permiso | Descripcion | Acciones permitidas |
|---|---|---|
CTACTE_PORTAL_PAGOS_VIEW | Ver pagos del portal | Listar, filtrar, consultar historial |
CTACTE_PORTAL_PAGOS_RECONCILIAR | Conciliar pagos | Generar recibo desde pago portal |
Backend
Tabla involucrada: portal_payments
Tabla existente a nivel SUCURSAL (schema suc{sucursal_id}).
| Campo clave | Tipo | Descripcion |
|---|---|---|
id | UUID | Identificador del pago |
ordcon_id | integer | FK a ordcon — cliente que pago |
amount | decimal | Monto total del pago |
status | string | Estado: pending, approved, rejected, cancelled |
gateway | string | Gateway usado: paypertic, mercadopago |
facturas_pagadas | jsonb | Array de facturas incluidas en el pago con sus montos |
recibo_id | integer / null | FK a ordcta.id — null hasta que se concilia |
external_id | string | ID del pago en el gateway externo |
created_at | timestamp | Fecha de creacion del pago |
Condicion de "pendiente de conciliacion": status = 'approved' AND recibo_id IS NULL
Servicio a implementar: PortalReciboCreatorService
Modulo: Modules/Portal/Application/Services/
Responsabilidad: Crear el recibo en ordcta a partir de un portal_payment aprobado. Servicio de dominio acotado, sin cheques, sin efectivo, sin retenciones. Solo recibos de cobro online (transferencia electronica).
Dependencias esperadas:
ReciboRelationsService— servicio existente para crear recibos enordctaConnectionManager— resolucion de schemas SUCURSAL y CAJAportal_payments— lectura del pago aprobado
Logica principal:
- Leer el
portal_paymentpor ID, validar questatus = 'approved'yrecibo_id IS NULL - Resolver el cliente via
ordcon_id - Construir el DTO de recibo con los datos del pago (monto, facturas, fecha, tipo de cobro online)
- Llamar a
ReciboRelationsServicepara crear el recibo enordcta(schema SUCURSAL) - Si Tesoreria esta habilitado y
portal.caja_idesta configurado, generar elmovimien la caja correspondiente (schema CAJA) - UPDATE
portal_payments SET recibo_id = {nuevo_recibo_id}dondeid = {payment_id} - Retornar el ID del recibo creado
Idempotencia: El servicio debe verificar que recibo_id IS NULL antes de crear el recibo. Si ya tiene recibo_id, retornar error PAYMENT_ALREADY_RECONCILED.
Multi-schema
- Recibo en ordcta: schema SUCURSAL —
suc{sucursal_id}— resuelto viasucursal_iddelportal_payment - Movimiento en movimi: schema CAJA —
suc{sucursal_id}caja{caja_id}— requiereportal.caja_idconfigurado endata_configde la sucursal
Gap abierto: caja_id
La caja destino para el movimiento de Tesoreria aun no esta definida. Se configura via portal.caja_id en data_config de la sucursal. Si este valor no esta configurado, el servicio omite la creacion del movimi (solo crea el recibo en ordcta).
Esta decision de diseno queda pendiente hasta la implementacion de Fase 5.
Reglas de negocio
- Solo pagos approved: Solo se pueden conciliar pagos con
status = 'approved'. Pagospending,rejectedocancelledno son conciliables. - Un recibo por pago: Cada
portal_paymentpuede tener como maximo un recibo asociado. Sirecibo_id != null, el pago ya fue conciliado y no puede reconciliarse nuevamente. - Tipo de recibo: El recibo es de tipo "cobro online" (transferencia electronica). No incluye cheques, efectivo ni retenciones.
- Caja opcional: Si Tesoreria no esta habilitado o
portal.caja_idno esta configurado, se crea solo el recibo enordctasin movimiento de caja. - Idempotencia: El servicio verifica
recibo_id IS NULLantes de proceder para evitar dobles acreditaciones.
Casos de uso
Caso 1: Conciliar un pago aprobado
Actor: Operador con permiso CTACTE_PORTAL_PAGOS_RECONCILIAR
Precondiciones:
- Existe un
portal_paymentconstatus = 'approved'yrecibo_id IS NULL - La sucursal tiene
portal.gateway.nombreconfigurado (el pago ya ocurrio)
Flujo principal:
- El operador abre la vista "Pagos Portal" → tab "Pendientes de conciliacion"
- Localiza el pago del cliente (puede filtrar por fecha o cliente)
- Hace click en "Generar Recibo"
- El sistema precarga el formulario de recibo con: cliente, monto, facturas pagadas
- El operador revisa los datos y confirma
PortalReciboCreatorServicecrea el recibo enordctay actualizaportal_payments.recibo_id- El sistema muestra confirmacion con el numero de recibo generado
- El pago pasa al tab "Historial"
Postcondiciones:
- Existe un nuevo recibo en
ordctade la sucursal correspondiente portal_payments.recibo_idapunta al nuevo recibo- El saldo del cliente en ctacte refleja el pago
Flujos alternativos:
- Pago ya conciliado: Si
recibo_id != null, el sistema retornaPAYMENT_ALREADY_RECONCILEDy no crea un segundo recibo - Caja no configurada: Si
portal.caja_idno esta definido, se crea solo el recibo enordctasin movimiento de caja. Se muestra un aviso al operador
Caso 2: Consultar historial de pagos conciliados
Actor: Operador con permiso CTACTE_PORTAL_PAGOS_VIEW
Flujo principal:
- El operador abre la vista "Pagos Portal" → tab "Historial"
- Aplica filtros opcionales (periodo, cliente)
- Ve el listado de pagos conciliados con su numero de recibo y fecha de conciliacion
Consideraciones tecnicas
Modulo de ubicacion en el ERP
La vista puede ubicarse en:
- CtaCte: Opcion natural — los recibos viven en
ordctay la vista es operativa para cualquier cliente con ctacte. - Membresias: Solo valido si el foco es exclusivamente socios/miembros con membresia activa.
Recomendacion: ubicar en CtaCte como subseccion "Pagos Portal" para mayor alcance. Si en el futuro los pagos del portal aplican exclusivamente a socios, se puede agregar un acceso rapido desde Membresias.
Performance
- El listado de pagos pendientes debe paginarse (los pagos aprobados sin recibo pueden acumularse en periodos de alto volumen).
- Indice recomendado en
portal_payments:(status, recibo_id)para la query de pendientes.
Seguridad
- El permiso
CTACTE_PORTAL_PAGOS_RECONCILIARdebe ser restrictivo — solo roles operativos que tengan autoridad para acreditar pagos en ctacte. - El servicio verifica que el
portal_paymentpertenece a la sucursal del operador antes de proceder.
Testing
- Test unitario:
PortalReciboCreatorService— caso feliz, pago ya conciliado, caja no configurada - Test de integracion: flujo completo webhook → vista → conciliacion → recibo en ordcta
- Test E2E: no aplica (vista solo accesible desde el ERP, no desde portal-usuarios)
Dependencias
Funcionalidades relacionadas
- Gap: Reconciliacion de Pagos Portal — contexto del gap que esta vista cierra
- Webhook de Pagos — quien popula
portal_paymentsconstatus = 'approved' - Configuracion de Gateway — prerequisito para que existan pagos online
Servicios a implementar
PortalReciboCreatorService— nuevo servicio DDD enModules/Portal/Application/Services/
Servicios existentes reutilizados
ReciboRelationsService— creacion de recibos enordctaConnectionManager— resolucion de schemas SUCURSAL y CAJA