cuenca-validations 2.1.38.dev1__tar.gz → 2.1.39.dev0__tar.gz

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 (36) hide show
  1. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/PKG-INFO +1 -1
  2. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/__init__.py +2 -2
  3. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/enums.py +1 -7
  4. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/requests.py +27 -5
  5. cuenca_validations-2.1.39.dev0/cuenca_validations/version.py +1 -0
  6. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations.egg-info/PKG-INFO +1 -1
  7. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/tests/test_requests.py +24 -0
  8. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/tests/test_types.py +10 -60
  9. cuenca_validations-2.1.38.dev1/cuenca_validations/version.py +0 -1
  10. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/LICENSE +0 -0
  11. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/README.md +0 -0
  12. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/__init__.py +0 -0
  13. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/card_bins.py +0 -0
  14. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/errors.py +0 -0
  15. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/py.typed +0 -0
  16. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/card.py +0 -0
  17. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/files.py +0 -0
  18. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/general.py +0 -0
  19. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/helpers.py +0 -0
  20. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/identities.py +0 -0
  21. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/morals.py +0 -0
  22. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/queries.py +0 -0
  23. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/typing.py +0 -0
  24. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/validators.py +0 -0
  25. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations.egg-info/SOURCES.txt +0 -0
  26. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations.egg-info/dependency_links.txt +0 -0
  27. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations.egg-info/requires.txt +0 -0
  28. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations.egg-info/top_level.txt +0 -0
  29. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/setup.cfg +0 -0
  30. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/setup.py +0 -0
  31. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/tests/__init__.py +0 -0
  32. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/tests/test_card.py +0 -0
  33. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/tests/test_errors.py +0 -0
  34. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/tests/test_helpers.py +0 -0
  35. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/tests/test_statement.py +0 -0
  36. {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/tests/test_validators.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cuenca_validations
3
- Version: 2.1.38.dev1
3
+ Version: 2.1.39.dev0
4
4
  Summary: Cuenca common validations
5
5
  Home-page: https://github.com/cuenca-mx/cuenca-validations
6
6
  Author: Cuenca
@@ -27,6 +27,7 @@ __all__ = [
27
27
  'CardTransactionType',
28
28
  'CardType',
29
29
  'Country',
30
+ 'CodiNotificationRequest',
30
31
  'Curp',
31
32
  'CurpValidationRequest',
32
33
  'CommissionType',
@@ -45,7 +46,6 @@ __all__ = [
45
46
  'FileRequest',
46
47
  'FileUploadRequest',
47
48
  'FraudFundsTransferRequest',
48
- 'FraudFundsTransferTipoPago',
49
49
  'Gender',
50
50
  'IncomeType',
51
51
  'IssuerNetwork',
@@ -146,7 +146,6 @@ from .enums import (
146
146
  EventType,
147
147
  FileExtension,
148
148
  FileFormat,
149
- FraudFundsTransferTipoPago,
150
149
  Gender,
151
150
  IncomeType,
152
151
  IssuerNetwork,
@@ -228,6 +227,7 @@ from .requests import (
228
227
  ApiKeyUpdateRequest,
229
228
  BankAccountValidationRequest,
230
229
  BeneficiaryRequest,
230
+ CodiNotificationRequest,
231
231
  CurpValidationRequest,
232
232
  EndpointRequest,
233
233
  EndpointUpdateRequest,
@@ -1,4 +1,4 @@
1
- from enum import Enum, IntEnum
1
+ from enum import Enum
2
2
 
3
3
 
4
4
  class CardNetwork(str, Enum):
@@ -743,9 +743,3 @@ class RequiredAction(str, Enum):
743
743
  level_up_required = 'level_up_required'
744
744
  level_up_invitation = 'level_up_invitation'
745
745
  fix_documents = 'fix_documents'
746
-
747
-
748
- class FraudFundsTransferTipoPago(IntEnum):
749
- participante_participante = 7
750
- devolucion_especial_ordenes_aceptadas_acreditadas = 23
751
- devolucion_extemporanea_especial_ordenes_acreditadas = 24
@@ -1,7 +1,7 @@
1
1
  import datetime as dt
2
2
  from typing import Annotated, Any, Optional, Union
3
3
 
4
- from clabe import Clabe
4
+ from clabe import BANK_NAMES, Clabe
5
5
  from pydantic import (
6
6
  BaseModel,
7
7
  ConfigDict,
@@ -29,7 +29,6 @@ from ..types.enums import (
29
29
  Country,
30
30
  EcommerceIndicator,
31
31
  FileExtension,
32
- FraudFundsTransferTipoPago,
33
32
  Gender,
34
33
  IncomeType,
35
34
  IssuerNetwork,
@@ -329,16 +328,20 @@ class FraudFundsTransferRequest(BaseRequest):
329
328
  user_id: NonEmptyStr
330
329
  clabe: Optional[Clabe] = None
331
330
  bank_code: Optional[str] = None
332
- tipo_pago: Optional[FraudFundsTransferTipoPago] = None
333
331
  amount: Optional[StrictPositiveInt] = None
334
332
  concepto: Optional[NonEmptyStr] = None
335
333
 
334
+ @field_validator('bank_code')
335
+ @classmethod
336
+ def validate_bank_code(cls, bank_code: Optional[str]) -> Optional[str]:
337
+ if bank_code is not None and bank_code not in BANK_NAMES:
338
+ raise ValueError('Not a valid bank code')
339
+ return bank_code
340
+
336
341
  @model_validator(mode='after')
337
342
  def validate_destination(self) -> 'FraudFundsTransferRequest':
338
343
  if self.clabe is None and self.bank_code is None:
339
344
  raise ValueError('clabe or bank_code required')
340
- if self.bank_code is not None and self.tipo_pago is None:
341
- raise ValueError('tipo_pago required when using bank_code')
342
345
  return self
343
346
 
344
347
 
@@ -459,6 +462,25 @@ class CurpValidationRequest(BaseRequest):
459
462
  return values
460
463
 
461
464
 
465
+ class CodiNotificationRequest(BaseRequest):
466
+ clave_rastreo: str
467
+ status: str
468
+ payment_type: Optional[str] = None
469
+ monto: Optional[int] = None
470
+ concepto: Optional[str] = None
471
+ cuenta_ordenante: Optional[str] = None
472
+ cuenta_beneficiario: Optional[str] = None
473
+ nombre_ordenante: Optional[str] = None
474
+ nombre_beneficiario: Optional[str] = None
475
+ referencia_numerica: Optional[str] = None
476
+ alias_celular_ordenante: Optional[str] = None
477
+ digito_verificador_ordenante: Optional[str] = None
478
+ alias_celular_beneficiario: Optional[str] = None
479
+ digito_verificador_beneficiario: Optional[str] = None
480
+ folio_esquema: str
481
+ estampa_tiempo_cobro: Optional[int] = None
482
+
483
+
462
484
  class TOSRequest(BaseModel):
463
485
  type: TermsOfService
464
486
  version: str
@@ -0,0 +1 @@
1
+ __version__ = '2.1.39.dev0'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cuenca_validations
3
- Version: 2.1.38.dev1
3
+ Version: 2.1.39.dev0
4
4
  Summary: Cuenca common validations
5
5
  Home-page: https://github.com/cuenca-mx/cuenca-validations
6
6
  Author: Cuenca
@@ -4,6 +4,7 @@ from pydantic_extra_types.phone_numbers import PhoneNumber
4
4
 
5
5
  from cuenca_validations.types.enums import VerificationType
6
6
  from cuenca_validations.types.requests import (
7
+ CodiNotificationRequest,
7
8
  PasswordResetRequest,
8
9
  UpdateTransferRequest,
9
10
  UserTOSAgreementRequest,
@@ -123,3 +124,26 @@ def test_update_transfer_request_forbids_extra() -> None:
123
124
  {'status': 'succeeded', 'foo': 'bar'}
124
125
  )
125
126
  assert 'Extra inputs are not permitted' in str(ex.value)
127
+
128
+
129
+ def test_codi_notification_request_serializes() -> None:
130
+ payload: DictStrAny = {
131
+ 'clave_rastreo': 'LT123456789',
132
+ 'status': 'succeeded',
133
+ 'payment_type': '19',
134
+ 'monto': 10000,
135
+ 'concepto': 'Pago CoDi test',
136
+ 'cuenta_ordenante': '646180157000000001',
137
+ 'cuenta_beneficiario': '646180157000000002',
138
+ 'nombre_ordenante': 'Juan Perez',
139
+ 'nombre_beneficiario': 'Maria Lopez',
140
+ 'folio_esquema': '25535dd9e425535dd9ee',
141
+ 'estampa_tiempo_cobro': 1704067200000,
142
+ 'referencia_numerica': '1234567',
143
+ 'alias_celular_ordenante': '2700754676',
144
+ 'digito_verificador_ordenante': '34',
145
+ 'alias_celular_beneficiario': '0754676270',
146
+ 'digito_verificador_beneficiario': '27',
147
+ }
148
+ req = CodiNotificationRequest.model_validate(payload)
149
+ assert req.model_dump() == payload
@@ -675,69 +675,19 @@ def test_bank_account_validation_clabe_request():
675
675
  assert BankAccountValidationRequest(account_number='646180157098510917')
676
676
 
677
677
 
678
- @pytest.mark.parametrize(
679
- 'data, expected_dump',
680
- [
681
- (
682
- dict(
683
- user_id='US123',
684
- clabe='646180157098510917',
685
- amount=10000,
686
- concepto=' Devolución fraude ',
687
- ),
688
- dict(
689
- user_id='US123',
690
- clabe='646180157098510917',
691
- amount=10000,
692
- concepto='Devolución fraude',
693
- ),
694
- ),
695
- (
696
- dict(user_id='US123', clabe='646180157098510917'),
697
- dict(user_id='US123', clabe='646180157098510917'),
698
- ),
699
- *[
700
- (
701
- dict(
702
- user_id='US123',
703
- bank_code='40012',
704
- tipo_pago=tipo_pago,
705
- amount=5000,
706
- ),
707
- dict(
708
- user_id='US123',
709
- bank_code='40012',
710
- tipo_pago=tipo_pago,
711
- amount=5000,
712
- ),
713
- )
714
- for tipo_pago in (7, 23, 24)
715
- ],
716
- ],
717
- )
718
- def test_fraud_funds_transfer_request(data, expected_dump):
719
- request = FraudFundsTransferRequest(**data)
720
- assert request.model_dump() == expected_dump
678
+ def test_fraud_funds_transfer_request():
679
+ assert FraudFundsTransferRequest(
680
+ user_id='US123',
681
+ bank_code='40012',
682
+ ).model_dump() == {'user_id': 'US123', 'bank_code': '40012'}
721
683
 
684
+ with pytest.raises(ValidationError) as exc:
685
+ FraudFundsTransferRequest(user_id='US123')
686
+ assert 'clabe or bank_code required' in str(exc.value)
722
687
 
723
- @pytest.mark.parametrize(
724
- 'data, expected_error',
725
- [
726
- (dict(user_id='US123'), 'clabe or bank_code required'),
727
- (
728
- dict(user_id='US123', bank_code='40012'),
729
- 'tipo_pago required when using bank_code',
730
- ),
731
- (
732
- dict(user_id='US123', bank_code='40012', tipo_pago=1),
733
- 'Input should be 7, 23 or 24',
734
- ),
735
- ],
736
- )
737
- def test_fraud_funds_transfer_request_invalid(data, expected_error):
738
688
  with pytest.raises(ValidationError) as exc:
739
- FraudFundsTransferRequest(**data)
740
- assert expected_error in str(exc.value)
689
+ FraudFundsTransferRequest(user_id='US123', bank_code='99999')
690
+ assert 'Not a valid bank code' in str(exc.value)
741
691
 
742
692
 
743
693
  @pytest.mark.parametrize(
@@ -1 +0,0 @@
1
- __version__ = '2.1.38.dev1'