Пример #1
0
def write(database):
    einzelbuchungen = database.einzelbuchungen.content.copy()[database.einzelbuchungen.content.Dynamisch == False]
    einzelbuchungen_raw_data = einzelbuchungen[['Datum', 'Kategorie', 'Name', 'Wert', 'Tags']]
    content = einzelbuchungen_raw_data.to_csv(index=False)

    content += "\n Dauerauftraege \n"
    content += database.dauerauftraege.content.to_csv(index=False)

    content += "\n Gemeinsame Buchungen \n"
    content += database.gemeinsamebuchungen.content.to_csv(index=False)

    FileSystem.instance().write('../Database_' + database.name + '.csv', content)
    print("WRITER: All Saved")
Пример #2
0
    def test_import_shouldWriteIntoAbrechnungen(self):
        self.set_up()
        einzelbuchungen = viewcore.database_instance().einzelbuchungen
        einzelbuchungen.add(datum('01.01.2017'), 'Essen', 'some name', -1.54)

        context = import_data.index(PostRequest({'import': self._IMPORT_DATA}))

        written_abrechnung = None
        for key in FileSystem.instance()._fs_stub.keys():
            if key.startswith('../Import'):
                written_abrechnung = FileSystem.instance()._fs_stub[key]

        assert written_abrechnung == self._IMPORT_DATA
Пример #3
0
    def teste_write_with_old_database_should_migrate(self):
        self.mock_filesystem()
        self.write_db_file_stub('testuser', self.full_db_old)

        database = DBManager.read('testuser', set())
        DBManager.write(database)

        assert FileSystem.instance().read('../Database_testuser.csv') == self.full_db.split('\n')
Пример #4
0
def read(nutzername, ausgeschlossene_kategorien):
    if not FileSystem.instance().read('../Database_' + nutzername + '.csv'):
        neue_datenbank = DatabaseModule.Database(nutzername)
        write(neue_datenbank)

    file_content = FileSystem.instance().read('../Database_' + nutzername + '.csv')

    tables = {}

    tables["einzelbuchungen"] = ""
    tables["dauerauftraege"] = ""
    tables["gemeinsamebuchungen"] = ""
    mode = "einzelbuchungen"
    for line in file_content:
        line = line.strip()
        if line == "":
            continue
        if line == 'Dauerauftraege':
            mode = 'dauerauftraege'
            continue

        if line == 'Gemeinsame Buchungen':
            mode = 'gemeinsamebuchungen'
            continue
        if not ',' in line:
            break

        tables[mode] = tables[mode] + "\n" + line

    database = DatabaseModule.Database(nutzername, ausgeschlossene_kategorien=ausgeschlossene_kategorien)

    raw_data = pd.read_csv(StringIO(tables["einzelbuchungen"]))
    database.einzelbuchungen.parse(raw_data)
    print("READER: Einzelbuchungen gelesen")

    database.dauerauftraege.parse(pd.read_csv(StringIO(tables["dauerauftraege"])))
    print("READER: Daueraufträge gelesen")

    database.gemeinsamebuchungen.parse(pd.read_csv(StringIO(tables["gemeinsamebuchungen"])))

    print('READER: Refreshe Database')
    database.refresh()
    print('READER: Refresh done')
    return database
Пример #5
0
def _load_config():
    lines = FileSystem.instance().read('../config')
    if not lines:
        return dict(configuration_provider.DEFAULT_CONFIG)
    loaded_config = {}
    for line in lines:
        if ':' in line:
            line = line.strip()
            loaded_config[line.split(':', 1)[0]] = line.split(':', 1)[1]
    for key in dict(configuration_provider.DEFAULT_CONFIG):
        if key not in loaded_config:
            loaded_config[key] = configuration_provider.DEFAULT_CONFIG[key]
    print("#####", loaded_config)
    return loaded_config
