Carteras (Funds)
Gestion de fondos: cierre mensual, posiciones, aprobaciones, reportes y emails.
El modulo de Carteras (/admin/funds) es donde el equipo de gestion
crea fondos, carga el rendimiento mensual, aprueba retiros y monitorea
las posiciones de los inversores.
Crear una cartera#
Desde /admin/funds/new:
| Campo | Que es |
|---|---|
| Slug | URL del fondo (balanced-income). |
| Inception date | Primer dia que el fondo recibe capital. |
| Risk level | conservative / moderate / aggressive. |
| Min deposito | Monto minimo de subscripcion en USDC. |
| Min retiro | Monto minimo de redemption. |
| Min lockin | Meses minimos de permanencia para el inversor. |
| Fee gestion (anual) | Cobrado mensualmente prorrateado. |
| Fee performance | % sobre el rendimiento generado (high water mark). |
| TIR objetivo | Target anual estimado (informativo). |
El status se guarda como active por default. Solo los fondos active
son visibles para inversores en el marketplace (/invertir/carteras).
Marketplace visible al inversor#
Los inversores ven los fondos como planes de inversion estilo plataforma de inversiones:
- Card con nombre centrado, interes mensual y plazo como metricas grandes.
- Lista: deposito min, TIR anual, retorno capital, inversores, AUM.
- Boton "Invertir Ahora" prominente.
- Detalle del fondo con hero stat-boxes, performance historica con color- coding (verde/rojo por mes), y CTA de suscripcion.
Cierre mensual (CORE)#
Pasos en /admin/funds/[id] → tab Periodos:
- Mes a cerrar: por default, el primer mes abierto. Generalmente el mes anterior al actual.
- Rendimiento %: el % real generado por la cartera ese mes.
- Click en Preview cierre → muestra cuantas posiciones se afectan y el total a distribuir, sin escribir nada.
- Click en Confirmar y enviar emails → atomicamente:
- Calcula TWR de cada posicion activa.
- Escribe
fund_ledgercon tipomonthly_return. - Actualiza
fund_positions.currentBalanceytotalReturns. - Crea
fund_reportspor inversor. - Envia emails Resend con el reporte.
- Inserta
notificationsyactivity_feed. - Actualiza el AUM del fondo.
- Marca el periodo como
closed. - Logea en
audit_log(fund.close_period).
Aviso
Una vez cerrado un periodo no se puede editar desde la UI. Si
necesitas corregir un error, contacta al equipo de ingenieria — hay que
hacer una compensacion via addManualMovement o un periodo "reverted".
Flujo de aprobacion de retiros#
Los retiros de carteras requieren aprobacion del admin antes de ejecutarse:
- El inversor solicita desde
/dashboard/cartera/retirar. - La solicitud aparece en
/admin/approvals(bandeja unificada). - El admin aprueba o rechaza. Si rechaza, los fondos vuelven.
- Las solicitudes aprobadas se ejecutan el dia 1 via Vercel Cron.
- Una vez ejecutado, el admin puede marcar como paid con referencia externa (transferencia bancaria, tx hash, etc.).
Posiciones#
Tab Posiciones: tabla con todos los inversores del fondo, ordenada por saldo descendente. Por cada posicion ves saldo, depositado, ganado, retirado y status.
Acciones disponibles:
- Ajuste manual: bonificacion, cargo, subscripcion o retiro directo a una posicion, con audit logging.
- Cierre forzado de posicion (futuro).
- Re-envio del ultimo reporte (futuro).
Solicitudes pendientes#
Tab Solicitudes: muestra subscripciones y retiros pendientes que se
procesan automaticamente el dia 1 de cada mes via Vercel Cron
(/api/cron/process-fund-requests).
Info
Las subscripciones se ejecutan directamente si estan en estado pending.
Los retiros solo se ejecutan si estan en estado approved (requieren
aprobacion previa del admin).
Movimientos#
Tab Movimientos: ledger global del fondo. Util para auditoria.
Cada entry tiene type, amount, description, occurredAt.
Tipos de movimiento:
subscription— deposito ejecutadoredemption— retiro ejecutadomonthly_return— rendimiento mensualfee— comisionadjustment— ajuste manual del admin
Convenciones del rendimiento mensual#
- Rango razonable: 0% a 5% mensual.
- Negativos permitidos pero el sistema te avisa si bajas de 0%.
- No cierres dos veces el mismo mes; el sistema rechaza si ya esta closed.
- TWR se aplica a movimientos intra-mes.
Resend / emails#
Cada cierre dispara emails desde admin@vlozity.com (dominio verificado
en Resend). Si Resend falla, el cierre no se rompe: el email_log
queda como failed y el periodo se completa igual. El admin puede
re-disparar emails despues.
Auditoria#
Todo cierre genera entradas en audit_log:
action: "fund.close_period"
entity: "fund_period"
entityId: <period uuid>
metadata: { fundId, returnPct, positionsAffected, totalDistributed }
Verlas en /admin/audit.
UX del inversor#
El inversor ve su cartera en multiples puntos:
- Sidebar: saldo total + rendimiento promedio + Depositar/Retirar.
- Dropdown de usuario: saldo + accesos rapidos.
- Dashboard hero: balance grande con twin cards (Cuenta de Inversion
- Monto Invertido).
- Cartera: 4 KPIs + tabs (Evolucion, Periodos, Movimientos, Reportes).
- Movimientos: historial con iconos y colores, filtrable por tipo.