catalogmx 0.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. catalogmx/__init__.py +56 -0
  2. catalogmx/catalogs/__init__.py +5 -0
  3. catalogmx/catalogs/banxico/__init__.py +24 -0
  4. catalogmx/catalogs/banxico/banks.py +136 -0
  5. catalogmx/catalogs/banxico/codigos_plaza.py +287 -0
  6. catalogmx/catalogs/banxico/instituciones_financieras.py +338 -0
  7. catalogmx/catalogs/banxico/monedas_divisas.py +386 -0
  8. catalogmx/catalogs/banxico/udis.py +279 -0
  9. catalogmx/catalogs/ift/__init__.py +15 -0
  10. catalogmx/catalogs/ift/codigos_lada.py +426 -0
  11. catalogmx/catalogs/ift/operadores_moviles.py +315 -0
  12. catalogmx/catalogs/inegi/__init__.py +21 -0
  13. catalogmx/catalogs/inegi/localidades.py +207 -0
  14. catalogmx/catalogs/inegi/municipios.py +73 -0
  15. catalogmx/catalogs/inegi/municipios_completo.py +236 -0
  16. catalogmx/catalogs/inegi/states.py +148 -0
  17. catalogmx/catalogs/mexico/__init__.py +17 -0
  18. catalogmx/catalogs/mexico/hoy_no_circula.py +215 -0
  19. catalogmx/catalogs/mexico/placas_formatos.py +184 -0
  20. catalogmx/catalogs/mexico/salarios_minimos.py +156 -0
  21. catalogmx/catalogs/mexico/uma.py +207 -0
  22. catalogmx/catalogs/sat/__init__.py +13 -0
  23. catalogmx/catalogs/sat/carta_porte/__init__.py +19 -0
  24. catalogmx/catalogs/sat/carta_porte/aeropuertos.py +76 -0
  25. catalogmx/catalogs/sat/carta_porte/carreteras.py +59 -0
  26. catalogmx/catalogs/sat/carta_porte/config_autotransporte.py +54 -0
  27. catalogmx/catalogs/sat/carta_porte/material_peligroso.py +66 -0
  28. catalogmx/catalogs/sat/carta_porte/puertos_maritimos.py +63 -0
  29. catalogmx/catalogs/sat/carta_porte/tipo_embalaje.py +48 -0
  30. catalogmx/catalogs/sat/carta_porte/tipo_permiso.py +54 -0
  31. catalogmx/catalogs/sat/cfdi_4/__init__.py +42 -0
  32. catalogmx/catalogs/sat/cfdi_4/clave_prod_serv.py +383 -0
  33. catalogmx/catalogs/sat/cfdi_4/clave_unidad.py +298 -0
  34. catalogmx/catalogs/sat/cfdi_4/exportacion.py +45 -0
  35. catalogmx/catalogs/sat/cfdi_4/forma_pago.py +45 -0
  36. catalogmx/catalogs/sat/cfdi_4/impuesto.py +57 -0
  37. catalogmx/catalogs/sat/cfdi_4/meses.py +34 -0
  38. catalogmx/catalogs/sat/cfdi_4/metodo_pago.py +45 -0
  39. catalogmx/catalogs/sat/cfdi_4/objeto_imp.py +45 -0
  40. catalogmx/catalogs/sat/cfdi_4/periodicidad.py +34 -0
  41. catalogmx/catalogs/sat/cfdi_4/regimen_fiscal.py +57 -0
  42. catalogmx/catalogs/sat/cfdi_4/tasa_o_cuota.py +42 -0
  43. catalogmx/catalogs/sat/cfdi_4/tipo_comprobante.py +45 -0
  44. catalogmx/catalogs/sat/cfdi_4/tipo_factor.py +34 -0
  45. catalogmx/catalogs/sat/cfdi_4/tipo_relacion.py +45 -0
  46. catalogmx/catalogs/sat/cfdi_4/uso_cfdi.py +45 -0
  47. catalogmx/catalogs/sat/comercio_exterior/__init__.py +39 -0
  48. catalogmx/catalogs/sat/comercio_exterior/claves_pedimento.py +77 -0
  49. catalogmx/catalogs/sat/comercio_exterior/estados.py +122 -0
  50. catalogmx/catalogs/sat/comercio_exterior/incoterms.py +226 -0
  51. catalogmx/catalogs/sat/comercio_exterior/monedas.py +107 -0
  52. catalogmx/catalogs/sat/comercio_exterior/motivos_traslado.py +54 -0
  53. catalogmx/catalogs/sat/comercio_exterior/paises.py +88 -0
  54. catalogmx/catalogs/sat/comercio_exterior/registro_ident_trib.py +76 -0
  55. catalogmx/catalogs/sat/comercio_exterior/unidades_aduana.py +54 -0
  56. catalogmx/catalogs/sat/comercio_exterior/validator.py +212 -0
  57. catalogmx/catalogs/sat/nomina/__init__.py +19 -0
  58. catalogmx/catalogs/sat/nomina/banco.py +50 -0
  59. catalogmx/catalogs/sat/nomina/periodicidad_pago.py +48 -0
  60. catalogmx/catalogs/sat/nomina/riesgo_puesto.py +56 -0
  61. catalogmx/catalogs/sat/nomina/tipo_contrato.py +47 -0
  62. catalogmx/catalogs/sat/nomina/tipo_jornada.py +42 -0
  63. catalogmx/catalogs/sat/nomina/tipo_nomina.py +52 -0
  64. catalogmx/catalogs/sat/nomina/tipo_regimen.py +47 -0
  65. catalogmx/catalogs/sepomex/__init__.py +5 -0
  66. catalogmx/catalogs/sepomex/codigos_postales.py +184 -0
  67. catalogmx/cli.py +185 -0
  68. catalogmx/helpers.py +324 -0
  69. catalogmx/utils/text.py +55 -0
  70. catalogmx/validators/__init__.py +0 -0
  71. catalogmx/validators/clabe.py +233 -0
  72. catalogmx/validators/curp.py +623 -0
  73. catalogmx/validators/nss.py +255 -0
  74. catalogmx/validators/rfc.py +1004 -0
  75. catalogmx-0.3.0.dist-info/METADATA +644 -0
  76. catalogmx-0.3.0.dist-info/RECORD +81 -0
  77. catalogmx-0.3.0.dist-info/WHEEL +5 -0
  78. catalogmx-0.3.0.dist-info/entry_points.txt +2 -0
  79. catalogmx-0.3.0.dist-info/licenses/AUTHORS.rst +5 -0
  80. catalogmx-0.3.0.dist-info/licenses/LICENSE +19 -0
  81. catalogmx-0.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,338 @@
