Anpassungen Preset, Employee und Summe

This commit is contained in:
Beate Trzensiok 2022-03-18 13:24:37 +01:00
parent f93587e175
commit 6b657d5b13
7 changed files with 202 additions and 90 deletions

View File

@ -0,0 +1,32 @@
{
"actions": [],
"allow_rename": 1,
"creation": "2022-03-17 13:43:21.255556",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"employee"
],
"fields": [
{
"fieldname": "employee",
"fieldtype": "Link",
"in_list_view": 1,
"label": "Employee",
"options": "Employee"
}
],
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2022-03-17 13:43:21.255556",
"modified_by": "Administrator",
"module": "MSP",
"name": "Veraufsstatistik Employee",
"owner": "Administrator",
"permissions": [],
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1
}

View File

@ -0,0 +1,8 @@
# Copyright (c) 2022, itsdave GmbH and contributors
# For license information, please see license.txt
# import frappe
from frappe.model.document import Document
class VeraufsstatistikEmployee(Document):
pass

View File

@ -4,6 +4,14 @@
frappe.ui.form.on('Verkaufsstatistik Report', {
refresh: function(frm) {
frm.add_custom_button('Generate Excel Sheet', () => frm.trigger('generate_excel_sheet'));
frm.add_custom_button('Generate Report', () => frm.trigger('generate_report'));
},
generate_report: function(frm) {
frm.call('generate_report', {}, () => frm.reload_doc());
},
generate_excel_sheet: function(frm) {
frm.call('generate_excel_sheet', {}, () => frm.reload_doc());
moment.locale("de") // weeks start on monday
frm.trigger('preset');
@ -17,6 +25,7 @@ frappe.ui.form.on('Verkaufsstatistik Report', {
// }
// });
// },
preset: function(frm) {
if (!frm.doc.preset) {
// No preset selected. Allow manual selection of dates.
@ -35,52 +44,9 @@ frappe.ui.form.on('Verkaufsstatistik Report', {
frm.events.set_dates(frm, frappe.datetime.year_to_date());
}
}
},
from_date: (frm) => frm.trigger('set_to_date'),
set_to_date: function (frm) {
const len_in_days = moment(frm.doc.to_date).diff(moment(frm.doc.from_date), 'days');
let to_date = moment(frm.doc.from_date).add(len_in_days, 'days');
if (frm.doc.preset && frm.doc.preset !== 'YTD') {
// to_date is equal to the end of the week / month / year of from_date
const time_map = {
'Last Week': 'week',
'Last Month': 'month',
'Last Year': 'year',
}
to_date = moment(frm.doc.from_date).endOf(time_map[frm.doc.preset]);
}
},
set_from_date: function(frm) {
if (frm.doc.to_previous_year) {
frm.toggle_enable(['from_date'], false);
let from_date = moment(frm.doc.from_date).subtract(1, 'year');
if (frm.doc.preset == 'Last Week') {
const week = moment(frm.doc.from_date).format('WW');
const previous_year = (moment(frm.doc.from_date).year() - 1).toString();
from_date = moment(`${previous_year}W${week}`);
}
frm.set_value('from_date', from_date.format());
} else {
frm.toggle_enable(['from_date'], true);
}
},
set_dates: function(frm, date_range) {
frm.set_value('from_date', date_range.start);
frm.set_value('to_date', date_range.end);
},
});
});

View File

@ -8,16 +8,19 @@
"field_order": [
"from_date",
"preset",
"artikel",
"column_break_4",
"to_date",
"report",
"section_break_6",
"gruppiert",
"artikel",
"employee",
"report_section",
"report_basierend_auf",
"gruppiert_nach",
"section_break_10",
"anzahl",
"preis",
"summenzeile",
"zeiteinheit_section",
"resolution",
"ausgabe_section",
@ -36,6 +39,7 @@
"options": "\nLast Week\nLast Month\nLast Year\nYTD"
},
{
"depends_on": "eval:doc.gruppiert==\"Item\"",
"fieldname": "artikel",
"fieldtype": "Table MultiSelect",
"label": "Artikel",
@ -50,12 +54,6 @@
"fieldtype": "Date",
"label": "To Date"
},
{
"fieldname": "report",
"fieldtype": "Button",
"label": "Report",
"options": "do_report"
},
{
"fieldname": "resolution",
"fieldtype": "Select",
@ -89,7 +87,7 @@
"fieldname": "gruppiert_nach",
"fieldtype": "Select",
"label": "Gruppiert nach",
"options": "Artikel\nMitarbeiter"
"options": "Artikel\nMitarbeiter\nAlle"
},
{
"fieldname": "zeiteinheit_section",
@ -110,12 +108,36 @@
},
{
"fieldname": "section_break_10",
"fieldtype": "Section Break",
"label": "Parameter"
},
{
"fieldname": "section_break_6",
"fieldtype": "Section Break"
},
{
"default": "0",
"fieldname": "summenzeile",
"fieldtype": "Check",
"label": "Summenzeile"
},
{
"depends_on": "eval:doc.gruppiert==\"Employee\"",
"fieldname": "employee",
"fieldtype": "Table MultiSelect",
"label": "Employee",
"options": "Veraufsstatistik Employee"
},
{
"fieldname": "gruppiert",
"fieldtype": "Select",
"label": "Auswahl",
"options": "Item\nEmployee"
}
],
"index_web_pages_for_search": 1,
"links": [],
"modified": "2022-03-14 16:25:40.030362",
"modified": "2022-03-18 13:14:49.834111",
"modified_by": "Administrator",
"module": "MSP",
"name": "Verkaufsstatistik Report",

View File

@ -9,16 +9,39 @@ from datetime import datetime as dt
from pprint import pprint
import pandas as pd
import numpy as np
from six import BytesIO
from frappe.utils.file_manager import save_file
class VerkaufsstatistikReport(Document):
@frappe.whitelist()
def do_report(self):
employee_tup = ""
if self.gruppiert == "Employee":
employee_auswahl = self.employee
if employee_auswahl != []:
employee_list = [x.employee for x in employee_auswahl]
filters = {"employee": ["in", employee_list]}
else:
filters = {}
employee_art = frappe.get_all(
"Employee Item Assignment",
filters= filters,
fields= ["item","employee_name"])
#employee_artikel = [x.item for x in employee_art]
artikel_name = [x.item for x in employee_art]
employee_tup = [(x.item,x.employee_name) for x in employee_art]
print(employee_tup)
# if employee_auswahl == []:
# frappe.throw('Keine Mitarbeiter ausgewählt.')
elif self.gruppiert == "Item":
artikel_auswahl = self.artikel
print(artikel_auswahl)
artikel_name = [a.item for a in artikel_auswahl]
if artikel_auswahl == []:
frappe.throw('Keine Artikel ausgewählt.')
artikel_name = [a.item for a in artikel_auswahl]
else:
frappe.throw('Keine Auswahl bei Gruppierung getroffen.')
if self.report_basierend_auf == "Rechnung":
item_list = []
si_list = frappe.get_all(
@ -34,9 +57,16 @@ class VerkaufsstatistikReport(Document):
artikel_doc = frappe.get_doc("Sales Invoice", si["name"])
for artikel in artikel_doc.items:
if artikel.item_code in artikel_name:
empl = str(artikel.item_name).replace("Arbeitszeit ","").replace("Herr ","").replace(" Anwendungsentwicklung","").replace("Remote-Service ","")
b = [y[0] for y in employee_tup]
if artikel.item_code in b:
employee =employee_tup[b.index(artikel.item_code )][1]
else:
employee = 0
#print(employee)
#empl = str(artikel.item_name).replace("Arbeitszeit ","").replace("Herr ","").replace(" Anwendungsentwicklung","").replace("Remote-Service ","")
price = artikel.qty*artikel.rate
artikel_details = [si["posting_date"],empl,artikel.item_name,artikel.item_code,artikel.qty,artikel.rate, price]
artikel_details = [si["posting_date"],employee,artikel.item_name,artikel.item_code,artikel.qty,artikel.rate, price]
item_list.append(artikel_details)
if self.report_basierend_auf == "Lieferschein":
@ -54,21 +84,35 @@ class VerkaufsstatistikReport(Document):
for artikel in artikel_doc.items:
if artikel.item_code in artikel_name:
empl = str(artikel.item_name).replace("Arbeitszeit ","").replace("Herr ","").replace(" Anwendungsentwicklung","").replace("Remote-Service ","")
b = [y[0] for y in employee_tup]
if artikel.item_code in b:
employee =employee_tup[b.index(artikel.item_code )][1]
else:
employee = 0
#empl = str(artikel.item_name).replace("Arbeitszeit ","").replace("Herr ","").replace(" Anwendungsentwicklung","").replace("Remote-Service ","")
price = artikel.qty*artikel.rate
artikel_details = [dn["posting_date"],empl,artikel.item_name,artikel.item_code,artikel.qty, artikel.rate, price]
artikel_details = [dn["posting_date"],employee,artikel.item_name,artikel.item_code,artikel.qty, artikel.rate, price]
item_list.append(artikel_details)
print(artikel_details)
df = pd.DataFrame(item_list, columns = ["Datum","Mitarbeiter","Item Name","Item","Anzahl","Preis pro Einheit","Preis"])
df['Datum'] = pd.to_datetime(df['Datum'])
df['Kalenderwoche']= df['Datum'].dt.isocalendar().week
#df['Monat']= df['Datum'].dt.month
df['Jahr'] = df['Datum'].dt.year
df['Monat'] = df['Datum'].dt.strftime("%m.%Y")
df['Date'] = pd.to_datetime(df['Datum'])
df['Datum'] = df['Date'].dt.strftime('%d.%m.%Y')
df['Kalenderwoche']= df['Date'].dt.isocalendar().week
#df['Monat']= df['Date'].dt.month
df['Jahr'] = df['Date'].dt.year
df['Monat'] = df['Date'].dt.strftime("%m.%Y")
from_date_dt = dt. strptime(self.from_date, '%Y-%m-%d')
from_date_st = from_date_dt.strftime('%d.%m.%Y')
to_date_dt = dt. strptime(self.to_date, '%Y-%m-%d')
to_date_st = to_date_dt.strftime('%d.%m.%Y')
df['Periode'] = from_date_st+ " bis " + to_date_st
df.round ({"Anzahl":2,"Preis":2})
if df.empty:
frappe.throw('Für die angegebene Periode sind keine Daten vorhanden')
print(df.dtypes)
if self.resolution == 'monthly':
date = ['Monat']
@ -83,7 +127,7 @@ class VerkaufsstatistikReport(Document):
date = ["Jahr"]
elif self.resolution == 'period':
date = []
date = ["Periode"]
else:
frappe.msgprint("Bitte Zeiteinheit für Gruppierung auswählen")
@ -100,9 +144,10 @@ class VerkaufsstatistikReport(Document):
if self.gruppiert_nach == "Artikel":
df_pivot =df.pivot_table(index=date, columns="Item", values = values, aggfunc = np.sum, fill_value=0)
else:
elif self.gruppiert_nach == "Mitarbeiter":
df_pivot =df.pivot_table(index=date, columns="Mitarbeiter", values = values, aggfunc = np.sum, fill_value=0)
elif self.gruppiert_nach == "Alle":
df_pivot =df.pivot_table(index=date, values = values, aggfunc = np.sum, fill_value=0)
# df_pivot.columns = df_pivot.columns.droplevel(0) #remove amount
# df_pivot.columns.name = None #remove categories
# df_pivot = df_pivot.reset_index() #index to columns
@ -125,27 +170,33 @@ class VerkaufsstatistikReport(Document):
a = df_pivot.drop(date,axis=1).astype(float)
a[date] = df_pivot[date]
a.set_index(date, inplace = True)
#c = a.columns.tolist()
# = [lambda x : x.replace('(', '').replace(')','').replace("'",'') for x in c]
#print(a)
#df_pivot = df_pivot.astype(float)d
#df_pivot = self.add_total_row(df_pivot)
# print(df_pivot)
self.report_ausgabe = self.get_styler(a).render()
#self.report_ausgabe = self.get_styler(a).render()
if item_list == []:
self.report_ausgabe = '<p>' + ("Für die angegebene Periode sind keine Daten vorhanden") + '</p>'
def add_total_row(df,self):
return a
@frappe.whitelist()
def generate_report(self):
df = self.do_report()
if self.summenzeile == 1:
df= self.add_total_row(df)
if df.empty:
frappe.throw('Für die angegebene Periode sind keine Daten vorhanden')
self.report_ausgabe = self.get_styler(df).render()
self.save()
def add_total_row(self,df):
sum_row = df.aggregate('sum')
mean_row = df.aggregate('mean')
df.loc['SUM'] = sum_row
df.loc['MEAN'] = mean_row
return df
def get_styler(self,df):
styles = [
dict(props=[("border-collapse", "collapse"), ("width", "100%")]),
@ -156,4 +207,36 @@ class VerkaufsstatistikReport(Document):
#dict(selector=".col0", props=[("text-align", "left")]), # first column
dict(selector="tbody tr:nth-of-type(odd)", props=[("background-color", "rgba(0,0,0,.05)")]), # stripes
]
if self.summenzeile == 1:
a = dict(selector="tr:nth-last-child(1)", props=[("font-weight", "bold")])
styles.append(a)
return df.style.format('{:.2f}').set_table_styles(styles)
@frappe.whitelist()
def generate_excel_sheet(self):
df = self.do_report()
if self.summenzeile == 1:
df= self.add_total_row(df)
if df.empty:
frappe.throw('Für die angegebene Periode sind keine Daten vorhanden')
self.attach_as_excel(self.get_styler(df), self.doctype, self.name)
def styler_to_excel(self,styler):
buffer = BytesIO()
with pd.ExcelWriter(buffer, engine='xlsxwriter', date_format='DD.MM.YYYY', datetime_format='DD.MM.YYYY hh:mm') as writer:
styler.to_excel(writer, index=True)
return buffer.getvalue()
def attach_as_excel(self,styler, doctype, name):
content = self.styler_to_excel(styler)
filename = name + '.xlsx'
save_file(filename, content, doctype, name, None, False, 1)

View File

@ -11,6 +11,7 @@
{
"fieldname": "item",
"fieldtype": "Link",
"in_list_view": 1,
"label": "Item",
"options": "Item"
}
@ -18,7 +19,7 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2021-10-26 11:58:30.925182",
"modified": "2022-03-17 11:51:20.508506",
"modified_by": "Administrator",
"module": "MSP",
"name": "Verkaufsstatistik Report Artikel",