def make_basic_report(report_data): report = ISection(name='report') report = add_test_specs(report, **report_data) report = add_test_results_table(report, **report_data) report = add_test_results_plots(report, **report_data) report_name = f'basic-report.pdf' build_report(report, report_name, **report_data)
def make_lum_report(report_data): report = ISection(name='report') # add test specifications to report if available if report_data['test_specs_df'] is not None: report = add_test_specs(report, **report_data) with report.new_section('Light Directionality', page_break=False) as ld: ld = add_light_directionality(ld, numbering=False, **report_data) report_name = f'lum-report.pdf' build_report(report, report_name, **report_data)
def make_report(report_data): report = ISection(name='report') report = add_test_specs(report, **report_data) merged_df = report_data['merged_df'] with report.new_section("APL' vs Power Charts", page_break=False) as apl_power: for test_name in merged_df['test_name'].unique(): if 'standby' not in test_name: apl_power = add_apl_power(apl_power, test_name, **report_data) filename = f'apl-power-charts.pdf' report_title = "APL' vs Power Charts All Tests" build_report(report, filename, report_title=report_title, **report_data)
def main(argv): if argv: inputfile = argv[0] else: raise ValueError("python main.py <inputfile>") presences = load_data(inputfile) report = build_report(presences) print(report)
def run_experiment(cfg): logging.getLogger(__name__).info("Initializing reader " + cfg_get(cfg, 'reader')) reader = readers[cfg_get(cfg, 'reader')] logging.getLogger(__name__).info("Reading dataset...") dataset = reader(cfg_get(cfg, 'input'), **cfg_get(cfg, 'reader_params', {})) preprocessing_steps = cfg_get(cfg, 'preprocessing', []) for step in preprocessing_steps: step_name = step['name'] step_params = step['params'] if 'params' in step else {} logging.getLogger(__name__).info("Running pre processing step " + step_name) preprocessing_functions[step_name](dataset=dataset, **step_params) logging.getLogger(__name__).info("Initializing model " + cfg_get(cfg, 'model')) model = models[cfg_get(cfg, 'model')](dataset=dataset, **cfg_get(cfg, 'model_params', {})) if cfg_get(cfg, 'optimizer', required=False) is not None: logging.getLogger( __name__).info("Initializing optimizer " + str(cfg_get(cfg, 'optimizer', required=False))) optimizer = optimizers[cfg_get( cfg, 'optimizer', required=False)](**cfg_get(cfg, 'optimizer_params', {})) else: optimizer = None logging.getLogger(__name__).info("Preparing the model...") if optimizer is not None: model.prepare(optimizer=optimizer) else: model.prepare() logging.getLogger(__name__).info("Inizializing driver " + cfg_get(cfg, 'driver', 'train_test')) driver = training_drivers[cfg_get(cfg, 'driver', 'train_test')] logging.getLogger(__name__).info("Calling driver...") t_start = datetime.now() i_train, y_train, p_train, i_test, y_test, p_test = driver( model, dataset, **cfg_get(cfg, 'driver_params', {})) t_end = datetime.now() report = build_report(y_train, p_train, y_test, p_test, dataset, (t_end - t_start).total_seconds()) report['config'] = cfg postprocessing_steps = cfg_get(cfg, 'postprocessing', []) report['postprocessing'] = {} for step in postprocessing_steps: step_name = step['name'] step_params = step['params'] if 'params' in step else {} logging.getLogger(__name__).info("Running postprocessing step " + step_name) report['postprocessing'][step_name] = postprocessing_functions[ step_name](dataset=dataset, report=report, i_train=i_train, y_train=y_train, p_train=p_train, i_test=i_test, y_test=y_test, p_test=p_test, **step_params) if 'model_save_file' in cfg: logging.getLogger(__name__).info("Saving model to file " + cfg['model_save_file']) model.save(cfg['model_save_file']) if 'model_export_file' in cfg: logging.getLogger(__name__).info("Exporting model to file " + cfg['model_export_file']) model.export(cfg['model_export_file'], dataset.label_names) return report
def make_compliance_report(report_data): report = ISection(name='report') report = add_test_specs(report, **report_data) report = add_compliance_section(report, **report_data) report_name = f'compliance-report.pdf' build_report(report, report_name, **report_data)
def event_handler(event, window): settings = sg.UserSettings() show_company_data = False if event in (sg.WIN_CLOSED, 'Exit'): return "exit" if event in company.Company.all(): settings['-company-'] = event company.Company.current_load_data() return "outer" #print(event, values) elif event == 'Über': print() print('ERPNext Client für Solidarische Ökonomie Bremen', 'Version ' + VERSION) elif event == 'Hilfe Server': print() print('Anleitung für Einstellungen ERPNext-Server:') print( '- Adresse des ERPNext-Servers: z.B. https://erpnext.cafesunshine.de' ) print( '- API-Schlüssel und -Geheimnis bekommt man im ERPNext-Webclient') print('- (d.h. im Browser unter eben jener Adresse)') print(' - unter Einstellungen - My Settings') print(' - API-Zugriff (ganz unten auf der Seite)') print(' - dann "Schlüssel generieren" anklicken') print(' - das API-Geheimnis wird nur einmal angezeigt!') print(' - der API-Schlüssel wird stets angezeigt') print('- Diese Daten hier unter "Einstellungen" eingeben.') elif event == 'Hilfe Banktransaktionen': print() print('Das Datum des letzten Kontoauszugs wird angezeigt') print( 'Im Homebanking die Banktransaktionen seit diesem Datum herunterladen und als csv-Datein speichern' ) print( '- Doppelungen werden erkannt, also lieber einen zu großen statt zu kleinen Zeitraum wählen' ) print('Dann hier unter Einlesen - Kontoauszug die csv-Datei hochladen') print( 'Danach unter Bearbeiten - Banktransaktionen die Banktransaktionen zuordnen' ) print( 'Jeder Banktransaktion muss ein ERPNext-Buchungskonto oder eine offene Rechnung zugeordnet werden' ) print( '- Dadurch entsteht ein ERPNext-Buchungssatz oder eine ERPNext-Zahlung' ) print( '- Man kann die Bearbeitung einer Banktransaktion auch abbrechen und mit der nächsten weitermachen' ) print( ' - Die Banktransaktion bleibt dann offen und kann später bearbeitet werden' ) print( 'Schließlich müssen die ERPNext-Buchungssätze und ERPNext-Zahlungen noch gebucht werden' ) print( '-> Das geht unter Anzeigen - Buchungssätze bzw. Anzeigen - Zahlungen, oder auf der ERPNext-Seite' ) elif event == 'Hilfe Rechnungen': print() print('Einlesen von Einkaufsrechnungen:') suppliers = ", ".join( purchase_invoice.PurchaseInvoice.suppliers.keys()) print( 'Derzeit können Rechnungen von folgenden Lieferanten eingelesen werden: ' + suppliers) print( '(Für andere Lieferanten bitte im ERPNext-Webclient manuell eine Rechnung anlegen. Die Liste der hier möglichen Lieferanten kann ggf. erweitert werden.)' ) print('Das Einlesen einer Rechnung geht hier wie folgt:') print( '- Unter Einlesen - Einkaufsrechnung das PDF hochladen (bitte keinen Scan einer Rechnung und keine Auftragsbestätigung!)' ) print('- oder unter Einlesen - Einkaufsrechnung Balkonmodule') print('Bei Balkonmodul-Rechnungen wird das Lager aktualisiert, d.h.:') print( '- Für jeden Rechnungenartikel muss ein ERPNext-Artikel gefunden werden' ) print( '- Es kann auch ein neuer ERPNext-Artikel angelegt werden, mit den Daten aus der Rechnung' ) print('- Ggf. muss der Preis angepasst werden') print( 'Für alle Rechnungen (ob Balkonmodul oder nicht) wird schließlich die Einkaufsrechnungen in ERPNext hochgeladen.' ) print('Dort muss sie noch geprüft und gebucht werden') elif event == 'Hilfe Buchen': print() print( 'In ERPNext werden Dokumente wie Rechnungen, Buchungssätze und Zahlungen zunächst als Entwurf gespeichert.' ) print( 'Im Entwurfsstadium kann ein Dokument noch bearbeitet oder auch gelöscht werden.' ) print( 'Schließlich muss das Dokument gebucht werden. Nur dann wird es für die Abrechnung wirksam.' ) print( 'Ein einmal gebuchtes Dokument bleibt für immer im System. Es kann nicht mehr bearbeitet werden. Das ist gesetzlich so vorgeschrieben.' ) print( 'Es kann allerdings abgebrochen und abgeändert werden. Dadurch entsteht ein neues Dokument (eine Kopie).' ) print( 'Das alte Dokument bleibt aber als abgebrochenes Dokument im System.' ) elif event == 'ERPNext-Server': layout = [[sg.Text('Adresse des ERPNext-Servers')], [sg.Input(default_text=settings['-server-'])], [sg.Text('API-Schlüssel für Server-API')], [sg.Input(default_text=settings['-key-'])], [sg.Text('API-Geheimnis für Server-API')], [sg.Input(default_text=settings['-secret-'])], [sg.Button('Testen')]] window1 = sg.Window("ERPNext-Server-Einstellungen", layout, finalize=True) window1.bring_to_front() event, values = window1.read() if values: if len(values) > 0 and values[0]: settings['-server-'] = values[0] if len(values) > 1 and values[1]: settings['-key-'] = values[1] if len(values) > 2 and values[2]: settings['-secret-'] = values[2] window1.close() if "http:" in settings['-server-']: settings['-server-'] = settings['-server-'].replace( 'http', 'https') print() print("Teste API ...") result = api_wrapper(Api.initialize) if result['err_msg'] or result['exception']: if result['err_msg']: print(result['err_msg']) elif result['exception']: print(result['exception']) print("API-Test fehlgeschlagen!") settings['-setup-'] = True else: print("API-Test erfolgreich!") settings['-setup-'] = False initial_loads() window.close() return "outer" elif event == 'Update': print() print("Aktualisiere dieses Programm...") tmp = tempfile.mktemp() os.system("cd {}; git pull --rebase > {} 2>&1".format( settings['-folder-'], tmp)) f = open(tmp, 'r') print(f.read()) f.close() print("Bitte Programm neu starten.") elif event == 'Sofort buchen': c = checkbox_input( 'Buchungseinstellungen', 'Ein Dokument muss gebucht werden, um für die Abrechnung wirksam zu werden.\nEin einmal gebuchtes Dokument bleibt für immer im System. Es kann nicht mehr bearbeitet werden. Das ist gesetzlich so vorgeschrieben.\nBei einer Einkaufsrechnung wird in jedem Fall gefragt, ob diese gebucht werden soll.', 'Alle Dokumente immer gleich einbuchen', default=settings['-buchen-']) if c is not None: settings['-buchen-'] = c elif settings['-setup-']: print() print("Bitte erst ERPNext-Server einstellen (unter Einstellungen)") return "inner" elif event == 'Daten neu laden': company.Company.clear_companies() bank.BankAccount.clear_baccounts() initial_loads() show_company_data = True elif event == 'Kontoauszug': filename = utils.get_file('Kontoauszug als csv') if filename: print() print("Lese {} ein ...".format(filename)) b = bank.BankStatement.process_file(filename) if b: comp = b.baccount.company.name if settings['-company-'] != comp: print("Kontoauszug ist für " + comp) settings['-company-'] = comp show_company_data = True print("{} Banktransaktionen eingelesen, davon {} neu".\ format(len(b.entries),len(b.transactions))) else: print("Konnte keinen Kontoauszug einlesen") elif event == 'Einkaufsrechnung': if purchase_inv(False): show_company_data = True elif event == 'Einkaufsrechnung Balkonmodule': if purchase_inv(True): show_company_data = True elif event == 'Banktransaktionen bearbeiten': comp = company.Company.get_company(settings['-company-']) if comp: comp.reconciliate_all() show_company_data = True elif event == 'Buchungssätze': keys = [ 'posting_date', 'account', 'caccount', 'total_debit', 'user_remark' ] headings = [ 'Datum', 'Buchungskonto', 'Gegenkonto', 'Betrag', 'Bemerkung' ] while True: comp = company.Company.get_company(settings['-company-']) jes = comp.open_journal_entries() jes1 = [] for j in jes: j1 = gui_api_wrapper(Api.api.get_doc, 'Journal Entry', j['name']) j1['account'] = j1['accounts'][0]['account'] j1['caccount'] = j1['accounts'][1]['account'] jes1.append(j1) title = "Buchungssätze" tbl = table.Table(jes1, keys, headings, title, enable_events=True, display_row_numbers=True) ix = tbl.display() if ix is False: break je = jes[ix] details = utils.format_entry(jes1[ix], keys, headings) choice = easygui.buttonbox("Buchungssatz {}\n{} ".\ format(je['name'],details), "Buchungssatz", ["Buchen","Löschen","Nichts tun"]) if choice == "Buchen": bank.BankTransaction.submit_entry(je['name']) show_company_data = True elif choice == "Löschen": bank.BankTransaction.delete_entry(je['name']) show_company_data = True elif event == 'Zahlungen': while True: keys = ['posting_date', 'paid_amount', 'party', 'reference_no'] headings = ['Datum', 'Betrag', 'Gezahlt an', 'Referenz.'] comp = company.Company.get_company(settings['-company-']) pes = comp.open_payment_entries() title = "Zahlungen" tbl = table.Table(pes, keys, headings, title, enable_events=True, display_row_numbers=True) ix = tbl.display() if ix is False: break pe = pes[ix] details = utils.format_entry(pe, keys, headings) choice = easygui.buttonbox("Zahlung {}\n{} ".\ format(pe['name'],details), "Zahlung", ["Buchen","Löschen","Nichts tun"]) if choice == "Buchen": bank.BankTransaction.submit_entry(pe['name'], is_journal=False) show_company_data = True elif choice == "Löschen": bank.BankTransaction.delete_entry(pe['name'], is_journal=False) show_company_data = True elif event in ['Einkaufsrechnungen', 'Verkaufsrechnungen']: while True: keys = [ 'posting_date', 'outstanding_amount', 'bill_no', 'status', 'account', 'supplier', 'title' ] headings = [ 'Datum', 'Ausstehend', 'Rechungsnr.', 'Status', 'Buchungskonto', 'Lieferant', 'Titel' ] comp = company.Company.get_company(settings['-company-']) if event == 'Einkaufsrechnungen': inv_type = 'Purchase Invoice' else: inv_type = 'Sales Invoice' invs = comp.get_open_invoices_of_type(inv_type) inv_docs = [] bt_dict = defaultdict(list) for i in range(len(invs)): name = invs[i].name inv_doc = gui_api_wrapper(Api.api.get_doc, inv_type, name) if not 'bill_no' in inv_doc: inv_doc['bill_no'] = name accounts = list( set(map(lambda i: i['expense_account'], inv_doc['items']))) inv_doc['account'] = accounts[0] if len(accounts) > 1: inv_doc['account'] + " + weitere" total = inv_doc['grand_total'] if inv_type == 'Purchase Invoice': total = -total bt = bank.BankTransaction.find_bank_transaction(\ comp.name,total, inv_doc['bill_no'] if 'bill_no' in inv_doc else "") if bt: ref = None if 'customer' in inv_doc: ref = inv_doc['customer'] if 'supplier' in inv_doc: ref = inv_doc['supplier'] if ref: inv_doc['similarity'] = \ utils.similar(bt.description.lower(), ref.lower()) bt_dict[bt.name].append((i, inv_doc['similarity'])) inv_doc['bt'] = bt inv_doc['btname'] = bt.name inv_doc['disabled'] = not (bt or inv_doc['status'] == 'Draft') inv_docs.append(inv_doc) # handle duplicate bank transactions, use best matching invoice for bt, entries in bt_dict.items(): entries.sort(key=lambda e: e[1], reverse=True) for (i, s) in entries[1:]: del inv_docs[i]['bt'] del inv_docs[i]['btname'] tbl = table.Table(inv_docs, keys + ['btname'], headings + ['Bank'], event, enable_events=True, display_row_numbers=True) ix = tbl.display() if ix is False: break inv_doc = inv_docs[ix] details = utils.format_entry(inv_doc, keys, headings) msg = "{} {}\n{} ".\ format(event[:-2],inv_doc['name'],details) choices = [ "Buchen", "Löschen", "Buchungskonto bearbeiten", "Nichts tun" ] if 'bt' in inv_doc: bt = inv_doc['bt'] msg += "\n\nZugehörige Bank-Transaktion gefunden: {}\n".\ format(bt.description) choices[0] = "Sofort buchen und zahlen" if bt or inv_doc['status'] == 'Draft': choice = easygui.buttonbox(msg, event[:-2], choices) #print(choice) if choice == "Buchen" or choice == "Sofort buchen und zahlen": gui_api_wrapper(Api.submit_doc, inv_type, inv_doc['name']) show_company_data = True if choice == "Sofort buchen und zahlen": inv = Invoice(inv_doc, inv_type == 'Sales Invoice') inv.payment(bt) elif choice == "Löschen": gui_api_wrapper(Api.api.delete, inv_type, inv_doc['name']) show_company_data = True elif choice == "Buchungskonto bearbeiten": if inv_doc['account'][-10:] != ' + weitere': title = "Buchungskonto ändern" msg = "Bitte ein Buchungskonto auswählen" accounts = comp.leaf_accounts_for_credit account_names = [acc['name'] for acc in accounts] account_names.remove(inv_doc['account']) texts = [inv_doc['account']] + account_names account = easygui.choicebox(msg, title, texts) del inv_doc['account'] nitems = [] for item in inv_doc['items']: item['expense_account'] = account nitems.append(item) inv_doc['items'] = nitems gui_api_wrapper(Api.api.update, inv_doc) elif event == 'Banktransaktionen': keys = ['date', 'amount', 'description'] headings = ['Datum', 'Betrag', 'Bemerkung'] comp = company.Company.get_company(settings['-company-']) while True: bts = comp.open_bank_transactions() for bt in bts: bt['amount'] = bt['unallocated_amount'] * np.sign( bt['deposit'] - bt['withdrawal']) title = "Banktransaktionen" tbl = table.Table(bts, keys, headings, title, enable_events=True, max_col_width=120, display_row_numbers=True) ix = tbl.display() if ix is False: break comp.reconciliate(bts[ix]) show_company_data = True elif event in bank.BankAccount.get_baccount_names(): keys = ['date', 'open', 'amount', 'balance', 'description'] headings = ['Datum', 'Offen', 'Betrag', 'Stand', 'Bemerkung'] while True: bts = gui_api_wrapper(Api.api.get_list, 'Bank Transaction', filters={ 'bank_account': event, 'status': ['!=', 'Cancelled'] }, order_by='date asc', limit_page_length=LIMIT) balance = 0.0 for bt in bts: bt['amount'] = bt['deposit'] - bt['withdrawal'] balance += bt['amount'] bt['balance'] = balance bt['disabled'] = (bt['status'] == 'Reconciled') if bt['disabled']: bt['open'] = '' else: bt['open'] = '*' bts.reverse() title = "Banktransaktionen für " + event tbl = table.Table(bts, keys, headings, title, enable_events=True, max_col_width=120, display_row_numbers=True) ix = tbl.display() if ix is False: break comp = company.Company.get_company(settings['-company-']) comp.reconciliate(bts[ix]) show_company_data = True elif event in [ 'Abrechnung', 'Quartalsabrechnung', 'Monatsabrechnung', 'Bilanz' ]: comp = settings['-company-'] if event == 'Abrechnung': consolidated = True periodicity = 'Yearly' elif event == 'Quartalsabrechnung': consolidated = False periodicity = 'Quarterly' elif event == 'Monatsabrechnung': consolidated = False periodicity = 'Monthly' else: consolidated = False periodicity = None balance = event == 'Bilanz' tbl = report.build_report(comp, consolidated=consolidated, balance=balance, periodicity=periodicity) # in PDF, always also display balance if event != 'Bilanz': child = report.build_report(comp, consolidated=False, balance=True) tbl.child = child tbl.child_title = " mit Bilanz" while True: ix = tbl.display() if ix is False: break account = tbl.entries[ix]['account'] tbl1 = report.general_ledger(comp, account) if tbl1: tbl1.display() elif event in ['Chancen', 'Chancen Balkon']: tbl = report.opportunities(settings['-company-'], event == 'Chancen Balkon') tbl.display() if show_company_data: print() show_data() window.set_title(utils.title()) show_company_data = False return "inner"