Merge pull request #4926 from nabinhait/balance_sheet
[fix][report] Show group rows with zero values if there are values against children
diff --git a/erpnext/docs/user/manual/de/accounts/journal-entry.md b/erpnext/docs/user/manual/de/accounts/journal-entry.md
index f823f0e..0885130 100644
--- a/erpnext/docs/user/manual/de/accounts/journal-entry.md
+++ b/erpnext/docs/user/manual/de/accounts/journal-entry.md
@@ -10,6 +10,7 @@
<img class="screenshot" alt="Buchungssatz" src="{{docs_base_url}}/assets/img/accounts/journal-entry.png">
In einem Buchungssatz müssen Sie folgendes tun:
+
* Die Belegart über das DropDown-Menü auswählen.
* Zeilen für die einzelnen Buchungen hinzufügen. In jeder Zeile müssen Sie folgendes Angeben:
* Das Konto, das betroffen ist.
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 46ab671..41bce00 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -165,6 +165,7 @@
execute:frappe.db.set_value("Backup Manager", None, "send_backups_to_dropbox", 1 if frappe.db.get_value("Backup Manager", None, "upload_backups_to_dropbox") in ("Daily", "Weekly") else 0)
execute:frappe.db.sql_list("delete from `tabDocPerm` where parent='Issue' and modified_by='Administrator' and role='Guest'")
erpnext.patches.v5_0.update_item_and_description_again
+erpnext.patches.v6_0.multi_currency
erpnext.patches.v5_0.repost_gle_for_jv_with_multiple_party
erpnext.patches.v5_0.portal_fixes
erpnext.patches.v5_0.reset_values_in_tools
@@ -207,7 +208,6 @@
execute:frappe.db.sql("""update `tabProject` set percent_complete=round(percent_complete, 2) where percent_complete is not null""")
erpnext.patches.v6_0.fix_outstanding_amount
erpnext.patches.v6_0.fix_planned_qty
-erpnext.patches.v6_0.multi_currency
erpnext.patches.v6_2.remove_newsletter_duplicates
erpnext.patches.v6_2.fix_missing_default_taxes_and_lead
erpnext.patches.v6_3.convert_applicable_territory
diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py
index 07ac326..42e8d1b 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.py
+++ b/erpnext/stock/doctype/serial_no/serial_no.py
@@ -139,8 +139,8 @@
return sle_dict
def on_trash(self):
- sl_entries = frappe.db.sql("""select serial_no from `tabStock Ledger Entry`
- where serial_no like %s and item_code=%s and ifnull(is_cancelled, 'No')='No'""",
+ sl_entries = frappe.db.sql("""select serial_no from `tabStock Ledger Entry`
+ where serial_no like %s and item_code=%s and ifnull(is_cancelled, 'No')='No'""",
("%%%s%%" % self.name, self.item_code), as_dict=True)
# Find the exact match
@@ -149,7 +149,7 @@
if self.name.upper() in get_serial_nos(d.serial_no):
sle_exists = True
break
-
+
if sle_exists:
frappe.throw(_("Cannot delete Serial No {0}, as it is used in stock transactions").format(self.name))
@@ -208,9 +208,9 @@
if not allow_serial_nos_with_different_item(serial_no, sle):
frappe.throw(_("Serial No {0} does not belong to Item {1}").format(serial_no,
sle.item_code), SerialNoItemError)
-
+
if sr.warehouse and sle.actual_qty > 0:
- frappe.throw(_("Serial No {0} has already been received").format(sr.name),
+ frappe.throw(_("Serial No {0} has already been received").format(serial_no),
SerialNoDuplicateError)
if sle.actual_qty < 0:
@@ -229,10 +229,10 @@
elif sle.actual_qty < 0 or not item_det.serial_no_series:
frappe.throw(_("Serial Nos Required for Serialized Item {0}").format(sle.item_code),
SerialNoRequiredError)
-
+
def allow_serial_nos_with_different_item(sle_serial_no, sle):
"""
- Allows same serial nos for raw materials and finished goods
+ Allows same serial nos for raw materials and finished goods
in Manufacture / Repack type Stock Entry
"""
allow_serial_nos = False
@@ -244,9 +244,9 @@
serial_nos = get_serial_nos(d.serial_no)
if sle_serial_no in serial_nos:
allow_serial_nos = True
-
+
return allow_serial_nos
-
+
def update_serial_nos(sle, item_det):
if sle.is_cancelled == "No" and not sle.serial_no and sle.actual_qty > 0 \
and item_det.has_serial_no == 1 and item_det.serial_no_series:
diff --git a/erpnext/stock/report/stock_balance/stock_balance.js b/erpnext/stock/report/stock_balance/stock_balance.js
index db334f8..1af32ed 100644
--- a/erpnext/stock/report/stock_balance/stock_balance.js
+++ b/erpnext/stock/report/stock_balance/stock_balance.js
@@ -22,7 +22,40 @@
"label": __("Item"),
"fieldtype": "Link",
"width": "80",
- "options": "Item"
+ "options": "Item",
+ "reqd": 1,
+ "on_change": function(me) {
+ frappe.query_reports["Stock Balance"].toggle_mandatory_filters(me);
+ }
+ },
+ {
+ "fieldname": "warehouse",
+ "label": __("Warehouse"),
+ "fieldtype": "Link",
+ "width": "80",
+ "options": "Warehouse",
+ "reqd": 1,
+ "on_change": function(me) {
+ frappe.query_reports["Stock Balance"].toggle_mandatory_filters(me);
+ }
+ },
+ ],
+
+ "toggle_mandatory_filters": function(me) {
+ var values = me.get_values(false);
+ var item_filter = me.filters_by_name["item_code"];
+ var warehouse_filter = me.filters_by_name["warehouse"];
+
+ if (values.item_code) {
+ warehouse_filter.df.reqd = 0;
+ } else if (values.warehouse) {
+ item_filter.df.reqd = 0;
+ } else {
+ item_filter.df.reqd = 1;
+ warehouse_filter.df.reqd = 1;
}
- ]
+
+ item_filter.set_mandatory(values.item_code);
+ warehouse_filter.set_mandatory(values.warehouse);
+ }
}
diff --git a/erpnext/stock/report/stock_balance/stock_balance.py b/erpnext/stock/report/stock_balance/stock_balance.py
index 7dd728f..d465050 100644
--- a/erpnext/stock/report/stock_balance/stock_balance.py
+++ b/erpnext/stock/report/stock_balance/stock_balance.py
@@ -9,7 +9,7 @@
def execute(filters=None):
if not filters: filters = {}
- columns = get_columns(filters)
+ columns = get_columns()
item_map = get_item_details(filters)
iwb_map = get_item_warehouse_map(filters)
@@ -30,8 +30,8 @@
return columns, data
-def get_columns(filters):
- """return columns based on filters"""
+def get_columns():
+ """return columns"""
columns = [
_("Item")+":Link/Item:100",
@@ -68,9 +68,11 @@
if filters.get("item_code"):
conditions += " and item_code = '%s'" % frappe.db.escape(filters.get("item_code"), percent=False)
+ if filters.get("warehouse"):
+ conditions += " and warehouse = '%s'" % frappe.db.escape(filters.get("warehouse"), percent=False)
+
return conditions
-#get all details
def get_stock_ledger_entries(filters):
conditions = get_conditions(filters)
return frappe.db.sql("""select item_code, warehouse, posting_date, actual_qty, valuation_rate,
@@ -125,9 +127,13 @@
return iwb_map
def get_item_details(filters):
- item_map = {}
- for d in frappe.db.sql("select name, item_name, stock_uom, item_group, brand, \
- description from tabItem", as_dict=1):
- item_map.setdefault(d.name, d)
+ condition = ''
+ value = ()
+ if filters.get("item_code"):
+ condition = "where item_code=%s"
+ value = (filters["item_code"],)
- return item_map
+ items = frappe.db.sql("""select name, item_name, stock_uom, item_group, brand, description
+ from tabItem {condition}""".format(condition=condition), value, as_dict=1)
+
+ return dict((d.name, d) for d in items)