コード例 #1
0
def test_order_until_today_table_header_should_comply_order_table_header():
    component_under_test = OrderDauerauftrag()

    component_under_test.add(datum('01.01.2020'), datum('02.02.2020'),
                             'monatlich', '1name', '1konto', '1depotwert', 100)

    result = component_under_test.get_all_order_until_today()

    assert sorted(result.columns) == sorted(Order.TABLE_HEADER)
コード例 #2
0
def test_order_until_today_with_date_in_future_should_be_empty():
    component_under_test = OrderDauerauftrag()

    component_under_test.add(datum('01.01.3020'), datum('01.01.3021'),
                             'monatlich', 'future', '1konto', '1depotwert',
                             333)

    result = component_under_test.get_all_order_until_today()

    assert len(result) == 0
コード例 #3
0
def test_order_until_today_with_invalid_dates_should_be_empty():
    component_under_test = OrderDauerauftrag()

    component_under_test.add(datum('01.01.2020'), datum('01.01.2019'),
                             'monatlich', 'invalid', '1konto', '1depotwert',
                             222)

    result = component_under_test.get_all_order_until_today()

    assert len(result) == 0
コード例 #4
0
ファイル: __init__.py プロジェクト: dmkif/BudgetButlerWeb
 def __init__(self, name, ausgeschlossene_kategorien=set()):
     self.name = name
     self.dauerauftraege = Dauerauftraege()
     self.gemeinsamebuchungen = Gemeinsamebuchungen()
     self.einzelbuchungen = Einzelbuchungen()
     self.sparbuchungen = Sparbuchungen()
     self.sparkontos = Kontos()
     self.depotwerte = Depotwerte()
     self.order = Order()
     self.orderdauerauftrag = OrderDauerauftrag()
     self.depotauszuege = Depotauszuege()
     self.einzelbuchungen.ausgeschlossene_kategorien = ausgeschlossene_kategorien
     self.tainted = 0
コード例 #5
0
def test_add_should_add():
    component_under_test = OrderDauerauftrag()

    component_under_test.add(datum('01.01.2020'), datum('01.01.2021'),
                             'monatlich', '1name', '1konto', '1depotwert', 100)

    assert len(component_under_test.content) == 1
    assert component_under_test.content.Startdatum[0] == datum('01.01.2020')
    assert component_under_test.content.Endedatum[0] == datum('01.01.2021')
    assert component_under_test.content.Rhythmus[0] == 'monatlich'
    assert component_under_test.content.Name[0] == '1name'
    assert component_under_test.content.Konto[0] == '1konto'
    assert component_under_test.content.Depotwert[0] == '1depotwert'
    assert component_under_test.content.Wert[0] == 100
コード例 #6
0
def test_get_aktuelle_should_only_return_current():
    component_under_test = OrderDauerauftrag()

    component_under_test.add(datum('01.01.2020'), datum('02.02.2020'),
                             'monatlich', 'past', '1konto', '1depotwert', 100)
    component_under_test.add(datum('01.01.2020'), datum('02.02.2050'),
                             'monatlich', '1name', '1konto', '1depotwert', 100)
    component_under_test.add(datum('01.01.2050'), datum('02.02.2050'),
                             'monatlich', 'future', '1konto', '1depotwert',
                             100)

    result = component_under_test.aktuelle()

    assert len(result) == 1
    assert result[0]['Name'] == '1name'
コード例 #7
0
def test_order_until_today():
    component_under_test = OrderDauerauftrag()

    component_under_test.add(datum('01.01.2020'), datum('02.02.2020'),
                             'monatlich', '1name', '1konto', '1depotwert', 100)

    result = component_under_test.get_all_order_until_today()

    assert len(result) == 2
    assert result.Datum[0] == datum('01.01.2020')
    assert result.Name[0] == '1name'
    assert result.Konto[0] == '1konto'
    assert result.Depotwert[0] == '1depotwert'
    assert result.Wert[0] == 100

    assert result.Datum[1] == datum('01.02.2020')
    assert result.Name[1] == '1name'
    assert result.Konto[1] == '1konto'
    assert result.Depotwert[1] == '1depotwert'
    assert result.Wert[1] == 100
