diff --git a/backend/api/v1/modules/a76/audit_log/register.py b/backend/api/v1/modules/a76/audit_log/register.py new file mode 100644 index 00000000..054dfb39 --- /dev/null +++ b/backend/api/v1/modules/a76/audit_log/register.py @@ -0,0 +1,150 @@ +# Importar modelos para Audit Log +from api.v1.modules.a76.pedmientos.models.pedimentos import Pedimentos +from api.v1.modules.a76.invoices.models import InvoiceHeader, InvoiceSalesDetails +from api.v1.modules.a76.audit_log.events import register_audit_listeners + +# Core Modules +from api.v1.modules.a76.clients_and_providers.models import ClientProvider +from api.v1.modules.a76.customs_brokers.models import CustomsBroker +from api.v1.modules.a76.parts.models import Part +from api.v1.modules.a76.items.models import LineItem +from api.v1.modules.a76.general_catalogs.company.models import Company + +# Reference Data +from api.v1.modules.public.reference_data.countries.models import Country +from api.v1.modules.public.reference_data.currency_types.models import CurrencyType +from api.v1.modules.public.reference_data.customs_sections.models import CustomsSection +from api.v1.modules.public.reference_data.customs_warehouses.models import ( + CustomsWarehouse, +) +from api.v1.modules.public.reference_data.incoterms.models import Incoterm +from api.v1.modules.public.reference_data.invoice_types.models import InvoiceType +from api.v1.modules.public.reference_data.material_types.models import MaterialType +from api.v1.modules.public.reference_data.payment_methods.models import PaymentMethod +from api.v1.modules.public.reference_data.pedimento_transport_catalog.models import ( + PedimentoTransportCatalog, +) +from api.v1.modules.public.reference_data.pedimento_codes.models import PedimentoCode +from api.v1.modules.public.reference_data.pedimento_regimens.models import ( + RegimenPedimento, +) +from api.v1.modules.public.reference_data.states.models import State +from api.v1.modules.public.reference_data.transport_modes.models import TransportMode +from api.v1.modules.public.reference_data.transport_types.models import TransportType +from api.v1.modules.public.reference_data.valuation_methods.models import ( + ValuationMethod, +) +from api.v1.modules.public.reference_data.license_exceptions.models import LicenseException +from api.v1.modules.public.reference_data.agency_tariff_codes.models import AgencyTariffCode +from api.v1.modules.public.reference_data.identifiers.models import IdentifierCatalog +from api.v1.modules.public.reference_data.carta_porte_codes.models import CartaPorte +from api.v1.modules.a76.general_catalogs.units_of_measure.models import UnitOfMeasure +from api.v1.modules.a76.general_catalogs.exchange_rate.models import ExchangeRate +from api.v1.modules.a76.general_catalogs.identifiers.models import Identifier +from api.v1.modules.a76.classes.models import Class +from api.v1.modules.a76.general_catalogs.classification_concepts.models import ( + ClassificationConcept, +) +from api.v1.modules.a76.general_catalogs.concepts.models import Concept +from api.v1.modules.a76.general_catalogs.customs_broker_concepts.models import ( + CustomsBrokerConcept, +) +from api.v1.modules.a76.general_catalogs.depreciation_catalog.models import ( + DepreciationCatalog, +) +from api.v1.modules.a76.general_catalogs.doda.models import Doda +from api.v1.modules.a76.general_catalogs.electronic_notices.models import ( + ElectronicNotice, +) +from api.v1.modules.a76.general_catalogs.equivalencies.models import Equivalency +from api.v1.modules.a76.general_catalogs.error_catalogs.models import ErrorCatalog +from api.v1.modules.a76.general_catalogs.fda_catalog.models import FDACatalog +from api.v1.modules.a76.general_catalogs.inpc.models import INPC +from api.v1.modules.a76.general_catalogs.legends.models import Legend +from api.v1.modules.a76.general_catalogs.multi_currency_types.models import ( + MultiCurrencyType, +) +from api.v1.modules.a76.general_catalogs.packages.models import Package +from api.v1.modules.a76.general_catalogs.ports.models import Port +from api.v1.modules.a76.general_catalogs.location.models import Location, FaLocationExt +from api.v1.modules.a76.general_catalogs.prevalidators.models import Prevalidator +from api.v1.modules.a76.general_catalogs.seal.models import Seal +from api.v1.modules.a76.general_catalogs.signatures.models import Signature +from api.v1.modules.a76.general_catalogs.fractions.tariff_fractions.models import ( + TariffFraction, +) +from api.v1.modules.a76.general_catalogs.unit_conversions.models import UnitConversion +from api.v1.modules.a76.general_catalogs.fractions.us_tariff_fractions.models import ( + USTariffFraction, +) +from api.v1.modules.a76.general_catalogs.sectors.models import Sector +from api.v1.modules.a76.transportation.trailers.models import Trailer +from api.v1.modules.a76.transportation.transporters.models import Transporter +from api.v1.modules.a76.transportation.vehicles.models import Vehicle + + +# Registrar Listeners de Auditoría +def register_audit(): + register_audit_listeners( + [ + # Core Transactions + Pedimentos, + InvoiceHeader, + InvoiceSalesDetails, + LineItem, + # Sidebar Core Modules + ClientProvider, + CustomsBroker, + Part, + Company, + # Transportation Modules + Trailer, + Transporter, + Vehicle, + # Reference Data + Country, + CurrencyType, + CustomsSection, + CustomsWarehouse, + Incoterm, + InvoiceType, + MaterialType, + PaymentMethod, + PedimentoTransportCatalog, + PedimentoCode, + RegimenPedimento, + Sector, + State, + TransportMode, + TransportType, + ValuationMethod, + LicenseException, + AgencyTariffCode, + IdentifierCatalog, + CartaPorte, + UnitOfMeasure, + ExchangeRate, + Identifier, + Class, + ClassificationConcept, + Concept, + CustomsBrokerConcept, + DepreciationCatalog, + Doda, + ElectronicNotice, + Equivalency, + ErrorCatalog, + FDACatalog, + INPC, + Legend, + MultiCurrencyType, + Package, + Port, + Prevalidator, + Seal, + Signature, + TariffFraction, + UnitConversion, + USTariffFraction, + ] + ) \ No newline at end of file diff --git a/backend/main.py b/backend/main.py index 570f7230..c2d060ac 100644 --- a/backend/main.py +++ b/backend/main.py @@ -5,98 +5,18 @@ Backend API con FastAPI + Keycloak + SQLAlchemy import logging import subprocess - -# Importar modelos para registrar con SQLAlchemy - -# Reference Data (Dependencies) -from api.v1.modules.public.reference_data.countries.models import Country -from api.v1.modules.public.reference_data.currency_types.models import CurrencyType -from api.v1.modules.public.reference_data.customs_sections.models import CustomsSection -from api.v1.modules.public.reference_data.customs_warehouses.models import CustomsWarehouse -from api.v1.modules.public.reference_data.incoterms.models import Incoterm -from api.v1.modules.public.reference_data.invoice_types.models import InvoiceType -from api.v1.modules.public.reference_data.material_types.models import MaterialType -from api.v1.modules.public.reference_data.payment_methods.models import PaymentMethod -from api.v1.modules.public.reference_data.pedimento_transport_catalog.models import ( - PedimentoTransportCatalog, -) -# Orden: PedimentoCode y RegimenPedimento antes de CodePedimentoRegimen para que -# SQLAlchemy resuelva los nombres en relationship() al configurar el mapper -from api.v1.modules.public.reference_data.pedimento_codes.models import PedimentoCode -from api.v1.modules.public.reference_data.pedimento_regimens.models import RegimenPedimento -from api.v1.modules.public.reference_data.code_pedimento_regimens.models import ( - CodePedimentoRegimen, -) -from api.v1.modules.a76.general_catalogs.sectors.models import Sector -from api.v1.modules.public.reference_data.states.models import State -from api.v1.modules.public.reference_data.transport_modes.models import TransportMode -from api.v1.modules.public.reference_data.transport_types.models import TransportType -from api.v1.modules.public.reference_data.valuation_methods.models import ValuationMethod -from api.v1.modules.public.reference_data.license_exceptions.models import LicenseException -from api.v1.modules.public.reference_data.agency_tariff_codes.models import AgencyTariffCode -from api.v1.modules.public.reference_data.identifiers.models import IdentifierCatalog -from api.v1.modules.public.reference_data.carta_porte.models import CartaPorte -from api.v1.modules.a76.general_catalogs.units_of_measure.models import UnitOfMeasure -from api.v1.modules.a76.general_catalogs.exchange_rate.models import ExchangeRate -from api.v1.modules.a76.general_catalogs.identifiers.models import Identifier -from api.v1.modules.a76.classes.models import Class -from api.v1.modules.a76.general_catalogs.classification_concepts.models import ClassificationConcept -from api.v1.modules.a76.general_catalogs.concepts.models import Concept -from api.v1.modules.a76.general_catalogs.customs_broker_concepts.models import CustomsBrokerConcept -from api.v1.modules.a76.general_catalogs.depreciation_catalog.models import DepreciationCatalog -from api.v1.modules.a76.general_catalogs.doda.models import Doda -from api.v1.modules.a76.general_catalogs.electronic_notices.models import ElectronicNotice -from api.v1.modules.a76.general_catalogs.equivalencies.models import Equivalency -from api.v1.modules.a76.general_catalogs.error_catalogs.models import ErrorCatalog -from api.v1.modules.a76.general_catalogs.fda_catalog.models import FDACatalog -from api.v1.modules.a76.general_catalogs.inpc.models import INPC -from api.v1.modules.a76.general_catalogs.legends.models import Legend -from api.v1.modules.a76.general_catalogs.multi_currency_types.models import MultiCurrencyType -from api.v1.modules.a76.general_catalogs.packages.models import Package -from api.v1.modules.a76.general_catalogs.ports.models import Port -from api.v1.modules.a76.general_catalogs.location.models import Location, FaLocationExt -from api.v1.modules.a76.general_catalogs.prevalidators.models import Prevalidator -from api.v1.modules.a76.general_catalogs.seal.models import Seal -from api.v1.modules.a76.general_catalogs.signatures.models import Signature -from api.v1.modules.a76.general_catalogs.fractions.tariff_fractions.models import ( - TariffFraction, -) -from api.v1.modules.a76.general_catalogs.unit_conversions.models import UnitConversion -from api.v1.modules.a76.general_catalogs.fractions.us_tariff_fractions.models import ( - USTariffFraction, -) - -# Core Modules & Reference Data (Dependencies) -from api.v1.modules.a76.clients_and_providers.models import ClientProvider -from api.v1.modules.a76.customs_brokers.models import CustomsBroker -from api.v1.modules.a76.general_catalogs.company.models import Company - -# Transportation Modules -from api.v1.modules.a76.transportation.trailers.models import Trailer -from api.v1.modules.a76.transportation.transporters.models import Transporter -from api.v1.modules.a76.transportation.vehicles.models import Vehicle - -# Core Modules & Transactional Models -from api.v1.modules.a76.items.models import LineItem -from api.v1.modules.a76.items.series.models import Serie -from api.v1.modules.a76.parts.models import Part -from api.v1.modules.a24.fa.fa_parts.models import FaPart -from api.v1.modules.a24.inv.inv_parts.models import InvPart -from api.v1.modules.a76.manifests.manifest.models import Manifest -from api.v1.modules.a76.manifests.concept_manifestation.models import ConceptManifestation -from api.v1.modules.a76.manifests.value_manifestation.models import ValueManifestation - -# Transactional Primary Models -from api.v1.modules.a76.pedmientos.models.pedimentos import Pedimentos -from api.v1.modules.a76.invoices.models import InvoiceHeader, InvoiceSalesDetails -from api.v1.modules.a76.audit_log.events import register_audit_listeners +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware +from fastapi.staticfiles import StaticFiles +from pathlib import Path +from contextlib import asynccontextmanager # Core Modules (Secondary) - import core.celery_app # Initialize Celery App +from api.v1.modules.a76.audit_log.middleware import UserContextMiddleware # Middleware de Contexto de Usuario (Audit Log) +from api.v1.modules.a76.audit_log.register import register_audit from api.v1.router import router as api_v1_router from core.config import settings -from core.database import init_db from core.paths import layout_path from core.error_handlers import register_exception_handlers from core.middleware import ( @@ -104,26 +24,6 @@ from core.middleware import ( RequestLoggingMiddleware, TenantMiddleware, ) -from fastapi import FastAPI, Request, status, HTTPException -from fastapi.middleware.cors import CORSMiddleware -from fastapi.exceptions import RequestValidationError -from fastapi.responses import JSONResponse -from fastapi.staticfiles import StaticFiles -from pathlib import Path - -# Importar modelos para registrar con SQLAlchemy -# IMPORTANT: Import FaLineItem BEFORE LineItem for relationship resolution -from api.v1.modules.a24.fa.fa_item_lines.models import FaLineItem -from api.v1.modules.a76.items.models import LineItem -from api.v1.modules.a76.items.series.models import Serie -from api.v1.modules.a76.parts.models import Part -from api.v1.modules.a24.fa.fa_parts.models import FaPart -from api.v1.modules.a24.inv.inv_parts.models import InvPart -from api.v1.modules.a76.manifests.manifest.models import Manifest -from api.v1.modules.a76.manifests.concept_manifestation.models import ( - ConceptManifestation, -) -from api.v1.modules.a76.manifests.value_manifestation.models import ValueManifestation # Configurar logging logging.basicConfig( @@ -131,7 +31,6 @@ logging.basicConfig( format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", ) - # Crear aplicación FastAPI app = FastAPI( title="Anexo76 API", @@ -147,35 +46,14 @@ logger = logging.getLogger(__name__) # Registrar manejadores de excepciones register_exception_handlers(app) - -def _cors_headers_for_request(request: Request): - """Return CORS headers if request Origin is allowed (so error responses don't get blocked by browser).""" - origin = request.headers.get("origin") - if not origin: - return {} - allowed = settings.cors_origins_list - if origin in allowed: - return { - "Access-Control-Allow-Origin": origin, - "Access-Control-Allow-Credentials": "true", - } - return {} - - - for k, v in _cors_headers_for_request(request).items(): - response.headers[k] = v - return response - - def run_migrations(): subprocess.run(["alembic", "upgrade", "head"], check=True) # Inicializar la base de datos -@app.on_event("startup") async def on_startup(): """Evento de inicio de la aplicación""" logger.info("Iniciando la aplicación Anexo76...") - init_db() + #init_db() run_migrations() logger.info("Base de datos inicializada correctamente.") @@ -195,159 +73,16 @@ if settings.DEBUG: app.add_middleware(LicenseValidationMiddleware) app.add_middleware(TenantMiddleware) - -# Middleware de Contexto de Usuario (Audit Log) -from api.v1.modules.a76.audit_log.middleware import UserContextMiddleware - app.add_middleware(UserContextMiddleware) -# Importar modelos para Audit Log -from api.v1.modules.a76.pedmientos.models.pedimentos import Pedimentos -from api.v1.modules.a76.invoices.models import InvoiceHeader, InvoiceSalesDetails -from api.v1.modules.a76.audit_log.events import register_audit_listeners +@asynccontextmanager +async def lifespan(app: FastAPI): + # Centraliza startup para evitar on_event() (deprecated en FastAPI) + await on_startup() + register_audit() + yield -# Core Modules -from api.v1.modules.a76.clients_and_providers.models import ClientProvider -from api.v1.modules.a76.customs_brokers.models import CustomsBroker -from api.v1.modules.a76.parts.models import Part -from api.v1.modules.a76.items.models import LineItem -from api.v1.modules.a76.general_catalogs.company.models import Company - -# Reference Data -from api.v1.modules.public.reference_data.countries.models import Country -from api.v1.modules.public.reference_data.currency_types.models import CurrencyType -from api.v1.modules.public.reference_data.customs_sections.models import CustomsSection -from api.v1.modules.public.reference_data.customs_warehouses.models import ( - CustomsWarehouse, -) -from api.v1.modules.public.reference_data.incoterms.models import Incoterm -from api.v1.modules.public.reference_data.invoice_types.models import InvoiceType -from api.v1.modules.public.reference_data.material_types.models import MaterialType -from api.v1.modules.public.reference_data.payment_methods.models import PaymentMethod -from api.v1.modules.public.reference_data.pedimento_transport_catalog.models import ( - PedimentoTransportCatalog, -) -from api.v1.modules.public.reference_data.pedimento_codes.models import PedimentoCode -from api.v1.modules.public.reference_data.pedimento_regimens.models import ( - RegimenPedimento, -) -from api.v1.modules.public.reference_data.states.models import State -from api.v1.modules.public.reference_data.transport_modes.models import TransportMode -from api.v1.modules.public.reference_data.transport_types.models import TransportType -from api.v1.modules.public.reference_data.valuation_methods.models import ( - ValuationMethod, -) -from api.v1.modules.public.reference_data.license_exceptions.models import LicenseException -from api.v1.modules.public.reference_data.agency_tariff_codes.models import AgencyTariffCode -from api.v1.modules.public.reference_data.identifiers.models import IdentifierCatalog -from api.v1.modules.public.reference_data.carta_porte.models import CartaPorte -from api.v1.modules.a76.general_catalogs.units_of_measure.models import UnitOfMeasure -from api.v1.modules.a76.general_catalogs.exchange_rate.models import ExchangeRate -from api.v1.modules.a76.general_catalogs.identifiers.models import Identifier -from api.v1.modules.a76.classes.models import Class -from api.v1.modules.a76.general_catalogs.classification_concepts.models import ( - ClassificationConcept, -) -from api.v1.modules.a76.general_catalogs.concepts.models import Concept -from api.v1.modules.a76.general_catalogs.customs_broker_concepts.models import ( - CustomsBrokerConcept, -) -from api.v1.modules.a76.general_catalogs.depreciation_catalog.models import ( - DepreciationCatalog, -) -from api.v1.modules.a76.general_catalogs.doda.models import Doda -from api.v1.modules.a76.general_catalogs.electronic_notices.models import ( - ElectronicNotice, -) -from api.v1.modules.a76.general_catalogs.equivalencies.models import Equivalency -from api.v1.modules.a76.general_catalogs.error_catalogs.models import ErrorCatalog -from api.v1.modules.a76.general_catalogs.fda_catalog.models import FDACatalog -from api.v1.modules.a76.general_catalogs.inpc.models import INPC -from api.v1.modules.a76.general_catalogs.legends.models import Legend -from api.v1.modules.a76.general_catalogs.multi_currency_types.models import ( - MultiCurrencyType, -) -from api.v1.modules.a76.general_catalogs.packages.models import Package -from api.v1.modules.a76.general_catalogs.ports.models import Port -from api.v1.modules.a76.general_catalogs.location.models import Location, FaLocationExt -from api.v1.modules.a76.general_catalogs.prevalidators.models import Prevalidator -from api.v1.modules.a76.general_catalogs.seal.models import Seal -from api.v1.modules.a76.general_catalogs.signatures.models import Signature -from api.v1.modules.a76.general_catalogs.fractions.tariff_fractions.models import ( - TariffFraction, -) -from api.v1.modules.a76.general_catalogs.unit_conversions.models import UnitConversion -from api.v1.modules.a76.general_catalogs.fractions.us_tariff_fractions.models import ( - USTariffFraction, -) - - -# Registrar Listeners de Auditoría -@app.on_event("startup") -def register_audit(): - register_audit_listeners( - [ - # Core Transactions - Pedimentos, - InvoiceHeader, - InvoiceSalesDetails, - LineItem, - # Sidebar Core Modules - ClientProvider, - CustomsBroker, - Part, - Company, - # Transportation Modules - Trailer, - Transporter, - Vehicle, - # Reference Data - Country, - CurrencyType, - CustomsSection, - CustomsWarehouse, - Incoterm, - InvoiceType, - MaterialType, - PaymentMethod, - PedimentoTransportCatalog, - PedimentoCode, - RegimenPedimento, - Sector, - State, - TransportMode, - TransportType, - ValuationMethod, - LicenseException, - AgencyTariffCode, - IdentifierCatalog, - CartaPorte, - UnitOfMeasure, - ExchangeRate, - Identifier, - Class, - ClassificationConcept, - Concept, - CustomsBrokerConcept, - DepreciationCatalog, - Doda, - ElectronicNotice, - Equivalency, - ErrorCatalog, - FDACatalog, - INPC, - Legend, - MultiCurrencyType, - Package, - Port, - Prevalidator, - Seal, - Signature, - TariffFraction, - UnitConversion, - USTariffFraction, - ] - ) +app.router.lifespan_context = lifespan # Crear directorio de uploads si no existe y montar archivos estáticos