Merge pull request #14111 from netchampfaris/stock-ledger-report-hotfix
[fix] Stock Ledger report item filter
diff --git a/erpnext/__init__.py b/erpnext/__init__.py
index 3eaf994..a88326d 100644
--- a/erpnext/__init__.py
+++ b/erpnext/__init__.py
@@ -5,7 +5,7 @@
from erpnext.hooks import regional_overrides
from frappe.utils import getdate
-__version__ = '10.1.33'
+__version__ = '10.1.35'
def get_default_company(user=None):
'''Get default company for user'''
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py
index 3dc4fd7..6977512 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.py
+++ b/erpnext/accounts/report/general_ledger/general_ledger.py
@@ -71,8 +71,8 @@
if gle_currency:
account_currency = gle_currency
else:
- account_currency = None if filters.party_type in ["Employee", "Student", "Shareholder"] else \
- frappe.db.get_value(filters.party_type, filters.party, "default_currency")
+ account_currency = (None if filters.party_type in ["Employee", "Student", "Shareholder", "Member"] else
+ frappe.db.get_value(filters.party_type, filters.party, "default_currency"))
filters["account_currency"] = account_currency or filters.company_currency
diff --git a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
index 710099e..72661ff 100644
--- a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
+++ b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
@@ -49,7 +49,7 @@
row += [
d.credit_to, d.mode_of_payment, d.project, d.company, d.purchase_order,
- purchase_receipt, expense_account, d.stock_qty, d.stock_uom, d.base_net_rate, d.base_net_amount
+ purchase_receipt, expense_account, d.stock_qty, d.stock_uom, d.base_net_amount / d.stock_qty, d.base_net_amount
]
total_tax = 0
@@ -120,8 +120,7 @@
`tabPurchase Invoice Item`.`project`, `tabPurchase Invoice Item`.`purchase_order`,
`tabPurchase Invoice Item`.`purchase_receipt`, `tabPurchase Invoice Item`.`po_detail`,
`tabPurchase Invoice Item`.`expense_account`, `tabPurchase Invoice Item`.`stock_qty`,
- `tabPurchase Invoice Item`.`stock_uom`, `tabPurchase Invoice Item`.`base_net_rate`,
- `tabPurchase Invoice Item`.`base_net_amount`,
+ `tabPurchase Invoice Item`.`stock_uom`, `tabPurchase Invoice Item`.`base_net_amount`,
`tabPurchase Invoice`.supplier_name, `tabPurchase Invoice`.mode_of_payment {0}
from `tabPurchase Invoice`, `tabPurchase Invoice Item`
where `tabPurchase Invoice`.name = `tabPurchase Invoice Item`.`parent` and
diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py
index 15a93bd..bc18d77 100644
--- a/erpnext/controllers/queries.py
+++ b/erpnext/controllers/queries.py
@@ -157,9 +157,10 @@
# scan description only if items are less than 50000
description_cond = 'or tabItem.description LIKE %(txt)s'
- return frappe.db.sql("""select tabItem.name, tabItem.item_group,
+ return frappe.db.sql("""select tabItem.name,
if(length(tabItem.item_name) > 40,
concat(substr(tabItem.item_name, 1, 40), "..."), item_name) as item_name,
+ tabItem.item_group,
if(length(tabItem.description) > 40, \
concat(substr(tabItem.description, 1, 40), "..."), description) as decription
from tabItem
diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py
index a4d9dae..b44f597 100644
--- a/erpnext/controllers/taxes_and_totals.py
+++ b/erpnext/controllers/taxes_and_totals.py
@@ -38,6 +38,7 @@
self.manipulate_grand_total_for_inclusive_tax()
self.calculate_totals()
self._cleanup()
+ self.calculate_total_net_weight()
def validate_conversion_rate(self):
# validate conversion rate
@@ -328,6 +329,13 @@
self.set_rounded_total()
+ def calculate_total_net_weight(self):
+ if self.doc.meta.get_field('total_net_weight'):
+ self.doc.total_net_weight = 0.0
+ for d in self.doc.items:
+ if d.total_weight:
+ self.doc.total_net_weight += d.total_weight
+
def set_rounded_total(self):
if self.doc.meta.get_field("rounded_total"):
if self.doc.is_rounded_total_disabled():
diff --git a/erpnext/healthcare/doctype/consultation/consultation.py b/erpnext/healthcare/doctype/consultation/consultation.py
index ebf80d6..30b3734 100755
--- a/erpnext/healthcare/doctype/consultation/consultation.py
+++ b/erpnext/healthcare/doctype/consultation/consultation.py
@@ -6,7 +6,7 @@
import frappe
from frappe import _
from frappe.model.document import Document
-from frappe.utils import getdate
+from frappe.utils import getdate, cstr
import json
from erpnext.healthcare.doctype.healthcare_settings.healthcare_settings import get_receivable_account, get_income_account
@@ -125,7 +125,7 @@
def set_subject_field(consultation):
subject = "No Diagnosis "
if(consultation.diagnosis):
- subject = "Diagnosis: \n"+ str(consultation.diagnosis)+". "
+ subject = "Diagnosis: \n"+ cstr(consultation.diagnosis)+". "
if(consultation.drug_prescription):
subject +="\nDrug(s) Prescribed. "
if(consultation.test_prescription):
diff --git a/erpnext/healthcare/doctype/lab_test/lab_test.py b/erpnext/healthcare/doctype/lab_test/lab_test.py
index 3ad8b53..b3b64f4 100644
--- a/erpnext/healthcare/doctype/lab_test/lab_test.py
+++ b/erpnext/healthcare/doctype/lab_test/lab_test.py
@@ -6,7 +6,7 @@
import frappe
from frappe.model.document import Document
import json
-from frappe.utils import getdate
+from frappe.utils import getdate, cstr
from erpnext.healthcare.doctype.healthcare_settings.healthcare_settings import get_receivable_account
from frappe import _
@@ -228,9 +228,9 @@
return employee
def insert_lab_test_to_medical_record(doc):
- subject = str(doc.test_name)
+ subject = cstr(doc.test_name)
if(doc.test_comment):
- subject += ", \n"+str(doc.test_comment)
+ subject += ", \n"+ cstr(doc.test_comment)
medical_record = frappe.new_doc("Patient Medical Record")
medical_record.patient = doc.patient
medical_record.subject = subject
diff --git a/erpnext/healthcare/doctype/vital_signs/vital_signs.py b/erpnext/healthcare/doctype/vital_signs/vital_signs.py
index dea848d..9aa055c 100644
--- a/erpnext/healthcare/doctype/vital_signs/vital_signs.py
+++ b/erpnext/healthcare/doctype/vital_signs/vital_signs.py
@@ -5,6 +5,7 @@
from __future__ import unicode_literals
import frappe
from frappe.model.document import Document
+from frappe.utils import cstr
class VitalSigns(Document):
def on_submit(self):
@@ -33,16 +34,16 @@
def set_subject_field(doc):
subject = " "
if(doc.temperature):
- subject += "Temperature: \n"+ str(doc.temperature)+". "
+ subject += "Temperature: \n"+ cstr(doc.temperature)+". "
if(doc.pulse):
- subject += "Pulse: \n"+ str(doc.pulse)+". "
+ subject += "Pulse: \n"+ cstr(doc.pulse)+". "
if(doc.respiratory_rate):
- subject += "Respiratory Rate: \n"+ str(doc.respiratory_rate)+". "
+ subject += "Respiratory Rate: \n"+ cstr(doc.respiratory_rate)+". "
if(doc.bp):
- subject += "BP: \n"+ str(doc.bp)+". "
+ subject += "BP: \n"+ cstr(doc.bp)+". "
if(doc.bmi):
- subject += "BMI: \n"+ str(doc.bmi)+". "
+ subject += "BMI: \n"+ cstr(doc.bmi)+". "
if(doc.nutrition_note):
- subject += "Note: \n"+ str(doc.nutrition_note)+". "
+ subject += "Note: \n"+ cstr(doc.nutrition_note)+". "
return subject
diff --git a/erpnext/hr/doctype/leave_application/leave_application.js b/erpnext/hr/doctype/leave_application/leave_application.js
index 06eee61..b335717 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.js
+++ b/erpnext/hr/doctype/leave_application/leave_application.js
@@ -42,6 +42,7 @@
employee: function(frm) {
frm.trigger("get_leave_balance");
+ frm.trigger("set_leave_approver");
},
leave_type: function(frm) {
@@ -125,4 +126,21 @@
});
}
},
+
+ set_leave_approver: function(frm) {
+ if(frm.doc.employee) {
+ // server call is done to include holidays in leave days calculations
+ return frappe.call({
+ method: 'erpnext.hr.doctype.leave_application.leave_application.get_leave_approver_data',
+ args: {
+ "employee": frm.doc.employee,
+ },
+ callback: function(r) {
+ if (r && r.message) {
+ frm.set_value('leave_approver', r.message);
+ }
+ }
+ });
+ }
+ }
});
diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py
index 4e1b54b..e03764a 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.py
+++ b/erpnext/hr/doctype/leave_application/leave_application.py
@@ -116,7 +116,7 @@
frappe.db.sql("""update `tabAttendance` set status = %s, leave_type = %s\
where name = %s""",(status, self.leave_type, d.name))
- elif self.from_date <= nowdate():
+ elif self.to_date <= nowdate():
for dt in daterange(getdate(self.from_date), getdate(self.to_date)):
date = dt.strftime("%Y-%m-%d")
if not date == self.half_day_date:
@@ -126,6 +126,7 @@
doc.company = self.company
doc.status = "On Leave"
doc.leave_type = self.leave_type
+ doc.insert(ignore_permissions=True)
doc.submit()
else:
doc = frappe.new_doc("Attendance")
@@ -134,6 +135,7 @@
doc.company = self.company
doc.status = "Half Day"
doc.leave_type = self.leave_type
+ doc.insert(ignore_permissions=True)
doc.submit()
def validate_salary_processed_days(self):
@@ -530,3 +532,8 @@
"title": _("Holiday") + ": " + cstr(holiday.description),
"name": holiday.name
})
+
+@frappe.whitelist()
+def get_leave_approver_data(employee):
+ return frappe.db.get_value("Employee Leave Approver",
+ {'parent': employee}, 'leave_approver')
diff --git a/erpnext/manufacturing/page/production_analytics/production_analytics.js b/erpnext/manufacturing/page/production_analytics/production_analytics.js
index efbd0a5..21b4293 100644
--- a/erpnext/manufacturing/page/production_analytics/production_analytics.js
+++ b/erpnext/manufacturing/page/production_analytics/production_analytics.js
@@ -64,8 +64,7 @@
var chart_data = this.get_chart_data ? this.get_chart_data() : null;
- this.chart = new Chart({
- parent: ".chart",
+ this.chart = new frappeChart.Chart(".chart", {
data: chart_data,
type: 'line'
});
diff --git a/erpnext/regional/report/gstr_1/gstr_1.py b/erpnext/regional/report/gstr_1/gstr_1.py
index a14500a..52f0748 100644
--- a/erpnext/regional/report/gstr_1/gstr_1.py
+++ b/erpnext/regional/report/gstr_1/gstr_1.py
@@ -23,7 +23,7 @@
posting_date,
base_grand_total,
base_rounded_total,
- customer_gstin,
+ COALESCE(NULLIF(customer_gstin,''), NULLIF(billing_address_gstin, '')) as customer_gstin,
place_of_supply,
ecommerce_gstin,
reverse_charge,
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index 203458e..effbe82 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -501,7 +501,7 @@
def update_item_price(self):
frappe.db.sql("""update `tabItem Price` set item_name=%s,
- item_description=%s, modified=NOW() where item_code=%s""",
+ item_description=%s where item_code=%s""",
(self.item_name, self.description, self.name))
def on_trash(self):
diff --git a/erpnext/stock/doctype/warehouse/warehouse.js b/erpnext/stock/doctype/warehouse/warehouse.js
index 1bfa416..1bea00e 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.js
+++ b/erpnext/stock/doctype/warehouse/warehouse.js
@@ -39,6 +39,8 @@
frm.toggle_enable(['is_group', 'company'], false);
+ frappe.dynamic_link = {doc: frm.doc, fieldname: 'name', doctype: 'Warehouse'};
+
frm.fields_dict['parent_warehouse'].get_query = function(doc) {
return {
filters: {
diff --git a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.js b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.js
index 2482cf8..c0535bf 100644
--- a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.js
+++ b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.js
@@ -14,6 +14,19 @@
"label": __("To Date"),
"fieldtype": "Date",
"default": frappe.datetime.get_today()
+ },
+ {
+ "fieldname":"item_group",
+ "label": __("Item Group"),
+ "fieldtype": "Link",
+ "options": "Item Group",
+ "reqd": 1
+ },
+ {
+ "fieldname":"brand",
+ "label": __("Brand"),
+ "fieldtype": "Link",
+ "options": "Brand"
}
]
}
\ No newline at end of file
diff --git a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py
index cc47ad9..618fd15 100644
--- a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py
+++ b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py
@@ -10,7 +10,7 @@
if not filters: filters = {}
float_preceision = frappe.db.get_default("float_preceision")
- condition =get_condition(filters)
+ condition = get_condition(filters)
avg_daily_outgoing = 0
diff = ((getdate(filters.get("to_date")) - getdate(filters.get("from_date"))).days)+1
@@ -18,7 +18,7 @@
frappe.throw(_("'From Date' must be after 'To Date'"))
columns = get_columns()
- items = get_item_info()
+ items = get_item_info(filters)
consumed_item_map = get_consumed_items(condition)
delivered_item_map = get_delivered_items(condition)
@@ -28,23 +28,31 @@
avg_daily_outgoing = flt(total_outgoing / diff, float_preceision)
reorder_level = (avg_daily_outgoing * flt(item.lead_time_days)) + flt(item.safety_stock)
- data.append([item.name, item.item_name, item.description, item.safety_stock, item.lead_time_days,
- consumed_item_map.get(item.name, 0), delivered_item_map.get(item.name,0), total_outgoing,
- avg_daily_outgoing, reorder_level])
+ data.append([item.name, item.item_name, item.item_group, item.brand, item.description,
+ item.safety_stock, item.lead_time_days, consumed_item_map.get(item.name, 0),
+ delivered_item_map.get(item.name,0), total_outgoing, avg_daily_outgoing, reorder_level])
return columns , data
def get_columns():
return[
- _("Item") + ":Link/Item:120", _("Item Name") + ":Data:120", _("Description") + "::160",
+ _("Item") + ":Link/Item:120", _("Item Name") + ":Data:120", _("Item Group") + ":Link/Item Group:100",
+ _("Brand") + ":Link/Brand:100", _("Description") + "::160",
_("Safety Stock") + ":Float:160", _("Lead Time Days") + ":Float:120", _("Consumed") + ":Float:120",
_("Delivered") + ":Float:120", _("Total Outgoing") + ":Float:120", _("Avg Daily Outgoing") + ":Float:160",
_("Reorder Level") + ":Float:120"
]
-def get_item_info():
- return frappe.db.sql("""select name, item_name, description, safety_stock,
- lead_time_days from tabItem""", as_dict=1)
+def get_item_info(filters):
+ from erpnext.stock.report.stock_ledger.stock_ledger import get_item_group_condition
+ conditions = [get_item_group_condition(filters.get("item_group"))]
+ if filters.get("brand"):
+ conditions.append("item.brand=%(brand)s")
+
+ return frappe.db.sql("""select name, item_name, description, brand, item_group,
+ safety_stock, lead_time_days from `tabItem` item where {}"""
+ .format(" and ".join(conditions)), filters, as_dict=1)
+
def get_consumed_items(condition):
cn_items = frappe.db.sql("""select se_item.item_code,
diff --git a/erpnext/utilities/page/leaderboard/leaderboard.js b/erpnext/utilities/page/leaderboard/leaderboard.js
index 1a9efd5..1c085f2 100644
--- a/erpnext/utilities/page/leaderboard/leaderboard.js
+++ b/erpnext/utilities/page/leaderboard/leaderboard.js
@@ -146,7 +146,6 @@
me.$graph_area.show().empty();
let args = {
- parent: '.leaderboard-graph',
data: {
datasets: [
{
@@ -160,7 +159,7 @@
type: 'bar',
height: 140
};
- new Chart(args);
+ new frappeChart.Chart('.leaderboard-graph', args);
notify(me, r, $container);
}
@@ -280,7 +279,7 @@
fields.map(col => {
let val = item[col];
if(col=="name") {
- var formatted_value = `<a class="grey list-id ellipsis"
+ var formatted_value = `<a class="grey list-id ellipsis"
href="#Form/${me.options.selected_doctype}/${item["name"]}"> ${val} </a>`
} else {
var formatted_value = `<span class="text-muted ellipsis">