mirror of
https://github.com/pretix/pretix.git
synced 2026-05-04 15:04:03 +00:00
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:
@@ -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):
|
||||
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user