Anpassungen Verkaufsstatistik

This commit is contained in:
Beate Trzensiok 2022-03-14 16:27:11 +01:00
parent 992914c29e
commit 9b4a85ba43
2 changed files with 93 additions and 23 deletions

View File

@ -15,6 +15,9 @@
"report_section", "report_section",
"report_basierend_auf", "report_basierend_auf",
"gruppiert_nach", "gruppiert_nach",
"section_break_10",
"anzahl",
"preis",
"zeiteinheit_section", "zeiteinheit_section",
"resolution", "resolution",
"ausgabe_section", "ausgabe_section",
@ -57,7 +60,7 @@
"fieldname": "resolution", "fieldname": "resolution",
"fieldtype": "Select", "fieldtype": "Select",
"label": "Auswahl", "label": "Auswahl",
"options": "period\ndaily\nweekly\nmonthly\nyearly\nemployee", "options": "period\ndaily\nweekly\nmonthly\nyearly",
"translatable": 1 "translatable": 1
}, },
{ {
@ -92,11 +95,27 @@
"fieldname": "zeiteinheit_section", "fieldname": "zeiteinheit_section",
"fieldtype": "Section Break", "fieldtype": "Section Break",
"label": "Zeiteinheit" "label": "Zeiteinheit"
},
{
"default": "0",
"fieldname": "anzahl",
"fieldtype": "Check",
"label": "Anzahl"
},
{
"default": "0",
"fieldname": "preis",
"fieldtype": "Check",
"label": "Preis"
},
{
"fieldname": "section_break_10",
"fieldtype": "Section Break"
} }
], ],
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"links": [], "links": [],
"modified": "2022-03-11 08:32:22.749064", "modified": "2022-03-14 16:25:40.030362",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "MSP", "module": "MSP",
"name": "Verkaufsstatistik Report", "name": "Verkaufsstatistik Report",

View File

