# -* coding: utf8 *- import datetime class Image: def __init__(self, pilimage, caption=None, dpi=80, alignment="left"): self.imagedata = pilimage self.alignment = alignment self.dpi = dpi self.caption = caption class Text: def __init__(self, content, urgent=False, headline=None): self.paragraphs = [content] self.urgent = urgent self.headline = headline def addParagraph(self, content): self.paragraphs.append(content) class Table: def __init__(self, vatType='gross', tender=False, summary=True): self.entries = [] self.vat = {} self.sum = 0.0 self.tender = tender self.summary = summary if vatType not in ['gross', 'net']: raise ValueError('vatType must be »gross« or »net«') self.vatType = vatType def validEntry(self, entry): '''bekommt einen Eintrag und liefert einen Eintrag wenn ok, wirft ansonsten ValueError. wird benutzt um z.B. die Summe auszurechnen oder ähnliches ''' e = entry if not ('count' in e and 'subject' in e and 'price' in e and 'vat' in e): raise ValueError('Some data is missing!') if 'unit' not in e: e['unit'] = None ret = {'count': e['count'], 'unit': e['unit'], 'subject': e['subject'], 'price': e['price'], 'total': (e['price'] * e['count']), 'vat': e['vat'], 'tender': False, } if 'tender' in e: ret['tender'] = e['tender'] if 'desc' in e: ret['desc'] = e['desc'] return ret def addItem(self, data): '''Fügt eine Zeile ein. data muss ein Dict mit passenden Keys und passenden Typen sein''' d = self.validEntry(data) if not d['vat'] in self.vat: self.vat[d['vat']] = [0, chr(65 + len(self.vat))] if 'tender' not in data or not data['tender']: self.vat[d['vat']][0] += d['total'] self.sum += d['total'] self.entries.append(d) class Invoice: tender = False caption = 'Rechnung' def __init__(self): self.customerno = None self.addresslines = ['', ] self.salutation = 'Sehr geehrte Damen und Herren,' self.id = None self.parts = [] self.pagecount = 0 self.date = datetime.date.today() def setDate(self, date): if type(date) != datetime.date: raise ValueError('date must be of type »datetime.date«') self.date = date class Tender(Invoice): tender = True caption = 'Angebot' class Generic(Invoice): tender = False caption = ''