From 071d1e606088c7172830882317f9a3e64474c91a Mon Sep 17 00:00:00 2001 From: Beate Trzensiok Date: Mon, 1 Nov 2021 09:38:08 +0100 Subject: [PATCH] Report Artikelverkauf --- .../verkaufsstatistik_report/__init__.py | 0 .../test_verkaufsstatistik_report.py | 8 ++ .../verkaufsstatistik_report.js | 86 +++++++++++++ .../verkaufsstatistik_report.json | 120 ++++++++++++++++++ .../verkaufsstatistik_report.py | 92 ++++++++++++++ .../__init__.py | 0 .../test_verkaufsstatistik_report_artikel.py | 8 ++ .../verkaufsstatistik_report_artikel.js | 8 ++ .../verkaufsstatistik_report_artikel.json | 30 +++++ .../verkaufsstatistik_report_artikel.py | 8 ++ 10 files changed, 360 insertions(+) create mode 100644 msp/msp/doctype/verkaufsstatistik_report/__init__.py create mode 100644 msp/msp/doctype/verkaufsstatistik_report/test_verkaufsstatistik_report.py create mode 100644 msp/msp/doctype/verkaufsstatistik_report/verkaufsstatistik_report.js create mode 100644 msp/msp/doctype/verkaufsstatistik_report/verkaufsstatistik_report.json create mode 100644 msp/msp/doctype/verkaufsstatistik_report/verkaufsstatistik_report.py create mode 100644 msp/msp/doctype/verkaufsstatistik_report_artikel/__init__.py create mode 100644 msp/msp/doctype/verkaufsstatistik_report_artikel/test_verkaufsstatistik_report_artikel.py create mode 100644 msp/msp/doctype/verkaufsstatistik_report_artikel/verkaufsstatistik_report_artikel.js create mode 100644 msp/msp/doctype/verkaufsstatistik_report_artikel/verkaufsstatistik_report_artikel.json create mode 100644 msp/msp/doctype/verkaufsstatistik_report_artikel/verkaufsstatistik_report_artikel.py diff --git a/msp/msp/doctype/verkaufsstatistik_report/__init__.py b/msp/msp/doctype/verkaufsstatistik_report/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/msp/msp/doctype/verkaufsstatistik_report/test_verkaufsstatistik_report.py b/msp/msp/doctype/verkaufsstatistik_report/test_verkaufsstatistik_report.py new file mode 100644 index 0000000..942ca32 --- /dev/null +++ b/msp/msp/doctype/verkaufsstatistik_report/test_verkaufsstatistik_report.py @@ -0,0 +1,8 @@ +# Copyright (c) 2021, itsdave GmbH and Contributors +# See license.txt + +# import frappe +import unittest + +class TestVerkaufsstatistikReport(unittest.TestCase): + pass diff --git a/msp/msp/doctype/verkaufsstatistik_report/verkaufsstatistik_report.js b/msp/msp/doctype/verkaufsstatistik_report/verkaufsstatistik_report.js new file mode 100644 index 0000000..e1d2b55 --- /dev/null +++ b/msp/msp/doctype/verkaufsstatistik_report/verkaufsstatistik_report.js @@ -0,0 +1,86 @@ +// Copyright (c) 2021, itsdave GmbH and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Verkaufsstatistik Report', { + refresh: function(frm) { + + moment.locale("de") // weeks start on monday + frm.trigger('preset'); + + }, + setup: function(frm) { + frm.set_query("artikel",function(){ + return { + filters: [ + ["Item","item_group", "in", ["Anwendungsentwicklung", "Arbeitszeiten Techniker"]] + ] + } + }); + }, + preset: function(frm) { + if (!frm.doc.preset) { + // No preset selected. Allow manual selection of dates. + frm.toggle_enable(['from_date', 'to_date'], true); + } else { + // Preset selected. Make dates read only. + frm.toggle_enable(['from_date', 'to_date'], false); + + if (frm.doc.preset === 'Last Week') { + frm.events.set_dates(frm, frappe.datetime.previous("week")); + } else if (frm.doc.preset === 'Last Month') { + frm.events.set_dates(frm, frappe.datetime.previous("month")); + } else if (frm.doc.preset === 'Last Year') { + frm.events.set_dates(frm, frappe.datetime.previous("year")); + } else if (frm.doc.preset === 'YTD') { + 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); + }, + + +}); + diff --git a/msp/msp/doctype/verkaufsstatistik_report/verkaufsstatistik_report.json b/msp/msp/doctype/verkaufsstatistik_report/verkaufsstatistik_report.json new file mode 100644 index 0000000..32fb517 --- /dev/null +++ b/msp/msp/doctype/verkaufsstatistik_report/verkaufsstatistik_report.json @@ -0,0 +1,120 @@ +{ + "actions": [], + "autoname": "VKSR-.#####", + "creation": "2021-10-26 11:58:38.201900", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "from_date", + "preset", + "artikel", + "column_break_4", + "to_date", + "report", + "report_section", + "report_basierend_auf", + "gruppiert_nach", + "zeiteinheit_section", + "resolution", + "ausgabe_section", + "report_ausgabe" + ], + "fields": [ + { + "fieldname": "from_date", + "fieldtype": "Date", + "label": "\u00a0From Date" + }, + { + "fieldname": "preset", + "fieldtype": "Select", + "label": "Preset", + "options": "\nLast Week\nLast Month\nLast Year\nYTD" + }, + { + "fieldname": "artikel", + "fieldtype": "Table MultiSelect", + "label": "Artikel", + "options": "Verkaufsstatistik Report Artikel" + }, + { + "fieldname": "column_break_4", + "fieldtype": "Column Break" + }, + { + "fieldname": "to_date", + "fieldtype": "Date", + "label": "To Date" + }, + { + "fieldname": "report", + "fieldtype": "Button", + "label": "Report", + "options": "do_report" + }, + { + "fieldname": "resolution", + "fieldtype": "Select", + "label": "Auswahl", + "options": "period\ndaily\nweekly\nmonthly\nyearly\nemployee", + "translatable": 1 + }, + { + "fieldname": "ausgabe_section", + "fieldtype": "Section Break", + "label": "Ausgabe" + }, + { + "fieldname": "report_ausgabe", + "fieldtype": "Text Editor", + "label": "Report Ausgabe" + }, + { + "fieldname": "report_section", + "fieldtype": "Section Break", + "label": " Report" + }, + { + "fieldname": "report_basierend_auf", + "fieldtype": "Select", + "label": " Report basierend auf", + "options": "Rechnung\nLieferschein" + }, + { + "fieldname": "gruppiert_nach", + "fieldtype": "Select", + "label": "Gruppiert nach", + "options": "Artikel\nMitarbeiter" + }, + { + "fieldname": "zeiteinheit_section", + "fieldtype": "Section Break", + "label": "Zeiteinheit" + } + ], + "index_web_pages_for_search": 1, + "links": [], + "modified": "2021-10-26 16:02:19.458345", + "modified_by": "Administrator", + "module": "MSP", + "name": "Verkaufsstatistik Report", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/msp/msp/doctype/verkaufsstatistik_report/verkaufsstatistik_report.py b/msp/msp/doctype/verkaufsstatistik_report/verkaufsstatistik_report.py new file mode 100644 index 0000000..be665f5 --- /dev/null +++ b/msp/msp/doctype/verkaufsstatistik_report/verkaufsstatistik_report.py @@ -0,0 +1,92 @@ +# Copyright (c) 2021, itsdave GmbH and contributors +# For license information, please see license.txt + + +from frappe.model.document import Document +from os import replace +import frappe +from datetime import datetime as dt +from pprint import pprint +import pandas as pd + + +class VerkaufsstatistikReport(Document): + @frappe.whitelist() + def do_report(self): + artikel_auswahl = self.artikel + artikel_name = [a.item for a in artikel_auswahl] + if self.report_basierend_auf == "Rechnung": + item_list = [] + si_list = frappe.get_all( + "Sales Invoice", + filters = { + "docstatus": 1, + "posting_date": ["between", [self.from_date, self.to_date]] + }, + fields = ["posting_date", "name"] + ) + for si in si_list: + 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 ","") + artikel_details = [si["posting_date"],empl,artikel.item_name,artikel.item_code,artikel.qty] + item_list.append(artikel_details) + + if self.report_basierend_auf == "Lieferschein": + item_list = [] + dn_list = frappe.get_all( + "Delivery Note", + filters = { + "docstatus": 1, + "posting_date": ["between", [self.from_date, self.to_date]] + }, + fields = ["posting_date", "name"] + ) + for dn in dn_list: + artikel_doc = frappe.get_doc("Delivery Note", dn["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 ","") + artikel_details = [dn["posting_date"],empl,artikel.item_name,artikel.item_code,artikel.qty] + item_list.append(artikel_details) + + + df = pd.DataFrame(item_list, columns = ["Datum","Mitarbeiter","Item Name","Item","Anzahl"]) + 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 + + + if self.resolution == 'monthly': + filters = ['Jahr','Monat'] + + elif self.resolution == 'weekly': + filters =['Jahr','Kalenderwoche'] + + elif self.resolution == 'daily': + filters = ['Datum'] + + elif self.resolution == 'yearly': + filters = ["Jahr"] + + elif self.resolution == 'period': + filters = [] + + else: + frappe.msgprint("Bitte Zeiteinheit für Gruppierung auswählen") + + if self.gruppiert_nach == "Artikel": + filters = filters +["Item","Item Name"] + if self.gruppiert_nach == "Mitarbeiter": + filters.append("Mitarbeiter") + df_grouped = df.groupby(filters).agg({'Anzahl': ['sum']}).reset_index() + + html = df_grouped.to_html(header = False,index = False) + #html_2 = html.replace('','') + self.report_ausgabe = html + + if item_list == []: + self.report_ausgabe = '

