Modelo de datos (Contabilidad)

App A comparte el proyecto Firebase con App B. Las declaraciones no se persisten (se calculan en runtime y se exportan); sí se guardan libros, prorrata, pagos, taxi y cuentas.

Colecciones (Firestore)

Raíz

  • subscriptions/{userId}_accountants — suscripción del contador (Paddle).
  • facturadorAccess/{authUid} — índice de accesos POS (custom claims).
  • feCallback/{clave} — callbacks de Hacienda.

Por cliente — users/{userId}/clients/{clientId}

SubcolecciónContenido
accountantFiles/{fileId}Factura cruda aplanada: Emisor.*, Receptor.*, ResumenFactura.*, MH, MR, tipoMovimiento, FechaEmisionTS, Clave, y el desglose plano IVA(x%), NETO_IVA(x%), TE, totalTE, Otros, tarifaMismatch, tarifaMismatchDetails.
gastosBook/{year}, ingresosBook/{year}Doc de año { regimenes[], monthSummaries{} }. Subcolección months/{periodo}rows/{rowKey} = PurchaseBookRow/SalesBookRow (incluye ivaPorTarifa, ivaPorTarifaNeto, cuentaContable, detalleSeleccionado, actividadSeleccionada, mismatchOverride, tarifaMismatchDetailsbreakdown original).
oldIngresos/{year}Prorrata manual { year, values, savedAt }.
cuentas/{year}Overrides del árbol de cuentas contables.
pagos/{pagoId}Pagos/cobros (interfaz Pago).
taxiBook/{year}/quarters/{quarterId}/rows/{rowId} + taxiPlacaIndex/{placa}Lecturas de odómetro (índice compuesto placa + fechaLectura).

Compartidas con App B (reglas en firestore.rules)

facturacionConfig (secretos del emisor, solo Admin), consecutivos (Admin), comprobantes/{clave} (metadata; owner + facturador), comprobantesXml (Admin), productos, receptores/{id}/exo, proveedores, exportJobs.

Tipos principales — lib/accountants/types.ts

  • PurchaseBookRow / SalesBookRow — la fila de libro con su desglose, cuenta, detalle, régimen y override.
  • Pago — pagos/cobros.
  • FormData / FormSection / FormField — estructura de las declaraciones.
  • FormTotals / RateTotals / DetalleTotals / PagoDiferidoTotals — agregados de cálculo.
  • YearBookDoc / MonthSummaryEntry — el doc de año y sus resúmenes mensuales.

Claves planas del desglose (en accountantFiles y en las filas)

ClaveSignificado
IVA(0.5%)IVA(13%)IVA bruto por tarifa
NETO_IVA(x%)IVA neto por tarifa (preferido en los cálculos)
TE / totalTEImpuesto de tarifa especial (IVA / base)
OtrosImpuestos código 99
tarifaMismatchFlag: el código de tarifa no coincide con la tarifa real
tarifaMismatchDetails{ resolvedKey, originalCode, actualTarifa, monto, montoNeto, lineaBase }

Ingreso vs. gasto

tipoMovimiento se deriva al ingestar: ingreso si la cédula del cliente es el emisor del XML; gasto si es el receptor. Define en qué libro (ventas/compras) cae la factura.

Archivos de referencia de Hacienda

app/apiHaciendaYllaves/ contiene artefactos de referencia (catálogo CABYS .xlsx, códigos de moneda v4.4, y las llaves/certificados de firma usados por App B). El PDF de ANEXOS Y ESTRUCTURAS v4.4 y los .p12 están gitignored (sensibles).