Exemplo n.º 1
0
    def test_aendere_bei_voller_datenbank(self):
        component_under_test = Dauerauftraege()
        component_under_test.add(datum('1.1.2010'), date.today(),
                                 '1some kategorie', '1some name',
                                 '1some rhythmus', 1.23)
        component_under_test.add(datum('1.1.2010'), date.today(),
                                 '2some kategorie', '2some name',
                                 '2some rhythmus', 1.23)
        component_under_test.add(datum('1.1.2010'), date.today(),
                                 '3some kategorie', '3some name',
                                 '3some rhythmus', 1.23)

        component_under_test.edit(1, datum('2.1.2010'), datum('3.1.2010'),
                                  'some other kategorie', 'some other name',
                                  'some other rhythmus', 2.34)

        assert len(component_under_test.content) == 3
        assert component_under_test.content.Startdatum[1] == datum('2.1.2010')
        assert component_under_test.content.Endedatum[1] == datum('3.1.2010')
        assert component_under_test.content.Name[1] == 'some other name'
        assert component_under_test.content.Kategorie[
            1] == 'some other kategorie'
        assert component_under_test.content.Rhythmus[
            1] == 'some other rhythmus'
        assert component_under_test.content.Wert[1] == 2.34
Exemplo n.º 2
0
def test_get_future_with_actual_dauerauftrag_should_return_empty():
    component_under_test = Dauerauftraege()
    component_under_test.add(datum('01.01.2012'), datum('01.01.2100'),
                             'some kategorie', 'some name', 'some rhythmus', 1)

    result = component_under_test.future()

    assert result == []
Exemplo n.º 3
0
def test_get_aktuelle_with_past_dauerauftrag_should_return_empty_list():
    component_under_test = Dauerauftraege()
    component_under_test.add(datum('01.01.2012'), datum('01.01.2012'),
                             'some kategorie', 'some name', 'some rhythmus', 1)

    result = component_under_test.aktuelle()

    assert result == []
Exemplo n.º 4
0
def test_add():
    component_under_test = Dauerauftraege()
    component_under_test.add(datum('1.1.2010'), date.today(), 'some kategorie',
                             'some name', 'some rhythmus', 1.23)

    assert len(component_under_test.content) == 1
    assert component_under_test.content.Startdatum[0] == datum('1.1.2010')
    assert component_under_test.content.Endedatum[0] == date.today()
    assert component_under_test.content.Name[0] == 'some name'
    assert component_under_test.content.Kategorie[0] == 'some kategorie'
    assert component_under_test.content.Rhythmus[0] == 'some rhythmus'
    assert component_under_test.content.Wert[0] == 1.23
Exemplo n.º 5
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
Exemplo n.º 6
0
def test_get():
    component_under_test = Dauerauftraege()
    component_under_test.add(datum('1.1.2010'), date.today(), 'some kategorie',
                             'some name', 'some rhythmus', 1.23)

    result = component_under_test.get(0)

    assert len(component_under_test.content) == 1
    assert result['Startdatum'] == datum('1.1.2010')
    assert result['Endedatum'] == date.today()
    assert result['Name'] == 'some name'
    assert result['Kategorie'] == 'some kategorie'
    assert result['Rhythmus'] == 'some rhythmus'
    assert result['Wert'] == 1.23
Exemplo n.º 7
0
def test_delete_should_taint():
    component_under_test = Dauerauftraege()
    component_under_test.add(datum('1.1.2010'), date.today(), 'some kategorie',
                             'some name', 'some rhythmus', 1.23)
    assert component_under_test.taint_number() == 1
    component_under_test.delete(0)
    assert component_under_test.taint_number() == 2
Exemplo n.º 8
0
def test_get_future_with_future_dauerauftrag_should_return_dauerauftrag():
    component_under_test = Dauerauftraege()
    component_under_test.add(datum('01.01.2100'), datum('01.01.2100'),
                             'some kategorie', 'some name', 'some rhythmus', 1)

    result = component_under_test.future()

    assert len(result) == 1
    assert result[0]['Startdatum'] == datum('01.01.2100')
    assert result[0]['Endedatum'] == datum('01.01.2100')
    assert result[0]['Kategorie'] == 'some kategorie'
    assert result[0]['Name'] == 'some name'
    assert result[0]['Rhythmus'] == 'some rhythmus'
    assert result[0]['Wert'] == 1
Exemplo n.º 9
0
def test_edit_should_taint():
    component_under_test = Dauerauftraege()
    component_under_test.add(datum('1.1.2010'), date.today(), 'some kategorie',
                             'some name', 'some rhythmus', 1.23)
    assert component_under_test.taint_number() == 1
    component_under_test.edit(0, datum('2.1.2010'), datum('3.1.2010'),
                              'some other kategorie', 'some other name',
                              'some other rhythmus', 2.34)
    assert component_under_test.taint_number() == 2
Exemplo n.º 10
0
def test_get_einzelbuchungen_until_yearly():
    component_under_test = Dauerauftraege()
    component_under_test.add(datum('1.1.2010'), datum('2.1.2011'),
                             'some kategorie', 'some name',
                             FREQUENCY_JAEHRLICH_NAME, 1.23)

    result = component_under_test.get_all_einzelbuchungen_until_today()

    assert len(result) == 2
    first_row = result.iloc[0]
    assert first_row.Datum == datum('1.1.2010')
    assert first_row.Kategorie == 'some kategorie'
    assert first_row.Name == 'some name'
    assert first_row.Wert == 1.23

    second_row = result.iloc[1]
    assert second_row.Datum == datum('1.1.2011')
    assert second_row.Kategorie == 'some kategorie'
    assert second_row.Name == 'some name'
    assert second_row.Wert == 1.23
Exemplo n.º 11
0
def test_get_einzelbuchungen_until_today_should_use_end_of_month_when_overflow(
):
    component_under_test = Dauerauftraege()
    component_under_test.add(datum('31.1.2010'), datum('2.3.2010'),
                             'some kategorie', 'some name',
                             FREQUENCY_MONATLICH_NAME, 1.23)

    result = component_under_test.get_all_einzelbuchungen_until_today()

    assert len(result) == 2
    first_row = result.iloc[0]
    assert first_row.Datum == datum('31.1.2010')
    assert first_row.Kategorie == 'some kategorie'
    assert first_row.Name == 'some name'
    assert first_row.Wert == 1.23

    second_row = result.iloc[1]
    assert second_row.Datum == datum('28.2.2010')
    assert second_row.Kategorie == 'some kategorie'
    assert second_row.Name == 'some name'
    assert second_row.Wert == 1.23
Exemplo n.º 12
0
 def test_add_shoul_taint(self):
     component_under_test = Dauerauftraege()
     assert component_under_test.taint_number() == 0
     component_under_test.add(datum('1.1.2010'), date.today(),
                              'some kategorie', 'some name',
                              'some rhythmus', 1.23)
     assert component_under_test.taint_number() == 1
Exemplo n.º 13
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