from dataclasses import dataclass import gspread import csv import locale import datetime import yaml import os from pathlib import Path #TODO: Upload automatically! @dataclass class Export: # all necessary fields for ELSAP-importfiles sum_col: str desc_col: str week: str bestellnummer: str bestellposition: str leistungszeilennummer: str kurztext: str leistungszeilentext: str username: str name: str kontierung: str ansprechpartner_username: str ansprechpartner_name: str def export_timesheet(csvexport_filename, ex: Export): with open(f"{csvexport_filename}.csv", 'w') as file: writer = csv.writer(file, delimiter=';', lineterminator="\n") writer.writerow(["Bestellnummer","Bestellpositionsnr","Leistungszeilennummer","Kurztext","Leistungszeilentext","Username","Name","Arbeitstag","Stunden","Beschreibung","Kontierung","Ansprechpartner Username","Ansprechpartner","Status"]) # iterate for time_entry in list_of_dicts: if time_entry.get(ex.sum_col) and time_entry.get(ex.desc_col) and time_entry.get("week"): if (int(time_entry.get("week")) in week) or week is None: #if week == int(time_entry.get("week")) or week is None: date_str_de_de = time_entry.get("date") datetime_object = datetime.datetime.strptime(date_str_de_de, '%a., %d. %B %Y') if ex.kontierung == '': sub_kontierung = time_entry.get("pos_service").split("-")[1] writer.writerow([ex.bestellnummer,ex.bestellposition,ex.leistungszeilennummer,ex.kurztext,ex.leistungszeilentext,ex.username,ex.name,datetime_object.strftime('%d.%m.%Y'),time_entry.get(ex.sum_col),time_entry.get(ex.desc_col),sub_kontierung,ex.ansprechpartner_username,ex.ansprechpartner_name,"OFFEN"]) else: writer.writerow([ex.bestellnummer,ex.bestellposition,ex.leistungszeilennummer,ex.kurztext,ex.leistungszeilentext,ex.username,ex.name,datetime_object.strftime('%d.%m.%Y'),time_entry.get(ex.sum_col),time_entry.get(ex.desc_col),ex.kontierung,ex.ansprechpartner_username,ex.ansprechpartner_name,"OFFEN"]) # Check if the file size is small (indicating only the header) file_path = f"{csvexport_filename}.csv" # Use os.path.getsize to get the file size if os.path.getsize(file_path) <= 190: # Adjust this size threshold based on your expected header size os.remove(file_path) print(f"File {file_path} was deleted because it only contained the header.") else: print(f"File {file_path} contains data and was not deleted.") locale.setlocale(locale.LC_ALL, 'de_AT.UTF-8') with open("./app/config.yaml", encoding='utf8') as f: cfg = yaml.load(f, Loader=yaml.FullLoader) home = Path.home() gc = gspread.service_account(home / "service_account.json") sh = gc.open(cfg['spreadsheet_name']) worksheet = sh.worksheet(cfg['worksheet_name']) week = cfg['week'] # 10, 11, 12 or None username = cfg['username'] name = cfg['name'] ansprechpartner_username = cfg['ansprechpartner_username'] ansprechpartner_name = cfg['ansprechpartner_name'] # read the whole sheet list_of_dicts = worksheet.get_all_records(numericise_ignore=['all']) for key in ["wgwr3", "wgwr_service", "dkarb", "bauwb", "service"]: elsap_id = list_of_dicts[2].get(f"sum_{key}") if elsap_id != "": csvexport_filename = f"{datetime.date.today().strftime('%Y_%m')}_01_{elsap_id}_{username}" ex1 = Export(sum_col=f"sum_{key}", desc_col=f"desc_{key}", week=week, bestellnummer=elsap_id.split('_')[0], bestellposition=elsap_id.split('_')[1], leistungszeilennummer=elsap_id.split('_')[2], kurztext=list_of_dicts[1].get(f"sum_{key}"), leistungszeilentext=list_of_dicts[3].get(f"sum_{key}"), username=username, name=name, kontierung=list_of_dicts[4].get(f"sum_{key}"), ansprechpartner_username=ansprechpartner_username, ansprechpartner_name=ansprechpartner_name) export_timesheet(csvexport_filename=csvexport_filename, ex=ex1)