Geldbeträge immer als Decimal
Bernd Wurst

Bernd Wurst commited on 2025-02-16 13:25:32
Zeige 3 geänderte Dateien mit 18 Einfügungen und 18 Löschungen.

... ...
@@ -1,7 +1,7 @@
1 1
 # -* coding: utf8 *-
2 2
 
3 3
 import datetime
4
-
4
+from decimal import Decimal
5 5
 
6 6
 class InvoiceImage(object):
7 7
     def __init__(self, pilimage, caption=None, dpi=80, alignment="left"):
... ...
@@ -27,7 +27,7 @@ class InvoiceTable(object):
27 27
     def __init__(self, vatType='gross', tender=False, summary=True):
28 28
         self.entries = []
29 29
         self.vat = {}
30
-        self.sum = 0.0
30
+        self.sum = Decimal('0.0')
31 31
         self.payments = []
32 32
         self.tender = tender
33 33
         self.summary = summary
... ...
@@ -47,14 +47,14 @@ class InvoiceTable(object):
47 47
                'count': e['count'],
48 48
                'unit': e['unit'],
49 49
                'subject': e['subject'],
50
-               'price': e['price'],
51
-               'total': (e['price'] * e['count']),
52
-               'vat': e['vat'],
50
+               'price': Decimal(e['price']),
51
+               'total': Decimal(e['price'] * e['count']),
52
+               'vat': Decimal(e['vat']),
53 53
                'tender': False,
54 54
                'print_date': True,
55 55
                }
56 56
         if ret['vat'] > 1:
57
-            ret['vat'] = float(ret['vat']) / 100
57
+            ret['vat'] = Decimal(ret['vat'] / 100)
58 58
             
59 59
         if 'tender' in e.keys():
60 60
             ret['tender'] = e['tender']
... ...
@@ -84,7 +84,7 @@ class InvoiceTable(object):
84 84
         self.entries.append({'type': 'title', 'title': title, })
85 85
 
86 86
     def addPayment(self, payment_type, amount, date):
87
-        self.payments.append({"type": payment_type, "amount": amount, "date": date})
87
+        self.payments.append({"type": payment_type, "amount": Decimal(amount), "date": date})
88 88
 
89 89
 
90 90
 RECHNUNG = 380
... ...
@@ -1,7 +1,7 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3 3
 import os.path
4
-
4
+from decimal import Decimal
5 5
 from reportlab.lib.pagesizes import A4
6 6
 from reportlab.lib.units import cm, inch
7 7
 from reportlab.pdfbase import pdfmetrics
... ...
@@ -367,7 +367,7 @@ class PDF(object):
367 367
                 left = self.leftcontent
368 368
                 right = self.rightcontent
369 369
                 self._tableHead(part)
370
-                temp_sum = 0.0
370
+                temp_sum = Decimal('0.0')
371 371
                 odd = True
372 372
                 for el in part.entries:
373 373
                     if el['type'] == 'title':
... ...
@@ -493,7 +493,7 @@ class PDF(object):
493 493
                             self.canvas.setFont(self.font, font_size)
494 494
                             self.y -= self.line_height + self.line_padding
495 495
                             summaries = []
496
-                            vat = 0.0
496
+                            vat = Decimal('0.0')
497 497
                             if len(part.vat) == 1 and list(part.vat.keys())[0] == 0.0:
498 498
                                 self.canvas.drawString(left, self.y - self.font_height,
499 499
                                                        'Dieser Beleg wurde ohne Ausweis von MwSt erstellt.')
... ...
@@ -516,7 +516,7 @@ class PDF(object):
516 516
                                                               _formatPrice((vatdata[0] / (vat + 1)) * vat)))
517 517
                                         else:
518 518
                                             summaries.append(('%s: Durchlaufende Posten ohne Berechnung von MwSt.' % (
519
-                                                vatdata[1]), 0.0))
519
+                                                vatdata[1]), Decimal('0.0')))
520 520
                             summaries.append(('Nettobetrag:', _formatPrice(part.sum - (part.sum / (vat + 1)) * vat)))
521 521
                             summaries.sort()
522 522
                             for line in summaries:
... ...
@@ -546,7 +546,7 @@ class PDF(object):
546 546
                             self.canvas.drawRightString(left + 14.5 * cm, self.y - self.font_height, line[0])
547 547
                             self.canvas.drawRightString(left + 16.8 * cm, self.y - self.font_height, line[1])
548 548
                             self.y -= self.line_height
549
-                        sum = 0
549
+                        sum = Decimal('0.0')
550 550
                         for vat, vatdata in part.vat.items():
551 551
                             sum += (vat + 1) * vatdata[0]
552 552
                         self.canvas.setFont(self.font + '-Bold', font_size)
... ...
@@ -557,7 +557,7 @@ class PDF(object):
557 557
                         self.canvas.drawRightString(left + 16.8 * cm, self.y - self.font_height, _formatPrice(sum))
558 558
                         self.canvas.setFont(self.font, font_size)
559 559
                         self.y -= self.line_height + self.line_padding
560
-                    paysum = 0.0
560
+                    paysum = Decimal('0.0')
561 561
                     for pay in part.payments:
562 562
                         paysum += pay['amount']
563 563
                         descr = 'Zahlung'
... ...
@@ -577,7 +577,7 @@ class PDF(object):
577 577
                         self.y -= self.line_height
578 578
                     sum = part.sum
579 579
                     if part.vatType == 'net':
580
-                        sum = 0
580
+                        sum = Decimal('0.0')
581 581
                         for vat, vatdata in part.vat.items():
582 582
                             sum += (vat + 1) * vatdata[0]
583 583
                     rest = sum - paysum
... ...
@@ -148,10 +148,10 @@ def InvoiceToXML(invoice):
148 148
         doc.trade.delivery.event.occurrence = deliverydate
149 149
 
150 150
     # Line Items
151
-    summe_netto = 0.0
152
-    summe_brutto = 0.0
153
-    summe_bezahlt = 0.0
154
-    summe_ust = 0.0
151
+    summe_netto = Decimal('0.0')
152
+    summe_brutto = Decimal('0.0')
153
+    summe_bezahlt = Decimal('0.0')
154
+    summe_ust = Decimal('0.0')
155 155
     line_id_count = 0
156 156
     textparts = []
157 157
     for part in invoice.parts:
158 158