@ -8,12 +8,16 @@ import frappe
from datetime import datetime as dt from datetime import datetime as dt
from pprint import pprint from pprint import pprint
import pandas as pd import pandas as pd
import numpy as np
from retail.retail.doctype.flex_report.flex_report import pivot_table
class VerkaufsstatistikReport(Document): class VerkaufsstatistikReport(Document):
@frappe.whitelist() @frappe.whitelist()
def do_report(self): def do_report(self):
artikel_auswahl = self.artikel artikel_auswahl = self.artikel
if artikel_auswahl == []:
frappe.throw('Keine Artikel ausgewählt.')
artikel_name = [a.item for a in artikel_auswahl] artikel_name = [a.item for a in artikel_auswahl]
if self.report_basierend_auf == "Rechnung": if self.report_basierend_auf == "Rechnung":
item_list = [] item_list = []
@ -31,7 +35,8 @@ class VerkaufsstatistikReport(Document):
for artikel in artikel_doc.items: for artikel in artikel_doc.items:
if artikel.item_code in artikel_name: if artikel.item_code in artikel_name:
empl = str(artikel.item_name).replace("Arbeitszeit ","").replace("Herr ","").replace(" Anwendungsentwicklung","").replace("Remote-Service ","") empl = str(artikel.item_name).replace("Arbeitszeit ","").replace("Herr ","").replace(" Anwendungsentwicklung","").replace("Remote-Service ","")
artikel_details = [si["posting_date"],empl,artikel.item_name,artikel.item_code,artikel.qty,artikel.rate] price = artikel.qty*artikel.rate
artikel_details = [si["posting_date"],empl,artikel.item_name,artikel.item_code,artikel.qty,artikel.rate, price]
item_list.append(artikel_details) item_list.append(artikel_details)
if self.report_basierend_auf == "Lieferschein": if self.report_basierend_auf == "Lieferschein":
@ -50,54 +55,100 @@ class VerkaufsstatistikReport(Document):
for artikel in artikel_doc.items: for artikel in artikel_doc.items:
if artikel.item_code in artikel_name: if artikel.item_code in artikel_name:
empl = str(artikel.item_name).replace("Arbeitszeit ","").replace("Herr ","").replace(" Anwendungsentwicklung","").replace("Remote-Service ","") empl = str(artikel.item_name).replace("Arbeitszeit ","").replace("Herr ","").replace(" Anwendungsentwicklung","").replace("Remote-Service ","")
artikel_details = [dn["posting_date"],empl,artikel.item_name,artikel.item_code,artikel.qty, artikel.rate] price = artikel.qty*artikel.rate
artikel_details = [dn["posting_date"],empl,artikel.item_name,artikel.item_code,artikel.qty, artikel.rate, price]
item_list.append(artikel_details) item_list.append(artikel_details)
print(artikel_details)
df = pd.DataFrame(item_list, columns = ["Datum","Mitarbeiter","Item Name","Item","Anzahl","Preis"]) df = pd.DataFrame(item_list, columns = ["Datum","Mitarbeiter","Item Name","Item","Anzahl","Preis pro Einheit","Preis"])
df['Datum'] = pd.to_datetime(df['Datum']) df['Datum'] = pd.to_datetime(df['Datum'])
df['Kalenderwoche']= df['Datum'].dt.isocalendar().week df['Kalenderwoche']= df['Datum'].dt.isocalendar().week
df['Monat']= df['Datum'].dt.month #df['Monat']= df['Datum'].dt.month
df['Jahr'] = df['Datum'].dt.year df['Jahr'] = df['Datum'].dt.year
df['Monat'] = df['Datum'].dt.strftime("%m.%Y")
df.round ({"Anzahl":2,"Preis":2})
print(df.dtypes)
if self.resolution == 'monthly': if self.resolution == 'monthly':
filters = ['Jahr','Monat'] date = ['Monat']
elif self.resolution == 'weekly': elif self.resolution == 'weekly':
filters =['Jahr','Kalenderwoche'] date =['Jahr','Kalenderwoche']
elif self.resolution == 'daily': elif self.resolution == 'daily':
filters = ['Datum'] date = ['Datum']
elif self.resolution == 'yearly': elif self.resolution == 'yearly':
filters = ["Jahr"] date = ["Jahr"]
elif self.resolution == 'period': elif self.resolution == 'period':
filters = [] date = []
else: else:
frappe.msgprint("Bitte Zeiteinheit für Gruppierung auswählen") frappe.msgprint("Bitte Zeiteinheit für Gruppierung auswählen")
print(df)
values = []
if self.anzahl == 1:
values.append("Anzahl")
if self.preis == 1:
values.append("Preis")
if self.gruppiert_nach == "Artikel": if self.gruppiert_nach == "Artikel":
filters = filters +["Item","Item Name","Preis"] df_pivot =df.pivot_table(index=date, columns="Item", values = values, aggfunc = np.sum, fill_value=0)
if self.gruppiert_nach == "Mitarbeiter": else:
filters.append("Mitarbeiter") df_pivot =df.pivot_table(index=date, columns="Mitarbeiter", values = values, aggfunc = np.sum, fill_value=0)
#df_grouped = df.groupby(filters).agg({'Anzahl': ['sum']}).reset_index()
df_grouped = df.groupby(filters)['Anzahl'].sum().to_frame('Anzahl').reset_index()
self.report_ausgabe = self.get_styler(df_grouped).render()
# #df_grouped = df.groupby(filters).agg({'Anzahl': ['sum']}).reset_index()
# if self.anzahl == 1:
# df['Item']=df['Item'].map('{} Anzahl'.format)
# df_grouped = df.groupby(filters)['Anzahl'].sum().reset_index()
# df_pivot1 = df_grouped.pivot_table(index= date,columns='Item',values='Anzahl')
# df_pivot1 = df_pivot.fillna(0)
# if self.preis == 1:
# df['Item']=df['Item'].map('{} Preis'.format)
# df_grouped = df.groupby(filters)['Preis'].sum().reset_index()
# df_pivot2 = df_grouped.pivot_table(index= date,columns='Item',values='Preis')
# df_pivot2= df_pivot.fillna(0)
df_pivot = pd.DataFrame(df_pivot.to_records())
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(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()
if item_list == []: if item_list == []:
self.report_ausgabe = '<p>' + ("Für die angegebene Periode sind keine Daten vorhanden") + '</p>' self.report_ausgabe = '<p>' + ("Für die angegebene Periode sind keine Daten vorhanden") + '</p>'
def add_total_row(df,self):
sum_row = df.aggregate('sum')
mean_row = df.aggregate('mean')
df.loc['SUM'] = sum_row
df.loc['MEAN'] = mean_row
def get_styler(self,df): def get_styler(self,df):
styles = [ styles = [
dict(props=[("border-collapse", "collapse"), ("width", "100%")]), dict(props=[("border-collapse", "collapse"), ("width", "100%")]),
dict(selector="th, td", props=[("padding", ".75rem"), ("border-top", "1px solid #dee2e6")]), dict(selector="th, td", props=[("padding", ".75rem"), ("border-top", "1px solid #dee2e6")]),
dict(selector=".col_heading", props=[('text-align', 'right')]), dict(selector=".col_heading", props=[('text-align', 'right')]),
#dict(selector=".col_heading.col0", props=[('text-align', 'left')]), dict(selector=".col_heading.col0", props=[('text-align', 'left')]),
dict(selector=".data", props=[("text-align", "right")]), dict(selector=".data", props=[("text-align", "right")]),
dict(selector=".col0", props=[("text-align", "left")]), # first column #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 dict(selector="tbody tr:nth-of-type(odd)", props=[("background-color", "rgba(0,0,0,.05)")]), # stripes
] ]
return df.style.hide_index().format({"Anzahl":'{:.2f}', "Preis":'{:.2f}'}).set_table_styles(styles) return df.style.format('{:.2f}').set_table_styles(styles)