def test_send_order(create_account): transaction = Transaction( concepto_pago='PRUEBA', institucion_ordenante='90646', cuenta_beneficiario='072691004495711499', institucion_beneficiaria='40072', monto=1020, nombre_beneficiario='Ricardo Sánchez Castillo de la Mancha S.A. de CV', nombre_ordenante=' Ricardo Sánchez Castillo de la Mancha S.A. de CV', cuenta_ordenante='646180157000000004', rfc_curp_ordenante='ND', speid_id='speid_id', tipo_cuenta_beneficiario=40, ) order = transaction.create_order() assert order.institucionOperante == transaction.institucion_ordenante assert order.institucionContraparte == transaction.institucion_beneficiaria assert order.monto == 10.20 assert transaction.clave_rastreo == order.claveRastreo assert transaction.tipo_cuenta_beneficiario == order.tipoCuentaBeneficiario assert transaction.rfc_curp_beneficiario == order.rfcCurpBeneficiario assert transaction.referencia_numerica == order.referenciaNumerica assert order.nombreBeneficiario == ('Ricardo Sanchez Castillo de la Mancha' ' S') assert order.nombreOrdenante == 'Ricardo Sanchez Castillo de la Mancha S' assert len(order.nombreBeneficiario) == 39 assert len(order.nombreOrdenante) == 39 order = transaction.create_order() assert transaction.stp_id == order.id transaction.delete()
def execute(order_val: dict): # Get version version = 0 if "version" in order_val: version = order_val['version'] if time_in_range(START_DOWNTIME, STOP_DOWNTIME, datetime.utcnow().time()): raise ScheduleError transaction = Transaction() try: input = factory.create(version, **order_val) transaction = input.transform() if not clabe.validate_clabe(transaction.cuenta_beneficiario) and ( not luhnmod10.valid(transaction.cuenta_beneficiario)): raise MalformedOrderException() except (MalformedOrderException, TypeError, ValueError): transaction.set_state(Estado.error) transaction.save() raise MalformedOrderException() try: prev_trx = Transaction.objects.get(speid_id=transaction.speid_id) # Si la transacción ya esta como succeeded termina # Puede suceder cuando se corre la misma tarea tiempo después # Y la transacción ya fue confirmada por stp assert prev_trx.estado != Estado.succeeded transaction = prev_trx transaction.events.append(Event(type=EventType.retry)) except DoesNotExist: transaction.events.append(Event(type=EventType.created)) transaction.save() pass except AssertionError: # Para evitar que se vuelva a mandar o regresar se manda la excepción raise ResendSuccessOrderException() if transaction.monto > MAX_AMOUNT: transaction.events.append(Event(type=EventType.error)) transaction.save() raise MalformedOrderException() now = datetime.utcnow() try: # Return transaction after 2 hours of creation assert (now - transaction.created_at) < timedelta(hours=2) transaction.create_order() except ( AssertionError, InvalidAccountType, InvalidAmount, InvalidInstitution, InvalidTrackingKey, PldRejected, ValidationError, ): transaction.set_state(Estado.failed) transaction.save()
def test_fail_send_order_no_account_registered(): transaction = Transaction( concepto_pago='PRUEBA', institucion_ordenante='90646', cuenta_beneficiario='072691004495711499', institucion_beneficiaria='40072', monto=1020, nombre_beneficiario='Ricardo Sánchez Castillo de la Mancha S.A. de CV', nombre_ordenante=' Ricardo Sánchez Castillo de la Mancha S.A. de CV', cuenta_ordenante='646180157000000004', rfc_curp_ordenante='ND', speid_id='speid_id', tipo_cuenta_beneficiario=40, ) transaction_id = transaction.save().id with pytest.raises(MalformedOrderException): transaction.create_order() transaction = Transaction.objects.get(id=transaction_id) assert transaction.estado is Estado.error transaction.delete()