Improvements for bank transfer importing (#1762)

Co-authored-by: Raphael Michel <michel@rami.io>
Co-authored-by: Raphael Michel <mail@raphaelmichel.de>
This commit is contained in:
Felix Rindt
2020-10-22 11:00:36 +02:00
committed by GitHub
parent 9e4dc344a4
commit a62c7939ae
26 changed files with 1204 additions and 139 deletions

View File

@@ -2,6 +2,7 @@ import logging
import re
from decimal import Decimal
import dateutil.parser
from celery.exceptions import MaxRetriesExceededError
from django.conf import settings
from django.db import transaction
@@ -41,9 +42,9 @@ def notify_incomplete_payment(o: Order):
def cancel_old_payments(order):
for p in order.payments.filter(
state__in=(OrderPayment.PAYMENT_STATE_PENDING,
OrderPayment.PAYMENT_STATE_CREATED),
provider='banktransfer',
state__in=(OrderPayment.PAYMENT_STATE_PENDING,
OrderPayment.PAYMENT_STATE_CREATED),
provider='banktransfer',
):
try:
with transaction.atomic():
@@ -64,8 +65,8 @@ def cancel_old_payments(order):
@transaction.atomic
def _handle_transaction(trans: BankTransaction, code: str, event: Event=None, organizer: Organizer=None,
slug: str=None):
def _handle_transaction(trans: BankTransaction, code: str, event: Event = None, organizer: Organizer = None,
slug: str = None):
if event:
try:
trans.order = event.orders.get(code=code)
@@ -117,8 +118,10 @@ def _handle_transaction(trans: BankTransaction, code: str, event: Event=None, or
p.info_data = {
'reference': trans.reference,
'date': trans.date,
'date': trans.date_parsed.isoformat() if trans.date_parsed else trans.date,
'payer': trans.payer,
'iban': trans.iban,
'bic': trans.bic,
'trans_id': trans.pk
}
@@ -150,7 +153,18 @@ def _handle_transaction(trans: BankTransaction, code: str, event: Event=None, or
trans.save()
def _get_unknown_transactions(job: BankImportJob, data: list, event: Event=None, organizer: Organizer=None):
def parse_date(date_str):
try:
return dateutil.parser.parse(
date_str,
dayfirst="." in date_str,
).date()
except (ValueError, OverflowError):
pass
return None
def _get_unknown_transactions(job: BankImportJob, data: list, event: Event = None, organizer: Organizer = None):
amount_pattern = re.compile("[^0-9.-]")
known_checksums = set(t['checksum'] for t in BankTransaction.objects.filter(
Q(event=event) if event else Q(organizer=organizer)
@@ -176,8 +190,11 @@ def _get_unknown_transactions(job: BankImportJob, data: list, event: Event=None,
trans = BankTransaction(event=event, organizer=organizer, import_job=job,
payer=row.get('payer', ''),
reference=row['reference'],
amount=amount,
date=row['date'])
amount=amount, date=row['date'],
iban=row.get('iban', ''), bic=row.get('bic', ''))
trans.date_parsed = parse_date(trans.date)
trans.checksum = trans.calculate_checksum()
if trans.checksum not in known_checksums:
trans.state = BankTransaction.STATE_UNCHECKED