Skip to content

Commit

Permalink
comando para obtener depósitos y confirmarlos (#418)
Browse files Browse the repository at this point in the history
* rebase

* rebse

* logs and assert

* format

* fix

* fix
  • Loading branch information
felipao-mx authored Aug 28, 2023
1 parent 793502c commit 2dab4c4
Show file tree
Hide file tree
Showing 7 changed files with 589 additions and 2 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,5 @@ docker-build
/.mypy_cache
coverage.xml
/.python-version

prueba-cert.pem
1 change: 1 addition & 0 deletions requirements-dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ pytest-vcr==1.0.*
coveralls==3.0.*
wheel==0.40.0
freezegun==1.2.2
requests-mock==1.9.*
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
blinker==1.4
boto3==1.16.*
celery==5.2.3
cepmex==0.2.0
cepmex==0.2.2
Flask==2.2.5
flask-mongoengine==1.0.0
luhnmod10==1.0.2
Expand Down
87 changes: 87 additions & 0 deletions speid/commands/spei.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,26 @@
import datetime as dt

import click
import pytz
from mongoengine import DoesNotExist
from stpmex.business_days import get_next_business_day
from stpmex.types import Estado as StpEstado

from speid import app
from speid.helpers.callback_helper import set_status_transaction
from speid.helpers.transaction_helper import process_incoming_transaction
from speid.models import Event, Transaction
from speid.processors import stpmex_client
from speid.types import Estado, EventType

ESTADOS_DEPOSITOS_VALIDOS = {
StpEstado.confirmada,
StpEstado.liquidada,
StpEstado.traspaso_liquidado,
}

TIPOS_PAGO_DEVOLUCION = {0, 16, 17, 18, 23, 24}


@app.cli.group('speid')
def speid_group():
Expand Down Expand Up @@ -48,5 +63,77 @@ def re_execute_transactions(speid_id):
transaction.create_order()


@speid_group.command('reconciliate-deposits')
@click.argument('fecha_operacion', type=click.DateTime())
@click.argument('claves_rastreo', type=str)
def reconciliate_deposits(
fecha_operacion: dt.datetime, claves_rastreo: str
) -> None:

claves_rastreo_filter = set(claves_rastreo.split(','))
mex_query_date = dt.datetime.utcnow().astimezone(
pytz.timezone('America/Mexico_City')
)

if fecha_operacion.date() < get_next_business_day(mex_query_date):
recibidas = stpmex_client.ordenes.consulta_recibidas(fecha_operacion)
else:
recibidas = stpmex_client.ordenes.consulta_recibidas()

no_procesadas = []
for recibida in recibidas:
if recibida.claveRastreo not in claves_rastreo_filter:
no_procesadas.append(recibida.claveRastreo)
continue
# Se ignora los tipos pago devolución debido a que
# el estado de estas operaciones se envían
# al webhook `POST /orden_events`
if recibida.tipoPago in TIPOS_PAGO_DEVOLUCION:
no_procesadas.append(recibida.claveRastreo)
continue

if recibida.estado not in ESTADOS_DEPOSITOS_VALIDOS:
no_procesadas.append(recibida.claveRastreo)
continue

try:
Transaction.objects.get(
clave_rastreo=recibida.claveRastreo,
fecha_operacion=recibida.fechaOperacion,
)
except DoesNotExist:
# Para reutilizar la lógica actual para abonar depósitos se
# hace una conversión del modelo de respuesta de
# la función `consulta_recibidas` al modelo del evento que envía
# STP por el webhook en `POST /ordenes`
stp_request = dict(
Clave=recibida.idEF,
FechaOperacion=recibida.fechaOperacion.strftime('%Y%m%d'),
InstitucionOrdenante=recibida.institucionContraparte,
InstitucionBeneficiaria=recibida.institucionOperante,
ClaveRastreo=recibida.claveRastreo,
Monto=recibida.monto,
NombreOrdenante=recibida.nombreOrdenante,
TipoCuentaOrdenante=recibida.tipoCuentaOrdenante,
CuentaOrdenante=recibida.cuentaOrdenante,
RFCCurpOrdenante=recibida.rfcCurpOrdenante,
NombreBeneficiario=recibida.nombreBeneficiario,
TipoCuentaBeneficiario=recibida.tipoCuentaBeneficiario,
CuentaBeneficiario=recibida.cuentaBeneficiario,
RFCCurpBeneficiario=getattr(
recibida, 'rfcCurpBeneficiario', 'NA'
),
ConceptoPago=recibida.conceptoPago,
ReferenciaNumerica=recibida.referenciaNumerica,
Empresa=recibida.empresa,
)
click.echo(f'Depósito procesado: {recibida.claveRastreo}')
process_incoming_transaction(stp_request)
else:
no_procesadas.append(recibida.claveRastreo)

click.echo(f'No procesadas: {no_procesadas}')


if __name__ == "__main__":
re_execute_transactions() # pragma: no cover
123 changes: 123 additions & 0 deletions tests/commands/deposits_20230825.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
{
"resultado": {
"lst": [
{
"claveRastreo": "058-25/08/2023/25-300CPWF924",
"conceptoPago": "Transferencia",
"cuentaBeneficiario": "646180157000000004",
"cuentaOrdenante": "058597000027474792",
"empresa": "TAMIZI",
"estado": "CCO",
"fechaOperacion": "20230825",
"horaServidorBanxico": "18:02:31",
"idEF": 34922,
"institucionContraparte": 40058,
"institucionOperante": 90646,
"iva": 0.0,
"medioEntrega": 1,
"monto": 40.0,
"nombreBeneficiario": "No disponible",
"nombreCEP": "Juan Perez",
"nombreOrdenante": "Juan Perez",
"prioridad": 0,
"referenciaNumerica": 240823,
"rfcCEP": "XAXX010101000",
"rfcCurpOrdenante": "ND",
"sello": "abc",
"tipoCuentaBeneficiario": 40,
"tipoCuentaOrdenante": 40,
"tipoPago": 1,
"topologia": "V",
"tsCaptura": 1692921752078,
"tsEntrega": 608,
"tsLiquidacion": 1692921752078
},
{
"claveRastreo": "HSBC438541",
"conceptoPago": "Juan Perez",
"cuentaBeneficiario": "646180157000000004",
"cuentaOrdenante": "021180065652373317",
"empresa": "TAMIZI",
"estado": "D",
"fechaOperacion": "20230825",
"horaServidorBanxico": "14:47:19",
"idEF": 31507,
"institucionContraparte": 40021,
"institucionOperante": 90646,
"iva": 0.0,
"medioEntrega": 1,
"monto": 6000.0,
"nombreBeneficiario": "Transferencia Express",
"nombreOrdenante": "Juan Perez",
"prioridad": 0,
"referenciaNumerica": 250823,
"rfcCurpOrdenante": "XAXX010101000",
"tipoCuentaBeneficiario": 40,
"tipoCuentaOrdenante": 40,
"tipoPago": 1,
"topologia": "V",
"tsCaptura": 1692996439524,
"tsDevolucion": 3654,
"tsLiquidacion": 1692996439524
},
{
"clavePago": "",
"claveRastreo": "AMU0016929218440013495354",
"conceptoPago": "Juan Perez",
"conceptoPago2": "",
"cuentaBeneficiario": "646180157000000004",
"cuentaBeneficiario2": "",
"cuentaOrdenante": "646731258610319776",
"empresa": "TAMIZI",
"estado": "TLQ",
"fechaOperacion": "20230825",
"idEF": 35966,
"institucionContraparte": 90646,
"institucionOperante": 90646,
"medioEntrega": 3,
"monto": 2900.0,
"nombreBeneficiario": "Juan Perez",
"nombreBeneficiario2": "",
"nombreCEP": "CUENCA TECNOLOGIA FINANCIERA SA DE CV",
"nombreOrdenante": "Juan Perez",
"prioridad": 0,
"referenciaCobranza": "",
"referenciaNumerica": 8244561,
"rfcCEP": "XAXX010101000",
"rfcCurpBeneficiario": "ND",
"rfcCurpBeneficiario2": "",
"rfcCurpOrdenante": "XAXX010101000",
"sello": "abc",
"tipoCuentaBeneficiario": 40,
"tipoCuentaOrdenante": 40,
"tipoPago": 1,
"topologia": "V",
"tsCaptura": 1692921845110,
"tsDevolucion": 0,
"tsEntrega": 0,
"tsLiquidacion": 1692921845110
},
{
"causaDevolucion": 3,
"claveRastreo": "CUENCA224487850225",
"claveRastreoDevolucion": "CUENCA224487850225",
"cuentaBeneficiario": "646180157000000004",
"empresa": "TAMIZI",
"estado": "LQ",
"fechaOperacion": "20230825",
"horaServidorBanxico": "18:23:56",
"idEF": 59746,
"institucionContraparte": 40002,
"institucionOperante": 90646,
"medioEntrega": 1,
"monto": 679.58,
"prioridad": 1,
"tipoPago": 0,
"topologia": "V",
"tsCaptura": 1692923037042,
"tsDevolucion": 582.142,
"tsLiquidacion": 1692923037042
}
]
}
}
Loading

0 comments on commit 2dab4c4

Please sign in to comment.