Reorganize project structure
This commit is contained in:
@@ -5,8 +5,8 @@
|
||||
'spread': 1.0},
|
||||
'visualize_params': {'median_threshold': 6},
|
||||
'spreadsheet_name': 'Zeiterfassung alle Projekte',
|
||||
'worksheet_name': 'Juni 2024',
|
||||
'week': [23],
|
||||
'worksheet_name': 'November 2024',
|
||||
'week': [45,46],
|
||||
'name': 'Markus Zimmerberger',
|
||||
'username': 'ZIM9003',
|
||||
'ansprechpartner_username': 'GRM0003',
|
||||
@@ -0,0 +1,15 @@
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker, declarative_base
|
||||
|
||||
DATABASE_URL = 'postgresql://zisco:ELcowUwryNy0PUf3Jr7z@192.168.1.202:5432/zisco'
|
||||
|
||||
engine = create_engine(DATABASE_URL)
|
||||
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
||||
Base = declarative_base()
|
||||
|
||||
def get_db():
|
||||
db = SessionLocal()
|
||||
try:
|
||||
yield db
|
||||
finally:
|
||||
db.close()
|
||||
@@ -0,0 +1,92 @@
|
||||
from dataclasses import dataclass
|
||||
import gspread
|
||||
import csv
|
||||
import locale
|
||||
import datetime
|
||||
import yaml
|
||||
import os
|
||||
|
||||
#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_DE')
|
||||
|
||||
with open("./app/config.yaml", encoding='utf8') as f:
|
||||
cfg = yaml.load(f, Loader=yaml.FullLoader)
|
||||
|
||||
gc = gspread.service_account()
|
||||
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)
|
||||
@@ -19,7 +19,7 @@ class InvoiceMaker(object):
|
||||
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
def createDocument(self):
|
||||
def create_document(self):
|
||||
""""""
|
||||
voffset = 65
|
||||
|
||||
@@ -84,5 +84,5 @@ class InvoiceMaker(object):
|
||||
#----------------------------------------------------------------------
|
||||
if __name__ == "__main__":
|
||||
doc = InvoiceMaker("example.pdf", "The MVP", 10)
|
||||
doc.createDocument()
|
||||
doc.create_document()
|
||||
doc.savePDF()
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
from fastapi import FastAPI, Depends
|
||||
from sqlalchemy.orm import Session
|
||||
from . import models, database
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
@app.on_event("startup")
|
||||
def startup():
|
||||
models.Base.metadata.create_all(bind=database.engine)
|
||||
|
||||
@app.get("/users/")
|
||||
def read_users(db: Session = Depends(database.get_db)):
|
||||
users = db.query(models.User).all()
|
||||
return users
|
||||
@@ -0,0 +1,9 @@
|
||||
from sqlalchemy import Column, Integer, String
|
||||
from .database import Base
|
||||
|
||||
class User(Base):
|
||||
__tablename__ = 'time_recordings'
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
project_id = Column(String(255), index=True)
|
||||
#email = Column(String(255), unique=True, index=True)
|
||||
|
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 9.7 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
@@ -1,64 +0,0 @@
|
||||
import gspread
|
||||
import csv
|
||||
import locale
|
||||
import datetime
|
||||
import yaml
|
||||
|
||||
#TODO: Upload automatically!
|
||||
|
||||
def export_timesheet(Csvexport_filename,Sum_col,Desc_col,Week,Bestellnummer,Bestellposition,Leistungszeilennummer,Kurztext,Leistungszeilentext,Username,Name,Kontierung,Ansprechpartner_username,Ansprechpartner_name):
|
||||
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(Sum_col) and time_entry.get(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 Kontierung == '':
|
||||
SubKontierung = time_entry.get("pos_service").split("-")[1]
|
||||
writer.writerow([Bestellnummer,Bestellposition,Leistungszeilennummer,Kurztext,Leistungszeilentext,Username,Name,datetime_object.strftime('%d.%m.%Y'),time_entry.get(Sum_col),time_entry.get(Desc_col),SubKontierung,Ansprechpartner_username,Ansprechpartner_name,"OFFEN"])
|
||||
else:
|
||||
writer.writerow([Bestellnummer,Bestellposition,Leistungszeilennummer,Kurztext,Leistungszeilentext,Username,Name,datetime_object.strftime('%d.%m.%Y'),time_entry.get(Sum_col),time_entry.get(Desc_col),Kontierung,Ansprechpartner_username,Ansprechpartner_name,"OFFEN"])
|
||||
|
||||
locale.setlocale(locale.LC_ALL, 'de_DE')
|
||||
|
||||
with open("config.yaml", encoding='utf8') as f:
|
||||
cfg = yaml.load(f, Loader=yaml.FullLoader)
|
||||
|
||||
gc = gspread.service_account()
|
||||
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 != "":
|
||||
# elsap_id = worksheet.acell('H3').value #'2061818_00030_0000000020'
|
||||
csvexport_filename = f"{datetime.date.today().strftime('%Y_%m')}_01_{elsap_id}_{username}"
|
||||
|
||||
export_timesheet(Csvexport_filename=csvexport_filename,
|
||||
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)
|
||||
@@ -0,0 +1,4 @@
|
||||
flyway.url=jdbc:postgresql://postgresql.home:5432/zisco
|
||||
flyway.user=zisco
|
||||
flyway.password=ELcowUwryNy0PUf3Jr7z
|
||||
flyway.locations=filesystem:./sql
|
||||
@@ -0,0 +1,4 @@
|
||||
CREATE TABLE zisco.time_recordings (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
project_id INT
|
||||
);
|
||||
Reference in New Issue
Block a user