Exemplo n.º 1
0
def test_edit_should_edit():
    component_under_test = Depotauszuege()

    component_under_test.add(datum('01.01.2020'), '1demoisin', '1demokonto', 100)
    component_under_test.add(datum('02.02.2020'), '2demoisin', '2demokonto', 200)
    component_under_test.add(datum('03.03.2020'), '3demoisin', '3demokonto', 300)

    assert len(component_under_test.content) == 3
    element_before = component_under_test.get(1)
    assert element_before == {
        'index': 1,
        'Datum': datum('02.02.2020'),
        'Depotwert': '2demoisin',
        'Konto': '2demokonto',
        'Wert': 200
    }

    component_under_test.edit(1, datum('03.02.2020'), '23demoisin', '23demokonto', 230)

    assert len(component_under_test.content) == 3
    element_after = component_under_test.get(1)
    assert element_after == {
        'index': 1,
        'Datum': datum('03.02.2020'),
        'Depotwert': '23demoisin',
        'Konto': '23demokonto',
        'Wert': 230
    }
Exemplo n.º 2
0
def test_add_should_add():
    component_under_test = Depotauszuege()

    component_under_test.add(datum('01.01.2020'), 'demoisin', 'demokonto', 100)

    assert len(component_under_test.content) == 1
    assert component_under_test.content.Datum[0] == datum('01.01.2020')
    assert component_under_test.content.Depotwert[0] == 'demoisin'
    assert component_under_test.content.Konto[0] == 'demokonto'
    assert component_under_test.content.Wert[0] == 100
Exemplo n.º 3
0
def test_get_isins_invested_by_should_filter_invalid_isins():
    component_under_test = Depotauszuege()

    component_under_test.add(time.today(), 'too_long_12342342345', '2demokonto', 222)
    component_under_test.add(time.today(), 'isin_1234567', '1demokonto', 111)
    component_under_test.add(time.today(), 'too_short', '2demokonto', 333)

    assert component_under_test.get_isins_invested_by() == ['isin_1234567']
Exemplo n.º 4
0
def test_get_isins_invested_by_should_filter_out_not_invested_etfs_to_that_time():
    component_under_test = Depotauszuege()

    component_under_test.add(time.today(), '1isin1234567', '1demokonto', 1)
    component_under_test.add(time.today() - timedelta(days=1), '2isin1234567', '2demokonto', 2)
    component_under_test.add(time.today(), '2isin1234567', '2demokonto', 0)

    assert component_under_test.get_isins_invested_by() == ['1isin1234567']
Exemplo n.º 5
0
def test_get_kontostand_by_():
    component_under_test = Depotauszuege()
    component_under_test.add(datum('01.01.2020'), '1isin', 'demokonto', 10)

    component_under_test.add(datum('02.01.2020'), '1isin', 'demokonto', 200)
    component_under_test.add(datum('02.01.2020'), '2isin', 'demokonto', 300)
    component_under_test.add(datum('02.01.2020'), '1isin', '1demokonto', 999)

    assert component_under_test.get_kontostand_by('demokonto') == 500
Exemplo n.º 6
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.º 7
0
def test_get_depotwert_by():
    component_under_test = Depotauszuege()

    component_under_test.add(datum('01.01.2020'), '1isin', '1demokonto', 11)

    component_under_test.add(datum('02.01.2020'), '1isin', '1demokonto', 200)
    component_under_test.add(datum('02.01.2020'), '2isin', '1demokonto', 311)
    component_under_test.add(datum('02.01.2020'), '1isin', '2demokonto', 400)

    assert component_under_test.get_depotwert_by('1isin') == 600
Exemplo n.º 8
0
def test_edit():
    set_up()
    persisted_state.database_instance().depotauszuege = Depotauszuege()
    add_depotauszug.index(
        VersionedPostRequest({
            'action': 'add',
            'datum_2demokonto': rfc('01.03.2020'),
            'konto': '2demokonto',
            'wert_2demokonto_2demoisin': '100,00'
        }))

    result = add_depotauszug.index(
        VersionedPostRequest({
            'action': 'add',
            'edit_index': 0,
            'datum_2demokonto': rfc('01.03.2020'),
            'konto': '2demokonto',
            'wert_2demokonto_2demoisin': '200,00'
        }))

    db = persisted_state.database_instance()
    assert len(db.depotauszuege.content) == 1
    assert db.depotauszuege.content.Wert[0] == 200
    assert db.depotauszuege.content.Konto[0] == '2demokonto'
    assert db.depotauszuege.content.Depotwert[0] == '2demoisin'
    assert db.depotauszuege.content.Datum[0] == datum('01.03.2020')

    result_element = list(result['letzte_erfassung'])[0]

    assert result_element['fa'] == 'pencil'
    assert result_element['datum'] == '01.03.2020'
    assert result_element['konto'] == '2demokonto'
    assert result_element['depotwert'] == '2demoisin'
    assert result_element['wert'] == '200,00'
