From 896d8db5b95f246a8582546532896ed34ff1e32f Mon Sep 17 00:00:00 2001 From: Beate Trzensiok Date: Wed, 14 Feb 2024 10:30:37 +0100 Subject: [PATCH] Item get act Stock --- msp/tools.py | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 186 insertions(+), 1 deletion(-) diff --git a/msp/tools.py b/msp/tools.py index b937a64..3348c8b 100644 --- a/msp/tools.py +++ b/msp/tools.py @@ -1,5 +1,7 @@ import frappe import json +from datetime import datetime, date, timedelta +from erpnext.stock.utils import get_stock_balance @frappe.whitelist() def checklist_fetch_from_template(values, name): @@ -29,4 +31,187 @@ def get_recursive_items(template_doc, it_checklist_doc): }) it_checklist_doc.append("it_checklist_elements", current_chekclist_element_doc) return it_checklist_doc - \ No newline at end of file + + + +@frappe.whitelist() +def get_hours_from_service_reports(employee, from_date, to_date): + + + to_date = to_date + timedelta(days=1) - timedelta(seconds=1) + + result = get_service_report_work(employee) + print(result) + + hours_dict = {} + + if result: + for entry in result: + if entry['end'] and entry['begin'] and entry['end'] >= from_date and entry['begin'] <= to_date: + date_key = entry['begin'].date() + if date_key not in hours_dict: + hours_dict[date_key] = 0 + hours_dict[date_key] += entry['hours'] + hours_sum = sum([x.hours for x in result if x.end and x.begin and x.end >= from_date and x.begin <= to_date]) + + else: + hours_sum = 0 + sorted_hours_dict = dict(sorted(hours_dict.items())) + print(hours_sum) + print(hours_dict) + return sorted_hours_dict,hours_sum + +def get_service_report_work(employee): + + + result = frappe.db.sql(""" + SELECT `begin`, `end`, `hours` + FROM `tabService Report Work` + WHERE parenttype = 'Service Report' + AND parent IN (SELECT name FROM `tabService Report` + WHERE employee = %s + ) + """, (employee,), as_dict=True) + + return result + + +@frappe.whitelist() +def get_target_hours(employee, from_date, to_date): + from_date = from_date.date() + to_date = to_date.date() + + target_agreement = frappe.get_all("Employee Target Agreement", + filters={ + "employee": employee, + "to_date": (">=", from_date), + "from_date": ("<=", to_date) + }, + fields=["from_date", "to_date", "daily_hours"]) + + # Liste der Feiertage + holidays_list = get_holidays_list(from_date, to_date) + + # Liste der Anwesenheitsdaten + attendance_list = get_attendance_list(employee, from_date, to_date) + + target_hours_dict = {} + + if target_agreement: + for agreement in target_agreement: + agreement_from_date = max(from_date, agreement["from_date"]) + agreement_to_date = min(to_date, agreement["to_date"]) + + current_date = agreement_from_date + while current_date <= agreement_to_date: + # Überprüfen, ob das Datum in der Liste der Feiertage enthalten ist + if current_date in holidays_list: + target_hours_dict[current_date] = 0 + else: + # Überprüfung vom Anwesenheitsstatus + attendance_status = attendance_list.get(current_date, "") + if attendance_status == "On Leave": + target_hours_dict[current_date] = 0 + elif attendance_status == "Half Day": + target_hours_dict[current_date] = agreement["daily_hours"] / 2 + else: + target_hours_dict[current_date] = agreement["daily_hours"] + + current_date += timedelta(days=1) + + return target_hours_dict + +def get_holidays_list(from_date, to_date): + + holidays = frappe.get_all("Holiday List", filters={"to_date": (">=", from_date), + "from_date": ("<=", to_date)}, + ) + holidays_list =[] + for x in holidays: + hol_doc = frappe.get_doc("Holiday List", x.name) + holidays_li = [h.holiday_date for h in hol_doc.holidays] + holidays_list.extend(holidays_li) + + print(holidays_list) + + # holidays_list = [datetime.strptime(holiday, '%Y-%m-%d').date() for holiday in holidays[0]["holidays"]] + return holidays_list + +def get_attendance_list(employee, from_date, to_date): + # Liste der Anwesenheitsdaten für den Mitarbeiter im angegebenen Zeitraum + attendance_data = frappe.get_all("Attendance", + filters={ + "employee": employee, + "attendance_date": (">=", from_date), + "attendance_date": ("<=", to_date) + }, + fields=["attendance_date", "status"]) + + # Dictionary mit Datum als Schlüssel und Anwesenheitsstatus als Wert + attendance_dict = {entry["attendance_date"]: entry["status"] for entry in attendance_data} + return attendance_dict + + +@frappe.whitelist() +def compare_hours(employee, from_date, to_date): + from_date = datetime.strptime(from_date, '%Y-%m-%d') + to_date = datetime.strptime(to_date, '%Y-%m-%d') + # Stunden aus get_hours_from_service_reports erhalten + service_hours, service_hours_sum = get_hours_from_service_reports(employee, from_date, to_date) + + # Stunden aus get_target_hours erhalten + target_hours = get_target_hours(employee, from_date, to_date) + + # Initialisiere die Dictionarys + daily_dict = {} + period_dict = {"service_hours": service_hours_sum, "target_hours": sum(target_hours.values())} + + # Vergleich der Stunden für jeden Tag im Zeitraum + current_date = from_date + to_date = to_date + + while current_date <= to_date: + date_key = current_date.date() + + # Service-Stunden für das Datum + service_hour = service_hours.get(date_key, 0) + + # Target-Stunden für das Datum + target_hour = target_hours.get(date_key, 0) + + # Differenz zwischen Target-Stunden und Service-Stunden für das Datum + difference = service_hour - target_hour + + # Füge Werte zum daily_dict hinzu + daily_dict[date_key] = {"service_hours": service_hour, "target_hours": target_hour, "difference": difference} + + current_date += timedelta(days=1) + + return {"daily_dict": daily_dict, "period_dict": period_dict} + + +@frappe.whitelist() +def get_act_stock(name): + warehouses = frappe.get_all("Warehouse", filters={"disabled": 0}, pluck="name") # Alle aktiven Warenlager erhalten + total_qty = 0 + + for warehouse in warehouses: + item_qty = get_stock_balance(name, warehouse) + total_qty += item_qty + + # warehouse = "Lagerräume - IG" + # item_qty = get_stock_balance(name,warehouse) + + if item_qty < 0: + result = ''+ ' ' + str(item_qty) + elif item_qty == 0: + result = '' + ' ' + str(item_qty) + elif item_qty > 0: + result = '' + ' ' + str(item_qty) + # + return result + + + + +