def test__EnergyValue__update_data_5(database):
    """Creates bookings for advanced pay for the next year."""
    from sw.allotmentclub import EnergyValue, ElectricMeter, EnergyPrice
    from sw.allotmentclub import Booking, BookingKind, BankingAccount
    setUp()
    BookingKind.create(title='Energieabschlag I')
    BookingKind.create(title='Energieabschlag II')
    BankingAccount.create(number='3')
    EnergyPrice.create(year=2016,
                       price=3020,
                       normal_fee=81700,
                       power_fee=243300)
    meter = ElectricMeter.get(1)
    value = EnergyValue.create(electric_meter=meter, year=2016, value=7132)
    assert Booking.query().filter(Booking.accounting_year == 2017).all() == []
    value.update_member()
    value.update_usage()
    value.update_data()
    ap1, ap2 = Booking.query().filter(Booking.accounting_year == 2017).all()
    assert ap1.value == ap2.value == -267800
    assert ap1.member == ap2.member == value.member
    assert ap1.booking_day == datetime.date(2017, 3, 31)
    assert ap2.booking_day == datetime.date(2017, 6, 30)
    assert ap1.purpose == 'Energieabschlag I für Zähler 318992603'
    assert ap2.purpose == 'Energieabschlag II für Zähler 318992603'
Example #2
0
def get_budget_sum(value, request=None, year=None):
    year = year if year else get_selected_year()
    kind = BookingKind.get(value)
    if kind.shorttitle == 'ENAB':
        kind = BookingKind.query().filter_by(shorttitle='ENAN').one()
        query = (Booking.query().filter(Booking.kind == kind).filter(
            Booking.accounting_year == year))
        return 0 - sum(b.value for b in query)
    return sum(b.value for b in get_budget_raw(value, request, year))
Example #3
0
def test_SEPASammlerExportView_1(browser):
    """Testing SEPASammler Energieabschlag 1 XML export."""
    from sw.allotmentclub import SEPASammler, SEPASammlerEntry, BookingKind
    from sw.allotmentclub import Member
    import datetime
    import lxml.etree
    kind = BookingKind.find_or_create(
        title='Energieabschlag I', shorttitle='ENA1')
    sammler = SEPASammler.create(
        booking_day='2018-03-31', accounting_year=2018, kind=kind)
    for iban, value in (('DE12500105170648489890', 2540500),
                        ('EE342200221034126658', 8213400)):
        SEPASammlerEntry.find_or_create(
            sepasammler=sammler, value=value,
            member=Member.create(
                lastname='Müller', direct_debit=True, iban=iban,
                bic='NOLADE21HAL',
                direct_debit_date=datetime.date(2017, 1, 1)))
    setUp()
    browser.login()
    browser.open(
        'http://localhost/accounts/sepa_sammler/{}/export'.format(sammler.id))
    doc = lxml.etree.fromstring(browser.contents.encode('utf-8'))
    assert '1075.39' == doc.find('.//CtrlSum', namespaces=doc.nsmap).text
    assert 'Mueller, ' == doc.findall('.//Nm', namespaces=doc.nsmap)[-1].text
    assert 'MUELLER' == doc.find('.//MndtId', namespaces=doc.nsmap).text
