Validación: Verifica que el doctor sea dueño de la cita
processRefund
Trigger: Callable desde admin panel
Parámetros:paymentId, reason
Acción: Si el pago original es Stripe, ejecuta refund via Stripe API. Crea documento payment con amount negativo.
Flujo de Pago del Paciente (Stripe)
Paciente abre detalle de cita → toca “Pagar cita médica”
App llama a API para crear Stripe Checkout Session (con Stripe Connect del doctor)
Se guarda checkoutSessionId en la cita
Se abre URL de Stripe Checkout en browser
Paciente completa pago en Stripe
Webhook recibe checkout.session.completed
Cloud Function crea payment doc + actualiza cita
Pantallas UI
Doctor: “Ingresos”
Summary card con total del mes
Lista de pagos (Stripe + manuales)
FAB “Registrar Pago” → modal con campos: cita, monto, descripción, método
Paciente: “Mis Pagos”
Lista de pagos ordenada por fecha
Bottom sheet con detalle de cada pago
Admin Panel: “/payments”
Métricas agregadas (total, por tipo)
Tabla filtrable por fecha, tipo, doctor
Export CSV
Real-time con onSnapshot
Stripe Connect
El sistema usa Stripe Connect para que cada doctor reciba pagos en su cuenta:
Cuenta
Doctor
Tipo
Estado
acct_1RUIUyKFe63Zb0DL
Dr. Carvajal
Standard
Activa
acct_1Kb607Jjr5pAQ1FN
Daniel Muvdi
Standard
Activa
Riesgo: Capacidad de crear nuevas cuentas Connect se suspende el 2026-06-03 por inactividad. Se creó cuenta Express de prueba para demostrar actividad.
Seguridad
sk_live fue removido de app_constants.dart (commit 90fd21e)
Pendiente: migrar completamente a Cloud Functions (Flowlu #693)
Toda escritura a payments es server-side (Cloud Functions)