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.
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/PKG-INFO +1 -1
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/__init__.py +2 -2
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/enums.py +1 -7
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/requests.py +27 -5
- cuenca_validations-2.1.39.dev0/cuenca_validations/version.py +1 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations.egg-info/PKG-INFO +1 -1
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/tests/test_requests.py +24 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/tests/test_types.py +10 -60
- cuenca_validations-2.1.38.dev1/cuenca_validations/version.py +0 -1
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/LICENSE +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/README.md +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/__init__.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/card_bins.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/errors.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/py.typed +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/card.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/files.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/general.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/helpers.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/identities.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/morals.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/queries.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/typing.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/validators.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations.egg-info/SOURCES.txt +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations.egg-info/dependency_links.txt +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations.egg-info/requires.txt +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations.egg-info/top_level.txt +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/setup.cfg +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/setup.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/tests/__init__.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/tests/test_card.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/tests/test_errors.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/tests/test_helpers.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/tests/test_statement.py +0 -0
- {cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/tests/test_validators.py +0 -0
|
@@ -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,
|
{cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/enums.py
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from enum import Enum
|
|
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'
|
|
@@ -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
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
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(
|
|
740
|
-
assert
|
|
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'
|
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/__init__.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/card_bins.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/errors.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/py.typed
RENAMED
|
File without changes
|
{cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/card.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/files.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/types/morals.py
RENAMED
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/typing.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.38.dev1 → cuenca_validations-2.1.39.dev0}/cuenca_validations/validators.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|