diff --git a/backend/alembic/versions/e7f8a9b0c1d2_widen_address_country.py b/backend/alembic/versions/e7f8a9b0c1d2_widen_address_country.py new file mode 100644 index 0000000..ed3744f --- /dev/null +++ b/backend/alembic/versions/e7f8a9b0c1d2_widen_address_country.py @@ -0,0 +1,44 @@ +"""ampliar crm.addresses.country a 3 (país ISO alfa-3 del catálogo) + +Revision ID: e7f8a9b0c1d2 +Revises: e6f7a8b9c0d1 +Create Date: 2026-07-22 00:30:00.000000 + +El catálogo de País usa códigos ISO 3166 alfa-3 (MEX, USA, …). La columna +addresses.country era String(2); se amplía a String(3) para almacenarlos. +""" +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op + +revision: str = "e7f8a9b0c1d2" +down_revision: Union[str, None] = "e6f7a8b9c0d1" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + +SCHEMA = "crm" + + +def upgrade() -> None: + op.alter_column( + "addresses", "country", + type_=sa.String(length=3), + existing_type=sa.String(length=2), + existing_nullable=True, + server_default=sa.text("'MEX'"), + schema=SCHEMA, + ) + + +def downgrade() -> None: + # Trunca a 2 chars por si hay códigos alfa-3 guardados (rollback de dev). + op.execute("UPDATE crm.addresses SET country = left(country, 2) WHERE length(country) > 2") + op.alter_column( + "addresses", "country", + type_=sa.String(length=2), + existing_type=sa.String(length=3), + existing_nullable=True, + server_default=sa.text("'MX'"), + schema=SCHEMA, + ) diff --git a/backend/api/v1/modules/crm/addresses/models.py b/backend/api/v1/modules/crm/addresses/models.py index 9cf7537..ab41fc1 100644 --- a/backend/api/v1/modules/crm/addresses/models.py +++ b/backend/api/v1/modules/crm/addresses/models.py @@ -29,7 +29,8 @@ class Address(Base, TenantScopedMixin, TimestampMixin): neighborhood: Mapped[str | None] = mapped_column(String(120), nullable=True) # colonia postal_code: Mapped[str | None] = mapped_column(String(10), nullable=True) # código postal city: Mapped[str | None] = mapped_column(String(120), nullable=True) # municipio - state: Mapped[str | None] = mapped_column(String(120), nullable=True) # estado - country: Mapped[str | None] = mapped_column(String(2), nullable=True, server_default=text("'MX'")) + state: Mapped[str | None] = mapped_column(String(120), nullable=True) # estado (código catálogo) + # País como código ISO 3166 alfa-3 del catálogo (p. ej. MEX). Ampliado de 2→3. + country: Mapped[str | None] = mapped_column(String(3), nullable=True, server_default=text("'MEX'")) reference_notes: Mapped[str | None] = mapped_column(Text, nullable=True) # referencias is_primary: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default=text("false")) diff --git a/backend/api/v1/modules/crm/catalogs/seed_data.py b/backend/api/v1/modules/crm/catalogs/seed_data.py index 3ed8fd6..05615b9 100644 --- a/backend/api/v1/modules/crm/catalogs/seed_data.py +++ b/backend/api/v1/modules/crm/catalogs/seed_data.py @@ -1,2129 +1,561 @@ """Datos semilla de los catálogos de referencia del CRM (T2026-07-081/082). -Generado a partir de CATALOGOS CRM.xlsx (SAT/ISO) + catálogos estándar. Los -catálogos globales (Aduanasoft) se siembran con tenant_id NULL. Los catálogos -"cliente" (servicio/puerto/aeropuerto/aduana) los llena cada tenant desde la -pantalla de administración; aquí solo se declara su metadata (labels). +Generado de CATALOGOS CRM.xlsx (SAT/ISO) + catálogos estándar. Globales +(Aduanasoft) se siembran con tenant_id NULL; los catálogos "cliente" los llena +cada tenant desde la administración (aquí solo su metadata). """ -GLOBAL_CATALOGS = { - "tipo_registro": { - "label": "Tipo de registro", - "is_system": true, - "items": [ - { - "code": "cliente", - "label": "Cliente" - }, - { - "code": "prospecto", - "label": "Prospecto" - } - ] - }, - "tipo_persona": { - "label": "Tipo de persona", - "is_system": true, - "items": [ - { - "code": "fisica", - "label": "Persona física" - }, - { - "code": "moral", - "label": "Persona moral" - } - ] - }, - "estatus": { - "label": "Estatus", - "is_system": true, - "items": [ - { - "code": "active", - "label": "Activo" - }, - { - "code": "inactive", - "label": "Inactivo" - } - ] - }, - "giro": { - "label": "Giro o industria", - "is_system": false, - "items": [ - { - "code": "importadora", - "label": "Importadora" - }, - { - "code": "exportadora", - "label": "Exportadora" - }, - { - "code": "manufactura", - "label": "Manufactura" - }, - { - "code": "comercializadora", - "label": "Comercializadora" - }, - { - "code": "logistica", - "label": "Logística y transporte" - }, - { - "code": "agencia_aduanal", - "label": "Agencia aduanal" - }, - { - "code": "maquiladora", - "label": "Maquiladora / IMMEX" - }, - { - "code": "servicios", - "label": "Servicios" - }, - { - "code": "otro", - "label": "Otro" - } - ] - }, - "clasificacion_cliente": { - "label": "Clasificación del cliente", - "is_system": false, - "items": [ - { - "code": "importador", - "label": "Importador" - }, - { - "code": "exportador", - "label": "Exportador" - }, - { - "code": "importador_exportador", - "label": "Importador/Exportador" - } - ] - }, - "medio_contacto": { - "label": "Medio de contacto preferido", - "is_system": false, - "items": [ - { - "code": "llamada", - "label": "Llamada telefónica" - }, - { - "code": "correo", - "label": "Correo electrónico" - }, - { - "code": "videoconferencia", - "label": "Videoconferencia" - }, - { - "code": "whatsapp", - "label": "WhatsApp" - }, - { - "code": "otro", - "label": "Otro" - } - ] - }, - "idioma": { - "label": "Idioma", - "is_system": false, - "items": [ - { - "code": "es", - "label": "Español" - }, - { - "code": "en", - "label": "Inglés" - }, - { - "code": "zh", - "label": "Chino (mandarín)" - }, - { - "code": "pt", - "label": "Portugués" - }, - { - "code": "fr", - "label": "Francés" - }, - { - "code": "de", - "label": "Alemán" - }, - { - "code": "ja", - "label": "Japonés" - }, - { - "code": "ko", - "label": "Coreano" - }, - { - "code": "it", - "label": "Italiano" - }, - { - "code": "otro", - "label": "Otro" - } - ] - }, - "regimen_fiscal": { - "label": "Régimen fiscal", - "is_system": false, - "items": [ - { - "code": "fisica", - "label": "Persona física" - }, - { - "code": "moral", - "label": "Persona moral" - } - ] - }, - "uso_cfdi": { - "label": "Uso de CFDI (SAT)", - "is_system": true, - "items": [ - { - "code": "G01", - "label": "Adquisición de mercancías" - }, - { - "code": "G02", - "label": "Devoluciones, descuentos o bonificaciones" - }, - { - "code": "G03", - "label": "Gastos en general" - }, - { - "code": "I01", - "label": "Construcciones" - }, - { - "code": "I02", - "label": "Mobiliario y equipo de oficina por inversiones" - }, - { - "code": "I03", - "label": "Equipo de transporte" - }, - { - "code": "I04", - "label": "Equipo de cómputo y accesorios" - }, - { - "code": "I05", - "label": "Dados, troqueles, moldes, matrices y herramental" - }, - { - "code": "I06", - "label": "Comunicaciones telefónicas" - }, - { - "code": "I07", - "label": "Comunicaciones satelitales" - }, - { - "code": "I08", - "label": "Otra maquinaria y equipo" - }, - { - "code": "D01", - "label": "Honorarios médicos, dentales y gastos hospitalarios" - }, - { - "code": "D02", - "label": "Gastos médicos por incapacidad o discapacidad" - }, - { - "code": "D03", - "label": "Gastos funerales" - }, - { - "code": "D04", - "label": "Donativos" - }, - { - "code": "D05", - "label": "Intereses por créditos hipotecarios" - }, - { - "code": "D06", - "label": "Aportaciones voluntarias al SAR" - }, - { - "code": "D07", - "label": "Primas por seguros de gastos médicos" - }, - { - "code": "D08", - "label": "Gastos de transportación escolar obligatoria" - }, - { - "code": "D09", - "label": "Depósitos en cuentas para el ahorro" - }, - { - "code": "D10", - "label": "Pagos por servicios educativos (colegiaturas)" - }, - { - "code": "S01", - "label": "Sin efectos fiscales" - }, - { - "code": "CP01", - "label": "Pagos" - }, - { - "code": "CN01", - "label": "Nómina" - }, - { - "code": "P01", - "label": "Por definir" - } - ] - }, - "forma_pago": { - "label": "Forma de pago (SAT)", - "is_system": true, - "items": [ - { - "code": "1", - "label": "Efectivo" - }, - { - "code": "2", - "label": "Cheque nominativo" - }, - { - "code": "3", - "label": "Transferencia electrónica de fondos" - }, - { - "code": "4", - "label": "Tarjeta de crédito" - }, - { - "code": "5", - "label": "Monedero electrónico" - }, - { - "code": "6", - "label": "Dinero electrónico" - }, - { - "code": "8", - "label": "Vales de despensa" - }, - { - "code": "12", - "label": "Dación en pago" - }, - { - "code": "13", - "label": "Pago por subrogación" - }, - { - "code": "14", - "label": "Pago por consignación" - }, - { - "code": "15", - "label": "Condonación" - }, - { - "code": "17", - "label": "Compensación" - }, - { - "code": "23", - "label": "Novación" - }, - { - "code": "24", - "label": "Confusión" - }, - { - "code": "25", - "label": "Remisión de deuda" - }, - { - "code": "26", - "label": "Prescripción o caducidad" - }, - { - "code": "27", - "label": "A satisfacción del acreedor" - }, - { - "code": "28", - "label": "Tarjeta de débito" - }, - { - "code": "29", - "label": "Tarjeta de servicios" - }, - { - "code": "30", - "label": "Aplicación de anticipos" - }, - { - "code": "31", - "label": "Intermediario pagos" - }, - { - "code": "99", - "label": "Por definir" - } - ] - }, - "metodo_pago": { - "label": "Método de pago (SAT)", - "is_system": true, - "items": [ - { - "code": "PPD", - "label": "Pago en parcialidades o diferido" - }, - { - "code": "PUE", - "label": "Pago en una sola exhibición" - } - ] - }, - "moneda": { - "label": "Moneda (ISO 4217)", - "is_system": true, - "items": [ - { - "code": "CRC", - "label": "Colón costarricense" - }, - { - "code": "CUC", - "label": "Peso Convertible" - }, - { - "code": "CUP", - "label": "Peso Cubano" - }, - { - "code": "CVE", - "label": "Cabo Verde Escudo" - }, - { - "code": "CZK", - "label": "Corona checa" - }, - { - "code": "DJF", - "label": "Franco de Djibouti" - }, - { - "code": "DKK", - "label": "Corona danesa" - }, - { - "code": "DOP", - "label": "Peso Dominicano" - }, - { - "code": "DZD", - "label": "Dinar argelino" - }, - { - "code": "EGP", - "label": "Libra egipcia" - }, - { - "code": "ERN", - "label": "Nakfa" - }, - { - "code": "ETB", - "label": "Birr etíope" - }, - { - "code": "EUR", - "label": "Euro" - }, - { - "code": "FJD", - "label": "Dólar de Fiji" - }, - { - "code": "FKP", - "label": "Libra malvinense" - }, - { - "code": "GBP", - "label": "Libra Esterlina" - }, - { - "code": "GEL", - "label": "Lari" - }, - { - "code": "GHS", - "label": "Cedi de Ghana" - }, - { - "code": "GIP", - "label": "Libra de Gibraltar" - }, - { - "code": "GMD", - "label": "Dalasi" - }, - { - "code": "GNF", - "label": "Franco guineano" - }, - { - "code": "GTQ", - "label": "Quetzal" - }, - { - "code": "GYD", - "label": "Dólar guyanés" - }, - { - "code": "HKD", - "label": "Dolar De Hong Kong" - }, - { - "code": "HNL", - "label": "Lempira" - }, - { - "code": "HRK", - "label": "Kuna" - }, - { - "code": "HTG", - "label": "Gourde" - }, - { - "code": "HUF", - "label": "Florín" - }, - { - "code": "IDR", - "label": "Rupia" - }, - { - "code": "ILS", - "label": "Nuevo Shekel Israelí" - }, - { - "code": "INR", - "label": "Rupia india" - }, - { - "code": "IQD", - "label": "Dinar iraquí" - }, - { - "code": "IRR", - "label": "Rial iraní" - }, - { - "code": "ISK", - "label": "Corona islandesa" - }, - { - "code": "JMD", - "label": "Dólar Jamaiquino" - }, - { - "code": "JOD", - "label": "Dinar jordano" - }, - { - "code": "JPY", - "label": "Yen" - }, - { - "code": "KES", - "label": "Chelín keniano" - }, - { - "code": "KGS", - "label": "Som" - }, - { - "code": "KHR", - "label": "Riel" - }, - { - "code": "KMF", - "label": "Franco Comoro" - }, - { - "code": "KPW", - "label": "Corea del Norte ganó" - }, - { - "code": "KRW", - "label": "Won" - }, - { - "code": "KWD", - "label": "Dinar kuwaití" - }, - { - "code": "KYD", - "label": "Dólar de las Islas Caimán" - }, - { - "code": "KZT", - "label": "Tenge" - }, - { - "code": "LAK", - "label": "Kip" - }, - { - "code": "LBP", - "label": "Libra libanesa" - }, - { - "code": "LKR", - "label": "Rupia de Sri Lanka" - }, - { - "code": "LRD", - "label": "Dólar liberiano" - }, - { - "code": "LSL", - "label": "Loti" - }, - { - "code": "LYD", - "label": "Dinar libio" - }, - { - "code": "MAD", - "label": "Dirham marroquí" - }, - { - "code": "MDL", - "label": "Leu moldavo" - }, - { - "code": "MGA", - "label": "Ariary malgache" - }, - { - "code": "MKD", - "label": "Denar" - }, - { - "code": "MMK", - "label": "Kyat" - }, - { - "code": "MNT", - "label": "Tugrik" - }, - { - "code": "MOP", - "label": "Pataca" - }, - { - "code": "MRO", - "label": "Ouguiya" - }, - { - "code": "MUR", - "label": "Rupia de Mauricio" - }, - { - "code": "MVR", - "label": "Rupia" - }, - { - "code": "MWK", - "label": "Kwacha" - }, - { - "code": "MXN", - "label": "Peso Mexicano" - }, - { - "code": "MXV", - "label": "México Unidad de Inversión (UDI)" - }, - { - "code": "MYR", - "label": "Ringgit malayo" - }, - { - "code": "MZN", - "label": "Mozambique Metical" - }, - { - "code": "NAD", - "label": "Dólar de Namibia" - }, - { - "code": "NGN", - "label": "Naira" - }, - { - "code": "NIO", - "label": "Córdoba Oro" - }, - { - "code": "NOK", - "label": "Corona noruega" - }, - { - "code": "NPR", - "label": "Rupia nepalí" - }, - { - "code": "NZD", - "label": "Dólar de Nueva Zelanda" - }, - { - "code": "OMR", - "label": "Rial omaní" - }, - { - "code": "PAB", - "label": "Balboa" - }, - { - "code": "PEN", - "label": "Nuevo Sol" - }, - { - "code": "PGK", - "label": "Kina" - }, - { - "code": "PHP", - "label": "Peso filipino" - }, - { - "code": "PKR", - "label": "Rupia de Pakistán" - }, - { - "code": "PLN", - "label": "Zloty" - }, - { - "code": "PYG", - "label": "Guaraní" - }, - { - "code": "QAR", - "label": "Qatar Rial" - }, - { - "code": "RON", - "label": "Leu rumano" - }, - { - "code": "RSD", - "label": "Dinar serbio" - }, - { - "code": "RUB", - "label": "Rublo ruso" - }, - { - "code": "RWF", - "label": "Franco ruandés" - }, - { - "code": "SAR", - "label": "Riyal saudí" - }, - { - "code": "SBD", - "label": "Dólar de las Islas Salomón" - }, - { - "code": "SCR", - "label": "Rupia de Seychelles" - }, - { - "code": "SDG", - "label": "Libra sudanesa" - }, - { - "code": "SEK", - "label": "Corona sueca" - }, - { - "code": "SGD", - "label": "Dolar De Singapur" - }, - { - "code": "SHP", - "label": "Libra de Santa Helena" - }, - { - "code": "SLL", - "label": "Leona" - }, - { - "code": "SOS", - "label": "Chelín somalí" - }, - { - "code": "SRD", - "label": "Dólar de Suriname" - }, - { - "code": "SSP", - "label": "Libra sudanesa Sur" - }, - { - "code": "STD", - "label": "Dobra" - }, - { - "code": "SVC", - "label": "Colon El Salvador" - }, - { - "code": "SYP", - "label": "Libra Siria" - }, - { - "code": "SZL", - "label": "Lilangeni" - }, - { - "code": "THB", - "label": "Baht" - }, - { - "code": "TJS", - "label": "Somoni" - }, - { - "code": "TMT", - "label": "Turkmenistán nuevo manat" - }, - { - "code": "TND", - "label": "Dinar tunecino" - }, - { - "code": "TOP", - "label": "Pa'anga" - }, - { - "code": "TRY", - "label": "Lira turca" - }, - { - "code": "TTD", - "label": "Dólar de Trinidad y Tobago" - }, - { - "code": "TWD", - "label": "Nuevo dólar de Taiwán" - }, - { - "code": "TZS", - "label": "Shilling tanzano" - }, - { - "code": "UAH", - "label": "Hryvnia" - }, - { - "code": "UGX", - "label": "Shilling de Uganda" - }, - { - "code": "USD", - "label": "Dolar americano" - }, - { - "code": "USN", - "label": "Dólar estadounidense (día siguiente)" - }, - { - "code": "UYI", - "label": "Peso Uruguay en Unidades Indexadas (URUIURUI)" - }, - { - "code": "UYU", - "label": "Peso Uruguayo" - }, - { - "code": "UZS", - "label": "Uzbekistán Sum" - }, - { - "code": "VEF", - "label": "Bolívar" - }, - { - "code": "VND", - "label": "Dong" - }, - { - "code": "VUV", - "label": "Vatu" - }, - { - "code": "WST", - "label": "Tala" - }, - { - "code": "XAF", - "label": "Franco CFA BEAC" - }, - { - "code": "XAG", - "label": "Plata" - }, - { - "code": "XAU", - "label": "Oro" - }, - { - "code": "XBA", - "label": "Unidad de Mercados de Bonos Unidad Europea Composite (EURCO)" - }, - { - "code": "XBB", - "label": "Unidad Monetaria de Bonos de Mercados Unidad Europea (UEM-6)" - }, - { - "code": "XBC", - "label": "Mercados de Bonos Unidad Europea unidad de cuenta a 9 (UCE-9)" - }, - { - "code": "XBD", - "label": "Mercados de Bonos Unidad Europea unidad de cuenta a 17 (UCE-17)" - }, - { - "code": "XCD", - "label": "Dólar del Caribe Oriental" - }, - { - "code": "XDR", - "label": "DEG (Derechos Especiales de Giro)" - }, - { - "code": "XOF", - "label": "Franco CFA BCEAO" - }, - { - "code": "XPD", - "label": "Paladio" - }, - { - "code": "XPF", - "label": "Franco CFP" - }, - { - "code": "XPT", - "label": "Platino" - }, - { - "code": "XSU", - "label": "Sucre" - }, - { - "code": "XTS", - "label": "Códigos reservados específicamente para propósitos de prueba" - }, - { - "code": "XUA", - "label": "Unidad ADB de Cuenta" - }, - { - "code": "XXX", - "label": "Los códigos asignados para las transacciones en que intervenga ninguna moneda" - }, - { - "code": "YER", - "label": "Rial yemení" - }, - { - "code": "ZAR", - "label": "Rand" - }, - { - "code": "ZMW", - "label": "Kwacha zambiano" - }, - { - "code": "ZWL", - "label": "Zimbabwe Dólar" - }, - { - "code": "NULL", - "label": "NULL" - } - ] - }, - "pais": { - "label": "País (ISO 3166)", - "is_system": true, - "items": [ - { - "code": "ABW", - "label": "Aruba" - }, - { - "code": "AFG", - "label": "Afganistán" - }, - { - "code": "AGO", - "label": "Angola" - }, - { - "code": "AIA", - "label": "Anguila" - }, - { - "code": "ALA", - "label": "Islas Åland" - }, - { - "code": "ALB", - "label": "Albania" - }, - { - "code": "AND", - "label": "Andorra" - }, - { - "code": "ARE", - "label": "Emiratos Árabes Unidos (Los)" - }, - { - "code": "ARG", - "label": "Argentina" - }, - { - "code": "ARM", - "label": "Armenia" - }, - { - "code": "ASM", - "label": "Samoa Americana" - }, - { - "code": "ATA", - "label": "Antártida" - }, - { - "code": "ATF", - "label": "Territorios Australes Franceses (los)" - }, - { - "code": "ATG", - "label": "Antigua y Barbuda" - }, - { - "code": "AUS", - "label": "Australia" - }, - { - "code": "AUT", - "label": "Austria" - }, - { - "code": "AZE", - "label": "Azerbaiyán" - }, - { - "code": "BDI", - "label": "Burundi" - }, - { - "code": "BEL", - "label": "Bélgica" - }, - { - "code": "BEN", - "label": "Benín" - }, - { - "code": "BES", - "label": "Bonaire, San Eustaquio y Saba" - }, - { - "code": "BFA", - "label": "Burkina Faso" - }, - { - "code": "BGD", - "label": "Bangladés" - }, - { - "code": "BGR", - "label": "Bulgaria" - }, - { - "code": "BHR", - "label": "Baréin" - }, - { - "code": "BHS", - "label": "Bahamas (las)" - }, - { - "code": "BIH", - "label": "Bosnia y Herzegovina" - }, - { - "code": "BLM", - "label": "San Bartolomé" - }, - { - "code": "BLR", - "label": "Bielorrusia" - }, - { - "code": "BLZ", - "label": "Belice" - }, - { - "code": "BMU", - "label": "Bermudas" - }, - { - "code": "BOL", - "label": "Bolivia, Estado Plurinacional de" - }, - { - "code": "BRA", - "label": "Brasil" - }, - { - "code": "BRB", - "label": "Barbados" - }, - { - "code": "BRN", - "label": "Brunéi Darussalam" - }, - { - "code": "BTN", - "label": "Bután" - }, - { - "code": "BVT", - "label": "Isla Bouvet" - }, - { - "code": "BWA", - "label": "Botsuana" - }, - { - "code": "CAF", - "label": "República Centroafricana (la)" - }, - { - "code": "CAN", - "label": "Canadá" - }, - { - "code": "CCK", - "label": "Islas Cocos (Keeling)" - }, - { - "code": "CHE", - "label": "Suiza" - }, - { - "code": "CHL", - "label": "Chile" - }, - { - "code": "CHN", - "label": "China" - }, - { - "code": "CIV", - "label": "Côte d'Ivoire" - }, - { - "code": "CMR", - "label": "Camerún" - }, - { - "code": "COD", - "label": "Congo (la República Democrática del)" - }, - { - "code": "COG", - "label": "Congo" - }, - { - "code": "COK", - "label": "Islas Cook (las)" - }, - { - "code": "COL", - "label": "Colombia" - }, - { - "code": "COM", - "label": "Comoras" - }, - { - "code": "CPV", - "label": "Cabo Verde" - }, - { - "code": "CRI", - "label": "Costa Rica" - }, - { - "code": "CUB", - "label": "Cuba" - }, - { - "code": "CUW", - "label": "Curaçao" - }, - { - "code": "CXR", - "label": "Isla de Navidad" - }, - { - "code": "CYM", - "label": "Islas Caimán (las)" - }, - { - "code": "CYP", - "label": "Chipre" - }, - { - "code": "CZE", - "label": "República Checa (la)" - }, - { - "code": "DEU", - "label": "Alemania" - }, - { - "code": "DJI", - "label": "Yibuti" - }, - { - "code": "DMA", - "label": "Dominica" - }, - { - "code": "DNK", - "label": "Dinamarca" - }, - { - "code": "DOM", - "label": "República Dominicana (la)" - }, - { - "code": "DZA", - "label": "Argelia" - }, - { - "code": "ECU", - "label": "Ecuador" - }, - { - "code": "EGY", - "label": "Egipto" - }, - { - "code": "ERI", - "label": "Eritrea" - }, - { - "code": "ESH", - "label": "Sahara Occidental" - }, - { - "code": "ESP", - "label": "España" - }, - { - "code": "EST", - "label": "Estonia" - }, - { - "code": "ETH", - "label": "Etiopía" - }, - { - "code": "FIN", - "label": "Finlandia" - }, - { - "code": "FJI", - "label": "Fiyi" - }, - { - "code": "FLK", - "label": "Islas Malvinas [Falkland] (las)" - }, - { - "code": "FRA", - "label": "Francia" - }, - { - "code": "FRO", - "label": "Islas Feroe (las)" - }, - { - "code": "FSM", - "label": "Micronesia (los Estados Federados de)" - }, - { - "code": "GAB", - "label": "Gabón" - }, - { - "code": "GBR", - "label": "Reino Unido (el)" - }, - { - "code": "GEO", - "label": "Georgia" - }, - { - "code": "GGY", - "label": "Guernsey" - }, - { - "code": "GHA", - "label": "Ghana" - }, - { - "code": "GIB", - "label": "Gibraltar" - }, - { - "code": "GIN", - "label": "Guinea" - }, - { - "code": "GLP", - "label": "Guadalupe" - }, - { - "code": "GMB", - "label": "Gambia (La)" - }, - { - "code": "GNB", - "label": "Guinea-Bisáu" - }, - { - "code": "GNQ", - "label": "Guinea Ecuatorial" - }, - { - "code": "GRC", - "label": "Grecia" - }, - { - "code": "GRD", - "label": "Granada" - }, - { - "code": "GRL", - "label": "Groenlandia" - }, - { - "code": "GTM", - "label": "Guatemala" - }, - { - "code": "GUF", - "label": "Guayana Francesa" - }, - { - "code": "GUM", - "label": "Guam" - }, - { - "code": "GUY", - "label": "Guyana" - }, - { - "code": "HKG", - "label": "Hong Kong" - }, - { - "code": "HMD", - "label": "Isla Heard e Islas McDonald" - }, - { - "code": "HND", - "label": "Honduras" - }, - { - "code": "HRV", - "label": "Croacia" - }, - { - "code": "HTI", - "label": "Haití" - }, - { - "code": "HUN", - "label": "Hungría" - }, - { - "code": "IDN", - "label": "Indonesia" - }, - { - "code": "IMN", - "label": "Isla de Man" - }, - { - "code": "IND", - "label": "India" - }, - { - "code": "IOT", - "label": "Territorio Británico del Océano Índico (el)" - }, - { - "code": "IRL", - "label": "Irlanda" - }, - { - "code": "IRN", - "label": "Irán (la República Islámica de)" - }, - { - "code": "IRQ", - "label": "Irak" - }, - { - "code": "ISL", - "label": "Islandia" - }, - { - "code": "ISR", - "label": "Israel" - }, - { - "code": "ITA", - "label": "Italia" - }, - { - "code": "JAM", - "label": "Jamaica" - }, - { - "code": "JEY", - "label": "Jersey" - }, - { - "code": "JOR", - "label": "Jordania" - }, - { - "code": "JPN", - "label": "Japón" - }, - { - "code": "KAZ", - "label": "Kazajistán" - }, - { - "code": "KEN", - "label": "Kenia" - }, - { - "code": "KGZ", - "label": "Kirguistán" - }, - { - "code": "KHM", - "label": "Camboya" - }, - { - "code": "KIR", - "label": "Kiribati" - }, - { - "code": "KNA", - "label": "San Cristóbal y Nieves" - }, - { - "code": "KOR", - "label": "Corea (la República de)" - }, - { - "code": "KWT", - "label": "Kuwait" - }, - { - "code": "LAO", - "label": "Lao, (la) República Democrática Popular" - }, - { - "code": "LBN", - "label": "Líbano" - }, - { - "code": "LBR", - "label": "Liberia" - }, - { - "code": "LBY", - "label": "Libia" - }, - { - "code": "LCA", - "label": "Santa Lucía" - }, - { - "code": "LIE", - "label": "Liechtenstein" - }, - { - "code": "LKA", - "label": "Sri Lanka" - }, - { - "code": "LSO", - "label": "Lesoto" - }, - { - "code": "LTU", - "label": "Lituania" - }, - { - "code": "LUX", - "label": "Luxemburgo" - }, - { - "code": "LVA", - "label": "Letonia" - }, - { - "code": "MAC", - "label": "Macao" - }, - { - "code": "MAF", - "label": "San Martín (parte francesa)" - }, - { - "code": "MAR", - "label": "Marruecos" - }, - { - "code": "MCO", - "label": "Mónaco" - }, - { - "code": "MDA", - "label": "Moldavia (la República de)" - }, - { - "code": "MDG", - "label": "Madagascar" - }, - { - "code": "MDV", - "label": "Maldivas" - }, - { - "code": "MEX", - "label": "México" - }, - { - "code": "MHL", - "label": "Islas Marshall (las)" - }, - { - "code": "MKD", - "label": "Macedonia (la antigua República Yugoslava de)" - }, - { - "code": "MLI", - "label": "Malí" - }, - { - "code": "MLT", - "label": "Malta" - }, - { - "code": "MMR", - "label": "Myanmar" - }, - { - "code": "MNE", - "label": "Montenegro" - }, - { - "code": "MNG", - "label": "Mongolia" - }, - { - "code": "MNP", - "label": "Islas Marianas del Norte (las)" - }, - { - "code": "MOZ", - "label": "Mozambique" - }, - { - "code": "MRT", - "label": "Mauritania" - }, - { - "code": "MSR", - "label": "Montserrat" - }, - { - "code": "MTQ", - "label": "Martinica" - }, - { - "code": "MUS", - "label": "Mauricio" - }, - { - "code": "MWI", - "label": "Malaui" - }, - { - "code": "MYS", - "label": "Malasia" - }, - { - "code": "MYT", - "label": "Mayotte" - }, - { - "code": "NAM", - "label": "Namibia" - }, - { - "code": "NCL", - "label": "Nueva Caledonia" - }, - { - "code": "NER", - "label": "Níger (el)" - }, - { - "code": "NFK", - "label": "Isla Norfolk" - }, - { - "code": "NGA", - "label": "Nigeria" - }, - { - "code": "NIC", - "label": "Nicaragua" - }, - { - "code": "NIU", - "label": "Niue" - }, - { - "code": "NLD", - "label": "Países Bajos (los)" - }, - { - "code": "NOR", - "label": "Noruega" - }, - { - "code": "NPL", - "label": "Nepal" - }, - { - "code": "NRU", - "label": "Nauru" - }, - { - "code": "NZL", - "label": "Nueva Zelanda" - }, - { - "code": "OMN", - "label": "Omán" - }, - { - "code": "PAK", - "label": "Pakistán" - }, - { - "code": "PAN", - "label": "Panamá" - }, - { - "code": "PCN", - "label": "Pitcairn" - }, - { - "code": "PER", - "label": "Perú" - }, - { - "code": "PHL", - "label": "Filipinas (las)" - }, - { - "code": "PLW", - "label": "Palaos" - }, - { - "code": "PNG", - "label": "Papúa Nueva Guinea" - }, - { - "code": "POL", - "label": "Polonia" - }, - { - "code": "PRI", - "label": "Puerto Rico" - }, - { - "code": "PRK", - "label": "Corea (la República Democrática Popular de)" - }, - { - "code": "PRT", - "label": "Portugal" - }, - { - "code": "PRY", - "label": "Paraguay" - }, - { - "code": "PSE", - "label": "Palestina, Estado de" - }, - { - "code": "PYF", - "label": "Polinesia Francesa" - }, - { - "code": "QAT", - "label": "Catar" - }, - { - "code": "REU", - "label": "Reunión" - }, - { - "code": "ROU", - "label": "Rumania" - }, - { - "code": "RUS", - "label": "Rusia, (la) Federación de" - }, - { - "code": "RWA", - "label": "Ruanda" - }, - { - "code": "SAU", - "label": "Arabia Saudita" - }, - { - "code": "SDN", - "label": "Sudán (el)" - }, - { - "code": "SEN", - "label": "Senegal" - }, - { - "code": "SGP", - "label": "Singapur" - }, - { - "code": "SGS", - "label": "Georgia del sur y las islas sandwich del sur" - }, - { - "code": "SHN", - "label": "Santa Helena, Ascensión y Tristán de Acuña" - }, - { - "code": "SJM", - "label": "Svalbard y Jan Mayen" - }, - { - "code": "SLB", - "label": "Islas Salomón (las)" - }, - { - "code": "SLE", - "label": "Sierra leona" - }, - { - "code": "NULL", - "label": "NULL" - } - ] - }, - "estado": { - "label": "Estado / Provincia", - "is_system": true, - "items": [ - { - "code": "AGU", - "label": "Aguascalientes", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "BCN", - "label": "Baja California", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "BCS", - "label": "Baja California Sur", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "CAM", - "label": "Campeche", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "CHP", - "label": "Chiapas", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "CHH", - "label": "Chihuahua", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "CMX", - "label": "Ciudad de México", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "COA", - "label": "Coahuila", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "COL", - "label": "Colima", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "DUR", - "label": "Durango", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "GUA", - "label": "Guanajuato", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "GRO", - "label": "Guerrero", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "HID", - "label": "Hidalgo", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "JAL", - "label": "Jalisco", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "MEX", - "label": "Estado de México", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "MIC", - "label": "Michoacán", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "MOR", - "label": "Morelos", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "NAY", - "label": "Nayarit", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "NLE", - "label": "Nuevo León", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "OAX", - "label": "Oaxaca", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "PUE", - "label": "Puebla", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "QUE", - "label": "Querétaro", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "ROO", - "label": "Quintana Roo", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "SLP", - "label": "San Luis Potosí", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "SIN", - "label": "Sinaloa", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "SON", - "label": "Sonora", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "TAB", - "label": "Tabasco", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "TAM", - "label": "Tamaulipas", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "TLA", - "label": "Tlaxcala", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "VER", - "label": "Veracruz", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "YUC", - "label": "Yucatán", - "parent_catalog": "pais", - "parent_code": "MEX" - }, - { - "code": "ZAC", - "label": "Zacatecas", - "parent_catalog": "pais", - "parent_code": "MEX" - } - ] - }, - "tipo_domicilio": { - "label": "Tipo de domicilio", - "is_system": false, - "items": [ - { - "code": "fiscal", - "label": "Fiscal" - }, - { - "code": "oficina", - "label": "Oficina" - }, - { - "code": "sucursal", - "label": "Sucursal" - }, - { - "code": "bodega", - "label": "Bodega" - }, - { - "code": "patio", - "label": "Patio" - }, - { - "code": "terminal", - "label": "Terminal" - }, - { - "code": "almacen", - "label": "Almacén" - } - ] - }, - "area": { - "label": "Área / Departamento", - "is_system": false, - "items": [ - { - "code": "ventas", - "label": "Ventas" - }, - { - "code": "operaciones", - "label": "Operaciones" - }, - { - "code": "facturacion", - "label": "Facturación" - }, - { - "code": "cobranza", - "label": "Cobranza" - }, - { - "code": "servicio_cliente", - "label": "Servicio al cliente" - } - ] - }, - "cobertura": { - "label": "Cobertura", - "is_system": true, - "items": [ - { - "code": "nacional", - "label": "Nacional" - }, - { - "code": "internacional", - "label": "Internacional" - } - ] - }, - "clasificacion_proveedor": { - "label": "Clasificación del proveedor", - "is_system": false, - "items": [ - { - "code": "naviera", - "label": "Naviera" - }, - { - "code": "aerolinea", - "label": "Aerolínea" - }, - { - "code": "transportista_terrestre", - "label": "Transportista Terrestre" - }, - { - "code": "ferrocarril", - "label": "Ferrocarril" - }, - { - "code": "agente_aduanal", - "label": "Agente Aduanal" - }, - { - "code": "agente_carga", - "label": "Agente de Carga" - }, - { - "code": "agente_corresponsal", - "label": "Agente Corresponsal" - }, - { - "code": "almacen", - "label": "Almacén" - }, - { - "code": "aseguradora", - "label": "Aseguradora" - }, - { - "code": "paqueteria", - "label": "Paquetería" - }, - { - "code": "otro", - "label": "Otro" - } - ] - } -} +GLOBAL_CATALOGS = {'tipo_registro': {'label': 'Tipo de registro', + 'is_system': True, + 'items': [{'code': 'cliente', 'label': 'Cliente'}, + {'code': 'prospecto', 'label': 'Prospecto'}]}, + 'tipo_persona': {'label': 'Tipo de persona', + 'is_system': True, + 'items': [{'code': 'fisica', 'label': 'Persona física'}, + {'code': 'moral', 'label': 'Persona moral'}]}, + 'estatus': {'label': 'Estatus', + 'is_system': True, + 'items': [{'code': 'active', 'label': 'Activo'}, {'code': 'inactive', 'label': 'Inactivo'}]}, + 'giro': {'label': 'Giro o industria', + 'is_system': False, + 'items': [{'code': 'importadora', 'label': 'Importadora'}, + {'code': 'exportadora', 'label': 'Exportadora'}, + {'code': 'manufactura', 'label': 'Manufactura'}, + {'code': 'comercializadora', 'label': 'Comercializadora'}, + {'code': 'logistica', 'label': 'Logística y transporte'}, + {'code': 'agencia_aduanal', 'label': 'Agencia aduanal'}, + {'code': 'maquiladora', 'label': 'Maquiladora / IMMEX'}, + {'code': 'servicios', 'label': 'Servicios'}, + {'code': 'otro', 'label': 'Otro'}]}, + 'clasificacion_cliente': {'label': 'Clasificación del cliente', + 'is_system': False, + 'items': [{'code': 'importador', 'label': 'Importador'}, + {'code': 'exportador', 'label': 'Exportador'}, + {'code': 'importador_exportador', 'label': 'Importador/Exportador'}]}, + 'medio_contacto': {'label': 'Medio de contacto preferido', + 'is_system': False, + 'items': [{'code': 'llamada', 'label': 'Llamada telefónica'}, + {'code': 'correo', 'label': 'Correo electrónico'}, + {'code': 'videoconferencia', 'label': 'Videoconferencia'}, + {'code': 'whatsapp', 'label': 'WhatsApp'}, + {'code': 'otro', 'label': 'Otro'}]}, + 'idioma': {'label': 'Idioma', + 'is_system': False, + 'items': [{'code': 'es', 'label': 'Español'}, + {'code': 'en', 'label': 'Inglés'}, + {'code': 'zh', 'label': 'Chino (mandarín)'}, + {'code': 'pt', 'label': 'Portugués'}, + {'code': 'fr', 'label': 'Francés'}, + {'code': 'de', 'label': 'Alemán'}, + {'code': 'ja', 'label': 'Japonés'}, + {'code': 'ko', 'label': 'Coreano'}, + {'code': 'it', 'label': 'Italiano'}, + {'code': 'otro', 'label': 'Otro'}]}, + 'regimen_fiscal': {'label': 'Régimen fiscal', + 'is_system': False, + 'items': [{'code': 'fisica', 'label': 'Persona física'}, + {'code': 'moral', 'label': 'Persona moral'}]}, + 'uso_cfdi': {'label': 'Uso de CFDI (SAT)', + 'is_system': True, + 'items': [{'code': 'G01', 'label': 'Adquisición de mercancías'}, + {'code': 'G02', 'label': 'Devoluciones, descuentos o bonificaciones'}, + {'code': 'G03', 'label': 'Gastos en general'}, + {'code': 'I01', 'label': 'Construcciones'}, + {'code': 'I02', 'label': 'Mobiliario y equipo de oficina por inversiones'}, + {'code': 'I03', 'label': 'Equipo de transporte'}, + {'code': 'I04', 'label': 'Equipo de cómputo y accesorios'}, + {'code': 'I05', 'label': 'Dados, troqueles, moldes, matrices y herramental'}, + {'code': 'I06', 'label': 'Comunicaciones telefónicas'}, + {'code': 'I07', 'label': 'Comunicaciones satelitales'}, + {'code': 'I08', 'label': 'Otra maquinaria y equipo'}, + {'code': 'D01', 'label': 'Honorarios médicos, dentales y gastos hospitalarios'}, + {'code': 'D02', 'label': 'Gastos médicos por incapacidad o discapacidad'}, + {'code': 'D03', 'label': 'Gastos funerales'}, + {'code': 'D04', 'label': 'Donativos'}, + {'code': 'D05', 'label': 'Intereses por créditos hipotecarios'}, + {'code': 'D06', 'label': 'Aportaciones voluntarias al SAR'}, + {'code': 'D07', 'label': 'Primas por seguros de gastos médicos'}, + {'code': 'D08', 'label': 'Gastos de transportación escolar obligatoria'}, + {'code': 'D09', 'label': 'Depósitos en cuentas para el ahorro'}, + {'code': 'D10', 'label': 'Pagos por servicios educativos (colegiaturas)'}, + {'code': 'S01', 'label': 'Sin efectos fiscales'}, + {'code': 'CP01', 'label': 'Pagos'}, + {'code': 'CN01', 'label': 'Nómina'}, + {'code': 'P01', 'label': 'Por definir'}]}, + 'forma_pago': {'label': 'Forma de pago (SAT)', + 'is_system': True, + 'items': [{'code': '1', 'label': 'Efectivo'}, + {'code': '2', 'label': 'Cheque nominativo'}, + {'code': '3', 'label': 'Transferencia electrónica de fondos'}, + {'code': '4', 'label': 'Tarjeta de crédito'}, + {'code': '5', 'label': 'Monedero electrónico'}, + {'code': '6', 'label': 'Dinero electrónico'}, + {'code': '8', 'label': 'Vales de despensa'}, + {'code': '12', 'label': 'Dación en pago'}, + {'code': '13', 'label': 'Pago por subrogación'}, + {'code': '14', 'label': 'Pago por consignación'}, + {'code': '15', 'label': 'Condonación'}, + {'code': '17', 'label': 'Compensación'}, + {'code': '23', 'label': 'Novación'}, + {'code': '24', 'label': 'Confusión'}, + {'code': '25', 'label': 'Remisión de deuda'}, + {'code': '26', 'label': 'Prescripción o caducidad'}, + {'code': '27', 'label': 'A satisfacción del acreedor'}, + {'code': '28', 'label': 'Tarjeta de débito'}, + {'code': '29', 'label': 'Tarjeta de servicios'}, + {'code': '30', 'label': 'Aplicación de anticipos'}, + {'code': '31', 'label': 'Intermediario pagos'}, + {'code': '99', 'label': 'Por definir'}]}, + 'metodo_pago': {'label': 'Método de pago (SAT)', + 'is_system': True, + 'items': [{'code': 'PPD', 'label': 'Pago en parcialidades o diferido'}, + {'code': 'PUE', 'label': 'Pago en una sola exhibición'}]}, + 'moneda': {'label': 'Moneda (ISO 4217)', + 'is_system': True, + 'items': [{'code': 'CRC', 'label': 'Colón costarricense'}, + {'code': 'CUC', 'label': 'Peso Convertible'}, + {'code': 'CUP', 'label': 'Peso Cubano'}, + {'code': 'CVE', 'label': 'Cabo Verde Escudo'}, + {'code': 'CZK', 'label': 'Corona checa'}, + {'code': 'DJF', 'label': 'Franco de Djibouti'}, + {'code': 'DKK', 'label': 'Corona danesa'}, + {'code': 'DOP', 'label': 'Peso Dominicano'}, + {'code': 'DZD', 'label': 'Dinar argelino'}, + {'code': 'EGP', 'label': 'Libra egipcia'}, + {'code': 'ERN', 'label': 'Nakfa'}, + {'code': 'ETB', 'label': 'Birr etíope'}, + {'code': 'EUR', 'label': 'Euro'}, + {'code': 'FJD', 'label': 'Dólar de Fiji'}, + {'code': 'FKP', 'label': 'Libra malvinense'}, + {'code': 'GBP', 'label': 'Libra Esterlina'}, + {'code': 'GEL', 'label': 'Lari'}, + {'code': 'GHS', 'label': 'Cedi de Ghana'}, + {'code': 'GIP', 'label': 'Libra de Gibraltar'}, + {'code': 'GMD', 'label': 'Dalasi'}, + {'code': 'GNF', 'label': 'Franco guineano'}, + {'code': 'GTQ', 'label': 'Quetzal'}, + {'code': 'GYD', 'label': 'Dólar guyanés'}, + {'code': 'HKD', 'label': 'Dolar De Hong Kong'}, + {'code': 'HNL', 'label': 'Lempira'}, + {'code': 'HRK', 'label': 'Kuna'}, + {'code': 'HTG', 'label': 'Gourde'}, + {'code': 'HUF', 'label': 'Florín'}, + {'code': 'IDR', 'label': 'Rupia'}, + {'code': 'ILS', 'label': 'Nuevo Shekel Israelí'}, + {'code': 'INR', 'label': 'Rupia india'}, + {'code': 'IQD', 'label': 'Dinar iraquí'}, + {'code': 'IRR', 'label': 'Rial iraní'}, + {'code': 'ISK', 'label': 'Corona islandesa'}, + {'code': 'JMD', 'label': 'Dólar Jamaiquino'}, + {'code': 'JOD', 'label': 'Dinar jordano'}, + {'code': 'JPY', 'label': 'Yen'}, + {'code': 'KES', 'label': 'Chelín keniano'}, + {'code': 'KGS', 'label': 'Som'}, + {'code': 'KHR', 'label': 'Riel'}, + {'code': 'KMF', 'label': 'Franco Comoro'}, + {'code': 'KPW', 'label': 'Corea del Norte ganó'}, + {'code': 'KRW', 'label': 'Won'}, + {'code': 'KWD', 'label': 'Dinar kuwaití'}, + {'code': 'KYD', 'label': 'Dólar de las Islas Caimán'}, + {'code': 'KZT', 'label': 'Tenge'}, + {'code': 'LAK', 'label': 'Kip'}, + {'code': 'LBP', 'label': 'Libra libanesa'}, + {'code': 'LKR', 'label': 'Rupia de Sri Lanka'}, + {'code': 'LRD', 'label': 'Dólar liberiano'}, + {'code': 'LSL', 'label': 'Loti'}, + {'code': 'LYD', 'label': 'Dinar libio'}, + {'code': 'MAD', 'label': 'Dirham marroquí'}, + {'code': 'MDL', 'label': 'Leu moldavo'}, + {'code': 'MGA', 'label': 'Ariary malgache'}, + {'code': 'MKD', 'label': 'Denar'}, + {'code': 'MMK', 'label': 'Kyat'}, + {'code': 'MNT', 'label': 'Tugrik'}, + {'code': 'MOP', 'label': 'Pataca'}, + {'code': 'MRO', 'label': 'Ouguiya'}, + {'code': 'MUR', 'label': 'Rupia de Mauricio'}, + {'code': 'MVR', 'label': 'Rupia'}, + {'code': 'MWK', 'label': 'Kwacha'}, + {'code': 'MXN', 'label': 'Peso Mexicano'}, + {'code': 'MXV', 'label': 'México Unidad de Inversión (UDI)'}, + {'code': 'MYR', 'label': 'Ringgit malayo'}, + {'code': 'MZN', 'label': 'Mozambique Metical'}, + {'code': 'NAD', 'label': 'Dólar de Namibia'}, + {'code': 'NGN', 'label': 'Naira'}, + {'code': 'NIO', 'label': 'Córdoba Oro'}, + {'code': 'NOK', 'label': 'Corona noruega'}, + {'code': 'NPR', 'label': 'Rupia nepalí'}, + {'code': 'NZD', 'label': 'Dólar de Nueva Zelanda'}, + {'code': 'OMR', 'label': 'Rial omaní'}, + {'code': 'PAB', 'label': 'Balboa'}, + {'code': 'PEN', 'label': 'Nuevo Sol'}, + {'code': 'PGK', 'label': 'Kina'}, + {'code': 'PHP', 'label': 'Peso filipino'}, + {'code': 'PKR', 'label': 'Rupia de Pakistán'}, + {'code': 'PLN', 'label': 'Zloty'}, + {'code': 'PYG', 'label': 'Guaraní'}, + {'code': 'QAR', 'label': 'Qatar Rial'}, + {'code': 'RON', 'label': 'Leu rumano'}, + {'code': 'RSD', 'label': 'Dinar serbio'}, + {'code': 'RUB', 'label': 'Rublo ruso'}, + {'code': 'RWF', 'label': 'Franco ruandés'}, + {'code': 'SAR', 'label': 'Riyal saudí'}, + {'code': 'SBD', 'label': 'Dólar de las Islas Salomón'}, + {'code': 'SCR', 'label': 'Rupia de Seychelles'}, + {'code': 'SDG', 'label': 'Libra sudanesa'}, + {'code': 'SEK', 'label': 'Corona sueca'}, + {'code': 'SGD', 'label': 'Dolar De Singapur'}, + {'code': 'SHP', 'label': 'Libra de Santa Helena'}, + {'code': 'SLL', 'label': 'Leona'}, + {'code': 'SOS', 'label': 'Chelín somalí'}, + {'code': 'SRD', 'label': 'Dólar de Suriname'}, + {'code': 'SSP', 'label': 'Libra sudanesa Sur'}, + {'code': 'STD', 'label': 'Dobra'}, + {'code': 'SVC', 'label': 'Colon El Salvador'}, + {'code': 'SYP', 'label': 'Libra Siria'}, + {'code': 'SZL', 'label': 'Lilangeni'}, + {'code': 'THB', 'label': 'Baht'}, + {'code': 'TJS', 'label': 'Somoni'}, + {'code': 'TMT', 'label': 'Turkmenistán nuevo manat'}, + {'code': 'TND', 'label': 'Dinar tunecino'}, + {'code': 'TOP', 'label': "Pa'anga"}, + {'code': 'TRY', 'label': 'Lira turca'}, + {'code': 'TTD', 'label': 'Dólar de Trinidad y Tobago'}, + {'code': 'TWD', 'label': 'Nuevo dólar de Taiwán'}, + {'code': 'TZS', 'label': 'Shilling tanzano'}, + {'code': 'UAH', 'label': 'Hryvnia'}, + {'code': 'UGX', 'label': 'Shilling de Uganda'}, + {'code': 'USD', 'label': 'Dolar americano'}, + {'code': 'USN', 'label': 'Dólar estadounidense (día siguiente)'}, + {'code': 'UYI', 'label': 'Peso Uruguay en Unidades Indexadas (URUIURUI)'}, + {'code': 'UYU', 'label': 'Peso Uruguayo'}, + {'code': 'UZS', 'label': 'Uzbekistán Sum'}, + {'code': 'VEF', 'label': 'Bolívar'}, + {'code': 'VND', 'label': 'Dong'}, + {'code': 'VUV', 'label': 'Vatu'}, + {'code': 'WST', 'label': 'Tala'}, + {'code': 'XAF', 'label': 'Franco CFA BEAC'}, + {'code': 'XAG', 'label': 'Plata'}, + {'code': 'XAU', 'label': 'Oro'}, + {'code': 'XBA', + 'label': 'Unidad de Mercados de Bonos Unidad Europea Composite (EURCO)'}, + {'code': 'XBB', + 'label': 'Unidad Monetaria de Bonos de Mercados Unidad Europea (UEM-6)'}, + {'code': 'XBC', + 'label': 'Mercados de Bonos Unidad Europea unidad de cuenta a 9 (UCE-9)'}, + {'code': 'XBD', + 'label': 'Mercados de Bonos Unidad Europea unidad de cuenta a 17 (UCE-17)'}, + {'code': 'XCD', 'label': 'Dólar del Caribe Oriental'}, + {'code': 'XDR', 'label': 'DEG (Derechos Especiales de Giro)'}, + {'code': 'XOF', 'label': 'Franco CFA BCEAO'}, + {'code': 'XPD', 'label': 'Paladio'}, + {'code': 'XPF', 'label': 'Franco CFP'}, + {'code': 'XPT', 'label': 'Platino'}, + {'code': 'XSU', 'label': 'Sucre'}, + {'code': 'XTS', + 'label': 'Códigos reservados específicamente para propósitos de prueba'}, + {'code': 'XUA', 'label': 'Unidad ADB de Cuenta'}, + {'code': 'XXX', + 'label': 'Los códigos asignados para las transacciones en que intervenga ninguna ' + 'moneda'}, + {'code': 'YER', 'label': 'Rial yemení'}, + {'code': 'ZAR', 'label': 'Rand'}, + {'code': 'ZMW', 'label': 'Kwacha zambiano'}, + {'code': 'ZWL', 'label': 'Zimbabwe Dólar'}, + {'code': 'NULL', 'label': 'NULL'}]}, + 'pais': {'label': 'País (ISO 3166)', + 'is_system': True, + 'items': [{'code': 'ABW', 'label': 'Aruba'}, + {'code': 'AFG', 'label': 'Afganistán'}, + {'code': 'AGO', 'label': 'Angola'}, + {'code': 'AIA', 'label': 'Anguila'}, + {'code': 'ALA', 'label': 'Islas Åland'}, + {'code': 'ALB', 'label': 'Albania'}, + {'code': 'AND', 'label': 'Andorra'}, + {'code': 'ARE', 'label': 'Emiratos Árabes Unidos (Los)'}, + {'code': 'ARG', 'label': 'Argentina'}, + {'code': 'ARM', 'label': 'Armenia'}, + {'code': 'ASM', 'label': 'Samoa Americana'}, + {'code': 'ATA', 'label': 'Antártida'}, + {'code': 'ATF', 'label': 'Territorios Australes Franceses (los)'}, + {'code': 'ATG', 'label': 'Antigua y Barbuda'}, + {'code': 'AUS', 'label': 'Australia'}, + {'code': 'AUT', 'label': 'Austria'}, + {'code': 'AZE', 'label': 'Azerbaiyán'}, + {'code': 'BDI', 'label': 'Burundi'}, + {'code': 'BEL', 'label': 'Bélgica'}, + {'code': 'BEN', 'label': 'Benín'}, + {'code': 'BES', 'label': 'Bonaire, San Eustaquio y Saba'}, + {'code': 'BFA', 'label': 'Burkina Faso'}, + {'code': 'BGD', 'label': 'Bangladés'}, + {'code': 'BGR', 'label': 'Bulgaria'}, + {'code': 'BHR', 'label': 'Baréin'}, + {'code': 'BHS', 'label': 'Bahamas (las)'}, + {'code': 'BIH', 'label': 'Bosnia y Herzegovina'}, + {'code': 'BLM', 'label': 'San Bartolomé'}, + {'code': 'BLR', 'label': 'Bielorrusia'}, + {'code': 'BLZ', 'label': 'Belice'}, + {'code': 'BMU', 'label': 'Bermudas'}, + {'code': 'BOL', 'label': 'Bolivia, Estado Plurinacional de'}, + {'code': 'BRA', 'label': 'Brasil'}, + {'code': 'BRB', 'label': 'Barbados'}, + {'code': 'BRN', 'label': 'Brunéi Darussalam'}, + {'code': 'BTN', 'label': 'Bután'}, + {'code': 'BVT', 'label': 'Isla Bouvet'}, + {'code': 'BWA', 'label': 'Botsuana'}, + {'code': 'CAF', 'label': 'República Centroafricana (la)'}, + {'code': 'CAN', 'label': 'Canadá'}, + {'code': 'CCK', 'label': 'Islas Cocos (Keeling)'}, + {'code': 'CHE', 'label': 'Suiza'}, + {'code': 'CHL', 'label': 'Chile'}, + {'code': 'CHN', 'label': 'China'}, + {'code': 'CIV', 'label': "Côte d'Ivoire"}, + {'code': 'CMR', 'label': 'Camerún'}, + {'code': 'COD', 'label': 'Congo (la República Democrática del)'}, + {'code': 'COG', 'label': 'Congo'}, + {'code': 'COK', 'label': 'Islas Cook (las)'}, + {'code': 'COL', 'label': 'Colombia'}, + {'code': 'COM', 'label': 'Comoras'}, + {'code': 'CPV', 'label': 'Cabo Verde'}, + {'code': 'CRI', 'label': 'Costa Rica'}, + {'code': 'CUB', 'label': 'Cuba'}, + {'code': 'CUW', 'label': 'Curaçao'}, + {'code': 'CXR', 'label': 'Isla de Navidad'}, + {'code': 'CYM', 'label': 'Islas Caimán (las)'}, + {'code': 'CYP', 'label': 'Chipre'}, + {'code': 'CZE', 'label': 'República Checa (la)'}, + {'code': 'DEU', 'label': 'Alemania'}, + {'code': 'DJI', 'label': 'Yibuti'}, + {'code': 'DMA', 'label': 'Dominica'}, + {'code': 'DNK', 'label': 'Dinamarca'}, + {'code': 'DOM', 'label': 'República Dominicana (la)'}, + {'code': 'DZA', 'label': 'Argelia'}, + {'code': 'ECU', 'label': 'Ecuador'}, + {'code': 'EGY', 'label': 'Egipto'}, + {'code': 'ERI', 'label': 'Eritrea'}, + {'code': 'ESH', 'label': 'Sahara Occidental'}, + {'code': 'ESP', 'label': 'España'}, + {'code': 'EST', 'label': 'Estonia'}, + {'code': 'ETH', 'label': 'Etiopía'}, + {'code': 'FIN', 'label': 'Finlandia'}, + {'code': 'FJI', 'label': 'Fiyi'}, + {'code': 'FLK', 'label': 'Islas Malvinas [Falkland] (las)'}, + {'code': 'FRA', 'label': 'Francia'}, + {'code': 'FRO', 'label': 'Islas Feroe (las)'}, + {'code': 'FSM', 'label': 'Micronesia (los Estados Federados de)'}, + {'code': 'GAB', 'label': 'Gabón'}, + {'code': 'GBR', 'label': 'Reino Unido (el)'}, + {'code': 'GEO', 'label': 'Georgia'}, + {'code': 'GGY', 'label': 'Guernsey'}, + {'code': 'GHA', 'label': 'Ghana'}, + {'code': 'GIB', 'label': 'Gibraltar'}, + {'code': 'GIN', 'label': 'Guinea'}, + {'code': 'GLP', 'label': 'Guadalupe'}, + {'code': 'GMB', 'label': 'Gambia (La)'}, + {'code': 'GNB', 'label': 'Guinea-Bisáu'}, + {'code': 'GNQ', 'label': 'Guinea Ecuatorial'}, + {'code': 'GRC', 'label': 'Grecia'}, + {'code': 'GRD', 'label': 'Granada'}, + {'code': 'GRL', 'label': 'Groenlandia'}, + {'code': 'GTM', 'label': 'Guatemala'}, + {'code': 'GUF', 'label': 'Guayana Francesa'}, + {'code': 'GUM', 'label': 'Guam'}, + {'code': 'GUY', 'label': 'Guyana'}, + {'code': 'HKG', 'label': 'Hong Kong'}, + {'code': 'HMD', 'label': 'Isla Heard e Islas McDonald'}, + {'code': 'HND', 'label': 'Honduras'}, + {'code': 'HRV', 'label': 'Croacia'}, + {'code': 'HTI', 'label': 'Haití'}, + {'code': 'HUN', 'label': 'Hungría'}, + {'code': 'IDN', 'label': 'Indonesia'}, + {'code': 'IMN', 'label': 'Isla de Man'}, + {'code': 'IND', 'label': 'India'}, + {'code': 'IOT', 'label': 'Territorio Británico del Océano Índico (el)'}, + {'code': 'IRL', 'label': 'Irlanda'}, + {'code': 'IRN', 'label': 'Irán (la República Islámica de)'}, + {'code': 'IRQ', 'label': 'Irak'}, + {'code': 'ISL', 'label': 'Islandia'}, + {'code': 'ISR', 'label': 'Israel'}, + {'code': 'ITA', 'label': 'Italia'}, + {'code': 'JAM', 'label': 'Jamaica'}, + {'code': 'JEY', 'label': 'Jersey'}, + {'code': 'JOR', 'label': 'Jordania'}, + {'code': 'JPN', 'label': 'Japón'}, + {'code': 'KAZ', 'label': 'Kazajistán'}, + {'code': 'KEN', 'label': 'Kenia'}, + {'code': 'KGZ', 'label': 'Kirguistán'}, + {'code': 'KHM', 'label': 'Camboya'}, + {'code': 'KIR', 'label': 'Kiribati'}, + {'code': 'KNA', 'label': 'San Cristóbal y Nieves'}, + {'code': 'KOR', 'label': 'Corea (la República de)'}, + {'code': 'KWT', 'label': 'Kuwait'}, + {'code': 'LAO', 'label': 'Lao, (la) República Democrática Popular'}, + {'code': 'LBN', 'label': 'Líbano'}, + {'code': 'LBR', 'label': 'Liberia'}, + {'code': 'LBY', 'label': 'Libia'}, + {'code': 'LCA', 'label': 'Santa Lucía'}, + {'code': 'LIE', 'label': 'Liechtenstein'}, + {'code': 'LKA', 'label': 'Sri Lanka'}, + {'code': 'LSO', 'label': 'Lesoto'}, + {'code': 'LTU', 'label': 'Lituania'}, + {'code': 'LUX', 'label': 'Luxemburgo'}, + {'code': 'LVA', 'label': 'Letonia'}, + {'code': 'MAC', 'label': 'Macao'}, + {'code': 'MAF', 'label': 'San Martín (parte francesa)'}, + {'code': 'MAR', 'label': 'Marruecos'}, + {'code': 'MCO', 'label': 'Mónaco'}, + {'code': 'MDA', 'label': 'Moldavia (la República de)'}, + {'code': 'MDG', 'label': 'Madagascar'}, + {'code': 'MDV', 'label': 'Maldivas'}, + {'code': 'MEX', 'label': 'México'}, + {'code': 'MHL', 'label': 'Islas Marshall (las)'}, + {'code': 'MKD', 'label': 'Macedonia (la antigua República Yugoslava de)'}, + {'code': 'MLI', 'label': 'Malí'}, + {'code': 'MLT', 'label': 'Malta'}, + {'code': 'MMR', 'label': 'Myanmar'}, + {'code': 'MNE', 'label': 'Montenegro'}, + {'code': 'MNG', 'label': 'Mongolia'}, + {'code': 'MNP', 'label': 'Islas Marianas del Norte (las)'}, + {'code': 'MOZ', 'label': 'Mozambique'}, + {'code': 'MRT', 'label': 'Mauritania'}, + {'code': 'MSR', 'label': 'Montserrat'}, + {'code': 'MTQ', 'label': 'Martinica'}, + {'code': 'MUS', 'label': 'Mauricio'}, + {'code': 'MWI', 'label': 'Malaui'}, + {'code': 'MYS', 'label': 'Malasia'}, + {'code': 'MYT', 'label': 'Mayotte'}, + {'code': 'NAM', 'label': 'Namibia'}, + {'code': 'NCL', 'label': 'Nueva Caledonia'}, + {'code': 'NER', 'label': 'Níger (el)'}, + {'code': 'NFK', 'label': 'Isla Norfolk'}, + {'code': 'NGA', 'label': 'Nigeria'}, + {'code': 'NIC', 'label': 'Nicaragua'}, + {'code': 'NIU', 'label': 'Niue'}, + {'code': 'NLD', 'label': 'Países Bajos (los)'}, + {'code': 'NOR', 'label': 'Noruega'}, + {'code': 'NPL', 'label': 'Nepal'}, + {'code': 'NRU', 'label': 'Nauru'}, + {'code': 'NZL', 'label': 'Nueva Zelanda'}, + {'code': 'OMN', 'label': 'Omán'}, + {'code': 'PAK', 'label': 'Pakistán'}, + {'code': 'PAN', 'label': 'Panamá'}, + {'code': 'PCN', 'label': 'Pitcairn'}, + {'code': 'PER', 'label': 'Perú'}, + {'code': 'PHL', 'label': 'Filipinas (las)'}, + {'code': 'PLW', 'label': 'Palaos'}, + {'code': 'PNG', 'label': 'Papúa Nueva Guinea'}, + {'code': 'POL', 'label': 'Polonia'}, + {'code': 'PRI', 'label': 'Puerto Rico'}, + {'code': 'PRK', 'label': 'Corea (la República Democrática Popular de)'}, + {'code': 'PRT', 'label': 'Portugal'}, + {'code': 'PRY', 'label': 'Paraguay'}, + {'code': 'PSE', 'label': 'Palestina, Estado de'}, + {'code': 'PYF', 'label': 'Polinesia Francesa'}, + {'code': 'QAT', 'label': 'Catar'}, + {'code': 'REU', 'label': 'Reunión'}, + {'code': 'ROU', 'label': 'Rumania'}, + {'code': 'RUS', 'label': 'Rusia, (la) Federación de'}, + {'code': 'RWA', 'label': 'Ruanda'}, + {'code': 'SAU', 'label': 'Arabia Saudita'}, + {'code': 'SDN', 'label': 'Sudán (el)'}, + {'code': 'SEN', 'label': 'Senegal'}, + {'code': 'SGP', 'label': 'Singapur'}, + {'code': 'SGS', 'label': 'Georgia del sur y las islas sandwich del sur'}, + {'code': 'SHN', 'label': 'Santa Helena, Ascensión y Tristán de Acuña'}, + {'code': 'SJM', 'label': 'Svalbard y Jan Mayen'}, + {'code': 'SLB', 'label': 'Islas Salomón (las)'}, + {'code': 'SLE', 'label': 'Sierra leona'}, + {'code': 'NULL', 'label': 'NULL'}]}, + 'estado': {'label': 'Estado / Provincia', + 'is_system': True, + 'items': [{'code': 'AGU', + 'label': 'Aguascalientes', + 'parent_catalog': 'pais', + 'parent_code': 'MEX'}, + {'code': 'BCN', + 'label': 'Baja California', + 'parent_catalog': 'pais', + 'parent_code': 'MEX'}, + {'code': 'BCS', + 'label': 'Baja California Sur', + 'parent_catalog': 'pais', + 'parent_code': 'MEX'}, + {'code': 'CAM', 'label': 'Campeche', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'CHP', 'label': 'Chiapas', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'CHH', 'label': 'Chihuahua', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'CMX', + 'label': 'Ciudad de México', + 'parent_catalog': 'pais', + 'parent_code': 'MEX'}, + {'code': 'COA', 'label': 'Coahuila', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'COL', 'label': 'Colima', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'DUR', 'label': 'Durango', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'GUA', 'label': 'Guanajuato', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'GRO', 'label': 'Guerrero', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'HID', 'label': 'Hidalgo', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'JAL', 'label': 'Jalisco', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'MEX', + 'label': 'Estado de México', + 'parent_catalog': 'pais', + 'parent_code': 'MEX'}, + {'code': 'MIC', 'label': 'Michoacán', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'MOR', 'label': 'Morelos', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'NAY', 'label': 'Nayarit', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'NLE', 'label': 'Nuevo León', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'OAX', 'label': 'Oaxaca', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'PUE', 'label': 'Puebla', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'QUE', 'label': 'Querétaro', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'ROO', + 'label': 'Quintana Roo', + 'parent_catalog': 'pais', + 'parent_code': 'MEX'}, + {'code': 'SLP', + 'label': 'San Luis Potosí', + 'parent_catalog': 'pais', + 'parent_code': 'MEX'}, + {'code': 'SIN', 'label': 'Sinaloa', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'SON', 'label': 'Sonora', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'TAB', 'label': 'Tabasco', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'TAM', 'label': 'Tamaulipas', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'TLA', 'label': 'Tlaxcala', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'VER', 'label': 'Veracruz', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'YUC', 'label': 'Yucatán', 'parent_catalog': 'pais', 'parent_code': 'MEX'}, + {'code': 'ZAC', 'label': 'Zacatecas', 'parent_catalog': 'pais', 'parent_code': 'MEX'}]}, + 'tipo_domicilio': {'label': 'Tipo de domicilio', + 'is_system': False, + 'items': [{'code': 'fiscal', 'label': 'Fiscal'}, + {'code': 'oficina', 'label': 'Oficina'}, + {'code': 'sucursal', 'label': 'Sucursal'}, + {'code': 'bodega', 'label': 'Bodega'}, + {'code': 'patio', 'label': 'Patio'}, + {'code': 'terminal', 'label': 'Terminal'}, + {'code': 'almacen', 'label': 'Almacén'}]}, + 'area': {'label': 'Área / Departamento', + 'is_system': False, + 'items': [{'code': 'ventas', 'label': 'Ventas'}, + {'code': 'operaciones', 'label': 'Operaciones'}, + {'code': 'facturacion', 'label': 'Facturación'}, + {'code': 'cobranza', 'label': 'Cobranza'}, + {'code': 'servicio_cliente', 'label': 'Servicio al cliente'}]}, + 'cobertura': {'label': 'Cobertura', + 'is_system': True, + 'items': [{'code': 'nacional', 'label': 'Nacional'}, + {'code': 'internacional', 'label': 'Internacional'}]}, + 'clasificacion_proveedor': {'label': 'Clasificación del proveedor', + 'is_system': False, + 'items': [{'code': 'naviera', 'label': 'Naviera'}, + {'code': 'aerolinea', 'label': 'Aerolínea'}, + {'code': 'transportista_terrestre', + 'label': 'Transportista Terrestre'}, + {'code': 'ferrocarril', 'label': 'Ferrocarril'}, + {'code': 'agente_aduanal', 'label': 'Agente Aduanal'}, + {'code': 'agente_carga', 'label': 'Agente de Carga'}, + {'code': 'agente_corresponsal', 'label': 'Agente Corresponsal'}, + {'code': 'almacen', 'label': 'Almacén'}, + {'code': 'aseguradora', 'label': 'Aseguradora'}, + {'code': 'paqueteria', 'label': 'Paquetería'}, + {'code': 'otro', 'label': 'Otro'}]}} -TENANT_CATALOG_LABELS = { - "servicio": "Servicios que ofrece", - "puerto": "Puertos donde opera", - "aeropuerto": "Aeropuertos donde opera", - "aduana": "Aduanas donde opera" -} +TENANT_CATALOG_LABELS = {'servicio': 'Servicios que ofrece', + 'puerto': 'Puertos donde opera', + 'aeropuerto': 'Aeropuertos donde opera', + 'aduana': 'Aduanas donde opera'} diff --git a/frontend/src/lib/api/crm/catalogs.ts b/frontend/src/lib/api/crm/catalogs.ts new file mode 100644 index 0000000..3d66d8a --- /dev/null +++ b/frontend/src/lib/api/crm/catalogs.ts @@ -0,0 +1,63 @@ +/** + * Cliente API — Catálogos de referencia del CRM (SAT/ISO + del cliente). + * T2026-07-081/082. + */ +import { api, type ApiResponse } from '$lib/api'; + +export interface CatalogItem { + id: number; + catalog: string; + code: string; + label: string; + parent_catalog?: string | null; + parent_code?: string | null; + tenant_id: number | null; + sort_order: number; + is_active: boolean; + is_system: boolean; +} + +export interface CatalogMeta { + catalog: string; + label: string; + scope: 'global' | 'tenant'; + is_system: boolean; + count: number; +} + +export interface CatalogItemInput { + code: string; + label: string; + parent_catalog?: string | null; + parent_code?: string | null; + sort_order?: number; + is_active?: boolean; +} + +function qp(companyId: number, extra?: Record) { + const qs = new URLSearchParams({ company_id: String(companyId) }); + for (const [k, v] of Object.entries(extra ?? {})) if (v !== undefined && v !== '') qs.set(k, String(v)); + return qs.toString(); +} +async function unwrap(p: Promise<{ data?: T; error?: string }>): Promise { + const res = await p; + if (res.error) throw new Error(res.error); + return res.data as T; +} + +export const referenceCatalogsAPI = { + /** Metadata de todos los catálogos (para la pantalla de administración). */ + meta: (companyId: number) => unwrap(api.get(`/v1/crm/catalogs?${qp(companyId)}`)), + /** Opciones activas de un catálogo (global + del tenant), con dependiente opcional. */ + list: (catalog: string, companyId: number, parentCode?: string) => + unwrap(api.get(`/v1/crm/catalogs/${catalog}?${qp(companyId, { parent_code: parentCode })}`)), + /** Todas las opciones incluyendo inactivas (administración). */ + listAll: (catalog: string, companyId: number) => + unwrap(api.get(`/v1/crm/catalogs/${catalog}?${qp(companyId, { include_inactive: true })}`)), + create: (catalog: string, companyId: number, data: CatalogItemInput, scope: 'tenant' | 'global' = 'tenant') => + api.post(`/v1/crm/catalogs/${catalog}?${qp(companyId, { scope })}`, data) as Promise>, + update: (catalog: string, id: number, companyId: number, data: Partial) => + api.patch(`/v1/crm/catalogs/${catalog}/${id}?${qp(companyId)}`, data) as Promise>, + remove: (catalog: string, id: number, companyId: number) => + api.delete(`/v1/crm/catalogs/${catalog}/${id}?${qp(companyId)}`) as Promise> +}; diff --git a/frontend/src/lib/api/crm/types.ts b/frontend/src/lib/api/crm/types.ts index f8082c4..58f0870 100644 --- a/frontend/src/lib/api/crm/types.ts +++ b/frontend/src/lib/api/crm/types.ts @@ -24,10 +24,12 @@ export interface Account { status: AccountStatus; commercial_classification: string | null; preferred_contact_method: string | null; + preferred_contact_other: string | null; language: string | null; email: string | null; phone: string | null; website: string | null; + commercial_observations: string | null; tax_regime: string | null; cfdi_use: string | null; payment_method: string | null; @@ -66,6 +68,7 @@ export interface Supplier { person_type: string | null; status: AccountStatus; classifications: string[]; + classification_other: string | null; services_offered: string | null; coverage: string | null; countries: string[]; diff --git a/frontend/src/lib/components/crm/AccountFields.svelte b/frontend/src/lib/components/crm/AccountFields.svelte index 81d3757..6a995bd 100644 --- a/frontend/src/lib/components/crm/AccountFields.svelte +++ b/frontend/src/lib/components/crm/AccountFields.svelte @@ -1,15 +1,23 @@ {#if tab === 'generales'} @@ -18,28 +26,32 @@ - - - + + + - + {:else if tab === 'comercial'}
- - - + + + {#if form.preferred_contact_method === 'otro'} + + {/if} + +
{:else if tab === 'fiscal'}
- - - - - + + + + + @@ -47,7 +59,7 @@
{:else if tab === 'observaciones'}
- +
{/if} diff --git a/frontend/src/lib/components/crm/RelatedManager.svelte b/frontend/src/lib/components/crm/RelatedManager.svelte index ec3f880..15ce0a5 100644 --- a/frontend/src/lib/components/crm/RelatedManager.svelte +++ b/frontend/src/lib/components/crm/RelatedManager.svelte @@ -8,10 +8,16 @@ addressesAPI, contactsAPI, documentsAPI, type Address, type Contact, type Document, type AddressInput, type ContactInput, type DocumentInput } from '$lib/api/crm'; - import { ADDRESS_TYPES, DOC_TYPES, CONTACT_AREAS, labelOf } from '$lib/components/crm/format'; + import { DOC_TYPES, labelOf } from '$lib/components/crm/format'; + import { crmCatalogs } from '$lib/stores/crm-catalogs.svelte'; + import { onMount } from 'svelte'; import { uploadFile, uploadUrl } from '$lib/api/uploads'; import { toast } from 'svelte-sonner'; + onMount(() => { + void crmCatalogs.preload(['tipo_domicilio', 'area', 'pais']); + }); + // Dueño de los registros relacionados y qué sección mostrar let { ownerType, @@ -31,7 +37,7 @@ let activeModal = $state<'address' | 'contact' | 'document' | null>(null); let saving = $state(false); - let addressForm = $state({ address_type: 'fiscal', country: 'MX', is_primary: false }); + let addressForm = $state({ address_type: 'fiscal', country: 'MEX', is_primary: false }); let contactForm = $state({ first_name: '' }); let documentForm = $state({ doc_type: 'constancia_fiscal', name: '' }); let uploading = $state(false); @@ -70,6 +76,11 @@ if (companyId && ownerId) void load(companyId); }); + // Estado depende del país seleccionado (catálogo dependiente) + $effect(() => { + if (addressForm.country) void crmCatalogs.ensure('estado', addressForm.country); + }); + async function load(cid: number) { try { [addresses, contacts, documents] = await Promise.all([ @@ -83,7 +94,7 @@ } function openModal(kind: 'address' | 'contact' | 'document') { - if (kind === 'address') addressForm = { address_type: 'fiscal', country: 'MX', is_primary: false }; + if (kind === 'address') addressForm = { address_type: 'fiscal', country: 'MEX', is_primary: false }; if (kind === 'contact') contactForm = { first_name: '' }; if (kind === 'document') documentForm = { doc_type: 'constancia_fiscal', name: '' }; activeModal = kind; @@ -174,7 +185,7 @@ {#each addresses as a (a.id)} - {labelOf(ADDRESS_TYPES, a.address_type)}{#if a.is_primary}(principal){/if} + {crmCatalogs.label('tipo_domicilio', a.address_type)}{#if a.is_primary}(principal){/if} {[a.street, a.ext_number, a.neighborhood].filter(Boolean).join(' ') || '—'} {a.postal_code ?? '—'} {[a.city, a.state].filter(Boolean).join(', ') || '—'} @@ -204,7 +215,7 @@ {#each contacts as c (c.id)} {c.first_name} {c.last_name ?? ''}{#if c.is_primary}(principal){/if} - {[c.job_title, labelOf(CONTACT_AREAS, c.area) !== '—' ? labelOf(CONTACT_AREAS, c.area) : null].filter(Boolean).join(' · ') || '—'} + {[c.job_title, c.area ? crmCatalogs.label('area', c.area) : null].filter(Boolean).join(' · ') || '—'} {c.email ?? '—'} {c.phone ?? c.mobile ?? '—'} @@ -252,15 +263,15 @@ {#if activeModal === 'address'}