Exemplo n.º 9
0
def test_get_isins_invested_by_should_use_today_if_no_value_present():
    component_under_test = Depotauszuege()

    component_under_test.add(time.today(), '1isin1234567', '1demokonto', 1)
    component_under_test.add(time.today() + timedelta(days=1), '2isin1234567', '2demokonto', 2)

    assert component_under_test.get_isins_invested_by() == ['1isin1234567']
Exemplo n.º 10
0
def test_resolve_datum():
    component_under_test = Depotauszuege()

    component_under_test.add(datum('03.01.2020'), '1isin', '1demokonto', 11)
    component_under_test.add(datum('07.01.2020'), '1isin', '2demokonto', 11)
    component_under_test.add(datum('01.01.2020'), '1isin', '3demokonto', 11)

    assert component_under_test.resolve_datum(1) == datum('03.01.2020')
Exemplo n.º 11
0
def test_get_latest_datum_by():
    component_under_test = Depotauszuege()

    component_under_test.add(datum('01.01.2020'), 'demoisin', '1demokonto', 100)
    component_under_test.add(datum('02.01.2020'), 'demoisin', '1demokonto', 200)
    component_under_test.add(datum('03.01.2020'), 'demoisin', '2demokonto', 300)

    assert component_under_test.get_latest_datum_by('1demokonto') == datum('02.01.2020')
Exemplo n.º 12
0
def test_get_isins_invested_by_should_order_by_invested_value():
    component_under_test = Depotauszuege()

    component_under_test.add(time.today(), 'mid_12345678', '2demokonto', 222)
    component_under_test.add(time.today(), 'small_123456', '1demokonto', 111)
    component_under_test.add(time.today(), 'large_123456', '2demokonto', 333)

    assert component_under_test.get_isins_invested_by() == ['large_123456', 'mid_12345678', 'small_123456']
Exemplo n.º 13
0
def test_select_max_year():
    component_under_test = Depotauszuege()

    component_under_test.add(datum('03.01.2019'), '1isin', '1demokonto', 11)
    component_under_test.add(datum('05.01.2020'), '1isin', '1demokonto', 12)
    component_under_test.add(datum('03.01.2021'), '1isin', '1demokonto', 99)
    component_under_test.add(datum('03.01.2022'), '1isin', '1demokonto', 99)

    assert component_under_test.select_max_year(2020).get_kontostand_by('1demokonto') == 12
Exemplo n.º 14
0
def test_exists_wert():
    component_under_test = Depotauszuege()

    assert not component_under_test.exists_wert(depotwert='isin1', konto='konto1')

    component_under_test.add(datum('01.01.2020'), 'isin1', 'konto1', 100)

    assert component_under_test.exists_wert(depotwert='isin1', konto='konto1')
Exemplo n.º 15
0
def test_add_with_empty_datum_should_return_error_page():
    set_up()
    persisted_state.database_instance().depotauszuege = Depotauszuege()

    assert len(persisted_state.database_instance().depotauszuege.content) == 0

    result = add_depotauszug.index(
        VersionedPostRequest({
            'action': 'add',
            'konto': '2demokonto',
            'wert_2demokonto_2demoisin': '10,00',
            'wert_2demokonto_3demoisin': '10,00'
        }))
    assert result['%Errortext'] == 'Interner Fehler <Kein Datum gefunden>.'
Exemplo n.º 16
0
def test_init_with_empty_depotauszuege_should_flip_filled_and_empty():
    set_up()
    persisted_state.database_instance().depotauszuege = Depotauszuege()
    context = add_depotauszug.index(GetRequest())
    assert context['approve_title'] == 'Depotauszug hinzufügen'
    assert context['default_items'] == [
        {
            'datum':
            datum_to_string(date.today()),
            'empty_items': [],
            'filled_items': [{
                'description': '1demowert (1demoisin)',
                'isin': '1demoisin',
                'wert': 0
            }, {
                'description': '2demowert (2demoisin)',
                'isin': '2demoisin',
                'wert': 0
            }, {
                'description': '3demowert (3demoisin)',
                'isin': '3demoisin',
                'wert': 0
            }],
            'konto':
            '1demokonto'
        },
        {
            'datum':
            datum_to_string(date.today()),
            'empty_items': [],
            'filled_items': [{
                'description': '1demowert (1demoisin)',
                'isin': '1demoisin',
                'wert': 0
            }, {
                'description': '2demowert (2demoisin)',
                'isin': '2demoisin',
                'wert': 0
            }, {
                'description': '3demowert (3demoisin)',
                'isin': '3demoisin',
                'wert': 0
            }],
            'konto':
            '2demokonto'
        },
    ]
