Ejemplo n.º 1
0
    def test_edit_shouldEdit(self):
        component_under_test = Sparbuchungen()

        component_under_test.add(datum('04.04.2010'), '0name', 0, '0typ', '0konto', dynamisch=True)
        component_under_test.add(datum('01.01.2011'), '1name', 1, '1typ', '1konto', dynamisch=True)
        component_under_test.add(datum('02.02.2012'), '2name', 2, '2typ', '2konto', dynamisch=True)

        assert len(component_under_test.content) == 3
        element_before = component_under_test.get(1)
        assert element_before == {
            'Datum': datum('01.01.2011'),
            'Dynamisch': True,
            'Konto': '1konto',
            'Name': '1name',
            'Typ': '1typ',
            'Wert': 1,
            'index': 1
        }

        component_under_test.edit(1, datum('03.03.2011'), '3name', 3, '3typ', '3konto')

        assert len(component_under_test.content) == 3
        element_after = component_under_test.get(1)
        assert element_after == {
            'Datum': datum('03.03.2011'),
            'Dynamisch': True,
            'Konto': '3konto',
            'Name': '3name',
            'Typ': '3typ',
            'Wert': 3,
            'index': 1
        }
Ejemplo n.º 2
0
    def test_add_shouldAdd(self):
        component_under_test = Sparbuchungen()

        component_under_test.add(datum('01.01.2012'), '1name', 1, '1typ', '1konto', dynamisch=True)

        assert len(component_under_test.content) == 1
        assert component_under_test.content.Datum[0] == datum('01.01.2012')
        assert component_under_test.content.Typ[0] == '1typ'
        assert component_under_test.content.Name[0] == '1name'
        assert component_under_test.content.Wert[0] == 1
        assert component_under_test.content.Konto[0] == '1konto'
        assert component_under_test.content.Dynamisch[0]
Ejemplo n.º 3
0
 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
Ejemplo n.º 4
0
    def test_get_static_content_should_filter_dynamic_content(self):
        component_under_test = Sparbuchungen()

        component_under_test.add(datum('01.01.2012'), '1name', 1, '1typ', '1konto')
        component_under_test.add(datum('02.02.2013'), '2name', 2, '2typ', '2konto', dynamisch=True)

        static_content = component_under_test.get_static_content()

        assert len(static_content) == 1
        assert static_content.Datum[0] == datum('01.01.2012')
        assert static_content.Typ[0] == '1typ'
        assert static_content.Name[0] == '1name'
        assert static_content.Wert[0] == 1
        assert static_content.Konto[0] == '1konto'
        assert 'Dynamisch' not in static_content.columns
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
    def test_get_dynamische_einzelbuchungen(self):
        component_under_test = Sparbuchungen()

        component_under_test.add(datum('01.01.2011'), '1name', 1, Sparbuchungen.TYP_AUSSCHUETTUNG, '1konto')
        component_under_test.add(datum('02.02.2012'), '2name', 2, Sparbuchungen.TYP_MANUELLER_AUFTRAG, '2konto')
        component_under_test.add(datum('03.03.2013'), '3name', -3, Sparbuchungen.TYP_MANUELLER_AUFTRAG, '3konto')
        component_under_test.add(datum('04.04.2014'), '4name', 4, Sparbuchungen.TYP_ZINSEN, '3konto')

        result = component_under_test.get_dynamische_einzelbuchungen()

        assert len(result) == 3
        assert set(result.columns) == set(Einzelbuchungen.TABLE_HEADER)

        assert result.Datum[0] == datum('01.01.2011')
        assert result.Name[0] == '1name'
        assert result.Kategorie[0] == Sparbuchungen.TYP_AUSSCHUETTUNG
        assert result.Wert[0] == 1
        assert result.Dynamisch[0]
        assert not result.Tags[0]

        assert result.Datum[1] == datum('02.02.2012')
        assert result.Name[1] == '2name'
        assert result.Kategorie[1] == 'Sparen'
        assert result.Wert[1] == -2
        assert result.Dynamisch[1]
        assert not result.Tags[1]

        assert result.Datum[2] == datum('03.03.2013')
        assert result.Name[2] == '3name'
        assert result.Kategorie[2] == 'Sparen'
        assert result.Wert[2] == 3
        assert result.Dynamisch[2]
        assert not result.Tags[2]
Ejemplo n.º 7
0
    def test_select_max_year(self):
        component_under_test = Sparbuchungen()

        component_under_test.add(datum('01.01.2010'), '1name', 1, Sparbuchungen.TYP_MANUELLER_AUFTRAG, 'konto')
        component_under_test.add(datum('01.01.2011'), '1name', 1, Sparbuchungen.TYP_MANUELLER_AUFTRAG, 'konto')
        component_under_test.add(datum('01.01.2012'), '1name', 1, Sparbuchungen.TYP_MANUELLER_AUFTRAG, 'konto')
        component_under_test.add(datum('01.01.2013'), '1name', 33, Sparbuchungen.TYP_MANUELLER_AUFTRAG, 'konto')
        component_under_test.add(datum('01.01.2014'), '1name', 1, Sparbuchungen.TYP_MANUELLER_AUFTRAG, 'konto')

        assert component_under_test.select_max_year(2013).get_aufbuchungen_fuer('konto') == 36
Ejemplo n.º 8
0
    def test_get_aufbuchungen_fuer(self):
        component_under_test = Sparbuchungen()

        component_under_test.add(datum('01.01.2011'), '1name', 1, Sparbuchungen.TYP_AUSSCHUETTUNG, 'konto')
        component_under_test.add(datum('02.02.2012'), '2name', 200, Sparbuchungen.TYP_MANUELLER_AUFTRAG, 'konto')
        component_under_test.add(datum('03.03.2013'), '3name', -50, Sparbuchungen.TYP_MANUELLER_AUFTRAG, 'konto')
        component_under_test.add(datum('03.03.2013'), '3name', -3, Sparbuchungen.TYP_MANUELLER_AUFTRAG, 'anderes_konto')
        component_under_test.add(datum('04.04.2014'), '4name', 10, Sparbuchungen.TYP_ZINSEN, 'konto')

        assert component_under_test.get_aufbuchungen_fuer('konto') == 150