Source code for wtfs.models.invoice

from csv import writer
from datetime import datetime
from onegov.wtfs.models.municipality import Municipality
from onegov.wtfs.models.scan_job import ScanJob


from typing import TYPE_CHECKING
if TYPE_CHECKING:
    from _typeshed import SupportsWrite
    from datetime import date
    from sqlalchemy.orm import Session


[docs] class Invoice:
[docs] from_date: 'date | None'
[docs] to_date: 'date | None'
[docs] cs2_user: str | None
[docs] subject: str | None
[docs] municipality_id: str | None
[docs] accounting_unit: str | None
[docs] revenue_account: str | None
def __init__(self, session: 'Session'):
[docs] self.session = session
self.from_date = None self.to_date = None self.cs2_user = None self.subject = None self.municipality_id = None self.accounting_unit = None self.revenue_account = None
[docs] def export(self, file: 'SupportsWrite[str]') -> None: csv = writer(file, delimiter=';') now = datetime.now() current_date = f'{now:%Y-%m-%d}' current_time = f'{now:%H.%M.%S}' query = self.session.query(ScanJob) query = query.join(Municipality) if self.from_date: query = query.filter(ScanJob.dispatch_date >= self.from_date) if self.to_date: query = query.filter(ScanJob.dispatch_date <= self.to_date) if self.municipality_id: query = query.filter( ScanJob.municipality_id == self.municipality_id ) query = query.order_by( Municipality.meta['bfs_number'], Municipality.meta['gpn_number'], ScanJob.delivery_number ) item_number = 1 municipality_count = 0 last_municipality = None for scan_job in query: municipality = scan_job.municipality if municipality == last_municipality: item_number += 1 else: item_number = 1 municipality_count += 1 csv.writerow(( f'{now:%Y%m%d}{municipality_count}', current_date, current_time, f'{municipality.gpn_number:08}', f'{item_number:05}', f'{municipality.gpn_number:08}', self.subject, f'{item_number:05}', f'{item_number:03}', current_date, current_date, current_date, f'{municipality.gpn_number:08}', f'{int((scan_job.return_scanned_tax_forms or 0) * 1000):+018}', f'Lieferscheinnummer {scan_job.delivery_number}', f'{int(municipality.price_per_quantity * 10000000):+018}', f'{int(municipality.price_per_quantity * 10000000):+018}', '1', current_date, municipality.address_supplement or '', self.cs2_user, '000', self.accounting_unit, self.revenue_account, )) last_municipality = municipality