Skip to content

Commit 727e817

Browse files
Fix handling of CAMT files with charges.
1 parent 672d901 commit 727e817

File tree

5 files changed

+167
-12
lines changed

5 files changed

+167
-12
lines changed

django/geno/billing.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1498,20 +1498,26 @@ def process_sepa_transactions(data):
14981498
def add_sepa_transaction(book, tx, errors, skipped, success):
14991499
# tx: 'id': tx_id, 'date': date, 'amount': amount, 'reference': reference_nr,
15001500
# 'debtor': debtor, 'extra_info': additional_info, 'charges': charges
1501+
addtl_info = []
1502+
if tx.get("extra_info"):
1503+
addtl_info.append(tx["extra_info"])
1504+
if tx.get("debtor"):
1505+
addtl_info.append(tx["debtor"])
1506+
if tx.get("charges"):
1507+
addtl_info.append("Charges: %s" % tx["charges"])
15011508
bill_info = parse_reference_nr(tx["reference_nr"])
15021509
if "error" in bill_info:
15031510
errors.append(
1504-
"Ungültige Referenznummer: %s für Buchung %s - CHF %s"
1505-
% (bill_info["error"], tx["date"], tx["amount"])
1511+
"Ungültige Referenznummer: %s für Buchung %s - CHF %s (Referenznr. %s, %s)"
1512+
% (
1513+
bill_info["error"],
1514+
tx["date"],
1515+
tx["amount"],
1516+
tx["reference_nr"],
1517+
"/".join(addtl_info),
1518+
)
15061519
)
15071520
return
1508-
addtl_info = []
1509-
if tx["extra_info"]:
1510-
addtl_info.append(tx["extra_info"])
1511-
if tx["debtor"]:
1512-
addtl_info.append(tx["debtor"])
1513-
if tx["charges"]:
1514-
addtl_info.append("Charges: %s" % tx["charges"])
15151521
if bill_info["person"]:
15161522
bill_info_name = bill_info["person"]
15171523
else:

django/geno/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,7 @@ def get_context(self):
539539
if (
540540
self.organization.startswith("Verein ")
541541
or self.organization.endswith("verein")
542+
or self.organization.startswith("Hausverein")
542543
or self.organization.startswith("Verband ")
543544
or self.organization.endswith("verband")
544545
or self.organization.startswith("Regionalverband")

django/geno/sepa_reader.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,17 @@ def read_camt_transaction(data, tr, date_str, entry_ref=None):
2424
tr["refs"].get("instruction_id", ""),
2525
)
2626
amount = tr["amount"]["_value"]
27+
charges = ""
2728
if "charges" in tr:
28-
charges = tr["charges"]["total"]
29-
else:
30-
charges = ""
29+
if "total" in tr["charges"]:
30+
charges = tr["charges"]["total"]
31+
elif tr["charges"].get("record", []):
32+
if len(tr["charges"]["record"]) == 1:
33+
charges = tr["charges"]["record"][0]["amount"]["_value"]
34+
else:
35+
raise SepaReaderException(
36+
"More than one charge record: %s %s" % (tx_id, tr["charges"])
37+
)
3138
if "related_parties" not in tr or "debtor" not in tr["related_parties"]:
3239
return [
3340
"Ignoring transaction without debtor: %s" % tr["amount"]["_value"],
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
3+
<BkToCstmrDbtCdtNtfctn>
4+
<GrpHdr>
5+
<MsgId>161935259201_1</MsgId>
6+
<CreDtTm>2025-06-28T01:31:37.086+02:00</CreDtTm>
7+
<MsgPgntn>
8+
<PgNb>1</PgNb>
9+
<LastPgInd>true</LastPgInd>
10+
</MsgPgntn>
11+
<AddtlInf>SPS/PROD</AddtlInf>
12+
</GrpHdr>
13+
<Ntfctn>
14+
<Id>161935259201</Id>
15+
<CreDtTm>2025-06-28T01:31:37.086+02:00</CreDtTm>
16+
<FrToDt>
17+
<FrDtTm>2020-07-13T00:00:00.000+02:00</FrDtTm>
18+
<ToDtTm>2025-07-10T02:00:00.000+02:00</ToDtTm>
19+
</FrToDt>
20+
<RptgSrc>
21+
<Prtry>C53F</Prtry>
22+
</RptgSrc>
23+
<Acct>
24+
<Id>
25+
<IBAN>CH5600790000000351934</IBAN>
26+
</Id>
27+
<Ccy>CHF</Ccy>
28+
<Ownr>
29+
<Nm>Muster-Genossenschaft</Nm>
30+
<PstlAdr>
31+
<StrtNm>Musterstrasse 257</StrtNm>
32+
<PstCd>3018</PstCd>
33+
<TwnNm>Bern</TwnNm>
34+
</PstlAdr>
35+
</Ownr>
36+
</Acct>
37+
<Ntry>
38+
<NtryRef>CH7830790000000351934</NtryRef>
39+
<Amt Ccy="CHF">50.00</Amt>
40+
<CdtDbtInd>CRDT</CdtDbtInd>
41+
<Sts>BOOK</Sts>
42+
<BookgDt>
43+
<Dt>2025-06-28</Dt>
44+
</BookgDt>
45+
<ValDt>
46+
<Dt>2025-06-28</Dt>
47+
</ValDt>
48+
<AcctSvcrRef>424500009094184744</AcctSvcrRef>
49+
<BkTxCd>
50+
<Domn>
51+
<Cd>PMNT</Cd>
52+
<Fmly>
53+
<Cd>RCDT</Cd>
54+
<SubFmlyCd>VCOM</SubFmlyCd>
55+
</Fmly>
56+
</Domn>
57+
</BkTxCd>
58+
<NtryDtls>
59+
<TxDtls>
60+
<Refs>
61+
<AcctSvcrRef>424500009094184743</AcctSvcrRef>
62+
<AcctSvcrTxId>424500009094184743</AcctSvcrTxId>
63+
</Refs>
64+
<Amt Ccy="CHF">50.00</Amt>
65+
<CdtDbtInd>CRDT</CdtDbtInd>
66+
<BkTxCd>
67+
<Domn>
68+
<Cd>PMNT</Cd>
69+
<Fmly>
70+
<Cd>RCDT</Cd>
71+
<SubFmlyCd>ATXN</SubFmlyCd>
72+
</Fmly>
73+
</Domn>
74+
</BkTxCd>
75+
<Chrgs>
76+
<Rcrd>
77+
<Amt Ccy="CHF">1.20</Amt>
78+
<ChrgInclInd>false</ChrgInclInd>
79+
<Tp>
80+
<Prtry>
81+
<Id>2</Id>
82+
</Prtry>
83+
</Tp>
84+
</Rcrd>
85+
</Chrgs>
86+
<RltdPties>
87+
<Dbtr>
88+
<Nm>Hans Muster</Nm>
89+
<PstlAdr>
90+
<AdrLine>Musterweg 9</AdrLine>
91+
<AdrLine>CH-3004 Bern</AdrLine>
92+
</PstlAdr>
93+
</Dbtr>
94+
</RltdPties>
95+
<RltdAgts>
96+
<DbtrAgt>
97+
<FinInstnId>
98+
<BICFI>BCLRCHBBXXX</BICFI>
99+
<Nm>Bank Taler AG</Nm>
100+
<PstlAdr>
101+
<Ctry>CH</Ctry>
102+
<AdrLine>4000 Basel</AdrLine>
103+
</PstlAdr>
104+
</FinInstnId>
105+
</DbtrAgt>
106+
</RltdAgts>
107+
<RmtInf>
108+
<Strd>
109+
<CdtrRefInf>
110+
<Tp>
111+
<CdOrPrtry>
112+
<Prtry>QRR</Prtry>
113+
</CdOrPrtry>
114+
</Tp>
115+
<Ref>360000000002000000003620253</Ref>
116+
</CdtrRefInf>
117+
<AddtlRmtInf>Jahresbeitrag 2025 mit Gebühren</AddtlRmtInf>
118+
</Strd>
119+
</RmtInf>
120+
</TxDtls>
121+
</NtryDtls>
122+
<AddtlNtryInf>Zahlungseingang QRR</AddtlNtryInf>
123+
</Ntry>
124+
</Ntfctn>
125+
</BkToCstmrDbtCdtNtfctn>
126+
</Document>

django/geno/tests/test_sepa_reader.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import datetime
2+
13
from sepa import parser
24

35
from geno.sepa_reader import read_camt
@@ -71,6 +73,19 @@ def test_parse_testfiles(self):
7173
"reference_nr": "360000000002000000003620253",
7274
"debtor": "Hans Muster",
7375
"extra_info": "Jahresbeitrag 2025",
76+
"date": datetime.date(2025, 6, 27),
77+
},
78+
},
79+
{
80+
"file": "camt.054_CH5600790016583351934_2025-06-27_00070_with_charges.xml",
81+
"num_transactions": 1,
82+
"data": {
83+
"amount": "50.00",
84+
"reference_nr": "360000000002000000003620253",
85+
"debtor": "Hans Muster",
86+
"extra_info": "Jahresbeitrag 2025 mit Gebühren",
87+
"charges": "1.20",
88+
"date": datetime.date(2025, 6, 28),
7489
},
7590
},
7691
]

0 commit comments

Comments
 (0)