Esta guía es para nuevos empleados, desarrolladores y agentes Paperclip que se incorporan al proyecto Renteric. Explica qué hace el producto, cómo está arquitectada la aplicación, dónde hacer cambios y cómo debe moverse el trabajo a través de issues.
1. Contexto del Producto
Renteric es un SaaS de operaciones de alquileres enfocado primero en Argentina, para propietarios pequeños, administradores boutique e inmobiliarias. Centraliza:
- Propiedades, edificios, unidades, propietarios, inquilinos, garantes y contratos.
- Facturas, cobros, revisión de transferencias, gastos, liquidaciones y reportes.
- Mantenimiento, proveedores, inspecciones, mensajes, notificaciones y documentos.
- Portales de inquilino, propietario, prospecto, publicaciones públicas y panel interno.
- Flujos locales como MercadoPago, ARCA/AFIP, índices BCRA, i18n español/inglés y precios en ARS.
La promesa del producto es gestión automática de alquileres: menos planillas, WhatsApp, recordatorios manuales, registros duplicados y reportes repetidos.
Mapa Visual del Producto
Estas capturas públicas del demo muestran las superficies que todo empleado o desarrollador debería entender antes de cambiar código. Usan datos de demostración y no exponen información privada de clientes.







2. Superficies Principales
La app se organiza por grupos de rutas bajo src/app/[locale]/.
| Superficie | Grupo de ruta | Audiencia principal | Propósito |
|---|---|---|---|
| Dashboard administrador | (dashboard) |
Propietarios, admins, managers, contadores, mantenimiento | Operación diaria de propiedades, contratos, cobros, gastos, reportes, documentos y equipo. |
| Portal inquilino | (tenant-portal) |
Inquilinos | Autoservicio de contrato, pagos, comprobantes, mantenimiento, mensajes, documentos, firmas, renovaciones y perfil. |
| Portal propietario | (owner-portal) |
Propietarios representados por una inmobiliaria | Visibilidad de solo lectura: propiedades, contratos, rent roll, finanzas, transacciones, liquidaciones, reportes y mantenimiento. |
| Portal prospecto | (prospect-portal) |
Postulantes y prospectos | Estado de solicitud, carga de documentos, screening y seguimiento. |
| Publicaciones públicas | (public-listing) |
Visitantes y postulantes | Marketplace, hubs de inmobiliaria, subdominios, consultas y solicitudes. |
| Sitio público | (public) |
Visitantes | Marketing, precios, blog, guías, legales, contacto y seguridad. |
| Auth | (auth) |
Todos los usuarios | Login, registro, recuperación, verificación, aceptación de políticas y seteo de contraseña. |
| Admin interno | (admin) |
Superadmins | Suscripciones, usuarios, auditoría, cron, soporte, monitoreo e impersonación controlada. |
3. Stack Técnico
| Capa | Tecnología |
|---|---|
| Framework web | Next.js App Router, React, TypeScript |
| UI | shadcn/ui, Radix UI, Tailwind CSS |
| Formularios | React Hook Form y Zod |
| Base de datos | PostgreSQL con adaptadores Prisma v7 |
| Producción DB | Neon serverless PostgreSQL |
| Auth | Auth.js v5 con credentials, Google OAuth, magic links, JWT y 2FA |
| Jobs | BullMQ con Redis |
| Storage | S3-compatible o MinIO |
| i18n | next-intl con mensajes en inglés y español |
| Pagos | MercadoPago por defecto, Stripe opcional |
| Email y mensajes | Resend, SMTP, WhatsApp, Web Push |
| Observabilidad | Pino, Sentry, endpoints de métricas |
| IA | Extracción de contratos, comprobantes y facturas |
4. Arquitectura en Una Página
Renteric usa una arquitectura por capas:
- El navegador solicita una ruta localizada.
src/middleware.tsmaneja subdominios, locale, redirecciones de auth, CSP, rate limits, cookies y acceso por ruta.- Server Components renderizan páginas de lectura y llaman funciones de query.
- Client Components manejan formularios, tablas, filtros, diálogos y UI optimista.
- Server Actions manejan mutaciones: validan con Zod, aplican auth/permisos,
usan Prisma scoped por organización, auditan, revalidan y retornan
ActionResult<T>. - API routes se reservan para límites de sistema: webhooks, cron, archivos, integraciones, métricas, búsqueda y callbacks externos.
- Jobs de fondo corren fuera del request para facturación, recordatorios, sync, reportes, retención y transiciones de ciclo de vida.
Flujo interno por defecto:
Server Component read -> src/server/queries/<domain>.ts -> getScopedDb()
Client form submit -> Server Action -> validator -> getScopedDb() -> ActionResult<T>
External system -> API route -> validated boundary -> service/action/job
Vercel cron -> API route -> BullMQ queue -> worker processor
No agregues endpoints REST para CRUD interno normal. Usá Server Components para lecturas y Server Actions para escrituras.
5. Modelo de Datos y Multi-Tenancy
La cadena central del negocio es:
Organization -> Property -> Unit -> Lease -> Tenant
Modelos adyacentes: propietarios, garantes, facturas, transacciones, gastos, mantenimiento, proveedores, inspecciones, documentos, mensajes, notificaciones, cuentas receptoras, cuentas fiduciarias, solicitudes y estados de propietario.
Todo modelo de datos de clientes tiene organizationId. El aislamiento se
aplica con el cliente Prisma scoped de src/server/middleware/with-org-scope.ts.
Reglas que no se pueden romper:
- Usar
getScopedDb({ organizationId })o la DB scoped inyectada porcreateAction. - No usar Prisma raw para datos tenant-owned en acciones o queries visibles a usuarios.
- Dejar que el cliente scoped inyecte
organizationIdy filtros de soft-delete. - Importar tipos Prisma y
Prismadesde@/generated/prisma, no@prisma/client. - Usar
Prisma.Decimalpara dinero. - Tratar como soft-deleted los modelos que siguen esa convención: Property, Unit, Tenant, Vendor, Guarantor, Owner y relacionados.
6. Auth, Roles y Permisos
El estado de auth viaja en sesión/JWT con usuario, organización y rol. Roles y
permisos viven en src/config/permissions.ts.
Roles de dashboard:
ADMIN: acceso amplio a toda la organización.MANAGER: acceso operativo, normalmente por propiedades asignadas.ACCOUNTANT: finanzas, reportes, cobros y gastos.MAINTENANCE: mantenimiento, proveedores, activos, inspecciones y mensajes.
Roles de portal:
TENANT: solo portal de inquilino.OWNER: portal de propietario y visibilidad de lectura.
Reglas de mutación:
- CRUD con permisos debe usar
createActiondesdesrc/lib/create-action.ts. - Usar
withPermission,withPermissions,withAuthowithDashboardPermissionsegún patrón local. - No llamar
getAuthSession()directamente como único guard. - Retornar
ActionResult<T>en vez de lanzar errores crudos al cliente.
7. Mapa del Código
| Área | Ubicación |
|---|---|
| Rutas App | src/app/[locale]/ |
| API routes | src/app/api/ |
| Componentes de dominio | src/components/<domain>/ |
| UI primitives | src/components/ui/ |
| Server actions | src/server/actions/ |
| Server queries | src/server/queries/ |
| Validadores Zod | src/server/validators/ |
| Auth middleware | src/server/middleware/with-auth.ts |
| Prisma scoped | src/server/middleware/with-org-scope.ts |
| Prisma client | src/lib/db.ts |
| Tipos Prisma generados | src/generated/prisma/ |
| Permisos | src/config/permissions.ts |
| Rutas | src/config/routes.ts |
| Navegación | src/config/navigation.ts |
| Planes y feature flags | src/config/plans.ts |
| Jobs | src/server/jobs/ |
| Mensajes i18n | messages/en.json, messages/es.json |
| Docs de arquitectura | docs/architecture/ |
No leas completo src/generated/prisma/index.d.ts; es generado y muy grande.
Buscá tipos específicos.
8. Cómo Hacer un Cambio
- Encontrá el dominio por ruta, carpeta de componentes, server action, query o validador.
- Leé el patrón existente más cercano antes de inventar abstracciones.
- Agregá o actualizá validación con Zod en
src/server/validators. - Agregá el camino de lectura en Server Components y queries.
- Agregá el camino de escritura en Server Actions con auth, permisos, scoped DB
y
ActionResult<T>. - Actualizá UI usando patrones y primitives existentes.
- Agregá textos en
messages/en.jsonymessages/es.json. - Actualizá rutas, permisos, navegación o plan gates si creás superficie nueva.
- Agregá pruebas enfocadas.
- Actualizá documentación cuando cambie arquitectura, setup, operación o comportamiento de usuario.
9. Formularios
La mayoría usa React Hook Form y Zod.
- Usar
translatedZodResolver(schema, tValidation)para formularios i18n. - Usar
typedZodResolver(schema)para formularios sin traducción. - El cliente mejora UX, pero el server action siempre vuelve a validar.
- Construir
FormDatadesde datos validados al llamar acciones. - Mostrar
fieldErrorsinline cuando existan.
Flujo:
useForm -> resolver -> handleSubmit -> FormData -> server action
server action -> schema.safeParse -> mutation -> ActionResult<T>
success -> toast + router.refresh/revalidate path
failure -> toast and/or form field errors
10. Jobs y Cron
Los jobs viven en src/server/jobs/ y se registran en
src/server/jobs/worker.ts. Las rutas cron de Vercel encolan trabajo desde
src/app/api/cron/*.
Usalos para facturación, intereses, ajustes, vencimientos, recordatorios, gastos recurrentes, estados de propietario, sync externo, retención y auditoría. Los jobs nuevos deben ser idempotentes, logueados, retry-aware y seguros de reintentar.
11. Integraciones Externas
Las integraciones se envuelven en servicios, no se consumen directamente desde UI.
- MercadoPago y Stripe para pagos/suscripciones.
- Resend, SMTP, Twilio, Meta WhatsApp y Web Push.
- ARCA/AFIP y BCRA para impuestos e índices.
- S3/MinIO y ClamAV para archivos.
- Proveedores de IA para extracción documental.
- Tokko y proveedores de publicaciones.
- Sentry y métricas.
Nunca commitear API keys, tokens, certificados o datos privados. Validar webhooks y entradas externas en el borde.
12. Desarrollo Local
Camino rápido:
make dev-up
make dev
Camino manual:
docker compose up -d
npm install
npx prisma migrate deploy
npm run dev
Comandos útiles:
npm run worker
npm run lint
npm run test
npm run test:changed
npm run test:e2e
npm run build
npm run deploy
Usar npm run deploy:prod solo si el board lo pide explícitamente.
13. Expectativas de Verificación
Elegí verificación según riesgo:
- Solo docs: formatter o sanity check de markdown.
- Validators/actions: tests unitarios enfocados.
- Server behavior compartido: tests afectados más lint o typecheck/build cuando sea práctico.
- Workflow de usuario: Playwright para el path afectado.
- Jobs: tests enfocados y, si se puede, dry-run o worker local.
No declares terminado el trabajo sin verificación real o sin indicar claramente qué no se pudo ejecutar.
14. Workflow Paperclip
Paperclip coordina el trabajo entre board, managers y agentes. El board o un manager crea goals/issues. Los agentes toman issues asignados, trabajan en heartbeats, dejan comentarios o artefactos durables y mueven el issue a un estado claro.
Estados:
todo: listo pero sin dueño activo.in_progress: trabajo activo.in_review: espera reviewer, aprobación, interacción o monitor real.blocked: necesita acción de un dueño o issue bloqueante.done: completo, verificado y sin seguimiento.cancelled: abandonado intencionalmente.
Reglas:
- Trabajar solo en issues asignados salvo mención explícita.
- Hacer checkout salvo que el harness ya lo haya hecho.
- No cambiar de issue dentro del heartbeat.
- Usar comentarios con estado, links y verificación.
- Usar child issues para trabajo largo, paralelo o de otro agente.
- Usar blockers de primera clase.
- Marcar
donesolo cuando el pedido esté completo.
15. Cómo Crear Buenos Issues Paperclip
Creá un issue cuando el trabajo necesite dueño, review o auditoría.
Incluí:
- Título con resultado visible.
- Motivo de negocio o contexto fuente.
- Alcance incluido y fuera de alcance.
- Archivos, rutas o docs relevantes.
- Criterios de aceptación.
- Verificación requerida.
- Dependencias o blockers.
- Perfil sugerido de dueño cuando se conozca.
Plantilla:
## Objetivo
Agregar export CSV para liquidaciones de propietarios.
## Alcance
- Acción de export en el dominio de liquidaciones.
- Columnas: propietario, propiedad, período, renta bruta, gastos, comisión y neto.
- Botón en la página de detalle.
- Reutilizar patrones de export existentes.
## Fuera de Alcance
- Nuevos gráficos.
- Cambios al cálculo de liquidaciones.
## Criterios de Aceptación
- Export solo para usuarios con permisos financieros.
- Filas scoped por organización.
- Estados vacíos y errores traducidos.
- Tests enfocados cubren permisos y columnas.
## Verificación
- Tests unitarios del export.
- Lint en archivos cambiados.
Al mencionar otro issue, usá link interno como [REN-123](/REN/issues/REN-123).
16. Checklist de Review
- Multi-tenancy: sin Prisma raw para datos tenant-owned.
- Auth: toda mutación protegida.
- Type safety: sin
anynuevo; Prisma desde@/generated/prisma. - Validación: entradas externas parseadas con Zod.
- Dinero: decimales, no floats.
- Performance: sin queries sin límite ni N+1.
- Seguridad: sin secretos, stack traces ni uploads sin validar.
- Auditoría: mutaciones importantes registran actividad.
- i18n: textos visibles en inglés y español.
- Tests: pruebas enfocadas o verificación documentada.
- Deploy: después de commit limpio, correr
npm run deploysalvo producción.
17. Cuando Hay Dudas
El código existente es la primera autoridad:
- Buscá un dominio similar.
- Leé validador, query, action, componente y test juntos.
- Preferí cambios pequeños que encajen en el patrón local.
- Escalá decisiones estratégicas, presupuesto o cambios irreversibles al board.