Nueva dirección

- + - - - + + +
@@ -271,7 +282,7 @@ - + diff --git a/frontend/src/lib/components/crm/SupplierFields.svelte b/frontend/src/lib/components/crm/SupplierFields.svelte index 9a84ccf..ea7610b 100644 --- a/frontend/src/lib/components/crm/SupplierFields.svelte +++ b/frontend/src/lib/components/crm/SupplierFields.svelte @@ -1,6 +1,7 @@ {#if tab === 'generales'} @@ -28,25 +38,28 @@ - - + +
-

Clasificación (una o varias)

+

Clasificación del proveedor (una o varias)

- {#each SUPPLIER_CLASSIFICATIONS as c (c.value)} + {#each crmCatalogs.options('clasificacion_proveedor') as c (c.value)} {/each}
+ {#if hasOtro} + + {/if}
{:else if tab === 'comercial'}
- - - - - - + + + + + + @@ -56,16 +69,16 @@
{:else if tab === 'fiscal'}
- - - + + +
{:else if tab === 'observaciones'}
- +
{/if} diff --git a/frontend/src/lib/components/crm/format.ts b/frontend/src/lib/components/crm/format.ts index 2206adc..2cca268 100644 --- a/frontend/src/lib/components/crm/format.ts +++ b/frontend/src/lib/components/crm/format.ts @@ -43,7 +43,7 @@ export const ACCOUNT_STATUS: Option[] = [ export const COMMERCIAL_CLASSIFICATION: Option[] = [ { value: 'importador', label: 'Importador' }, { value: 'exportador', label: 'Exportador' }, - { value: 'ambos', label: 'Importador / Exportador' } + { value: 'importador_exportador', label: 'Importador / Exportador' } ]; export const ACCOUNT_TYPES: Option[] = [ @@ -58,7 +58,7 @@ export const ACCOUNT_TYPES: Option[] = [ export const CONTACT_METHODS: Option[] = [ { value: 'llamada', label: 'Llamada telefónica' }, { value: 'correo', label: 'Correo electrónico' }, - { value: 'videollamada', label: 'Videoconferencia' }, + { value: 'videoconferencia', label: 'Videoconferencia' }, { value: 'whatsapp', label: 'WhatsApp' }, { value: 'otro', label: 'Otro' } ]; diff --git a/frontend/src/lib/components/sidebar/modules.ts b/frontend/src/lib/components/sidebar/modules.ts index 0f2cce0..2e7bcd4 100644 --- a/frontend/src/lib/components/sidebar/modules.ts +++ b/frontend/src/lib/components/sidebar/modules.ts @@ -52,6 +52,7 @@ export function getNavMain(): NavMainItem[] { { title: 'Prospectos (embudo)', url: '/dashboard/crm/prospectos' }, { title: 'Oportunidades', url: '/dashboard/crm/oportunidades' }, { title: 'Actividades', url: '/dashboard/crm/actividades' }, + { title: 'Catálogos', url: '/dashboard/crm/catalogos' }, ], }, { diff --git a/frontend/src/lib/stores/crm-catalogs.svelte.ts b/frontend/src/lib/stores/crm-catalogs.svelte.ts new file mode 100644 index 0000000..8d4dcc7 --- /dev/null +++ b/frontend/src/lib/stores/crm-catalogs.svelte.ts @@ -0,0 +1,77 @@ +/** + * Store reactivo de catálogos de referencia del CRM. + * + * Carga desde el backend (/v1/crm/catalogs) y cachea por catálogo. Los + * formularios leen `options(catalog)` (reactivo) sin refetch. Los catálogos + * dependientes (Estado por País) se piden con `ensure(catalog, parentCode)`. + */ +import { referenceCatalogsAPI } from '$lib/api/crm/catalogs'; +import { companyStore } from '$lib/stores/company.svelte'; +import type { Option } from '$lib/components/crm/format'; + +class CrmCatalogStore { + private _cache = $state>({}); + private _pending = new Set(); + private _companyId: number | null = null; + + /** Toma la compañía activa; si cambió, limpia el caché. Devuelve su id (o null). */ + private syncCompany(): number | null { + const cid = companyStore.activeCompany?.id ?? null; + if (cid !== this._companyId) { + this._companyId = cid; + this._cache = {}; + this._pending.clear(); + } + return cid; + } + + private keyOf(catalog: string, parentCode?: string): string { + return parentCode ? `${catalog}:${parentCode}` : catalog; + } + + /** Opciones de un catálogo ya cargado (vacío si aún no se ha cargado). */ + options(catalog: string, parentCode?: string): Option[] { + return this._cache[this.keyOf(catalog, parentCode)] ?? []; + } + + /** Descripción de una clave (para listados/detalle). */ + label(catalog: string, code: string | null | undefined): string { + if (!code) return '—'; + return this.options(catalog).find((o) => o.value === code)?.label ?? code; + } + + /** Carga un catálogo (con dependiente opcional) si aún no está en caché. */ + async ensure(catalog: string, parentCode?: string): Promise { + const cid = this.syncCompany(); + const key = this.keyOf(catalog, parentCode); + if (cid == null || key in this._cache || this._pending.has(key)) return; + this._pending.add(key); + try { + const items = await referenceCatalogsAPI.list(catalog, cid, parentCode); + this._cache[key] = items.map((i) => ({ value: i.code, label: i.label })); + } catch { + this._cache[key] = []; + } finally { + this._pending.delete(key); + } + } + + /** Precarga varios catálogos globales en paralelo. */ + async preload(catalogs: string[]): Promise { + await Promise.all(catalogs.map((c) => this.ensure(c))); + } + + /** Invalida el caché de un catálogo (tras editar en administración). */ + invalidate(catalog?: string): void { + if (!catalog) { + this._cache = {}; + return; + } + for (const k of Object.keys(this._cache)) { + if (k === catalog || k.startsWith(`${catalog}:`)) delete this._cache[k]; + } + this._cache = { ...this._cache }; + } +} + +export const crmCatalogs = new CrmCatalogStore(); diff --git a/frontend/src/routes/dashboard/crm/catalogos/+page.svelte b/frontend/src/routes/dashboard/crm/catalogos/+page.svelte new file mode 100644 index 0000000..bb33ce5 --- /dev/null +++ b/frontend/src/routes/dashboard/crm/catalogos/+page.svelte @@ -0,0 +1,217 @@ + + +
+
+

Catálogos

+

+ Administra las opciones de los catálogos del CRM. Los catálogos base del sistema (SAT/ISO) solo se pueden activar/desactivar; los de tu empresa se pueden insertar, editar y borrar. +

+
+ + {#if !companyId} + Selecciona una compañía activa. + {:else} +
+ + Catálogos + + {#each metas as m (m.catalog)} + + {/each} + + + + + + {selected?.label ?? 'Opciones'} + + {#if selected} + {selected.scope === 'global' ? 'Catálogo global (Aduanasoft)' : 'Catálogo de tu empresa'} · {selected.count} opciones + {#if selected.is_system} · base del sistema (no se borra){/if} + {/if} + + + +
+ + + +
+ + {#if loading} +

Cargando…

+ {:else if items.length === 0} +

Sin opciones. Agrega la primera arriba.

+ {:else} +
+ + ClaveDescripciónOrigenActivoAcciones + + {#each items as it (it.id)} + + {it.code} + + {#if editId === it.id} + + {:else} + {it.label} + {/if} + + {it.tenant_id === null ? 'Global' : 'Empresa'}{#if it.is_system} · base{/if} + + {#if editId === it.id} + + {:else} + {it.is_active ? 'Sí' : 'No'} + {/if} + + + {#if editId === it.id} + + + {:else} + + {#if !it.is_system} + + {/if} + {/if} + + + {/each} + + +
+ {/if} +
+
+
+ {/if} +
diff --git a/frontend/src/routes/dashboard/crm/cuentas/+page.svelte b/frontend/src/routes/dashboard/crm/cuentas/+page.svelte index d9a1b5f..fcd59b1 100644 --- a/frontend/src/routes/dashboard/crm/cuentas/+page.svelte +++ b/frontend/src/routes/dashboard/crm/cuentas/+page.svelte @@ -1,5 +1,5 @@