コード例 #8
0
def test_get_all_order_until_today_should_use_end_of_month_when_overflow():
    component_under_test = OrderDauerauftrag()
    component_under_test.add(datum('31.01.2010'), datum('02.03.2010'),
                             FREQUENCY_MONATLICH_NAME, 'some name', '1konto',
                             '1depotwert', 100)

    result = component_under_test.get_all_order_until_today()

    assert len(result) == 2
    first_row = result.iloc[0]
    assert first_row.Datum == datum('31.1.2010')
    assert first_row.Name == 'some name'
    assert first_row.Depotwert == '1depotwert'
    assert first_row.Wert == 100

    second_row = result.iloc[1]
    assert second_row.Datum == datum('28.2.2010')
    assert second_row.Name == 'some name'
    assert second_row.Depotwert == '1depotwert'
    assert second_row.Wert == 100
コード例 #9
0
ファイル: __init__.py プロジェクト: dmkif/BudgetButlerWeb
class Database:
    def __init__(self, name, ausgeschlossene_kategorien=set()):
        self.name = name
        self.dauerauftraege = Dauerauftraege()
        self.gemeinsamebuchungen = Gemeinsamebuchungen()
        self.einzelbuchungen = Einzelbuchungen()
        self.sparbuchungen = Sparbuchungen()
        self.sparkontos = Kontos()
        self.depotwerte = Depotwerte()
        self.order = Order()
        self.orderdauerauftrag = OrderDauerauftrag()
        self.depotauszuege = Depotauszuege()
        self.einzelbuchungen.ausgeschlossene_kategorien = ausgeschlossene_kategorien
        self.tainted = 0

    def taint(self):
        self.tainted = self.tainted + 1

    def is_tainted(self):
        return self.taint_number() != 0

    def taint_number(self):
        return self.tainted + \
               self.dauerauftraege.taint_number() + \
               self.einzelbuchungen.taint_number() + \
               self.gemeinsamebuchungen.taint_number() + \
               self.sparbuchungen.taint_number() + \
               self.sparkontos.taint_number() + \
               self.depotwerte.taint_number() + \
               self.order.taint_number() +\
               self.depotauszuege.taint_number() +\
               self.orderdauerauftrag.taint_number()

    def refresh(self):
        print('DATABASE: Erneuere Datenbestand')
        alle_dauerauftragsbuchungen = self.dauerauftraege.get_all_einzelbuchungen_until_today(
        )
        self.einzelbuchungen.append_row(alle_dauerauftragsbuchungen)

        anteil_gemeinsamer_buchungen = self.gemeinsamebuchungen.anteil_gemeinsamer_buchungen(
        )
        self.einzelbuchungen.append_row(anteil_gemeinsamer_buchungen)

        anteil_sparbuchungen = self.sparbuchungen.get_dynamische_einzelbuchungen(
        )
        self.einzelbuchungen.append_row(anteil_sparbuchungen)

        anteil_orderdauerauftrag = self.orderdauerauftrag.get_all_order_until_today(
        )
        self.order.append_row(anteil_orderdauerauftrag)

        anteil_order = self.order.get_dynamische_einzelbuchungen()
        self.einzelbuchungen.append_row(anteil_order)

        print('DATABASE: Datenbestand erneuert')

    def _write_trenner(self, abrechnunsdatei):
        return abrechnunsdatei.write("".rjust(40, "#") + "\n ")

    def abrechnen(self,
                  mindate,
                  maxdate,
                  set_ergebnis=None,
                  verhaeltnis=50,
                  set_self_kategorie=None,
                  set_other_kategorie=None):
        selector = self.gemeinsamebuchungen.select().select_range(
            mindate, maxdate)

        name_self = persisted_state.database_instance().name
        name_partner = viewcore.name_of_partner()
        gemeinsame_buchungen_content = selector.content

        select_partner = selector.fuer(name_partner)
        select_self = selector.fuer(name_self)
        summe_partner = select_partner.sum()
        summe_self = select_self.sum()

        ausgaben_gesamt = selector.sum()

        abrechnunsdatei = StringWriter()
        zeitraum = datum_to_german(mindate) + '-' + datum_to_german(maxdate)
        abrechnunsdatei.write_line('Abrechnung vom ' +
                                   datum_to_german(time.today()) + ' (' +
                                   zeitraum + ')')
        self._write_trenner(abrechnunsdatei)
        abrechnunsdatei.write_line('Ergebnis:')

        abrechnunsdatei.write_line(set_ergebnis)

        abrechnunsdatei.write_empty_line()
        self._write_large_table_row(abrechnunsdatei,
                                    'Ausgaben von ' + name_partner,
                                    summe_partner)
        self._write_large_table_row(abrechnunsdatei,
                                    'Ausgaben von ' + name_self, summe_self)
        abrechnunsdatei.write_line("".ljust(38, "-"))
        self._write_large_table_row(abrechnunsdatei, "Gesamt", ausgaben_gesamt)

        if verhaeltnis == 50:
            self.write_into_file(abrechnunsdatei,
                                 selector.faktor(0.5).to_list(),
                                 'Gesamtausgaben pro Person ')
        self.write_into_file(abrechnunsdatei, select_partner.to_list(),
                             'Ausgaben von ' + name_partner)
        self.write_into_file(abrechnunsdatei, select_self.to_list(),
                             'Ausgaben von ' + name_self)

        ausgaben_fuer_partner = DataFrame()
        faktor_partner = self._faktor_other(verhaeltnis)

        ausgaben_fuer_self = DataFrame()
        faktor_self = self._faktor_self(verhaeltnis)

        summe_halb = selector.faktor(0.5).sum()

        if set_self_kategorie:
            faktor_self = 0.5

        if set_other_kategorie:
            faktor_partner = 0.5

        for _, row in gemeinsame_buchungen_content.iterrows():
            buchung_partner = self._berechne_abbuchung(
                row['Datum'], row['Kategorie'], row['Name'],
                ("%.2f" % (row['Wert'] * faktor_partner)))
            buchung_partner.Dynamisch = False
            ausgaben_fuer_partner = pd.concat(
                [ausgaben_fuer_partner, buchung_partner])

            buchung_self = self._berechne_abbuchung(
                row['Datum'], row['Kategorie'], row['Name'],
                ("%.2f" % (row['Wert'] * faktor_self)))
            buchung_self.Dynamisch = False
            ausgaben_fuer_self = pd.concat([ausgaben_fuer_self, buchung_self])

        if set_self_kategorie:
            extra_wert = (ausgaben_gesamt *
                          self._faktor_self(verhaeltnis)) - summe_halb
            extra_ausgleichs_buchung = self._berechne_abbuchung(
                maxdate, set_self_kategorie, set_self_kategorie,
                ("%.2f" % extra_wert))
            extra_ausgleichs_buchung.Dynamisch = False
            ausgaben_fuer_self = pd.concat(
                [ausgaben_fuer_self, extra_ausgleichs_buchung])

        if set_other_kategorie:
            extra_wert = (ausgaben_gesamt *
                          self._faktor_other(verhaeltnis)) - summe_halb
            extra_ausgleichs_buchung = self._berechne_abbuchung(
                maxdate, set_other_kategorie, set_other_kategorie,
                ("%.2f" % extra_wert))
            extra_ausgleichs_buchung.Dynamisch = False
            ausgaben_fuer_partner = pd.concat(
                [ausgaben_fuer_partner, extra_ausgleichs_buchung])

        report = TextReportWriter().generate_report(
            ausgaben_fuer_partner, abrechnunsdatei.to_string())

        self.einzelbuchungen.append_row(ausgaben_fuer_self)
        self.einzelbuchungen.taint()

        self.gemeinsamebuchungen.drop(
            gemeinsame_buchungen_content.index.tolist())
        self.taint()
        write_abrechnung("Abrechnung_" + str(time.now()), report)
        return report

    def _faktor_self(self, verhaeltnis):
        return verhaeltnis / 100

    def _faktor_other(self, verhaeltnis):
        return self._faktor_self(100 - verhaeltnis)

    def _write_large_table_row(self, abrechnunsdatei, name, summe):
        abrechnunsdatei.write_line(
            name.ljust(30, " ") + str("%.2f" % summe).rjust(7, " "))

    def write_into_file(self, abrechnunsdatei, ausgaben, title):
        abrechnunsdatei.write_empty_line(count=2)
        self._write_trenner(abrechnunsdatei)
        abrechnunsdatei.write_line(title)
        self._write_trenner(abrechnunsdatei)
        self._write_tabelle(abrechnunsdatei, ausgaben)

    def _write_tabelle(self, writer, tabelle):
        writer.write_line(
            self._to_left("Datum", 10) + self._to_left(" Kategorie", 14) +
            self._to_left("Name", 21) + self._to_right("Wert", 7))
        for row in tabelle:
            writer.write_line(
                datum_to_german(row['Datum']) + "  " +
                row['Kategorie'].ljust(len("Kategorie   "), " ") + " " +
                row['Name'].ljust(20, " ") + " " +
                str("%.2f" % (row['Wert'])).rjust(7, " "))

    def _to_left(self, target_string, size):
        return target_string.ljust(size, ' ')

    def _to_right(self, target_string, size):
        return target_string.rjust(size, ' ')

    def _berechne_abbuchung(self, laufdatum, kategorie, name, wert):
        return DataFrame([[laufdatum, kategorie, name, wert, True]],
                         columns=('Datum', 'Kategorie', 'Name', 'Wert',
                                  'Dynamisch'))

    def _row_to_dict(self, columns, index, row_data):
        row = {'index': index}
        for key in columns:
            row[key] = row_data[key]
        return row

    def frame_to_list_of_dicts(self, dataframe):
        result_list = []
        for index, row_data in dataframe.iterrows():
            row = self._row_to_dict(dataframe.columns, index, row_data)
            result_list.append(row)

        return result_list
