fin.invoices gana tipo de comprobante, forma y método de pago y CP de
expedición; fin.invoice_items gana concepto de catálogo y las claves ProdServ,
unidad y objeto de impuesto. Todas nullable: las facturas ya emitidas no las
tienen y siguen funcionando igual (listado, detalle, PDF, envío).
La columna de texto libre invoice_items.concept se conserva obligatoria porque
la consume el PDF actual; al capturar por catálogo, el service hereda ahí la
descripción del concepto cuando el cliente no la envía.
Nueva tabla fin.invoice_item_taxes para el detalle de impuestos trasladados y
retenidos por partida. No interviene en el cálculo de subtotal/IVA/total, que
sigue saliendo de invoices.tax_rate.
Incluye la migración e6f7a8b9c0d1 (crea el schema sat, siembra los catálogos con
sync_catalogs y monta las tablas e índices nuevos) y registra los permisos
fin.concept.* y fin.settings.{view,edit}.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
19 lines
798 B
Python
19 lines
798 B
Python
"""Router agregador del módulo Facturación (Diagrama 4). Prefijo ``/fin``."""
|
|
|
|
from fastapi import APIRouter, Depends
|
|
|
|
from api.v1.modules.core.permissions.dependencies import PermissionChecker
|
|
|
|
from . import permissions # noqa: F401 (side-effect: registra permisos)
|
|
from .catalogs.routes import router as catalogs_router
|
|
from .concepts.routes import router as concepts_router
|
|
from .invoices.routes import router as invoices_router
|
|
from .issuer.routes import router as issuer_router
|
|
|
|
# Enforcement por área/carril (R-T-07): se exige fin.access para el módulo.
|
|
router = APIRouter(dependencies=[Depends(PermissionChecker(["fin.access"]))])
|
|
router.include_router(catalogs_router)
|
|
router.include_router(concepts_router)
|
|
router.include_router(issuer_router)
|
|
router.include_router(invoices_router)
|