Example #4
0
def test_SEPASammlerExportView_2(browser):
    """Testing SEPASammler Energieabrechnung Sammelüberweisung XML export."""
    from sw.allotmentclub import SEPASammler, SEPASammlerEntry, BookingKind
    from sw.allotmentclub import Member
    import datetime
    import lxml.etree
    kind = BookingKind.find_or_create(
        title='Energieabrechnung', shorttitle='ENAB')
    sammler = SEPASammler.create(
        booking_day='2018-03-31', accounting_year=2018, kind=kind,
        is_ueberweisung=True)
    for iban, value in (('DE12500105170648489890', 2540500),
                        ('EE342200221034126658', 8213400)):
        SEPASammlerEntry.find_or_create(
            sepasammler=sammler, value=value,
            member=Member.create(
                lastname='Müller', direct_debit=True, iban=iban,
                bic='NOLADE21HAL',
                direct_debit_date=datetime.date(2017, 1, 1)))
    setUp()
    browser.login()
    browser.open(
        'http://localhost/accounts/sepa_sammler/{}/export'.format(sammler.id))
    doc = lxml.etree.fromstring(browser.contents.encode('utf-8'))
    assert '1075.39' == doc.find('.//CtrlSum', namespaces=doc.nsmap).text
    assert '2' == doc.find('.//NbOfTxs', namespaces=doc.nsmap).text
    assert ['254.05', '821.34'] == [
        d.text for d in doc.findall('.//InstdAmt', namespaces=doc.nsmap)
    ]
Example #5
0
def get_budget_raw(value, request=None, year=None):
    year = year if year else get_selected_year()
    kind = BookingKind.get(value)
    budget = (Budget.query().filter(Budget.booking_kind == kind).filter(
        Budget.accounting_year == year).one_or_none())
    if budget:
        return [budget]
    return []
Example #6
0
def test_BankingAccountListReportView_1(browser):
    from sw.allotmentclub import Booking, BookingKind, Member
    from ...conftest import assertFileEqual
    import transaction
    kind = BookingKind.find_or_create(
        title='Energieabschlag I', shorttitle='ENA1')
    BookingKind.find_or_create(
        title='Energieabschlag II', shorttitle='ENA2')
    member = Member.find_or_create(lastname='Wehrmann', firstname='Sebastian')
    setUp()
    for b in Booking.query():
        b.kind = kind
        b.member = member
    transaction.commit()

    browser.login()
    browser.open('http://localhost/accounts/report.pdf?for_year=2015')
    assertFileEqual(browser.contents, 'test_account_report_1.pdf')
def test__EnergyValue__update_data_6(database):
    """Creates multiple bookings for multiple meters of the same allotment."""
    from sw.allotmentclub import EnergyValue, ElectricMeter, EnergyPrice
    from sw.allotmentclub import Booking, BookingKind, BankingAccount
    setUp()
    BookingKind.create(title='Energieabrechnung')
    BookingKind.create(title='Energieabschlag I')
    BankingAccount.create(number='3')
    EnergyPrice.create(year=2016,
                       price=3020,
                       normal_fee=81700,
                       power_fee=243300)
    meter = ElectricMeter.get(1)
    value = EnergyValue.create(electric_meter=meter, year=2016, value=7132)
    meter2 = ElectricMeter.get(2)
    value2 = EnergyValue.create(electric_meter=meter2, year=2016, value=14123)
    meter.allotment = meter2.allotment

    assert Booking.query().filter(Booking.accounting_year == 2017).all() == []
    value.update_member()
    value.update_usage()
    value.update_data()
    value2.update_member()
    value2.update_usage()
    value2.update_data()

    ap1, ap2 = Booking.query().filter(Booking.accounting_year == 2017).all()
    assert ap1.value != ap2.value
    assert ap1.member == ap2.member == value.member
    assert ap1.booking_day == ap2.booking_day == datetime.date(2017, 3, 31)
    assert ap1.purpose == 'Energieabschlag I für Zähler 318992603'
    assert ap2.purpose == 'Energieabschlag I für Zähler 136426011'

    enab1, enab2 = Booking.query().filter(
        Booking.accounting_year == 2016).all()
    assert enab1.value != enab2.value
    assert enab1.member == enab2.member == value.member
    assert enab1.booking_day == enab2.booking_day == datetime.date(2016, 8, 31)
    assert enab1.purpose == 'Energieabrechnung für Zähler 318992603'
    assert enab2.purpose == 'Energieabrechnung für Zähler 136426011'
