Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/DevCarlosRodriguez/Documentacion-Arccnova-2.0/llms.txt

Use this file to discover all available pages before exploring further.

El esquema de ArccNova v2 es un diseño PostgreSQL 17 greenfield que refleja directamente los bounded contexts del monolito modular. El archivo fuente Referencias/esquema-bd/arccnova-schema.sql contiene las 91 tablas con su DDL completo, convenciones de nomenclatura y comentarios de trazabilidad a los requisitos. Esta página resume los grupos de entidades principales y los patrones transversales; para definiciones exactas de columnas siempre consultar el archivo SQL.
El archivo SQL es la fuente de verdad del esquema. Esta página es un resumen de orientación; cualquier discrepancia entre esta página y el SQL debe resolverse a favor del SQL.

Convenciones globales del esquema

ConvenciónDetalle
PK interna"Id" bigint GENERATED ALWAYS AS IDENTITY
PK pública"PublicId" uuid UNIQUE DEFAULT gen_random_uuid() — en entidades expuestas al cliente
NomenclaturaTablas en PascalCase plural; columnas en PascalCase (quoted)
Timestamps"CreatedAtUtc" / "UpdatedAtUtc" como timestamptz DEFAULT timezone('utc', now())
Estados de flujovarchar para estados simples; tablas catálogo para datos administrables
Tokensuuid como PK (ej. RefreshTokens, PasswordResetTokens)

Patrones transversales

Cada tabla operacional lleva un subconjunto de estos campos. No son opcionales — son invariantes de diseño aplicados por los interceptores de EF Core en Shared.Database.
"TenantId"  bigint NOT NULL REFERENCES "Tenants"("Id")
"BranchId"  bigint REFERENCES "Branches"("Id")
  • TenantId está en todas las tablas operacionales, sin excepción.
  • BranchId está en las entidades con ámbito de proyecto. Las entidades de ámbito solo-empresa (módulo Hr, catálogos de tenant) no llevan BranchId (ADR-010).
  • Ambos valores vienen siempre del JWT — nunca del body de la petición.

Jerarquía Tenant → Branch

La jerarquía principal del sistema es: una empresa (Tenant) tiene uno o más proyectos inmobiliarios (Branch). Todo el inventario, los contactos, las ventas y los cobros pertenecen a un Branch.
Tenants
  └── Branches (proyectos inmobiliarios)
        ├── Blocks  (manzanas)
        │     └── Lots (lotes)
        ├── Contacts (clientes finales)
        ├── Sales → Financing → Collections
        └── Treasury (egresos e ingresos del proyecto)

Entidades de Tenants

Tenants — empresa raíz del multi-tenancy.
CampoTipoNotas
IdbigintPK interna
PublicIduuidExpuesto al cliente
Namevarchar(200)Nombre de la empresa
Slugvarchar(100)Identificador URL único
IsActivebooleanEstado de la cuenta
BillingModevarchar(20)'internal' por defecto
StripeCustomerIdvarchar(100)ID de cliente en Stripe (suscripción SaaS)
StripeSubscriptionIdvarchar(100)Suscripción activa
SubscriptionStatusvarchar(50)Estado de la suscripción
TrialEndsAtUtctimestamptzFin del período de prueba
PricingPlans — planes del SaaS con su precio de Stripe.TenantPlans — relación activa/histórica entre un tenant y sus planes.PendingRegistrations — registro pendiente de pago: guarda los datos del CEO, empresa y plan seleccionado antes de confirmar la sesión de checkout de Stripe.PlanResourceLimits / TenantResourceUsages — cuotas de recursos por plan (número de proyectos, lotes, usuarios, etc.) y su consumo actual por tenant.

Entidades de Identity y RBAC