1
+ """
2
+ Catálogo de tipos de instituciones financieras en México (Banxico)
3
+
4
+ Este módulo proporciona acceso al catálogo de tipos de instituciones
5
+ del sistema financiero mexicano supervisadas por Banxico, CNBV, CNSF,
6
+ CONSAR y otras entidades reguladoras.
7
+ """
8
+
9
+ import json
10
+ from pathlib import Path
11
+ from typing import TypedDict
12
+
13
+ from catalogmx.utils.text import normalize_text
14
+
15
+
16
+ class TipoInstitucionFinanciera(TypedDict):
17
+ """Estructura de un tipo de institución financiera"""
18
+
19
+ codigo: str
20
+ tipo: str
21
+ descripcion: str
22
+ regulador: str
23
+ ley_aplicable: str
24
+ ejemplos: list[str]
25
+
26
+
27
+ class InstitucionesFinancieras:
28
+ """
29
+ Catálogo de tipos de instituciones del sistema financiero mexicano.
30
+
31
+ Incluye todos los tipos de instituciones reguladas y supervisadas
32
+ en México: bancos, casas de bolsa, SOFOMes, seguros, fianzas,
33
+ AFOREs, instituciones fintech, etc.
34
+
35
+ Características:
36
+ - 20+ tipos de instituciones financieras
37
+ - Información de reguladores (CNBV, CNSF, CONSAR, CONDUSEF, SHCP)
38
+ - Leyes aplicables para cada tipo
39
+ - Ejemplos de instituciones por categoría
40
+
41
+ Ejemplo:
42
+ >>> from catalogmx.catalogs.banxico import InstitucionesFinancieras
43
+ >>>
44
+ >>> # Obtener bancos
45
+ >>> bancos = InstitucionesFinancieras.get_bancos()
46
+ >>> for banco in bancos:
47
+ ... print(f"{banco['codigo']}: {banco['tipo']}")
48
+ >>>
49
+ >>> # Buscar por código
50
+ >>> inst = InstitucionesFinancieras.get_por_codigo("01")
51
+ >>> print(inst['tipo']) # "Banco Múltiple"
52
+ >>>
53
+ >>> # Obtener instituciones por regulador
54
+ >>> cnbv = InstitucionesFinancieras.get_por_regulador("CNBV")
55
+ >>> print(f"Instituciones reguladas por CNBV: {len(cnbv)}")
56
+ """
57
+
58
+ _data: list[TipoInstitucionFinanciera] | None = None
59
+
60
+ @classmethod
61
+ def _load_data(cls) -> None:
62
+ """Carga lazy de datos desde JSON"""
63
+ if cls._data is not None:
64
+ return
65
+
66
+ # Path: catalogmx/packages/python/catalogmx/catalogs/banxico/instituciones_financieras.py
67
+ # Target: catalogmx/packages/shared-data/banxico/instituciones_financieras.json
68
+ data_path = (
69
+ Path(__file__).parent.parent.parent.parent.parent
70
+ / "shared-data"
71
+ / "banxico"
72
+ / "instituciones_financieras.json"
73
+ )
74
+
75
+ with open(data_path, encoding="utf-8") as f:
76
+ json_data = json.load(f)
77
+ cls._data = json_data["tipos_institucion"]
78
+
79
+ @classmethod
80
+ def get_all(cls) -> list[TipoInstitucionFinanciera]:
81
+ """
82
+ Obtiene todos los tipos de instituciones financieras.
83
+
84
+ Returns:
85
+ Lista completa de tipos de instituciones
86
+
87
+ Ejemplo:
88
+ >>> instituciones = InstitucionesFinancieras.get_all()
89
+ >>> print(f"Total tipos: {len(instituciones)}")
90
+ """
91
+ cls._load_data()
92
+ return cls._data.copy() # type: ignore
93
+
94
+ @classmethod
95
+ def get_por_codigo(cls, codigo: str) -> TipoInstitucionFinanciera | None:
96
+ """
97
+ Busca tipo de institución por código.
98
+
99
+ Args:
100
+ codigo: Código del tipo de institución (ej: "01", "02")
101
+
102
+ Returns:
103
+ Información del tipo de institución o None si no existe
104
+
105
+ Ejemplo:
106
+ >>> banco = InstitucionesFinancieras.get_por_codigo("01")
107
+ >>> print(banco['tipo']) # "Banco Múltiple"
108
+ """
109
+ cls._load_data()
110
+ for inst in cls._data: # type: ignore
111
+ if inst["codigo"] == codigo:
112
+ return inst
113
+ return None
114
+
115
+ @classmethod
116
+ def buscar_por_tipo(cls, tipo: str) -> list[TipoInstitucionFinanciera]:
117
+ """
118
+ Busca por tipo de institución (insensible a acentos y mayúsculas).
119
+
120
+ Args:
121
+ tipo: Texto a buscar en el tipo de institución
122
+
123
+ Returns:
124
+ Lista de tipos de instituciones que coinciden
125
+
126
+ Ejemplo:
127
+ >>> bancos = InstitucionesFinancieras.buscar_por_tipo("banco")
128
+ >>> for b in bancos:
129
+ ... print(b['tipo'])
130
+ """
131
+ cls._load_data()
132
+ tipo_normalized = normalize_text(tipo)
133
+ return [
134
+ inst
135
+ for inst in cls._data # type: ignore
136
+ if tipo_normalized in normalize_text(inst["tipo"])
137
+ ]
138
+
139
+ @classmethod
140
+ def get_por_regulador(cls, regulador: str) -> list[TipoInstitucionFinanciera]:
141
+ """
142
+ Obtiene instituciones por regulador (insensible a acentos).
143
+
144
+ Args:
145
+ regulador: Nombre o siglas del regulador (CNBV, CNSF, CONSAR, etc.)
146
+
147
+ Returns:
148
+ Lista de instituciones reguladas por esa entidad
149
+
150
+ Ejemplo:
151
+ >>> cnbv = InstitucionesFinancieras.get_por_regulador("CNBV")
152
+ >>> print(f"Instituciones reguladas por CNBV: {len(cnbv)}")
153
+ """
154
+ cls._load_data()
155
+ regulador_normalized = normalize_text(regulador)
156
+ return [
157
+ inst
158
+ for inst in cls._data # type: ignore
159
+ if regulador_normalized in normalize_text(inst["regulador"])
160
+ ]
161
+
162
+ @classmethod
163
+ def get_bancos(cls) -> list[TipoInstitucionFinanciera]:
164
+ """
165
+ Obtiene bancos (múltiples y de desarrollo).
166
+
167
+ Returns:
168
+ Lista de tipos de bancos
169
+
170
+ Ejemplo:
171
+ >>> bancos = InstitucionesFinancieras.get_bancos()
172
+ >>> for banco in bancos:
173
+ ... print(f"{banco['tipo']}: {', '.join(banco['ejemplos'][:3])}")
174
+ """
175
+ cls._load_data()
176
+ return [inst for inst in cls._data if "banco" in inst["tipo"].lower()] # type: ignore
177
+
178
+ @classmethod
179
+ def get_sofomes(cls) -> list[TipoInstitucionFinanciera]:
180
+ """
181
+ Obtiene SOFOMes (ENR y ER).
182
+
183
+ Returns:
184
+ Lista de tipos de SOFOMes
185
+
186
+ Ejemplo:
187
+ >>> sofomes = InstitucionesFinancieras.get_sofomes()
188
+ >>> for sofom in sofomes:
189
+ ... print(f"{sofom['tipo']} - {sofom['regulador']}")
190
+ """
191
+ cls._load_data()
192
+ return [inst for inst in cls._data if "SOFOM" in inst["tipo"]] # type: ignore
193
+
194
+ @classmethod
195
+ def get_sector_popular(cls) -> list[TipoInstitucionFinanciera]:
196
+ """
197
+ Obtiene instituciones de ahorro y crédito popular.
198
+
199
+ Returns:
200
+ Lista de instituciones del sector popular
201
+
202
+ Ejemplo:
203
+ >>> sector_popular = InstitucionesFinancieras.get_sector_popular()
204
+ >>> for inst in sector_popular:
205
+ ... print(inst['tipo'])
206
+ """
207
+ cls._load_data()
208
+ return [
209
+ inst
210
+ for inst in cls._data # type: ignore
211
+ if any(
212
+ keyword in inst["tipo"]
213
+ for keyword in ["Cooperativa", "Financiera Popular", "Ahorro y Crédito"]
214
+ )
215
+ ]
216
+
217
+ @classmethod
218
+ def get_seguros_y_fianzas(cls) -> list[TipoInstitucionFinanciera]:
219
+ """
220
+ Obtiene instituciones de seguros y fianzas.
221
+
222
+ Returns:
223
+ Lista de instituciones de seguros y fianzas
224
+
225
+ Ejemplo:
226
+ >>> seguros = InstitucionesFinancieras.get_seguros_y_fianzas()
227
+ >>> for inst in seguros:
228
+ ... print(f"{inst['tipo']} - {inst['regulador']}")
229
+ """
230
+ cls._load_data()
231
+ return [
232
+ inst
233
+ for inst in cls._data # type: ignore
234
+ if "Seguros" in inst["tipo"] or "Fianzas" in inst["tipo"]
235
+ ]
236
+
237
+ @classmethod
238
+ def get_mercado_valores(cls) -> list[TipoInstitucionFinanciera]:
239
+ """
240
+ Obtiene instituciones del mercado de valores.
241
+
242
+ Returns:
243
+ Lista de instituciones del mercado de valores
244
+
245
+ Ejemplo:
246
+ >>> mercado = InstitucionesFinancieras.get_mercado_valores()
247
+ >>> for inst in mercado:
248
+ ... print(inst['tipo'])
249
+ """
250
+ cls._load_data()
251
+ return [
252
+ inst
253
+ for inst in cls._data # type: ignore
254
+ if any(
255
+ keyword in inst["tipo"]
256
+ for keyword in ["Bolsa", "Casa de Bolsa", "Valores", "Inversión"]
257
+ )
258
+ ]
259
+
260
+ @classmethod
261
+ def get_fintech(cls) -> list[TipoInstitucionFinanciera]:
262
+ """
263
+ Obtiene instituciones de tecnología financiera (Fintech).
264
+
265
+ Returns:
266
+ Lista de instituciones fintech
267
+
268
+ Ejemplo:
269
+ >>> fintech = InstitucionesFinancieras.get_fintech()
270
+ >>> for inst in fintech:
271
+ ... print(f"{inst['tipo']} - {inst['ley_aplicable']}")
272
+ """
273
+ cls._load_data()
274
+ return [
275
+ inst for inst in cls._data if "Tecnología Financiera" in inst["tipo"] # type: ignore
276
+ ]
277
+
278
+ @classmethod
279
+ def get_retiro(cls) -> list[TipoInstitucionFinanciera]:
280
+ """
281
+ Obtiene AFOREs y SIEFOREs.
282
+
283
+ Returns:
284
+ Lista de instituciones del sistema de ahorro para el retiro
285
+
286
+ Ejemplo:
287
+ >>> retiro = InstitucionesFinancieras.get_retiro()
288
+ >>> for inst in retiro:
289
+ ... print(f"{inst['tipo']} - {inst['regulador']}")
290
+ """
291
+ cls._load_data()
292
+ return [
293
+ inst
294
+ for inst in cls._data # type: ignore
295
+ if "AFORE" in inst["tipo"] or "SIEFORE" in inst["tipo"]
296
+ ]
297
+
298
+ @classmethod
299
+ def validar_codigo(cls, codigo: str) -> bool:
300
+ """
301
+ Valida código de institución.
302
+
303
+ Args:
304
+ codigo: Código a validar
305
+
306
+ Returns:
307
+ True si el código existe, False en caso contrario
308
+
309
+ Ejemplo:
310
+ >>> InstitucionesFinancieras.validar_codigo("01") # True
311
+ >>> InstitucionesFinancieras.validar_codigo("99") # False
312
+ """
313
+ cls._load_data()
314
+ return any(inst["codigo"] == codigo for inst in cls._data) # type: ignore
315
+
316
+ @classmethod
317
+ def get_descripcion_regulador(cls, siglas: str) -> str | None:
318
+ """
319
+ Obtiene descripción de regulador.
320
+
321
+ Args:
322
+ siglas: Siglas del regulador (CNBV, CNSF, CONSAR, etc.)
323
+
324
+ Returns:
325
+ Descripción completa del regulador o None si no existe
326
+
327
+ Ejemplo:
328
+ >>> desc = InstitucionesFinancieras.get_descripcion_regulador("CNBV")
329
+ >>> print(desc) # "Comisión Nacional Bancaria y de Valores"
330
+ """
331
+ reguladores = {
332
+ "CNBV": "Comisión Nacional Bancaria y de Valores",
333
+ "CNSF": "Comisión Nacional de Seguros y Fianzas",
334
+ "CONSAR": "Comisión Nacional del Sistema de Ahorro para el Retiro",
335
+ "CONDUSEF": "Comisión Nacional para la Protección y Defensa de los Usuarios de Servicios Financieros",
336
+ "SHCP": "Secretaría de Hacienda y Crédito Público",
337
+ }
338
+ return reguladores.get(siglas.upper())