mirror of
https://github.com/itsdave-de/msp.git
synced 2025-05-06 15:35:12 +02:00
Report Artikelverkauf
This commit is contained in:
parent
7374e1a6b5
commit
071d1e6060
@ -0,0 +1,8 @@
|
|||||||
|
# Copyright (c) 2021, itsdave GmbH and Contributors
|
||||||
|
# See license.txt
|
||||||
|
|
||||||
|
# import frappe
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
class TestVerkaufsstatistikReport(unittest.TestCase):
|
||||||
|
pass
|
@ -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);
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
@ -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
|
||||||
|
}
|
@ -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>'
|
@ -0,0 +1,8 @@
|
|||||||
|
# Copyright (c) 2021, itsdave GmbH and Contributors
|
||||||
|
# See license.txt
|
||||||
|
|
||||||
|
# import frappe
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
class TestVerkaufsstatistikReportArtikel(unittest.TestCase):
|
||||||
|
pass
|
@ -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) {
|
||||||
|
|
||||||
|
// }
|
||||||
|
});
|
@ -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
|
||||||
|
}
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user