def uurkosten_per_persoon(): # Vaste werknemers loonkosten_pp = loonkosten_per_persoon() loonkosten_pp = { user2name()[key]: val for key, val in loonkosten_pp.items() if user2name().get(key) } res = {} for user, kosten in loonkosten_pp.items(): res[user] = round( (kosten["maand_kosten_ft"] + OVERIGE_KOSTEN_PER_FTE_PER_MAAND) * 12 / 45 / 40 / PRODUCTIVITEIT, 2, ) # Freelancers freelancers = sheet_tab("Contracten werknemers", "Freelance") if not freelancers: log_error( "winstgevendheid.py", "uurkosten_per_persoon", "kan niet bij Freelance tab in contracten sheet", ) # Error in the spreadsheet return res id_col = freelancers[0].index("Id") bruto_per_uur_col = freelancers[0].index("BrutoPerUur") for line in freelancers[1:]: if line[id_col]: name = user2name().get(line[id_col]) if name: res[name] = round( float(line[bruto_per_uur_col].replace(",", ".")) + OVERIGE_KOSTEN_PER_FREELANCE_FTR_PER_UUR, 2, ) # Flex flex = sheet_tab("Contracten werknemers", "Flex") if not flex: log_error( "winstgevendheid.py", "uurkosten_per_persoon", "kan niet bij Flex tab in contracten sheet", ) # Error in the spreadsheet return res id_col = flex[0].index("Id") bruto_per_uur_col = flex[0].index("BrutoPerUur") for line in flex[1:]: if line[id_col]: name = user2name().get(line[id_col]) if name: res[name] = round( float(line[bruto_per_uur_col].replace(",", ".")) + OVERIGE_KOSTEN_PER_FREELANCE_FTR_PER_UUR, 2, ) return res
def bijgewerkt(): """Checkt in de Resultaat tab van het Keycijfers sheet of de boekhouding van afgelopen maand al is ingevuld.""" tab = sheet_tab(BEGROTING_SHEET, RESULTAAT_TAB) vm = vorige_maand() data = sheet_value(tab, RESULTAAT_BIJGEWERKT_ROW, vm + 2) return data
def omzet_begroot_tm_maand(m): """Begrote kosten t/m maand m""" if m == 0: return 0 tab = sheet_tab(BEGROTING_SHEET, BEGROTING_TAB) res = sheet_value(tab, BEGROTING_INKOMSTEN_ROW, m + 2) * 1000 return Decimal(res)
def winst_per_maand(): tab = sheet_tab(BEGROTING_SHEET, RESULTAAT_TAB) if not tab: return 0 # Error in the spreadsheet return [ to_int(s) for s in tab[RESULTAAT_WINST_ROW - 1][2:14] if to_int(s) != 0 ]
def laatste_geboekte_maand(): # Nummer van de laatste maand die in de boekhouding is bijgewerkt tab = sheet_tab(BEGROTING_SHEET, RESULTAAT_TAB) for m in range(12): data = sheet_value(tab, RESULTAAT_BIJGEWERKT_ROW, m + 3) if not data: return m return 12
def kosten_begroot_tm_maand(y, m): """Begrote kosten t/m maand m""" # todo: !! Rekening houden met het jaar if m == 0: return 0 tab = sheet_tab(BEGROTING_SHEET, BEGROTING_TAB) res = sheet_value(tab, BEGROTING_KOSTEN_ROW, m + 2) * 1000 return Decimal(res)
def omzet_vorig_jaar_per_maand(): y = datetime.today().year tab = sheet_tab(BEGROTING_SHEET, BEGROTING_TAB) if not tab: return 0 # Error in the spreadsheet return [ to_int(s) for s in tab[BEGROTING_INKOMSTEN_VORIG_JAAR_ROW - 1][2:14] ]
def omzet_per_maand(): tab = sheet_tab(BEGROTING_SHEET, RESULTAAT_TAB) if not tab: return 0 # Error in the spreadsheet res = [ to_int(s) for s in tab[RESULTAAT_INKOMSTEN_ROW - 1][2:14] if to_int(s) > 0 ] return res
def loonkosten_per_persoon(): """Dict met gegevens uit het contracten sheet met user als key en velden: - bruto: Bruto maandsalaris - maand_kosten_ft: Maandelijkse kosten voor Oberon op basis van fulltime - uren: Aantal uur per week - kosten_jaar: Werkelijke kosten dit jaar rekening houdend met startdatum en part time""" contracten = sheet_tab("Contracten werknemers", "Fixed") if not contracten: return [] # Error in the spreadsheet ex_werknemers = sheet_tab("Contracten werknemers", "ex werknemers") if not ex_werknemers: return [] # Error in the spreadsheet # Mensen die een managementfee factureren rdb = { "bruto": MT_SALARIS / 12, "maand_kosten_ft": MT_SALARIS / 12, "uren": 40 } gert = { "bruto": MT_SALARIS / 12 * 32 / 40, "maand_kosten_ft": MT_SALARIS / 12, "uren": 32, } joost = { "bruto": MT_SALARIS * 104 / 110 / 12 * 36 / 40, "maand_kosten_ft": MT_SALARIS * 104 / 110 / 12, "uren": 36, } hph = rdb users = {"rdb": rdb, "gert": gert, "hph": hph, "joost": joost} for k in users.keys(): users[k]["kosten_jaar"] = (MT_SALARIS * users[k]["uren"] / 40, ) users[k]["jaar_kosten_pt"] = 12 * users[k]["maand_kosten_ft"] * users[ k]["uren"] / 40 users[k]["fraction_of_the_year_worked"] = fraction_of_the_year_past() # Werknemers en ex werknemers id_col = contracten[0].index("Id") bruto_col = contracten[0].index("Bruto") kosten_col = contracten[0].index("Kosten voor Oberon obv full") uren_col = contracten[0].index("UrenPerWeek") start_date_col = contracten[0].index("InDienstGetreden") end_date_col = ex_werknemers[0].index("Einddatum") for line in contracten[1:] + ex_werknemers[1:]: if line[id_col]: d, m, y = parse_date(line[start_date_col]) if y == datetime.today().year: start_year_fraction = (m - 1) / 12 + d / 365 else: start_year_fraction = 0 end_year_fraction = fraction_of_the_year_past() if line in ex_werknemers: try: d, m, y = parse_date(line[end_date_col]) except: log_error( "winstgevendheid.py", "loonkosten_per_persoon()", "End date is not filled in for " + line[2], ) if y < datetime.today().year: continue if y == datetime.today().year: end_year_fraction = (m - 1) / 12 + d / 365 maand_kosten_ft = ( to_float(line[kosten_col]) if line[kosten_col] else 0 ) # Kosten_col zit LH, vakantiegeld etc. al bij in users[line[id_col]] = { "bruto": to_float(line[bruto_col]), "maand_kosten_ft": maand_kosten_ft, "uren": to_int(line[uren_col]), "jaar_kosten_pt": 12 * maand_kosten_ft * to_int(line[uren_col]) / 40, "fraction_of_the_year_worked": end_year_fraction - start_year_fraction, } return users
def winst_begroot_per_maand(): tab = sheet_tab(BEGROTING_SHEET, BEGROTING_TAB) if not tab: return 0 # Error in the spreadsheet return [1000 * to_int(s) for s in tab[BEGROTING_WINST_ROW - 1][2:14]]
def aantal_fte_begroot(): tab = sheet_tab(FTE_SHEET, FTE_TAB) m = datetime.today().month res = sheet_value(tab, FTE_ROW, FTE_START_COL + m - 1) return res
def aantal_fte(): tab = sheet_tab('Contracten werknemers', 'stats') return sheet_value(tab, 3, 6)
def aantal_mensen(hours=168): tab = sheet_tab('Contracten werknemers', 'stats') return sheet_value(tab, 2, 6)