Esempio n. 1
0
 def __init__(self, name, ausgeschlossene_kategorien=set()):
     self.name = name
     self.dauerauftraege = Dauerauftraege()
     self.gemeinsamebuchungen = Gemeinsamebuchungen()
     self.einzelbuchungen = Einzelbuchungen()
     self.einzelbuchungen.ausgeschlossene_kategorien = ausgeschlossene_kategorien
     self.tainted = 0
Esempio n. 2
0
    def test_aendere_beiVollerDatenbank(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
Esempio n. 3
0
 def test_delete_shouldTaint(self):
     component_under_test = Dauerauftraege()
     component_under_test.add(datum('1.1.2010'), date.today(),
                              'some kategorie', 'some name',
                              'some rhythmus', 1.23)
     component_under_test.de_taint()
     assert component_under_test.taint_number() == 0
     component_under_test.delete(0)
     assert component_under_test.taint_number() == 1
Esempio n. 4
0
    def test_get_future_withActualDauerauftrag_shouldReturnEmptyList(self):
        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 == []
Esempio n. 5
0
 def test_edit_shouldTaint(self):
     component_under_test = Dauerauftraege()
     component_under_test.add(datum('1.1.2010'), date.today(),
                              'some kategorie', 'some name',
                              'some rhythmus', 1.23)
     component_under_test.de_taint()
     assert component_under_test.taint_number() == 0
     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() == 1
Esempio n. 6
0
    def test_add(self):
        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
Esempio n. 7
0
    def test_get(self):
        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
Esempio n. 8
0
    def test_get_future_withFutureDauerauftrag_shouldReturnDauerauftrag(self):
        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
Esempio n. 9
0
class Database:
    '''
    Database
    '''
    def __init__(self, name, ausgeschlossene_kategorien=set()):
        self.name = name
        self.dauerauftraege = Dauerauftraege()
        self.gemeinsamebuchungen = Gemeinsamebuchungen()
        self.einzelbuchungen = Einzelbuchungen()
        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()

    def de_taint(self):
        self.tainted = 0
        self.dauerauftraege.de_taint()
        self.einzelbuchungen.de_taint()
        self.gemeinsamebuchungen.de_taint()

    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)

        print('DATABASE: Datenbestand erneuert')

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

    def abrechnen(self):
        '''
        rechnet gemeinsame ausgaben aus der Datenbank ab
        '''
        name_self = viewcore.database_instance().name
        name_partner = viewcore.name_of_partner()

        ausgaben_maureen = self.gemeinsamebuchungen.content[
            self.gemeinsamebuchungen.content.Person == name_partner]
        ausgaben_sebastian = self.gemeinsamebuchungen.content[
            self.gemeinsamebuchungen.content.Person == name_self]
        summe_maureen = self._sum(ausgaben_maureen['Wert'])
        summe_sebastian = self._sum(ausgaben_sebastian['Wert'])

        ausgaben_gesamt = summe_maureen + summe_sebastian

        dif_maureen = (ausgaben_gesamt / 2) - summe_maureen

        abrechnunsdatei = StringWriter()
        abrechnunsdatei.write("Abrechnung vom " +
                              datum_to_german(viewcore.today()) + "\n")
        self._write_trenner(abrechnunsdatei)
        abrechnunsdatei.write("Ergebnis:\n")

        if dif_maureen > 0:
            abrechnunsdatei.write(name_self + ' muss an ' + name_partner +
                                  ' noch ' + str('%.2f' % dif_maureen) +
                                  "€ überweisen.\n")
        else:
            abrechnunsdatei.write(name_partner + ' muss an ' + name_self +
                                  ' noch ' + str("%.2f" % (dif_maureen * -1)) +
                                  "€ überweisen.\n")

        abrechnunsdatei.write("\n")
        abrechnunsdatei.write(('Ausgaben von ' + name_partner).ljust(30, " ") +
                              str("%.2f" % summe_maureen).rjust(7, " ") + "\n")
        abrechnunsdatei.write(('Ausgaben von ' + name_self).ljust(30, " ") +
                              str("%.2f" % summe_sebastian).rjust(7, " ") +
                              "\n")
        abrechnunsdatei.write("".ljust(38, "-") + "\n")
        abrechnunsdatei.write("Gesamt".ljust(30, " ") +
                              str("%.2f" % ausgaben_gesamt).rjust(7, " ") +
                              "\n \n \n")

        self._write_trenner(abrechnunsdatei)
        abrechnunsdatei.write("Gesamtausgaben pro Person \n")
        self._write_trenner(abrechnunsdatei)

        abrechnunsdatei.write("Datum".ljust(10, " ") + " Kategorie    " +
                              "Name".ljust(20, " ") + " " +
                              "Wert".rjust(7, " ") + "\n")
        for _, row in self.gemeinsamebuchungen.content.iterrows():
            abrechnunsdatei.write(
                datum_to_german(row['Datum']) + "  " +
                row['Kategorie'].ljust(len("Kategorie   "), " ") + " " +
                row['Name'].ljust(20, " ") + " " +
                str("%.2f" % (row['Wert'] / 2)).rjust(7, " ") + "\n")

        abrechnunsdatei.write("\n")
        abrechnunsdatei.write("\n")

        self._write_trenner(abrechnunsdatei)
        abrechnunsdatei.write('Ausgaben von ' + name_partner + '\n')
        self._write_trenner(abrechnunsdatei)

        abrechnunsdatei.write("Datum".ljust(10, " ") + " Kategorie    " +
                              "Name".ljust(20, " ") + " " +
                              "Wert".rjust(7, " ") + "\n")
        for _, row in ausgaben_maureen.iterrows():
            abrechnunsdatei.write(
                datum_to_german(row['Datum']) + "  " +
                row['Kategorie'].ljust(len("Kategorie   "), " ") + " " +
                row['Name'].ljust(20, " ") + " " +
                str("%.2f" % (row['Wert'])).rjust(7, " ") + "\n")

        abrechnunsdatei.write("\n")
        abrechnunsdatei.write("\n")
        self._write_trenner(abrechnunsdatei)
        abrechnunsdatei.write('Ausgaben von ' + name_self + '\n')
        self._write_trenner(abrechnunsdatei)

        abrechnunsdatei.write("Datum".ljust(10, " ") + " Kategorie    " +
                              "Name".ljust(20, " ") + " " +
                              "Wert".rjust(7, " ") + "\n")
        for _, row in ausgaben_sebastian.iterrows():
            abrechnunsdatei.write(
                datum_to_german(row['Datum']) + "  " +
                row['Kategorie'].ljust(len("Kategorie   "), " ") + " " +
                row['Name'].ljust(20, " ") + " " +
                str("%.2f" % (row['Wert'])).rjust(7, " ") + "\n")

        ausgaben = DataFrame()
        for _, row in self.gemeinsamebuchungen.content.iterrows():
            buchung = self._berechne_abbuchung(row['Datum'], row['Kategorie'],
                                               row['Name'],
                                               ("%.2f" % (row['Wert'] / 2)))
            buchung.Dynamisch = False
            ausgaben = ausgaben.append(buchung)

        abrechnunsdatei.write("\n\n")
        abrechnunsdatei.write("#######MaschinenimportStart\n")
        abrechnunsdatei.write(ausgaben.to_csv(index=False))
        abrechnunsdatei.write("#######MaschinenimportEnd\n")

        self.einzelbuchungen.append_row(ausgaben)
        self.gemeinsamebuchungen.empty()
        self.taint()
        FileSystem.instance().write(
            "../Abrechnungen/Abrechnung_" + str(datetime.now()),
            abrechnunsdatei.to_string())
        return abrechnunsdatei.to_string()

    def _sum(self, data):
        if data.empty:
            return 0
        return data.sum()

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

    def func_woechentlich(self, buchungs_datum):
        return buchungs_datum.isocalendar()[1]

    def func_monatlich(self, buchungs_datum):
        return buchungs_datum.month

    def _row_to_dict(self, columns, index, row_data):
        row = {}
        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