Example #8
0
def setUpSEPASammlerUpdate(kind_shorttitle):
    from sw.allotmentclub import (
        SEPASammler, Booking, BookingKind, BankingAccount, Member)
    kind = BookingKind.find_or_create(title='', shorttitle=kind_shorttitle)
    sammler = SEPASammler.create(
        booking_day='2016-06-30', accounting_year=2016, kind=kind)
    for value in [-2500, -821300]:
        Booking.find_or_create(
            value=value, banking_account=BankingAccount.find_or_create(),
            accounting_year=2016, kind=kind,
            member=Member.create(direct_debit=True))
    setUp()
    return sammler
Example #9
0
def get_incoming_raw(value, request=None, year=None):
    from sqlalchemy.sql.expression import false
    year = year if year else get_selected_year()
    kind = BookingKind.get(value)
    query = (Booking.query().join(Member).filter(Booking.kind == kind).filter(
        Booking.accounting_year == year).filter(
            Booking.ignore_in_reporting == false()).filter(
                Booking.is_splitted == false()).filter(
                    Booking.banking_account_id == 1).filter(
                        Booking.booking_text != 'SAMMEL-LS-EINZUG').filter(
                            ~Booking.purpose.like('%ANZAHL 00000%')))
    sammler = (SEPASammlerEntry.query().join(SEPASammler).join(Member).filter(
        SEPASammler.kind == kind).filter(
            SEPASammlerEntry.ignore_in_reporting == false()).filter(
                SEPASammler.accounting_year == year))
    result = query.all() + sammler.all()
    if kind.shorttitle == 'ENAB':
        result += (get_incoming_raw(
            BookingKind.query().filter_by(shorttitle='ENA1').one().id, request,
            year) + get_incoming_raw(
                BookingKind.query().filter_by(shorttitle='ENA2').one().id,
                request, year))
    return result
Example #10
0
 def update(self):
     account = (BankingAccount.query().filter(
         BankingAccount.number == '1')).one()
     kind = (BookingKind.query().filter(
         BookingKind.title == 'Mitgliedsbeitrag')).one()
     year = get_selected_year()
     for member, fee_data in get_membership_fees(year).items():
         parcel_numbers = fee_data['parcel_number']
         parcel_size = fee_data['parcel_size']
         fee = fee_data['membership_fee']
         Booking.create(
             banking_account=account,
             purpose=(f'Mitgliedsbeitrag {year} Flurstück {parcel_numbers} '
                      f'({parcel_size}qm)'),
             value=0 - fee,
             accounting_year=year,
             booking_day=datetime.date(int(year), 3, 31),
             member=member,
             kind=kind)
Example #11
0
    def update(self):
        output = PdfFileWriter()
        compiler = pybars.Compiler()
        compiled_page = compiler.compile(self.hbs_page)
        cleanr = re.compile('<.*?>')

        for kind in BookingKind.query():
            data = BankingAccountListDetailView(kind, self.request)()['data']
            table_content = []
            for item in data['data']:
                table_content.append([(re.sub(cleanr, '', d['value'])
                                       if d['value'] else '&nbsp;')
                                      for d in item[1:5]])
            table_content = sorted(table_content,
                                   key=lambda x:
                                   (x[1], x[0], x[2]))  # sort by name
            sum_ = sum(
                float(i[0].replace(' €', '').replace('.', '').replace(
                    ',', '.')) for i in table_content)
            sum_ = int(sum_ * 10000)

            body = format_markdown(
                compiled_page(
                    dict(title='{} {}'.format(kind.title, get_selected_year()),
                         content=table_content,
                         summe=format_eur(sum_),
                         header_style=("border: 1px solid black; "
                                       "padding: 2px 2px -1px 2px;"))))
            output = self.add_page(body, output)
        result = BytesIO()
        output.write(result)
        result.seek(0)
        response = self.request.response
        response.set_cookie('fileDownload', value='true')
        response.content_type = 'application/pdf'
        response.content_disposition = 'attachment; filename=Report 2018.pdf'
        response.app_iter = FileIter(result)
        self.result = response