diff --git a/cuenca_validations/types/requests.py b/cuenca_validations/types/requests.py index 1357352e..661db882 100644 --- a/cuenca_validations/types/requests.py +++ b/cuenca_validations/types/requests.py @@ -1,7 +1,7 @@ import datetime as dt from typing import Annotated, Any, Optional, Union -from clabe import Clabe +from clabe import BANK_NAMES, Clabe from pydantic import ( BaseModel, ConfigDict, @@ -326,10 +326,24 @@ class WalletTransactionRequest(BaseRequest): class FraudFundsTransferRequest(BaseRequest): user_id: NonEmptyStr - clabe: Clabe + clabe: Optional[Clabe] = None + bank_code: Optional[str] = None amount: Optional[StrictPositiveInt] = None concepto: Optional[NonEmptyStr] = None + @field_validator('bank_code') + @classmethod + def validate_bank_code(cls, bank_code: Optional[str]) -> Optional[str]: + if bank_code is not None and bank_code not in BANK_NAMES: + raise ValueError('Not a valid bank code') + return bank_code + + @model_validator(mode='after') + def validate_destination(self) -> 'FraudFundsTransferRequest': + if self.clabe is None and self.bank_code is None: + raise ValueError('clabe or bank_code required') + return self + class FraudValidationRequest(BaseModel): amount: StrictPositiveInt diff --git a/cuenca_validations/version.py b/cuenca_validations/version.py index 7c11f9ad..c8942909 100644 --- a/cuenca_validations/version.py +++ b/cuenca_validations/version.py @@ -1 +1 @@ -__version__ = '2.1.37' +__version__ = '2.1.38' diff --git a/tests/test_types.py b/tests/test_types.py index 26ca75de..34e7f26d 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -676,30 +676,18 @@ def test_bank_account_validation_clabe_request(): def test_fraud_funds_transfer_request(): - request = FraudFundsTransferRequest( + assert FraudFundsTransferRequest( user_id='US123', - clabe='646180157098510917', - amount=10000, - concepto=' Devolución fraude ', - ) - - assert request.concepto == 'Devolución fraude' - assert request.model_dump() == { - 'user_id': 'US123', - 'clabe': '646180157098510917', - 'amount': 10000, - 'concepto': 'Devolución fraude', - } + bank_code='40012', + ).model_dump() == {'user_id': 'US123', 'bank_code': '40012'} - request_full_balance = FraudFundsTransferRequest( - user_id='US123', - clabe='646180157098510917', - ) + with pytest.raises(ValidationError) as exc: + FraudFundsTransferRequest(user_id='US123') + assert 'clabe or bank_code required' in str(exc.value) - assert request_full_balance.model_dump() == { - 'user_id': 'US123', - 'clabe': '646180157098510917', - } + with pytest.raises(ValidationError) as exc: + FraudFundsTransferRequest(user_id='US123', bank_code='99999') + assert 'Not a valid bank code' in str(exc.value) @pytest.mark.parametrize(