Users — usuario del sistema.
CampoTipoNotas
Id / PublicIdbigint / uuidPK interna y pública
TenantIdbigintEmpresa a la que pertenece
Emailvarchar(200)UNIQUE en toda la tabla
PasswordHashvarchar(500)BCrypt
FirstName / LastNamevarchar(100)
FailedLoginAttemptsintegerContador de bloqueo
LockedUntilUtctimestamptzBloqueo temporal
IsActivebooleanEstado de la cuenta
Rolevarchar(50)Rol base (legado; se extiende con Roles)
ActionPasswordHashvarchar(500)Contraseña de acción del v1 (C34; flag 6 pendiente)
RefreshTokens — tokens de refresco rotativos (PK uuid).PasswordResetTokens — tokens de restablecimiento con expiración.EmailConfirmationTokens — confirmación de correo, vigencia 72 h con reenvío (C05).Roles — roles personalizados por tenant. El rol CEO tiene IsProtected = true.Permissions — catálogo de permisos: matriz ModuleGroup × Submodule × Action. Los 18 permisos protegidos confirmados cubren 5 áreas (cobros, ventas, contratos, usuarios, conceptos de mora).RolePermissions — asignación de permisos a roles (tabla puente).UserPermissions — permisos individuales por usuario, por encima de su rol.ProtectedActions — los 18 permisos protegidos (lista cerrada, C33).TenantProtectedActions — configuración por empresa: qué permisos protegidos están activos.UserProtectedActions — otorgamiento de permisos protegidos a usuarios específicos.PermissionAuditLogs — auditoría de uso de permisos, retención permanente.

Entidades de Branches (Proyectos)

Branches — proyecto inmobiliario. Un tenant puede tener múltiples branches.
Campo claveNotas
Name / DisplayNameNombre interno y nombre de presentación
SiteIdSede de la empresa (catálogo Sites)
CountryId / StateId / MunicipalityId / LocalityIdGeografía del proyecto (Geo)
CurrencyIdMoneda del proyecto
AnnualInterestRateTasa de interés anual del proyecto
DefaultDelinquencyRateTasa de mora por defecto para ventas de este proyecto
GraceDaysDías de gracia por defecto
ContractCorrelative / ReceiptCorrelativeFolios correlativos
IsDeleted / DeletedAtUtcSoft delete (C11)
UserBranches — membresía usuario-proyecto con rol propio (RoleId). Un usuario puede tener roles distintos en proyectos distintos.

Catálogos Geográficos (Módulo Geo)

Countries → States → Municipalities → Localities
Semilla con datos de México y EE.UU. (T02). Las 4 tablas son catálogos globales sin TenantId.

Inventario de Propiedades (Módulo Properties)

Blocks — manzana (agrupación de lotes dentro de un proyecto).
CampoNotas
BranchIdProyecto al que pertenece
NameNombre único dentro del branch
Lots — lote individual.
CampoTipoNotas
BlockIdbigintManzana contenedora
Namevarchar(100)Nombre único dentro de la manzana
Areavarchar(50)Superficie (texto con unidad)
Pricenumeric(18,2)Precio de venta
Statusvarchar(20)Active / Reserved / Sold
BoundaryNorth/South/East/Westvarchar(300)Colindancias
MeasureNorth/South/East/Westvarchar(50)Medidas por colindancia

Contactos (Módulo Contacts)

La tabla Contacts concentra el expediente del cliente final (comprador de lote).
CampoNotas
NameNombre completo
CurpRfcCURP o RFC (MX)
DateOfBirth / GenderId / MaritalStatusIdDatos personales
Occupation / AddressOcupación y dirección
CountryId → LocalityIdGeografía
SpouseName / SpouseCurp / SpouseDateOfBirthCónyuge (opcional; contratos usan bloques condicionales)
BeneficiaryName / BeneficiaryGenderId / BeneficiaryDateOfBirthBeneficiario

Documentos Legales (Módulo LegalDocs)

DocumentTemplates — plantillas versionadas en plano. El campo IsCurrent marca la versión activa. Los tokens {{variable}} se resuelven contra el catálogo SystemVariables.LegalDocuments — instancia generada con variables resueltas (snapshot HTML). Origen polimórfico: SourceEntityType + SourceEntityId apunta a una venta o contrato laboral. El PDF final se genera con QuestPDF, se calcula su FinalPdfHash (SHA-256) y se almacena en el área aislada de S3.Estados: DraftPendingSignaturesSigned / Cancelled / Expired.DocumentSignatures — firmantes: cliente final (ContactId), usuario del sistema (UserId), empleado (EmployeeId) o externo. Incluye token único con expiración para firma remota, imagen del trazo y dirección IP.

