From 617bcd584f64c2ef70a8b96b5306aa07aa681b76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felipe=20L=C3=B3pez?= <37890430+felipaoo@users.noreply.github.com> Date: Tue, 16 Aug 2022 10:57:41 -0500 Subject: [PATCH] IDs duplicados (#363) * tipo transaccion * set tipo_transaccion * set tipo transaccion in validators * remove comments * asserts --- speid/models/transaction.py | 7 ++++++- speid/types.py | 5 +++++ speid/validations/speid_transaction.py | 5 ++++- speid/validations/stp_transaction.py | 2 ++ speid/views.py | 6 ++++-- tests/conftest.py | 2 ++ tests/helpers/test_callback_helper.py | 1 + tests/tasks/test_orders.py | 4 +++- tests/views/test_general.py | 3 ++- 9 files changed, 29 insertions(+), 6 deletions(-) diff --git a/speid/models/transaction.py b/speid/models/transaction.py index 8505ec80..23b1dbb0 100644 --- a/speid/models/transaction.py +++ b/speid/models/transaction.py @@ -18,7 +18,7 @@ from speid.exc import MalformedOrderException from speid.helpers import callback_helper from speid.processors import stpmex_client -from speid.types import Estado, EventType +from speid.types import Estado, EventType, TipoTransaccion from .account import Account from .base import BaseModel @@ -57,6 +57,7 @@ class Transaction(Document, BaseModel): created_at = date_now() updated_at = DateTimeField() stp_id = IntField() + tipo: TipoTransaccion = EnumField(TipoTransaccion) fecha_operacion = DateTimeField() institucion_ordenante = StringField() institucion_beneficiaria = StringField() @@ -109,6 +110,10 @@ class Transaction(Document, BaseModel): # The Unique-Sparse index skips over any document that is missing # the indexed field (null values) {'fields': ['+compound_key'], 'unique': True, 'sparse': True}, + { + 'fields': ['+stp_id', '+tipo'], + 'partialFilterExpression': {'tipo': TipoTransaccion.retiro}, + }, ] } diff --git a/speid/types.py b/speid/types.py index 49b34fd1..5bb01cd4 100644 --- a/speid/types.py +++ b/speid/types.py @@ -40,3 +40,8 @@ def convert_to_stp_state(cls, status: Enum) -> str: cls.rejected: 'DEVOLUCION', } return status_to_stp.get(status, 'DEVOLUCION') # type: ignore + + +class TipoTransaccion(str, Enum): + retiro = 'retiro' + deposito = 'deposito' diff --git a/speid/validations/speid_transaction.py b/speid/validations/speid_transaction.py index 362172e0..6af0702c 100644 --- a/speid/validations/speid_transaction.py +++ b/speid/validations/speid_transaction.py @@ -5,6 +5,7 @@ from stpmex.types import TipoCuenta from speid.models import Transaction +from speid.types import TipoTransaccion @dataclass @@ -59,5 +60,7 @@ def __post_init__(self): raise ValueError(f'{cuenta_len} is not a valid cuenta length') def transform(self) -> Transaction: - transaction = Transaction(**self.to_dict()) + transaction_dict = self.to_dict() + transaction_dict['tipo'] = TipoTransaccion.retiro + transaction = Transaction(**transaction_dict) return transaction diff --git a/speid/validations/stp_transaction.py b/speid/validations/stp_transaction.py index 0b3c10b5..c3396aaa 100644 --- a/speid/validations/stp_transaction.py +++ b/speid/validations/stp_transaction.py @@ -7,6 +7,7 @@ from speid.models import Transaction from speid.models.helpers import base62_uuid, camel_to_snake +from speid.types import TipoTransaccion regex = re.compile(r'^[A-Z]{4}[0-9]{6}[A-Z]{6}[A-Z|0-9][0-9]$') @@ -39,6 +40,7 @@ def transform(self) -> Transaction: } trans_dict['stp_id'] = trans_dict.pop('clave', None) trans_dict['monto'] = round(trans_dict['monto'] * 100) + trans_dict['tipo'] = TipoTransaccion.deposito transaction = Transaction(**trans_dict) transaction.speid_id = base62_uuid('SR')() transaction.fecha_operacion = datetime.strptime( diff --git a/speid/views.py b/speid/views.py index 6837c45c..df4842d4 100644 --- a/speid/views.py +++ b/speid/views.py @@ -7,7 +7,7 @@ from speid import app from speid.helpers.transaction_helper import process_incoming_transaction from speid.models import Transaction -from speid.types import Estado +from speid.types import Estado, TipoTransaccion from speid.utils import post logging.basicConfig(level=logging.INFO, format='SPEID: %(message)s') @@ -22,7 +22,9 @@ def health_check(): @app.route('/orden_events', methods=['POST']) def create_orden_events(): try: - transaction = Transaction.objects.get(stp_id=request.json['id']) + transaction = Transaction.objects.get( + stp_id=request.json['id'], tipo=TipoTransaccion.retiro + ) state = Estado.get_state_from_stp(request.json['Estado']) transaction.detalle = str(request.json.get('Detalle', '')) diff --git a/tests/conftest.py b/tests/conftest.py index 6f99f485..70b069c4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -7,6 +7,7 @@ from celery import Celery from speid.models import Transaction +from speid.types import TipoTransaccion SEND_TRANSACTION_TASK = os.environ['SEND_TRANSACTION_TASK'] SEND_STATUS_TRANSACTION_TASK = os.environ['SEND_STATUS_TRANSACTION_TASK'] @@ -41,6 +42,7 @@ def outcome_transaction() -> Generator[Transaction, None, None]: rfc_curp_ordenante='ND', speid_id='go' + dt.datetime.now().strftime('%m%d%H%M%S'), version=1, + tipo=TipoTransaccion.retiro, ) transaction.save() yield transaction diff --git a/tests/helpers/test_callback_helper.py b/tests/helpers/test_callback_helper.py index 135984cf..f2505e36 100644 --- a/tests/helpers/test_callback_helper.py +++ b/tests/helpers/test_callback_helper.py @@ -39,6 +39,7 @@ def test_send_transaction(mock_send_transaction: MagicMock): concepto_pago="PRUEBA", referencia_numerica=2423, empresa="TAMIZI", + tipo='deposito', ) transaction = Transaction(**params) diff --git a/tests/tasks/test_orders.py b/tests/tasks/test_orders.py index 932fd197..34c3f490 100644 --- a/tests/tasks/test_orders.py +++ b/tests/tasks/test_orders.py @@ -20,7 +20,7 @@ ) from speid.models import Transaction from speid.tasks.orders import execute, retry_timeout, send_order -from speid.types import Estado, EventType +from speid.types import Estado, EventType, TipoTransaccion @pytest.mark.parametrize( @@ -94,6 +94,7 @@ def test_create_order_debit_card(physical_account): transaction = Transaction.objects.order_by('-created_at').first() assert transaction.estado is Estado.submitted assert transaction.events[-1].type is EventType.completed + assert transaction.tipo is TipoTransaccion.retiro transaction.delete() @@ -116,6 +117,7 @@ def test_worker_with_version_2(physical_account): transaction = Transaction.objects.order_by('-created_at').first() assert transaction.estado is Estado.submitted assert transaction.events[-1].type is EventType.completed + assert transaction.tipo is TipoTransaccion.retiro transaction.delete() diff --git a/tests/views/test_general.py b/tests/views/test_general.py index a2cbd722..ada3e0f7 100644 --- a/tests/views/test_general.py +++ b/tests/views/test_general.py @@ -4,7 +4,7 @@ from celery import Celery from speid.models import Transaction -from speid.types import Estado +from speid.types import Estado, TipoTransaccion def test_ping(client): @@ -120,6 +120,7 @@ def test_create_orden(client, default_income_transaction): resp = client.post('/ordenes', json=default_income_transaction) transaction = Transaction.objects.order_by('-created_at').first() assert transaction.estado is Estado.succeeded + assert transaction.tipo is TipoTransaccion.deposito assert resp.status_code == 201 assert resp.json['estado'] == 'LIQUIDACION' transaction.delete()