Bank transfer: Allow using external IDs for deduplication (#3803)

* Bank transfer: Allow using external IDs for deduplication

* Do not use empty string in nullable field
This commit is contained in:
Raphael Michel
2024-01-09 14:01:01 +01:00
committed by GitHub
parent 7a2878657d
commit 2c67b82f4a
7 changed files with 95 additions and 4 deletions

View File

@@ -46,7 +46,7 @@ class BankTransactionSerializer(serializers.ModelSerializer):
class Meta:
model = BankTransaction
fields = ('state', 'message', 'checksum', 'payer', 'reference', 'amount', 'date', 'order',
'comment', 'iban', 'bic', 'currency')
'comment', 'iban', 'bic', 'currency', 'external_id')
class BankImportJobSerializer(serializers.ModelSerializer):

View File

@@ -0,0 +1,17 @@
# Generated by Django 4.2.9 on 2024-01-09 09:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("banktransfer", "0010_bigint"),
]
operations = [
migrations.AddField(
model_name="banktransaction",
name="external_id",
field=models.CharField(db_index=True, max_length=190, null=True),
),
]

View File

@@ -82,6 +82,7 @@ class BankTransaction(models.Model):
currency = models.CharField(max_length=10, null=True)
state = models.CharField(max_length=32, choices=STATES, default=STATE_UNCHECKED)
message = models.TextField()
external_id = models.CharField(max_length=190, db_index=True, null=True, blank=True)
checksum = models.CharField(max_length=190, db_index=True)
payer = models.TextField(blank=True)
reference = models.TextField(blank=True)

View File

@@ -307,6 +307,9 @@ def _get_unknown_transactions(job: BankImportJob, data: list, event: Event = Non
known_checksums = set(t['checksum'] for t in BankTransaction.objects.filter(
Q(event=event) if event else Q(organizer=organizer)
).values('checksum'))
known_by_external_id = set((t['external_id'], t['date'], t['amount']) for t in BankTransaction.objects.filter(
Q(event=event) if event else Q(organizer=organizer), external_id__isnull=False
).values('external_id', 'date', 'amount'))
transactions = []
for row in data:
@@ -328,14 +331,17 @@ def _get_unknown_transactions(job: BankImportJob, data: list, event: Event = Non
trans = BankTransaction(event=event, organizer=organizer, import_job=job,
payer=row.get('payer', ''),
reference=row.get('reference', ''),
amount=amount, date=row.get('date', ''),
iban=row.get('iban', ''), bic=row.get('bic', ''),
amount=amount,
date=row.get('date', ''),
iban=row.get('iban', ''),
bic=row.get('bic', ''),
external_id=row.get('external_id'),
currency=event.currency if event else job.currency)
trans.date_parsed = parse_date(trans.date)
trans.checksum = trans.calculate_checksum()
if trans.checksum not in known_checksums:
if trans.checksum not in known_checksums and (not trans.external_id or (trans.external_id, trans.date, trans.amount) not in known_by_external_id):
trans.state = BankTransaction.STATE_UNCHECKED
trans.save()
transactions.append(trans)