Exemplo n.º 17
0
def test_delete_depotauszug():
    component_under_test = Depotauszuege()


    component_under_test.add(datum('01.01.2020'), '1isin', '1demokonto', 1)
    component_under_test.add(datum('03.01.2020'), '2isin', '2demokonto', 2)
    component_under_test.add(datum('03.01.2020'), '3isin', '2demokonto', 3)
    component_under_test.add(datum('03.01.2020'), '4isin', '3demokonto', 4)

    assert len(component_under_test.content) == 4

    component_under_test.delete_depotauszug(datum('03.01.2020'), '2demokonto')

    assert len(component_under_test.content) == 2
    assert component_under_test.content.index.tolist() == [0, 3]
    assert component_under_test.content.Datum.tolist() == [datum('01.01.2020'), datum('03.01.2020')]
    assert component_under_test.content.Depotwert.tolist() == ['1isin', '4isin']
    assert component_under_test.content.Wert.tolist() == [1, 4]
Exemplo n.º 18
0
def test_get_by():
    component_under_test = Depotauszuege()

    component_under_test.add(datum('01.01.2020'), 'demoisin', '1demokonto', 100)
    component_under_test.add(datum('02.01.2020'), 'demoisin', '1demokonto', 200)
    component_under_test.add(datum('01.01.2020'), 'demoisin', '2demokonto', 300)

    result = component_under_test.get_by(datum('01.01.2020'), '1demokonto')

    assert len(result) == 1
    assert result.index[0] == 0
    assert result.Datum[0] == datum('01.01.2020')
    assert result.Depotwert[0] == 'demoisin'
    assert result.Konto[0] == '1demokonto'
    assert result.Wert[0] == 100
Exemplo n.º 19
0
def test_add_with_empty_value_should_skip():
    set_up()
    persisted_state.database_instance().depotauszuege = Depotauszuege()

    assert len(persisted_state.database_instance().depotauszuege.content) == 0

    add_depotauszug.index(
        VersionedPostRequest({
            'action': 'add',
            'datum_2demokonto': rfc('01.03.2020'),
            'konto': '2demokonto',
            'wert_2demokonto_2demoisin': '0,00',
            'wert_2demokonto_3demoisin': '0,00'
        }))

    db = persisted_state.database_instance()
    assert len(db.depotauszuege.content) == 0
Exemplo n.º 20
0
def test_edit_should_only_fire_once():
    set_up()
    persisted_state.database_instance().depotauszuege = Depotauszuege()
    add_depotauszug.index(
        VersionedPostRequest({
            'action': 'add',
            'datum_2demokonto': rfc('01.03.2020'),
            'konto': '2demokonto',
            'wert_2demokonto_2demoisin': '100,00'
        }))

    next_id = request_handler.current_key()
    add_depotauszug.index(
        PostRequest({
            'action': 'add',
            'ID': next_id,
            'edit_index': 0,
            'datum_2demokonto': rfc('01.03.2020'),
            'konto': '2demokonto',
            'wert_2demokonto_2demoisin': '200,00'
        }))

    add_depotauszug.index(
        PostRequest({
            'action': 'add',
            'ID': next_id,
            'edit_index': 0,
            'datum_2demokonto': rfc('01.03.2020'),
            'konto': 'overwritten',
            'wert_2demokonto_2demoisin': '0,00'
        }))

    db = persisted_state.database_instance()
    assert len(db.depotauszuege.content) == 1
    assert db.depotauszuege.content.Wert[0] == 200
    assert db.depotauszuege.content.Konto[0] == '2demokonto'
    assert db.depotauszuege.content.Depotwert[0] == '2demoisin'
    assert db.depotauszuege.content.Datum[0] == datum('01.03.2020')
Exemplo n.º 21
0
def test_get_kontostand_by_with_empty_should_return_zero():
    component_under_test = Depotauszuege()

    assert component_under_test.get_kontostand_by('demokonto') == 0
Exemplo n.º 22
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
Exemplo n.º 23
0
def test_get_depotwert_by_with_empty_should_return_zero():
    component_under_test = Depotauszuege()

    assert component_under_test.get_depotwert_by('isin1') == 0
Exemplo n.º 24
0
def test_resolve_index():
    component_under_test = Depotauszuege()

    component_under_test.add(datum('01.01.2020'), 'demoisin', '1demokonto', 100)
    component_under_test.add(datum('02.01.2020'), 'demoisin', '1demokonto', 200)
    component_under_test.add(datum('02.01.2020'), 'demoisin2', '1demokonto', 200)
    component_under_test.add(datum('01.01.2020'), 'demoisin', '2demokonto', 300)

    component_under_test.resolve_index(datum('01.01.2020'), '1demokonto', 'demoisin') == 0
    component_under_test.resolve_index(datum('02.01.2020'), '1demokonto', 'demoisin') == 1
    component_under_test.resolve_index(datum('02.01.2020'), '1demokonto', 'demoisin2') == 2
    component_under_test.resolve_index(datum('01.01.2020'), '2demokonto', 'demoisin') == 3
Exemplo n.º 25
0
def test_get_latest_datum_by_with_not_content_should_return_none():
    component_under_test = Depotauszuege()

    assert not component_under_test.get_latest_datum_by('1demokonto')