Report Artikelverkauf

This commit is contained in:
Beate Trzensiok 2021-11-01 09:38:08 +01:00
parent 7374e1a6b5
commit 071d1e6060
10 changed files with 360 additions and 0 deletions

View File

@ -0,0 +1,8 @@
# Copyright (c) 2021, itsdave GmbH and Contributors
# See license.txt
# import frappe
import unittest
class TestVerkaufsstatistikReport(unittest.TestCase):
pass

View File

@ -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);
},
});

View File

@ -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
}

View File

@ -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('<tr>','<tr style="text-align: center;">')
self.report_ausgabe = html
if item_list == []:
self.report_ausgabe = '<p>' + ("Für die angegebene Periode sind keine Daten vorhanden") + '</p>'

View File

@ -0,0 +1,8 @@
# Copyright (c) 2021, itsdave GmbH and Contributors
# See license.txt
# import frappe
import unittest
class TestVerkaufsstatistikReportArtikel(unittest.TestCase):
pass

View File

@ -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) {
// }
});

View File

@ -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
}

View File

@ -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