' + ("Für die angegebene Periode sind keine Daten vorhanden") + '

' diff --git a/msp/msp/doctype/verkaufsstatistik_report_artikel/__init__.py b/msp/msp/doctype/verkaufsstatistik_report_artikel/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/msp/msp/doctype/verkaufsstatistik_report_artikel/test_verkaufsstatistik_report_artikel.py b/msp/msp/doctype/verkaufsstatistik_report_artikel/test_verkaufsstatistik_report_artikel.py new file mode 100644 index 0000000..149d278 --- /dev/null +++ b/msp/msp/doctype/verkaufsstatistik_report_artikel/test_verkaufsstatistik_report_artikel.py @@ -0,0 +1,8 @@ +# Copyright (c) 2021, itsdave GmbH and Contributors +# See license.txt + +# import frappe +import unittest + +class TestVerkaufsstatistikReportArtikel(unittest.TestCase): + pass diff --git a/msp/msp/doctype/verkaufsstatistik_report_artikel/verkaufsstatistik_report_artikel.js b/msp/msp/doctype/verkaufsstatistik_report_artikel/verkaufsstatistik_report_artikel.js new file mode 100644 index 0000000..fa43cd3 --- /dev/null +++ b/msp/msp/doctype/verkaufsstatistik_report_artikel/verkaufsstatistik_report_artikel.js @@ -0,0 +1,8 @@ +// Copyright (c) 2021, itsdave GmbH and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Verkaufsstatistik Report Artikel', { + // refresh: function(frm) { + + // } +}); diff --git a/msp/msp/doctype/verkaufsstatistik_report_artikel/verkaufsstatistik_report_artikel.json b/msp/msp/doctype/verkaufsstatistik_report_artikel/verkaufsstatistik_report_artikel.json new file mode 100644 index 0000000..b9cd486 --- /dev/null +++ b/msp/msp/doctype/verkaufsstatistik_report_artikel/verkaufsstatistik_report_artikel.json @@ -0,0 +1,30 @@ +{ + "actions": [], + "creation": "2021-10-26 11:56:57.811638", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "item" + ], + "fields": [ + { + "fieldname": "item", + "fieldtype": "Link", + "label": "Item", + "options": "Item" + } + ], + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2021-10-26 11:58:30.925182", + "modified_by": "Administrator", + "module": "MSP", + "name": "Verkaufsstatistik Report Artikel", + "owner": "Administrator", + "permissions": [], + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/msp/msp/doctype/verkaufsstatistik_report_artikel/verkaufsstatistik_report_artikel.py b/msp/msp/doctype/verkaufsstatistik_report_artikel/verkaufsstatistik_report_artikel.py new file mode 100644 index 0000000..685799b --- /dev/null +++ b/msp/msp/doctype/verkaufsstatistik_report_artikel/verkaufsstatistik_report_artikel.py @@ -0,0 +1,8 @@ +# Copyright (c) 2021, itsdave GmbH and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + +class VerkaufsstatistikReportArtikel(Document): + pass