- Added service layer for handling client and provider operations including creation, retrieval, updating, and deletion. - Introduced DTOs for data transfer and validation. - Implemented filtering and pagination for client/provider listing. - Added logging for better traceability of operations. feat: Create parts management module - Developed a complete module for managing parts/components including creation, retrieval, updating, and deletion. - Introduced DTOs for parts with detailed attributes and validation. - Implemented search and filtering capabilities for parts based on various criteria. - Added endpoints for regulatory information retrieval and parts statistics. - Integrated logging for error handling and operational insights.
195 lines
10 KiB
Python
195 lines
10 KiB
Python
"""Create new A76 tables only - company, clients, parts, classes
|
|
|
|
Revision ID: 54f2046774d0
|
|
Revises: 7937209f9718
|
|
Create Date: 2025-11-06 03:38:27.848630
|
|
|
|
"""
|
|
from typing import Sequence, Union
|
|
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision: str = '54f2046774d0'
|
|
down_revision: Union[str, Sequence[str], None] = '7937209f9718'
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
"""Upgrade schema - Create only new A76 tables."""
|
|
|
|
# Create new A76 tables only (skip existing tenants, licenses, license_usage)
|
|
op.create_table('client_provider',
|
|
sa.Column('client_id', sa.String(length=8), nullable=False),
|
|
sa.Column('type_nat_foreign', sa.String(length=1), nullable=True),
|
|
sa.Column('name', sa.String(length=256), nullable=True),
|
|
sa.Column('short_name', sa.String(length=10), nullable=True),
|
|
sa.Column('rfc', sa.String(length=30), nullable=True),
|
|
sa.Column('curp', sa.String(length=19), nullable=True),
|
|
sa.Column('client_or_provider', sa.String(length=1), nullable=True),
|
|
sa.Column('linking', sa.String(length=1), nullable=True),
|
|
sa.Column('transform_subassembly', sa.String(length=1), nullable=True),
|
|
sa.Column('extra_information', sa.String(length=399), nullable=True),
|
|
sa.Column('web_key', sa.String(length=40), nullable=True),
|
|
sa.Column('responsible', sa.String(length=80), nullable=True),
|
|
sa.Column('position', sa.String(length=30), nullable=True),
|
|
sa.Column('incoterm', sa.String(length=19), nullable=True),
|
|
sa.Column('is_national_provider', sa.String(length=2), nullable=True),
|
|
sa.Column('enabled_disabled', sa.SmallInteger(), nullable=True),
|
|
sa.PrimaryKeyConstraint('client_id'),
|
|
schema='a76'
|
|
)
|
|
|
|
op.create_table('gcompany',
|
|
sa.Column('id', sa.String(length=3), nullable=False),
|
|
sa.Column('consecutive', sa.Boolean(), nullable=False),
|
|
sa.Column('name', sa.String(length=255), nullable=True),
|
|
sa.Column('rfc', sa.String(length=30), nullable=True),
|
|
sa.Column('main_activity', sa.String(length=255), nullable=True),
|
|
sa.Column('program', sa.String(length=10), nullable=True),
|
|
sa.Column('program_number', sa.String(length=40), nullable=True),
|
|
sa.Column('prosec', sa.SmallInteger(), nullable=True),
|
|
sa.Column('prosec_authorization', sa.String(length=20), nullable=True),
|
|
sa.Column('manufacturer_id', sa.String(length=25), nullable=True),
|
|
sa.Column('broker_company', sa.String(length=10), nullable=True),
|
|
sa.Column('responsible', sa.String(length=80), nullable=True),
|
|
sa.Column('responsible_name', sa.String(length=20), nullable=True),
|
|
sa.Column('responsible_last_name', sa.String(length=20), nullable=True),
|
|
sa.Column('responsible_mother_last_name', sa.String(length=20), nullable=True),
|
|
sa.Column('responsible_rfc', sa.String(length=30), nullable=True),
|
|
sa.Column('position', sa.String(length=30), nullable=True),
|
|
sa.Column('logo', sa.String(length=255), nullable=True),
|
|
sa.Column('has_express_line', sa.Boolean(), nullable=True),
|
|
sa.Column('order_format_type', sa.String(length=19), nullable=True),
|
|
sa.Column('previous_code', sa.SmallInteger(), nullable=True),
|
|
sa.Column('is_service_company', sa.Boolean(), nullable=True),
|
|
sa.Column('client_name', sa.String(length=300), nullable=True),
|
|
sa.Column('subassembly_mode', sa.String(length=7), nullable=True),
|
|
sa.Column('curp', sa.String(length=19), nullable=True),
|
|
sa.Column('inter_db_name', sa.String(length=100), nullable=True),
|
|
sa.Column('ctpat_svi', sa.String(length=100), nullable=True),
|
|
sa.Column('trusted_exporter_number', sa.String(length=50), nullable=True),
|
|
sa.Column('prevalidator_key', sa.String(length=20), nullable=True),
|
|
sa.Column('seventh_amendment', sa.Boolean(), nullable=True),
|
|
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True),
|
|
sa.PrimaryKeyConstraint('id'),
|
|
sa.UniqueConstraint('consecutive'),
|
|
schema='a76'
|
|
)
|
|
|
|
op.create_table('classes',
|
|
sa.Column('client_key', sa.Integer(), nullable=False),
|
|
sa.Column('class_code', sa.String(length=8), nullable=False),
|
|
sa.Column('description_spanish', sa.String(length=500), nullable=True),
|
|
sa.Column('description_english', sa.String(length=500), nullable=True),
|
|
sa.Column('material_key', sa.String(length=10), nullable=True),
|
|
sa.Column('unit_of_measure', sa.String(length=5), nullable=True),
|
|
sa.Column('fraction', sa.String(length=10), nullable=True),
|
|
sa.Column('us_fraction', sa.String(length=16), nullable=True),
|
|
sa.Column('sub_key', sa.String(length=5), nullable=True),
|
|
sa.Column('physical_review', sa.SmallInteger(), nullable=True),
|
|
sa.Column('iva_exempt_fraction', sa.String(length=4), nullable=True),
|
|
sa.ForeignKeyConstraint(['material_key'], ['public.material_types.key'], ),
|
|
sa.PrimaryKeyConstraint('client_key', 'class_code'),
|
|
schema='a76'
|
|
)
|
|
|
|
op.create_table('parts',
|
|
sa.Column('client_key', sa.Integer(), nullable=False),
|
|
sa.Column('part_number', sa.String(length=49), nullable=False),
|
|
sa.Column('fraction', sa.String(length=10), nullable=True),
|
|
sa.Column('description_spanish', sa.String(length=500), nullable=True),
|
|
sa.Column('description_english', sa.String(length=500), nullable=True),
|
|
sa.Column('part_class', sa.String(length=8), nullable=True),
|
|
sa.Column('unit_of_measure', sa.String(length=5), nullable=True),
|
|
sa.Column('commercial_part_number', sa.String(length=70), nullable=True),
|
|
sa.Column('country_of_origin', sa.String(length=3), nullable=True),
|
|
sa.Column('unit_cost', sa.Numeric(precision=23, scale=8), nullable=True),
|
|
sa.Column('currency_type', sa.String(length=2), nullable=True),
|
|
sa.Column('currency_key', sa.String(length=3), nullable=True),
|
|
sa.Column('unit_weight', sa.Numeric(precision=19, scale=8), nullable=True),
|
|
sa.Column('weight_type', sa.String(length=6), nullable=True),
|
|
sa.Column('us_fraction', sa.String(length=16), nullable=True),
|
|
sa.Column('fda_key', sa.String(length=20), nullable=True),
|
|
sa.Column('fcc_key', sa.String(length=30), nullable=True),
|
|
sa.Column('license_code', sa.String(length=3), nullable=True),
|
|
sa.Column('eccn', sa.String(length=20), nullable=True),
|
|
sa.Column('export_code', sa.String(length=2), nullable=True),
|
|
sa.Column('exclusion_symbol', sa.String(length=19), nullable=True),
|
|
sa.Column('supplier', sa.String(length=14), nullable=True),
|
|
sa.Column('alternate_unit_measure', sa.String(length=14), nullable=True),
|
|
sa.Column('added_value', sa.Numeric(precision=23, scale=8), nullable=True),
|
|
sa.Column('enabled_disabled', sa.SmallInteger(), nullable=True),
|
|
sa.Column('creation_date', sa.Integer(), nullable=True),
|
|
sa.Column('modification_date', sa.Integer(), nullable=True),
|
|
sa.Column('modification_date_iso', sa.DateTime(timezone=True), nullable=True),
|
|
sa.Column('part_photo', sa.String(length=255), nullable=True),
|
|
sa.ForeignKeyConstraint(['country_of_origin'], ['public.countries.m3_key'], ),
|
|
sa.ForeignKeyConstraint(['currency_key'], ['public.currency_types.code'], ),
|
|
sa.PrimaryKeyConstraint('client_key', 'part_number'),
|
|
schema='a76'
|
|
)
|
|
|
|
# Create dependent tables after main tables
|
|
op.create_table('gclient_provider_address',
|
|
sa.Column('client_id', sa.String(length=8), nullable=False),
|
|
sa.Column('municipality', sa.String(length=150), nullable=True),
|
|
sa.Column('streets', sa.String(length=100), nullable=True),
|
|
sa.Column('neighborhood', sa.String(length=40), nullable=True),
|
|
sa.Column('interior_number', sa.String(length=20), nullable=True),
|
|
sa.Column('exterior_number', sa.String(length=20), nullable=True),
|
|
sa.Column('postal_code', sa.String(length=15), nullable=True),
|
|
sa.Column('city', sa.String(length=30), nullable=True),
|
|
sa.Column('state', sa.String(length=30), nullable=True),
|
|
sa.Column('country', sa.String(length=3), nullable=True),
|
|
sa.Column('phone', sa.String(length=30), nullable=True),
|
|
sa.Column('fax_number', sa.String(length=30), nullable=True),
|
|
sa.Column('email', sa.String(length=100), nullable=True),
|
|
sa.Column('contact', sa.String(length=50), nullable=True),
|
|
sa.Column('reference', sa.String(length=250), nullable=True),
|
|
sa.ForeignKeyConstraint(['client_id'], ['a76.client_provider.client_id'], ondelete='CASCADE'),
|
|
sa.PrimaryKeyConstraint('client_id'),
|
|
schema='a76'
|
|
)
|
|
|
|
op.create_table('gclient_provider_programs',
|
|
sa.Column('client_id', sa.String(length=8), nullable=False),
|
|
sa.Column('program', sa.String(length=7), nullable=True),
|
|
sa.Column('program_number', sa.String(length=40), nullable=True),
|
|
sa.Column('prosec', sa.SmallInteger(), nullable=True),
|
|
sa.Column('prosec_authorization', sa.String(length=20), nullable=True),
|
|
sa.Column('secon_auth_date', sa.Integer(), nullable=True),
|
|
sa.Column('manufacturer_id', sa.String(length=25), nullable=True),
|
|
sa.Column('tax_id', sa.String(length=30), nullable=True),
|
|
sa.Column('broker', sa.String(length=6), nullable=True),
|
|
sa.Column('import_broker', sa.String(length=6), nullable=True),
|
|
sa.Column('transfer_key', sa.String(length=8), nullable=True),
|
|
sa.Column('secon_authorization', sa.String(length=20), nullable=True),
|
|
sa.Column('applied_proportion', sa.Numeric(precision=7, scale=2), nullable=True),
|
|
sa.Column('is_certified_company', sa.String(length=1), nullable=True),
|
|
sa.Column('certified_company_registry', sa.String(length=40), nullable=True),
|
|
sa.Column('donation_auth_number', sa.String(length=50), nullable=True),
|
|
sa.Column('ctpat_svi', sa.String(length=100), nullable=True),
|
|
sa.Column('tax_registry_number', sa.String(length=40), nullable=True),
|
|
sa.Column('subassembly_service', sa.SmallInteger(), nullable=True),
|
|
sa.Column('autse_dates', sa.Integer(), nullable=True),
|
|
sa.Column('autse_number', sa.String(length=300), nullable=True),
|
|
sa.ForeignKeyConstraint(['client_id'], ['a76.client_provider.client_id'], ondelete='CASCADE'),
|
|
sa.PrimaryKeyConstraint('client_id'),
|
|
schema='a76'
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
"""Downgrade schema - Drop only new A76 tables."""
|
|
# Drop tables in reverse dependency order
|
|
op.drop_table('gclient_provider_programs', schema='a76')
|
|
op.drop_table('gclient_provider_address', schema='a76')
|
|
op.drop_table('parts', schema='a76')
|
|
op.drop_table('classes', schema='a76')
|
|
op.drop_table('gcompany', schema='a76')
|
|
op.drop_table('client_provider', schema='a76') |