Ciclo Comercial (Módulos Sales + Financing)

Quotes — cotización informativa. NO está ligada a reserva ni venta (C13/C19). Calcula el plan de pagos sin comprometer el lote.Reservations — reserva del lote con monto y fecha de vencimiento. Al vencer, el lote vuelve a Active y el anticipo se pierde. Estados: Active / Expired / Converted.Sales — venta confirmada.
Campo claveNotas
FolioNúmero único de venta por tenant
ContactIdComprador
ManagerUserIdAsesor responsable
TotalSale / RemainingAmountMonto total y saldo pendiente
DelinquencyRateTasa de mora propia (default: la del proyecto)
StatusPending / Conform / Settled / Cancelled (C17)
LegalDocumentIdContrato generado
ClientLots — tabla de trazabilidad cliente-lote-venta-reserva.
Los 4 tipos de plan de financiamiento tienen cada uno su propia tabla con los mismos atributos clave:
TablaPlan
SalePrincipalsCapital principal (crédito a plazo)
SaleHitchesEnganche
SaleAdditionalsAdicionales
SaleServicePlansPlan de servicio
Todos comparten campos de ModalityTypeId, Installments, FirstPaymentDate, InterestRate y PeriodInterest (con precisión 8 decimales según C22).

Cobranza (Módulo Collections)

Las cuotas nacen al cobrar — no se materializa una tabla de amortización previa (Flag 2 del arquitecto, fiel al diseño del v1).
Collections — el cobro (recibo). Un cobro con SaleId = NULL y ContactId = NULL es un cobro no identificado (C29), que se notifica en tiempo real vía SSE.
Campo claveNotas
FolioNúmero de recibo
ReceiptTypeIdTipo de recibo con folio correlativo
AmountReceived / TotalToPay / ChangeMontos del cobro
ArrearsAmountMonto de mora incluido en el cobro
IsMultiplePaymentCobro con múltiples formas de pago
PaymentDateFecha y hora del cobro
MultipleInstallments — cuota generada al cobrar. Campos principales:
CampoNotas
InstallmentNumberNúmero de cuota del plan
PaymentAmountMonto de la cuota
IsPaymentCompletedSi la cuota está pagada
LastRemainingAmountSaldo restante después del cobro
InterestPayment / PrincipalPaymentDesglose interés/capital
NextPaymentDate / GracePeriodDueDateFechas de vencimiento
CollectionInstallments — tabla puente cobro-cuota: cuánto del cobro fue a interés, capital y capital extra.ConceptCollections — conceptos del cobro (mora, descuento, etc.). La mora viaja como concepto con IsDelinquentPayer = true.MultiplePayments — formas de pago múltiples de un mismo cobro (ej. parte en efectivo, parte en transferencia).VoucherImages — comprobantes adjuntos del cobro (actualizables).

Tesorería (Módulo Treasury)

TreasuryReceipts — recibo de tesorería (E.RECIBO). El tipo del concepto (ConceptId → Concepts.FlowType) define si es entrada o salida (C40). Incluye tipo de cuenta de destino, tercero y folio.ProjectExpenses — gastos asociados a un proyecto específico. Vinculados a un ConceptId y BranchId.GeneralExpenses — gastos generales de la empresa sin proyecto asociado. Solo TenantId, sin BranchId.El resumen financiero del proyecto se compone calculando la diferencia entre los cobros (Collections) y los gastos (ProjectExpenses + GeneralExpenses) por período.

Pagos en Línea (Módulo Payments)

TablaPropósito
StripeConnectAccountsCuenta Stripe Express por tenant; una por empresa
OnlinePaymentsRegistro de cada PaymentIntent; vincula con Collections al confirmarse
Ver detalle completo en ADR-004: Pagos Stripe.