Пример #6
0
def handle_request(request, import_prefix='', gemeinsam=False):
    print(request)
    imported_values = pandas.DataFrame([],
                                       columns=('Datum', 'Kategorie', 'Name',
                                                'Wert', ''))
    if request.method == "POST":
        if post_action_is(request, 'load_online_transactions'):
            serverurl = request.values['server']

            serverurl = _add_protokoll_if_needed(serverurl)
            _save_server_creds(serverurl, request.values['email'])

            r = requests.post(serverurl + '/getabrechnung.php',
                              data={
                                  'email': request.values['email'],
                                  'password': request.values['password']
                              })
            print(r.content)

            response = handle_request(PostRequest(
                {'import': r.content.decode("utf-8")}),
                                      import_prefix='Internet')
            r = requests.post(serverurl + '/deleteitems.php',
                              data={
                                  'email': request.values['email'],
                                  'password': request.values['password']
                              })
            return response

        if post_action_is(request, 'load_online_gemeinsame_transactions'):
            serverurl = request.values['server']
            serverurl = _add_protokoll_if_needed(serverurl)
            _save_server_creds(serverurl, request.values['email'])
            print(serverurl)

            online_username = requester.instance().post(
                serverurl + '/getusername.php',
                data={
                    'email': request.values['email'],
                    'password': request.values['password']
                })
            print('online username: '******'/getgemeinsam.php',
                data={
                    'email': request.values['email'],
                    'password': request.values['password']
                })
            print(online_content)

            table = _parse_table(online_content)
            print('table before person mapping', table)
            table.Person = table.Person.map(
                lambda x: viewcore.database_instance().name
                if x == online_username else configuration_provider.
                get_configuration('PARTNERNAME'))
            online_content = "#######MaschinenimportStart\n"
            online_content = online_content + table.to_csv(index=False)
            online_content = online_content + "#######MaschinenimportEnd\n"

            response = handle_request(PostRequest({'import': online_content}),
                                      import_prefix='Internet_Gemeinsam',
                                      gemeinsam=True)

            requester.instance().post(serverurl + '/deletegemeinsam.php',
                                      data={
                                          'email': request.values['email'],
                                          'password':
                                          request.values['password']
                                      })
            return response

        elif post_action_is(request, 'set_kategorien'):
            kategorien = ','.join(
                sorted(viewcore.database_instance().einzelbuchungen.
                       get_kategorien_ausgaben(
                           hide_ausgeschlossene_kategorien=True)))
            serverurl = request.values['server']

            serverurl = _add_protokoll_if_needed(serverurl)
            _save_server_creds(serverurl, request.values['email'])

            serverurl = serverurl + '/setkategorien.php'

            requester.instance().post(serverurl,
                                      data={
                                          'email': request.values['email'],
                                          'password':
                                          request.values['password'],
                                          'kategorien': kategorien
                                      })
        else:
            print(request.values)
            content = request.values['import'].replace('\r', '')
            FileSystem.instance().write(
                '../Import/' + import_prefix + 'Import_' + str(datetime.now()),
                content)

            imported_values = _parse_table(content)
            datenbank_kategorien = set(viewcore.database_instance().
                                       einzelbuchungen.get_alle_kategorien())
            nicht_passende_kategorien = []
            for imported_kategorie in set(imported_values.Kategorie):
                if imported_kategorie not in datenbank_kategorien:
                    nicht_passende_kategorien.append(imported_kategorie)

            if 'Person' in imported_values.columns:
                gemeinsam = True

            if not nicht_passende_kategorien:
                print('keine unpassenden kategorien gefunden')
                print('beginne mit dem direkten import')
                _import(imported_values, gemeinsam)

                context = viewcore.generate_base_context('import')
                last_elements = []
                for row_index, row in imported_values.iterrows():
                    last_elements.append((row_index, row.Datum, row.Name,
                                          row.Kategorie, row.Wert))
                context['ausgaben'] = last_elements
                return 'import.html', context

            elif _mapping_passt(request.values, nicht_passende_kategorien):
                print(
                    'import kann durchgeführt werden, weil mapping vorhanden')
                imported_values = _map_kategorien(imported_values,
                                                  nicht_passende_kategorien,
                                                  request.values)
                _import(imported_values, gemeinsam)

                context = viewcore.generate_base_context('import')
                last_elements = []
                for row_index, row in imported_values.iterrows():
                    last_elements.append((row_index, row.Datum, row.Name,
                                          row.Kategorie, row.Wert))
                context['ausgaben'] = last_elements

                return 'import.html', context

            print("Nicht passende Kategorien: ", nicht_passende_kategorien)
            options = ['neue Kategorie anlegen']
            for kategorie_option in datenbank_kategorien:
                options.append('als ' + str(kategorie_option) + ' importieren')
            options = sorted(options)
            options.insert(0, 'neue Kategorie anlegen')
            context = viewcore.generate_base_context('import')
            context['element_titel'] = 'Kategorien zuweisen'
            context['unpassende_kategorien'] = nicht_passende_kategorien
            context['optionen'] = options
            context['import'] = request.values['import']
            context['transaction_id'] = 'requested'
            return 'import_mapping.html', context

    context = viewcore.generate_base_context('import')
    context[
        'ONLINE_DEFAULT_SERVER'] = configuration_provider.get_configuration(
            'ONLINE_DEFAULT_SERVER')
    context['ONLINE_DEFAULT_USER'] = configuration_provider.get_configuration(
        'ONLINE_DEFAULT_USER')
    return 'import.html', context
Пример #7
0
 def write_db_file_stub(self,name, stub):
     FileSystem.instance().write('../Database_' + name + '.csv', stub)
Пример #8
0
    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()
Пример #9
0
def _save_config(config):
    content = []
    for key in config:
        content.append('{key}:{value}'.format(key=key, value=config[key]))
    content = reduce(lambda x, y: str(x) + '\n' + str(y), content)
    FileSystem.instance().write('../config', content)