From 38d10e6f5146e7420f58e6a04b25f53e79f6db66 Mon Sep 17 00:00:00 2001 From: hreyes Date: Fri, 24 Apr 2026 09:18:41 -0600 Subject: [PATCH] feature/carril-expres-transportes --- ...d9e0f1a2b3_transporter_has_express_line.py | 49 +++++++++++++++++++ .../a76/general_catalogs/company/dto.py | 2 - .../a76/general_catalogs/company/models.py | 1 - .../a76/general_catalogs/company/service.py | 2 +- .../transmission/MAINX30/service.py | 2 +- .../definitive/MAINX30/service.py | 2 +- .../transmission/temporal/MAINX30/service.py | 2 +- .../a76/transportation/transporters/dto.py | 1 + .../a76/transportation/transporters/models.py | 3 +- .../transportation/transporters/services.py | 1 + .../dashboard/a76/general_catalogs/company.ts | 2 - .../src/lib/api/dashboard/a76/transporters.ts | 1 + .../company/create-edit-dialog.svelte | 9 +--- .../transporters/create-edit-dialog.svelte | 14 ++++-- .../edit/[[id]]/+page.svelte | 14 ------ 15 files changed, 70 insertions(+), 35 deletions(-) create mode 100644 backend/alembic/versions/c8d9e0f1a2b3_transporter_has_express_line.py diff --git a/backend/alembic/versions/c8d9e0f1a2b3_transporter_has_express_line.py b/backend/alembic/versions/c8d9e0f1a2b3_transporter_has_express_line.py new file mode 100644 index 00000000..2d424d31 --- /dev/null +++ b/backend/alembic/versions/c8d9e0f1a2b3_transporter_has_express_line.py @@ -0,0 +1,49 @@ +"""Add has_express_line to transporter; remove from company. + +Revision ID: c8d9e0f1a2b3 +Revises: 6a7b8c9d0e1f +Create Date: 2026-04-24 + +Upgrade: add transporter column first (NOT NULL + default), then drop company column. +Downgrade: restore company column, drop transporter column (schema only; data not restored). +""" + +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op + +revision: str = "c8d9e0f1a2b3" +down_revision: Union[str, Sequence[str], None] = "6a7b8c9d0e1f" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + +SCHEMA = "a76" + + +def upgrade() -> None: + op.add_column( + "transporter", + sa.Column( + "has_express_line", + sa.Boolean(), + server_default=sa.text("false"), + nullable=False, + ), + schema=SCHEMA, + ) + op.drop_column("company", "has_express_line", schema=SCHEMA) + + +def downgrade() -> None: + op.add_column( + "company", + sa.Column( + "has_express_line", + sa.Boolean(), + server_default=sa.text("false"), + nullable=True, + ), + schema=SCHEMA, + ) + op.drop_column("transporter", "has_express_line", schema=SCHEMA) diff --git a/backend/api/v1/modules/a76/general_catalogs/company/dto.py b/backend/api/v1/modules/a76/general_catalogs/company/dto.py index d9153034..97421872 100644 --- a/backend/api/v1/modules/a76/general_catalogs/company/dto.py +++ b/backend/api/v1/modules/a76/general_catalogs/company/dto.py @@ -58,7 +58,6 @@ class CompanyCreateDTO(BaseModel): # Configuration logo: Optional[str] = Field(None, max_length=512, description="Company logo (path local o clave S3)") - has_express_line: Optional[bool] = Field(None, description="Has express line") order_format_type: Optional[str] = Field( None, max_length=19, description="Order format type" ) @@ -293,7 +292,6 @@ class CompanyResponseDTO(BaseModel): # Configuration logo: Optional[str] = None - has_express_line: Optional[bool] = None fiscal_deposit: Optional[bool] = None generate_barcodes_with_fiel: Optional[bool] = None order_format_type: Optional[str] = None diff --git a/backend/api/v1/modules/a76/general_catalogs/company/models.py b/backend/api/v1/modules/a76/general_catalogs/company/models.py index ef914264..90c41010 100644 --- a/backend/api/v1/modules/a76/general_catalogs/company/models.py +++ b/backend/api/v1/modules/a76/general_catalogs/company/models.py @@ -61,7 +61,6 @@ class Company(Base, TimestampMixin): # Configuración básica logo: Mapped[Optional[str]] = mapped_column(String(512)) - has_express_line: Mapped[Optional[bool]] = mapped_column(Boolean, default=False, server_default="false") fiscal_deposit: Mapped[Optional[bool]] = mapped_column(Boolean, default=False, server_default="false") generate_barcodes_with_fiel: Mapped[Optional[bool]] = mapped_column(Boolean, default=False, server_default="false") order_format_type: Mapped[Optional[str]] = mapped_column(String(19)) diff --git a/backend/api/v1/modules/a76/general_catalogs/company/service.py b/backend/api/v1/modules/a76/general_catalogs/company/service.py index 1432a7be..962292d8 100644 --- a/backend/api/v1/modules/a76/general_catalogs/company/service.py +++ b/backend/api/v1/modules/a76/general_catalogs/company/service.py @@ -119,7 +119,7 @@ class CompanyService: "prosec", "prosec_authorization", "sector1", "sector2", "sector3", "manufacturer_id", "broker_company", "responsible", "responsible_name", "responsible_last_name", "responsible_mother_last_name", "responsible_rfc", - "position", "logo", "has_express_line", "fiscal_deposit", + "position", "logo", "fiscal_deposit", "generate_barcodes_with_fiel", "order_format_type", "is_service_company", "client_name", "subassembly_mode", "previous_code", "active_labels", "active_fractions", "activate_caat", "trans_interface", diff --git a/backend/api/v1/modules/a76/reports/exportacion/transmission/MAINX30/service.py b/backend/api/v1/modules/a76/reports/exportacion/transmission/MAINX30/service.py index ffe01710..e48363fe 100644 --- a/backend/api/v1/modules/a76/reports/exportacion/transmission/MAINX30/service.py +++ b/backend/api/v1/modules/a76/reports/exportacion/transmission/MAINX30/service.py @@ -277,7 +277,7 @@ class Mainx30Service: broker=(empresa.broker_company or "")[:5], responsable=(empresa.responsible or "")[:30], rfc=(empresa.rfc or "")[:13], - tiene_linea_express=empresa.has_express_line or "N", + tiene_linea_express="N", nombre_empresa=(empresa.name or "")[:40], manufacturer_id=(empresa.manufacturer_id or "")[:10], ftp_key=(empresa.ftp_key or "")[:10] diff --git a/backend/api/v1/modules/a76/reports/importacion/transmission/definitive/MAINX30/service.py b/backend/api/v1/modules/a76/reports/importacion/transmission/definitive/MAINX30/service.py index 634058ee..881406b3 100644 --- a/backend/api/v1/modules/a76/reports/importacion/transmission/definitive/MAINX30/service.py +++ b/backend/api/v1/modules/a76/reports/importacion/transmission/definitive/MAINX30/service.py @@ -166,7 +166,7 @@ class Mainx30DefinitiveService: broker=(empresa.broker_company or "")[:5], responsable=(empresa.responsible or "")[:30], rfc=(empresa.rfc or "")[:13], - tiene_linea_express=empresa.has_express_line or "N", + tiene_linea_express="N", nombre_empresa=(empresa.name or "")[:40], manufacturer_id=(empresa.manufacturer_id or "")[:10], ftp_key=(empresa.ftp_key or "")[:10], diff --git a/backend/api/v1/modules/a76/reports/importacion/transmission/temporal/MAINX30/service.py b/backend/api/v1/modules/a76/reports/importacion/transmission/temporal/MAINX30/service.py index 78dadbc6..276182bd 100644 --- a/backend/api/v1/modules/a76/reports/importacion/transmission/temporal/MAINX30/service.py +++ b/backend/api/v1/modules/a76/reports/importacion/transmission/temporal/MAINX30/service.py @@ -168,7 +168,7 @@ class Mainx30Service: broker=(empresa.broker_company or "")[:5], responsable=(empresa.responsible or "")[:30], rfc=(empresa.rfc or "")[:13], - tiene_linea_express=empresa.has_express_line or "N", + tiene_linea_express="N", nombre_empresa=(empresa.name or "")[:40], manufacturer_id=(empresa.manufacturer_id or "")[:10], ftp_key=(empresa.ftp_key or "")[:10], diff --git a/backend/api/v1/modules/a76/transportation/transporters/dto.py b/backend/api/v1/modules/a76/transportation/transporters/dto.py index c4397d00..969fed6e 100644 --- a/backend/api/v1/modules/a76/transportation/transporters/dto.py +++ b/backend/api/v1/modules/a76/transportation/transporters/dto.py @@ -24,6 +24,7 @@ class TransporterBaseDTO(BaseModel): ftp_password: Optional[str] = None ftp_directory: Optional[str] = None filler_code: Optional[str] = None + has_express_line: Optional[bool] = False class TransporterCreateDTO(TransporterBaseDTO): diff --git a/backend/api/v1/modules/a76/transportation/transporters/models.py b/backend/api/v1/modules/a76/transportation/transporters/models.py index 58d03367..ec50d643 100644 --- a/backend/api/v1/modules/a76/transportation/transporters/models.py +++ b/backend/api/v1/modules/a76/transportation/transporters/models.py @@ -1,6 +1,6 @@ from api.v1.common.base_models import TenantScopedMixin, TimestampMixin from core.database import Base -from sqlalchemy import BigInteger, Column, ForeignKeyConstraint, String +from sqlalchemy import BigInteger, Boolean, Column, ForeignKeyConstraint, String class Transporter(Base, TenantScopedMixin, TimestampMixin): @@ -30,3 +30,4 @@ class Transporter(Base, TenantScopedMixin, TimestampMixin): ftp_password = Column(String(100), nullable=True) ftp_directory = Column(String(1000), nullable=True) filler_code = Column(String(20), nullable=True) + has_express_line = Column(Boolean, nullable=False, server_default="false") diff --git a/backend/api/v1/modules/a76/transportation/transporters/services.py b/backend/api/v1/modules/a76/transportation/transporters/services.py index 2654677e..8f40888d 100644 --- a/backend/api/v1/modules/a76/transportation/transporters/services.py +++ b/backend/api/v1/modules/a76/transportation/transporters/services.py @@ -159,6 +159,7 @@ class TransporterService: "ftp_password": transporter.ftp_password, "ftp_directory": transporter.ftp_directory, "filler_code": transporter.filler_code, + "has_express_line": transporter.has_express_line, } merged.update(update_data) validate_transporter_row_for_api( diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/company.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/company.ts index 73228d75..7934463e 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/company.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/company.ts @@ -107,7 +107,6 @@ export interface Company { responsible_mother_last_name: string | null; responsible_rfc?: string | null; position?: string | null; - has_express_line?: boolean; fiscal_deposit?: boolean; generate_barcodes_with_fiel?: boolean; is_service_company?: boolean; @@ -273,7 +272,6 @@ export interface CompanyCreate { responsible_mother_last_name?: string | null; responsible_rfc?: string | null; position?: string | null; - has_express_line?: boolean; fiscal_deposit?: boolean; generate_barcodes_with_fiel?: boolean; is_service_company?: boolean; diff --git a/frontend/src/lib/api/dashboard/a76/transporters.ts b/frontend/src/lib/api/dashboard/a76/transporters.ts index da855ae0..0ff1084f 100644 --- a/frontend/src/lib/api/dashboard/a76/transporters.ts +++ b/frontend/src/lib/api/dashboard/a76/transporters.ts @@ -21,6 +21,7 @@ export interface Transporter { ftp_password?: string; ftp_directory?: string; filler_code?: string; + has_express_line?: boolean; company_id?: number | string; tenant_id?: number | string; } diff --git a/frontend/src/lib/components/dashboard/general_catalogs/company/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/company/create-edit-dialog.svelte index 2cc43f4a..8a37a99c 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/company/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/company/create-edit-dialog.svelte @@ -43,7 +43,6 @@ // Configuración / Operativo manufacturer_id: '', - has_express_line: false, is_service_company: false, order_format_type: '', @@ -76,7 +75,6 @@ position: item.position || '', manufacturer_id: item.manufacturer_id || '', - has_express_line: item.has_express_line || false, is_service_company: item.is_service_company || false, order_format_type: item.order_format_type || '', @@ -89,7 +87,7 @@ name: '', rfc: '', curp: '', main_activity: '', program: '', program_number: '', prosec: 0, prosec_authorization: '', responsible_name: '', responsible_last_name: '', responsible_mother_last_name: '', responsible_rfc: '', position: '', - manufacturer_id: '', has_express_line: false, is_service_company: false, order_format_type: '', + manufacturer_id: '', is_service_company: false, order_format_type: '', ctpat_svi: '', trusted_exporter_number: '' }; } @@ -124,7 +122,6 @@ position: formData.position.trim() || null, manufacturer_id: formData.manufacturer_id.trim() || null, - has_express_line: formData.has_express_line, is_service_company: formData.is_service_company, order_format_type: formData.order_format_type.trim() || null, @@ -249,10 +246,6 @@
-
- - -
diff --git a/frontend/src/lib/components/dashboard/transportation/transporters/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/transportation/transporters/create-edit-dialog.svelte index 81d953b1..6d05d2ba 100644 --- a/frontend/src/lib/components/dashboard/transportation/transporters/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/transportation/transporters/create-edit-dialog.svelte @@ -3,6 +3,7 @@ import * as Dialog from '$lib/components/ui/dialog'; import { Input } from '$lib/components/ui/input'; import { Label } from '$lib/components/ui/label'; + import { Switch } from '$lib/components/ui/switch'; import * as Select from '$lib/components/ui/select'; import { transportersApi, type Transporter } from '$lib/api/dashboard/a76/transporters'; import { countriesApi, type Country } from '$lib/api/dashboard/reference_data/countries'; @@ -45,7 +46,8 @@ ftp_user: '', ftp_password: '', ftp_directory: '', - filler_code: '' + filler_code: '', + has_express_line: false }); let loading = $state(false); @@ -99,7 +101,8 @@ ftp_user: '', ftp_password: '', ftp_directory: '', - filler_code: '' + filler_code: '', + has_express_line: false }; } @@ -110,7 +113,7 @@ return; } if (item) { - formData = { ...item }; + formData = { ...item, has_express_line: item.has_express_line ?? false }; } else { formData = emptyTransporterForm(); } @@ -284,6 +287,11 @@
+ +
+ + +
diff --git a/frontend/src/routes/dashboard/general_catalogs/company_information/edit/[[id]]/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/company_information/edit/[[id]]/+page.svelte index 50a17ed4..5324812d 100644 --- a/frontend/src/routes/dashboard/general_catalogs/company_information/edit/[[id]]/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/company_information/edit/[[id]]/+page.svelte @@ -86,7 +86,6 @@ responsible_rfc: '', position: '', manufacturer_id: '', - has_express_line: false, fiscal_deposit: false, generate_barcodes_with_fiel: false, is_service_company: false, @@ -258,7 +257,6 @@ responsible_rfc: item.responsible_rfc || '', position: item.position || '', manufacturer_id: item.manufacturer_id || '', - has_express_line: item.has_express_line || false, fiscal_deposit: item.fiscal_deposit || false, generate_barcodes_with_fiel: item.generate_barcodes_with_fiel || false, is_service_company: item.is_service_company || false, @@ -694,7 +692,6 @@ cancel_cer_exp: Number(formData.cancel_cer_exp) || 0, cancel_key_exp: Number(formData.cancel_key_exp) || 0, // Ensure optional booleans are passed correctly or default to false/null if needed - has_express_line: formData.has_express_line, fiscal_deposit: formData.fiscal_deposit, generate_barcodes_with_fiel: formData.generate_barcodes_with_fiel, is_service_company: formData.is_service_company @@ -937,17 +934,6 @@ />
-
-
- -
-