Recursos Humanos (Módulo Hr)

El módulo Hr tiene ámbito solo-TenantId (sin BranchId en sus entidades principales). La razón social pagadora (HrLegalEntities) es el punto de anclaje de nómina, no el Branch.
HrLegalEntities — razón social pagadora (placeholder; modelado definitivo pendiente, R20). Campos clave: TenantId, LegalName, TaxId, CountryId.Areas — áreas de la empresa con HrLegalEntityId.Departments — departamentos dentro de un área.Positions — puestos dentro de un departamento.
Employees — empleado. Campos clave:
CampoNotas
EmployeeCodeCódigo único por entidad legal
UserIdVinculación con el usuario de Identity (puede ser null para empleados sin acceso al sistema)
PositionIdPuesto actual
HireDate / TerminationDateFechas de alta y baja
GenderId / MaritalStatusId / EducationLevelIdDatos demográficos
Curp / Rfc / NssIdentificadores fiscales MX
IsActive / IsDeletedEstado y soft delete
EmployeePhones — teléfonos del empleado (polimórfico por PhoneTypeId).EmployeeEmergencyContacts — contactos de emergencia.
Schedules — horario de trabajo con HrLegalEntityId, nombre y descripción.ScheduleDays — días del horario con entrada/salida esperadas, descanso y tolerancias.
ClockRecords — checadas brutas: timestamp, tipo de registro (RecordTypeId), fuente (ClockRecordSourceId: web con ubicación/IP, o kiosko con PIN), validez y coordenadas GPS.Attendances — registro procesado diario: una fila por empleado y día. Campos clave: WorkedMinutes, LateMinutes, EarlyOutMinutes, OvertimeMinutes, AbsentMinutes. IsLocked = true cuando el período está cerrado para prenómina.
PayrollGroups — grupo de nómina con frecuencia de pago (PayrollFrequencyId).PayrollConcepts — conceptos de nómina configurables: tipo (PayrollConceptTypeId), cálculo (PayrollCalculationTypeId), monto/porcentaje fijo o fórmula de expresión. Las fórmulas se validan contra el catálogo PayrollFormulaVariables al guardar (ADR-020).PayrollPeriods — período de nómina (año + número de período).PayrollRuns — ejecución de nómina para un período. El estado vive en PayrollRunStatusId (referencia al catálogo PayrollRunStatuses). ClosedAtUtc y ClosedByUserId registran el cierre; una vez cerrada es inmutable (R05).PayrollRunDetails — resultado por empleado: TotalEarnings, TotalDeductions, NetPay.PayrollRunDetailConcepts — desglose por concepto con snapshot inmutable del concepto al momento del cálculo (integridad histórica).
DocumentTypes — tipos de documento por entidad legal con vigencia por defecto.EmployeeDocuments — documento subido con dueño polimórfico (DocumentOwnerTypeId + OwnerEntityId). IsCurrent para el historial de renovaciones.RequiredDocuments — documentos requeridos por entidad legal.
VacationPolicies / VacationPolicyRules — tabuladores de vacaciones configurables con reglas por rango de años de antigüedad.VacationRequests / CommissionRequests / OvertimeRequests — solicitudes tipadas cuyo estado vive en ApprovalRequests (motor compartido).Incidents — registro manual de incidencias (sin efecto en nómina, R10).

Motor de Aprobaciones (Shared.Approvals)

ApprovalEntityTypes — catálogo de tipos de entidad que pueden requerir aprobación (ej. eliminación de cobros, solicitudes de vacaciones). ApprovalRequests — solicitud de aprobación polimórica por ApprovalEntityTypeId + EntityId. Estado: Pending / Approved / Rejected / Cancelled. Un solo nivel binario (R14).

Módulos sin tablas propias

MóduloRazón
ReportsSolo consultas — no persiste datos propios; el render ocurre en el WebClient
FinancingMotor de cálculo sobre los planes de Sales — sin tablas propias
Tax / Rentals / MaterialsFuera del alcance de esta versión

Build docs developers (and LLMs) love