コード例 #10
0
def test_edit_should_edit():
    component_under_test = OrderDauerauftrag()

    component_under_test.add(datum('01.01.2020'), datum('01.01.2021'),
                             'monatlich', '1name', '1konto', '1depotwert', 100)
    component_under_test.add(datum('02.02.2020'), datum('02.02.2021'),
                             'monatlich', '2name', '2konto', '2depotwert', 200)
    component_under_test.add(datum('03.03.2020'), datum('03.03.2021'),
                             'monatlich', '3name', '3konto', '3depotwert', 300)

    assert len(component_under_test.content) == 3
    element_before = component_under_test.get(1)
    assert element_before == {
        'index': 1,
        'Startdatum': datum('02.02.2020'),
        'Endedatum': datum('02.02.2021'),
        'Rhythmus': 'monatlich',
        'Name': '2name',
        'Konto': '2konto',
        'Depotwert': '2depotwert',
        'Wert': 200
    }

    component_under_test.edit(1, datum('03.02.2020'), datum('03.02.2021'),
                              'jährlich', '24name', '24konto', '24depotwert',
                              240)

    assert len(component_under_test.content) == 3
    element_after = component_under_test.get(1)
    assert element_after == {
        'index': 1,
        'Startdatum': datum('03.02.2020'),
        'Endedatum': datum('03.02.2021'),
        'Rhythmus': 'jährlich',
        'Name': '24name',
        'Konto': '24konto',
        'Depotwert': '24depotwert',
        'Wert': 240
    }