539 lines
19 KiB
YAML
539 lines
19 KiB
YAML
# TRACEABILITY.yml - MGN-010: Financial
|
|
# Matriz de trazabilidad: Documentacion -> Codigo
|
|
# Ubicacion: docs/02-fase-core-business/MGN-010-financial/implementacion/
|
|
|
|
epic_code: MGN-010
|
|
epic_name: Financial
|
|
phase: 2
|
|
phase_name: Core Business
|
|
story_points: 45
|
|
status: rf_documented
|
|
|
|
# =============================================================================
|
|
# DOCUMENTACION
|
|
# =============================================================================
|
|
|
|
documentation:
|
|
|
|
requirements:
|
|
- id: RF-FIN-001
|
|
title: Plan de Cuentas
|
|
file: ../requerimientos/RF-FIN-001.md
|
|
priority: P0
|
|
story_points: 13
|
|
status: documented
|
|
traces_to:
|
|
tables: [chart_of_accounts, accounts, account_balances]
|
|
services: [ChartOfAccountsService, AccountsService]
|
|
endpoints: [GET /api/v1/financial/charts, POST /api/v1/financial/charts/:id/accounts]
|
|
|
|
- id: RF-FIN-002
|
|
title: Monedas y Tipos de Cambio
|
|
file: ../requerimientos/RF-FIN-002.md
|
|
priority: P0
|
|
story_points: 10
|
|
status: documented
|
|
traces_to:
|
|
tables: [currencies, exchange_rates]
|
|
services: [CurrenciesService, ExchangeRateService]
|
|
endpoints: [GET /api/v1/financial/currencies, POST /api/v1/financial/currencies/convert]
|
|
|
|
- id: RF-FIN-003
|
|
title: Periodos Contables
|
|
file: ../requerimientos/RF-FIN-003.md
|
|
priority: P0
|
|
story_points: 10
|
|
status: documented
|
|
traces_to:
|
|
tables: [fiscal_years, fiscal_periods]
|
|
services: [FiscalPeriodService]
|
|
endpoints: [GET /api/v1/financial/fiscal-years, POST /api/v1/financial/periods/:id/close]
|
|
|
|
- id: RF-FIN-004
|
|
title: Asientos Contables
|
|
file: ../requerimientos/RF-FIN-004.md
|
|
priority: P0
|
|
story_points: 13
|
|
status: documented
|
|
traces_to:
|
|
tables: [journal_entries, journal_lines, cost_centers]
|
|
services: [JournalService]
|
|
endpoints: [GET /api/v1/financial/journal, POST /api/v1/financial/journal, POST /api/v1/financial/journal/:id/post]
|
|
|
|
specifications: []
|
|
# Pendiente de documentacion
|
|
|
|
user_stories: []
|
|
# Pendiente de documentacion
|
|
|
|
# =============================================================================
|
|
# IMPLEMENTACION
|
|
# =============================================================================
|
|
|
|
implementation:
|
|
|
|
database:
|
|
schema: core_financial
|
|
path: apps/database/ddl/schemas/core_financial/
|
|
status: pending
|
|
|
|
tables:
|
|
- name: chart_of_accounts
|
|
file: apps/database/ddl/schemas/core_financial/tables/chart_of_accounts.sql
|
|
status: pending
|
|
requirement: RF-FIN-001
|
|
columns:
|
|
- {name: id, type: UUID, pk: true}
|
|
- {name: tenant_id, type: UUID, fk: tenants}
|
|
- {name: code, type: VARCHAR(50)}
|
|
- {name: name, type: VARCHAR(255)}
|
|
- {name: description, type: TEXT}
|
|
- {name: standard, type: VARCHAR(20)}
|
|
- {name: base_currency_id, type: UUID, fk: currencies}
|
|
- {name: is_active, type: BOOLEAN, default: true}
|
|
- {name: created_at, type: TIMESTAMPTZ}
|
|
- {name: updated_at, type: TIMESTAMPTZ}
|
|
|
|
- name: accounts
|
|
file: apps/database/ddl/schemas/core_financial/tables/accounts.sql
|
|
status: pending
|
|
requirement: RF-FIN-001
|
|
columns:
|
|
- {name: id, type: UUID, pk: true}
|
|
- {name: chart_id, type: UUID, fk: chart_of_accounts}
|
|
- {name: parent_id, type: UUID, fk: accounts, nullable: true}
|
|
- {name: code, type: VARCHAR(50)}
|
|
- {name: name, type: VARCHAR(255)}
|
|
- {name: description, type: TEXT}
|
|
- {name: account_type, type: VARCHAR(50)}
|
|
- {name: nature, type: VARCHAR(10)}
|
|
- {name: level, type: INTEGER}
|
|
- {name: is_detail, type: BOOLEAN, default: true}
|
|
- {name: is_active, type: BOOLEAN, default: true}
|
|
- {name: currency_id, type: UUID, fk: currencies, nullable: true}
|
|
- {name: tags, type: JSONB}
|
|
- {name: created_at, type: TIMESTAMPTZ}
|
|
- {name: updated_at, type: TIMESTAMPTZ}
|
|
|
|
- name: account_balances
|
|
file: apps/database/ddl/schemas/core_financial/tables/account_balances.sql
|
|
status: pending
|
|
requirement: RF-FIN-001
|
|
columns:
|
|
- {name: id, type: UUID, pk: true}
|
|
- {name: account_id, type: UUID, fk: accounts}
|
|
- {name: period_id, type: UUID, fk: fiscal_periods}
|
|
- {name: opening_debit, type: "DECIMAL(18,4)", default: 0}
|
|
- {name: opening_credit, type: "DECIMAL(18,4)", default: 0}
|
|
- {name: movement_debit, type: "DECIMAL(18,4)", default: 0}
|
|
- {name: movement_credit, type: "DECIMAL(18,4)", default: 0}
|
|
- {name: closing_debit, type: "DECIMAL(18,4)", default: 0}
|
|
- {name: closing_credit, type: "DECIMAL(18,4)", default: 0}
|
|
- {name: balance, type: "DECIMAL(18,4)", default: 0}
|
|
- {name: updated_at, type: TIMESTAMPTZ}
|
|
|
|
- name: currencies
|
|
file: apps/database/ddl/schemas/core_financial/tables/currencies.sql
|
|
status: pending
|
|
requirement: RF-FIN-002
|
|
columns:
|
|
- {name: id, type: UUID, pk: true}
|
|
- {name: code, type: VARCHAR(3), unique: true}
|
|
- {name: name, type: VARCHAR(100)}
|
|
- {name: symbol, type: VARCHAR(10)}
|
|
- {name: decimal_places, type: INTEGER, default: 2}
|
|
- {name: decimal_separator, type: VARCHAR(1), default: "."}
|
|
- {name: thousand_separator, type: VARCHAR(1), default: ","}
|
|
- {name: symbol_position, type: VARCHAR(10), default: "before"}
|
|
- {name: is_active, type: BOOLEAN, default: true}
|
|
|
|
- name: exchange_rates
|
|
file: apps/database/ddl/schemas/core_financial/tables/exchange_rates.sql
|
|
status: pending
|
|
requirement: RF-FIN-002
|
|
columns:
|
|
- {name: id, type: UUID, pk: true}
|
|
- {name: tenant_id, type: UUID, fk: tenants}
|
|
- {name: from_currency_id, type: UUID, fk: currencies}
|
|
- {name: to_currency_id, type: UUID, fk: currencies}
|
|
- {name: rate, type: "DECIMAL(18,8)"}
|
|
- {name: inverse_rate, type: "DECIMAL(18,8)"}
|
|
- {name: effective_date, type: DATE}
|
|
- {name: source, type: VARCHAR(50)}
|
|
- {name: created_at, type: TIMESTAMPTZ}
|
|
|
|
- name: fiscal_years
|
|
file: apps/database/ddl/schemas/core_financial/tables/fiscal_years.sql
|
|
status: pending
|
|
requirement: RF-FIN-003
|
|
columns:
|
|
- {name: id, type: UUID, pk: true}
|
|
- {name: tenant_id, type: UUID, fk: tenants}
|
|
- {name: name, type: VARCHAR(100)}
|
|
- {name: code, type: VARCHAR(20)}
|
|
- {name: start_date, type: DATE}
|
|
- {name: end_date, type: DATE}
|
|
- {name: status, type: VARCHAR(20)}
|
|
- {name: closed_at, type: TIMESTAMPTZ}
|
|
- {name: closed_by, type: UUID, fk: users}
|
|
- {name: created_at, type: TIMESTAMPTZ}
|
|
|
|
- name: fiscal_periods
|
|
file: apps/database/ddl/schemas/core_financial/tables/fiscal_periods.sql
|
|
status: pending
|
|
requirement: RF-FIN-003
|
|
columns:
|
|
- {name: id, type: UUID, pk: true}
|
|
- {name: fiscal_year_id, type: UUID, fk: fiscal_years}
|
|
- {name: number, type: INTEGER}
|
|
- {name: name, type: VARCHAR(50)}
|
|
- {name: start_date, type: DATE}
|
|
- {name: end_date, type: DATE}
|
|
- {name: status, type: VARCHAR(20)}
|
|
- {name: is_adjustment, type: BOOLEAN, default: false}
|
|
- {name: closed_at, type: TIMESTAMPTZ}
|
|
- {name: closed_by, type: UUID, fk: users}
|
|
|
|
- name: journal_entries
|
|
file: apps/database/ddl/schemas/core_financial/tables/journal_entries.sql
|
|
status: pending
|
|
requirement: RF-FIN-004
|
|
columns:
|
|
- {name: id, type: UUID, pk: true}
|
|
- {name: tenant_id, type: UUID, fk: tenants}
|
|
- {name: period_id, type: UUID, fk: fiscal_periods}
|
|
- {name: entry_number, type: VARCHAR(50)}
|
|
- {name: entry_date, type: DATE}
|
|
- {name: description, type: TEXT}
|
|
- {name: reference, type: VARCHAR(255)}
|
|
- {name: source_type, type: VARCHAR(50)}
|
|
- {name: source_id, type: UUID}
|
|
- {name: status, type: VARCHAR(20)}
|
|
- {name: reversed_entry_id, type: UUID, fk: journal_entries, nullable: true}
|
|
- {name: posted_at, type: TIMESTAMPTZ}
|
|
- {name: posted_by, type: UUID, fk: users}
|
|
- {name: created_by, type: UUID, fk: users}
|
|
- {name: created_at, type: TIMESTAMPTZ}
|
|
- {name: updated_at, type: TIMESTAMPTZ}
|
|
|
|
- name: journal_lines
|
|
file: apps/database/ddl/schemas/core_financial/tables/journal_lines.sql
|
|
status: pending
|
|
requirement: RF-FIN-004
|
|
columns:
|
|
- {name: id, type: UUID, pk: true}
|
|
- {name: entry_id, type: UUID, fk: journal_entries}
|
|
- {name: line_number, type: INTEGER}
|
|
- {name: account_id, type: UUID, fk: accounts}
|
|
- {name: cost_center_id, type: UUID, fk: cost_centers, nullable: true}
|
|
- {name: description, type: TEXT}
|
|
- {name: debit, type: "DECIMAL(18,4)", default: 0}
|
|
- {name: credit, type: "DECIMAL(18,4)", default: 0}
|
|
- {name: currency_id, type: UUID, fk: currencies}
|
|
- {name: exchange_rate, type: "DECIMAL(18,8)", default: 1}
|
|
- {name: debit_base, type: "DECIMAL(18,4)", default: 0}
|
|
- {name: credit_base, type: "DECIMAL(18,4)", default: 0}
|
|
- {name: partner_id, type: UUID, nullable: true}
|
|
- {name: tags, type: JSONB}
|
|
- {name: reconciled, type: BOOLEAN, default: false}
|
|
- {name: reconciled_at, type: TIMESTAMPTZ}
|
|
|
|
- name: cost_centers
|
|
file: apps/database/ddl/schemas/core_financial/tables/cost_centers.sql
|
|
status: pending
|
|
requirement: RF-FIN-004
|
|
columns:
|
|
- {name: id, type: UUID, pk: true}
|
|
- {name: tenant_id, type: UUID, fk: tenants}
|
|
- {name: parent_id, type: UUID, fk: cost_centers, nullable: true}
|
|
- {name: code, type: VARCHAR(50)}
|
|
- {name: name, type: VARCHAR(255)}
|
|
- {name: level, type: INTEGER}
|
|
- {name: is_active, type: BOOLEAN, default: true}
|
|
- {name: created_at, type: TIMESTAMPTZ}
|
|
- {name: updated_at, type: TIMESTAMPTZ}
|
|
|
|
backend:
|
|
module: financial
|
|
path: apps/backend/src/modules/financial/
|
|
framework: NestJS
|
|
status: pending
|
|
|
|
entities:
|
|
- name: ChartOfAccounts
|
|
file: apps/backend/src/modules/financial/entities/chart-of-accounts.entity.ts
|
|
status: pending
|
|
requirement: RF-FIN-001
|
|
|
|
- name: Account
|
|
file: apps/backend/src/modules/financial/entities/account.entity.ts
|
|
status: pending
|
|
requirement: RF-FIN-001
|
|
|
|
- name: AccountBalance
|
|
file: apps/backend/src/modules/financial/entities/account-balance.entity.ts
|
|
status: pending
|
|
requirement: RF-FIN-001
|
|
|
|
- name: Currency
|
|
file: apps/backend/src/modules/financial/entities/currency.entity.ts
|
|
status: pending
|
|
requirement: RF-FIN-002
|
|
|
|
- name: ExchangeRate
|
|
file: apps/backend/src/modules/financial/entities/exchange-rate.entity.ts
|
|
status: pending
|
|
requirement: RF-FIN-002
|
|
|
|
- name: FiscalYear
|
|
file: apps/backend/src/modules/financial/entities/fiscal-year.entity.ts
|
|
status: pending
|
|
requirement: RF-FIN-003
|
|
|
|
- name: FiscalPeriod
|
|
file: apps/backend/src/modules/financial/entities/fiscal-period.entity.ts
|
|
status: pending
|
|
requirement: RF-FIN-003
|
|
|
|
- name: JournalEntry
|
|
file: apps/backend/src/modules/financial/entities/journal-entry.entity.ts
|
|
status: pending
|
|
requirement: RF-FIN-004
|
|
|
|
- name: JournalLine
|
|
file: apps/backend/src/modules/financial/entities/journal-line.entity.ts
|
|
status: pending
|
|
requirement: RF-FIN-004
|
|
|
|
- name: CostCenter
|
|
file: apps/backend/src/modules/financial/entities/cost-center.entity.ts
|
|
status: pending
|
|
requirement: RF-FIN-004
|
|
|
|
services:
|
|
- name: ChartOfAccountsService
|
|
file: apps/backend/src/modules/financial/chart-of-accounts.service.ts
|
|
status: pending
|
|
requirement: RF-FIN-001
|
|
methods:
|
|
- {name: create, description: Crear plan de cuentas}
|
|
- {name: importTemplate, description: Importar desde template}
|
|
- {name: getTree, description: Obtener arbol de cuentas}
|
|
|
|
- name: AccountsService
|
|
file: apps/backend/src/modules/financial/accounts.service.ts
|
|
status: pending
|
|
requirement: RF-FIN-001
|
|
methods:
|
|
- {name: create, description: Crear cuenta}
|
|
- {name: getBalance, description: Obtener saldo de cuenta}
|
|
- {name: validateCode, description: Validar codigo de cuenta}
|
|
|
|
- name: CurrenciesService
|
|
file: apps/backend/src/modules/financial/currencies.service.ts
|
|
status: pending
|
|
requirement: RF-FIN-002
|
|
methods:
|
|
- {name: getActive, description: Obtener monedas activas}
|
|
- {name: convert, description: Convertir moneda}
|
|
- {name: format, description: Formatear monto}
|
|
|
|
- name: ExchangeRateService
|
|
file: apps/backend/src/modules/financial/exchange-rate.service.ts
|
|
status: pending
|
|
requirement: RF-FIN-002
|
|
methods:
|
|
- {name: getRate, description: Obtener tipo de cambio}
|
|
- {name: setRate, description: Registrar tipo de cambio}
|
|
- {name: getHistory, description: Obtener historial de tasas}
|
|
|
|
- name: FiscalPeriodService
|
|
file: apps/backend/src/modules/financial/fiscal-period.service.ts
|
|
status: pending
|
|
requirement: RF-FIN-003
|
|
methods:
|
|
- {name: createYear, description: Crear año fiscal}
|
|
- {name: closePeriod, description: Cerrar periodo}
|
|
- {name: closeYear, description: Cerrar año fiscal}
|
|
- {name: canPostToDate, description: Validar fecha para contabilizar}
|
|
|
|
- name: JournalService
|
|
file: apps/backend/src/modules/financial/journal.service.ts
|
|
status: pending
|
|
requirement: RF-FIN-004
|
|
methods:
|
|
- {name: create, description: Crear asiento}
|
|
- {name: validate, description: Validar asiento}
|
|
- {name: post, description: Mayorizar asiento}
|
|
- {name: reverse, description: Reversar asiento}
|
|
|
|
controllers:
|
|
- name: ChartOfAccountsController
|
|
file: apps/backend/src/modules/financial/controllers/chart-of-accounts.controller.ts
|
|
status: pending
|
|
endpoints:
|
|
- method: GET
|
|
path: /api/v1/financial/charts
|
|
description: Listar planes de cuentas
|
|
requirement: RF-FIN-001
|
|
|
|
- method: POST
|
|
path: /api/v1/financial/charts
|
|
description: Crear plan de cuentas
|
|
requirement: RF-FIN-001
|
|
|
|
- method: GET
|
|
path: /api/v1/financial/charts/:id/accounts
|
|
description: Obtener arbol de cuentas
|
|
requirement: RF-FIN-001
|
|
|
|
- method: POST
|
|
path: /api/v1/financial/charts/:id/accounts
|
|
description: Crear cuenta
|
|
requirement: RF-FIN-001
|
|
|
|
- method: GET
|
|
path: /api/v1/financial/accounts/:id/balance
|
|
description: Obtener saldo de cuenta
|
|
requirement: RF-FIN-001
|
|
|
|
- name: CurrenciesController
|
|
file: apps/backend/src/modules/financial/controllers/currencies.controller.ts
|
|
status: pending
|
|
endpoints:
|
|
- method: GET
|
|
path: /api/v1/financial/currencies
|
|
description: Listar monedas
|
|
requirement: RF-FIN-002
|
|
|
|
- method: GET
|
|
path: /api/v1/financial/currencies/:code/rates
|
|
description: Obtener historial de tasas
|
|
requirement: RF-FIN-002
|
|
|
|
- method: POST
|
|
path: /api/v1/financial/currencies/:code/rates
|
|
description: Registrar tipo de cambio
|
|
requirement: RF-FIN-002
|
|
|
|
- method: POST
|
|
path: /api/v1/financial/currencies/convert
|
|
description: Convertir moneda
|
|
requirement: RF-FIN-002
|
|
|
|
- name: FiscalPeriodsController
|
|
file: apps/backend/src/modules/financial/controllers/fiscal-periods.controller.ts
|
|
status: pending
|
|
endpoints:
|
|
- method: GET
|
|
path: /api/v1/financial/fiscal-years
|
|
description: Listar años fiscales
|
|
requirement: RF-FIN-003
|
|
|
|
- method: POST
|
|
path: /api/v1/financial/fiscal-years
|
|
description: Crear año fiscal
|
|
requirement: RF-FIN-003
|
|
|
|
- method: GET
|
|
path: /api/v1/financial/fiscal-years/:id/periods
|
|
description: Obtener periodos del año
|
|
requirement: RF-FIN-003
|
|
|
|
- method: POST
|
|
path: /api/v1/financial/periods/:id/close
|
|
description: Cerrar periodo
|
|
requirement: RF-FIN-003
|
|
|
|
- name: JournalController
|
|
file: apps/backend/src/modules/financial/controllers/journal.controller.ts
|
|
status: pending
|
|
endpoints:
|
|
- method: GET
|
|
path: /api/v1/financial/journal
|
|
description: Listar asientos
|
|
requirement: RF-FIN-004
|
|
|
|
- method: POST
|
|
path: /api/v1/financial/journal
|
|
description: Crear asiento
|
|
requirement: RF-FIN-004
|
|
|
|
- method: GET
|
|
path: /api/v1/financial/journal/:id
|
|
description: Obtener asiento
|
|
requirement: RF-FIN-004
|
|
|
|
- method: POST
|
|
path: /api/v1/financial/journal/:id/post
|
|
description: Mayorizar asiento
|
|
requirement: RF-FIN-004
|
|
|
|
- method: POST
|
|
path: /api/v1/financial/journal/:id/reverse
|
|
description: Reversar asiento
|
|
requirement: RF-FIN-004
|
|
|
|
# =============================================================================
|
|
# DEPENDENCIAS
|
|
# =============================================================================
|
|
|
|
dependencies:
|
|
depends_on:
|
|
- module: MGN-001
|
|
type: hard
|
|
reason: Autenticacion requerida
|
|
- module: MGN-004
|
|
type: hard
|
|
reason: Aislamiento por tenant
|
|
- module: MGN-005
|
|
type: soft
|
|
reason: Catalogos de monedas, tipos cuenta
|
|
|
|
required_by:
|
|
- module: FINANCIAL_VERTICALS
|
|
type: hard
|
|
reason: Base para facturacion, CxC, CxP, tesoreria
|
|
|
|
# =============================================================================
|
|
# METRICAS
|
|
# =============================================================================
|
|
|
|
metrics:
|
|
story_points:
|
|
estimated: 45
|
|
actual: null
|
|
|
|
documentation:
|
|
requirements: 4
|
|
specifications: 0
|
|
user_stories: 0
|
|
|
|
files:
|
|
database: 10
|
|
backend: 20
|
|
frontend: 10
|
|
total: 40
|
|
|
|
# =============================================================================
|
|
# HISTORIAL
|
|
# =============================================================================
|
|
|
|
history:
|
|
- date: "2025-12-05"
|
|
action: "Creacion de estructura GAMILIT"
|
|
author: Requirements-Analyst
|
|
changes:
|
|
- "Creacion de TRACEABILITY.yml"
|
|
- "Definicion de estructura base"
|
|
|
|
- date: "2025-12-05"
|
|
action: "Documentacion de RF"
|
|
author: Requirements-Analyst
|
|
changes:
|
|
- "RF-FIN-001: Plan de Cuentas"
|
|
- "RF-FIN-002: Monedas y Tipos de Cambio"
|
|
- "RF-FIN-003: Periodos Contables"
|
|
- "RF-FIN-004: Asientos Contables"
|
|
- "Actualizacion de trazabilidad RF -> implementacion"
|