diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 378cf5e053..67d9a35cbd 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals import frappe -__version__ = '7.2.13' +__version__ = '7.2.14' def get_default_company(user=None): '''Get default company for user''' diff --git a/erpnext/accounts/doctype/budget/budget.js b/erpnext/accounts/doctype/budget/budget.js index 6697b178d3..cadf1e7e0c 100644 --- a/erpnext/accounts/doctype/budget/budget.js +++ b/erpnext/accounts/doctype/budget/budget.js @@ -43,9 +43,18 @@ frappe.ui.form.on('Budget', { }, budget_against: function(frm) { + frm.trigger("set_null_value") frm.trigger("toggle_reqd_fields") }, + set_null_value: function(frm) { + if(frm.doc.budget_against == 'Cost Center') { + frm.set_value('project', null) + } else { + frm.set_value('cost_center', null) + } + }, + toggle_reqd_fields: function(frm) { frm.toggle_reqd("cost_center", frm.doc.budget_against=="Cost Center"); frm.toggle_reqd("project", frm.doc.budget_against=="Project"); diff --git a/erpnext/accounts/doctype/budget/budget.py b/erpnext/accounts/doctype/budget/budget.py index 15d6f106df..a6348f19da 100644 --- a/erpnext/accounts/doctype/budget/budget.py +++ b/erpnext/accounts/doctype/budget/budget.py @@ -22,6 +22,7 @@ class Budget(Document): frappe.throw(_("{0} is mandatory").format(self.budget_against)) self.validate_duplicate() self.validate_accounts() + self.set_null_value() def validate_duplicate(self): budget_against_field = frappe.scrub(self.budget_against) @@ -54,25 +55,31 @@ class Budget(Document): else: account_list.append(d.account) + def set_null_value(self): + if self.budget_against == 'Cost Center': + self.project = None + else: + self.cost_center = None + def validate_expense_against_budget(args): args = frappe._dict(args) if not args.cost_center and not args.project: return - for budget_against in [args.project, args.cost_center]: - if budget_against \ + for budget_against in ['project', 'cost_center']: + if args.get(budget_against) \ and frappe.db.get_value("Account", {"name": args.account, "root_type": "Expense"}): - if args.project: + if args.project and budget_against == 'project': condition = "and b.project='%s'" % frappe.db.escape(args.project) args.budget_against_field = "Project" - elif args.cost_center: + elif args.cost_center and budget_against == 'cost_center': cc_lft, cc_rgt = frappe.db.get_value("Cost Center", args.cost_center, ["lft", "rgt"]) condition = """and exists(select name from `tabCost Center` where lft<=%s and rgt>=%s and name=b.cost_center)""" % (cc_lft, cc_rgt) args.budget_against_field = "Cost Center" - - args.budget_against = budget_against + + args.budget_against = args.get(budget_against) budget_records = frappe.db.sql(""" select diff --git a/erpnext/accounts/doctype/sales_invoice/pos.py b/erpnext/accounts/doctype/sales_invoice/pos.py index 9fb7cebb5e..bd54776177 100644 --- a/erpnext/accounts/doctype/sales_invoice/pos.py +++ b/erpnext/accounts/doctype/sales_invoice/pos.py @@ -82,8 +82,7 @@ def update_pos_profile_data(doc, pos_profile, company_data): doc.apply_discount_on = pos_profile.get('apply_discount_on') if pos_profile.get('apply_discount') else '' doc.customer_group = pos_profile.get('customer_group') or get_root('Customer Group') doc.territory = pos_profile.get('territory') or get_root('Territory') - if pos_profile.get('tc_name'): - doc.terms = frappe.db.get_value('Terms and Conditions', pos_profile.get('tc_name'), 'terms') + doc.terms = frappe.db.get_value('Terms and Conditions', pos_profile.get('tc_name'), 'terms') or doc.terms or '' def get_root(table): root = frappe.db.sql(""" select name from `tab%(table)s` having diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 534f96521f..7ade3187e2 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -2385,7 +2385,7 @@ "in_standard_filter": 0, "label": "Sales Invoice Payment", "length": 0, - "no_copy": 1, + "no_copy": 0, "options": "Sales Invoice Payment", "permlevel": 0, "precision": "", @@ -4183,7 +4183,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-01-17 11:07:25.814402", + "modified": "2017-01-18 13:21:13.226318", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", diff --git a/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py b/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py index 85c7daa4e5..a7d1820850 100644 --- a/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py +++ b/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py @@ -46,7 +46,7 @@ def validate_filters(filters): def get_columns(filters): return [ - _("Payment Document") + ":Link/DocType: 100", + _("Payment Document") + ":: 100", _("Payment Entry") + ":Dynamic Link/"+_("Payment Document")+":140", _("Party Type") + "::100", _("Party") + ":Dynamic Link/Party Type:140", diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index 865514b5cb..c4ba9e7b1d 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -223,7 +223,8 @@ class BuyingController(StockController): }) if not rm.rate: from erpnext.stock.stock_ledger import get_valuation_rate - rm.rate = get_valuation_rate(bom_item.item_code, self.supplier_warehouse) + rm.rate = get_valuation_rate(bom_item.item_code, self.supplier_warehouse, + self.doctype, self.name) else: rm.rate = bom_item.rate diff --git a/erpnext/controllers/sales_and_purchase_return.py b/erpnext/controllers/sales_and_purchase_return.py index 3e22681009..4f9bce1dec 100644 --- a/erpnext/controllers/sales_and_purchase_return.py +++ b/erpnext/controllers/sales_and_purchase_return.py @@ -198,6 +198,7 @@ def make_return_doc(doctype, source_name, target_doc=None): if tax.charge_type == "Actual": tax.tax_amount = -1 * tax.tax_amount + doc.discount_amount = -1 * source.discount_amount doc.run_method("calculate_taxes_and_totals") def update_item(source_doc, target_doc, source_parent): diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 74ea774ee7..5ecab8d322 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -88,9 +88,8 @@ class StockController(AccountsController): def validate_negative_stock(self, sle): if sle.qty_after_transaction < 0 and sle.actual_qty < 0: - frappe.throw(_("For the Item {0}, valuation rate not found for warehouse {1}. To be able to do accounting entries (for booking expenses), we need valuation rate for item {2}. Please create an incoming stock transaction, on or before {3} {4}, and then try submiting {5}") - .format(sle.item_code, sle.warehouse, - sle.item_code, sle.posting_date, sle.posting_time, self.name)) + frappe.throw(_("Valuation rate not found for the Item {0}, which is required to do accounting entries (for booking expenses). Please create an incoming stock transaction or mention valuation rate in Item record, and then try submiting {1} {2}") + .format(sle.item_code, sle.voucher_type, sle.voucher_no)) def get_voucher_details(self, default_expense_account, default_cost_center, sle_map): if self.doctype == "Stock Reconciliation": diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.py b/erpnext/hr/doctype/leave_allocation/leave_allocation.py index 3473fd841a..58a7f30093 100755 --- a/erpnext/hr/doctype/leave_allocation/leave_allocation.py +++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.py @@ -93,7 +93,7 @@ class LeaveAllocation(Document): if flt(leaves_taken) > flt(self.total_leaves_allocated): if frappe.db.get_value("Leave Type", self.leave_type, "allow_negative"): - frappe.msgprint(_("Note: Total allocated leaves {0} shouldn't be less than already approved leaves {1} for the period").format(self.total_leaves_allocated, leaves_taken), LessAllocationError) + frappe.msgprint(_("Note: Total allocated leaves {0} shouldn't be less than already approved leaves {1} for the period").format(self.total_leaves_allocated, leaves_taken)) else: frappe.throw(_("Total allocated leaves {0} cannot be less than already approved leaves {1} for the period").format(self.total_leaves_allocated, leaves_taken), LessAllocationError) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index bfda4409a0..9e3708184f 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -365,4 +365,5 @@ erpnext.patches.v7_2.update_doctype_status erpnext.patches.v7_2.update_salary_slips erpnext.patches.v7_2.delete_fleet_management_module_def erpnext.patches.v7_2.contact_address_links -erpnext.patches.v7_2.mark_students_active \ No newline at end of file +erpnext.patches.v7_2.mark_students_active +erpnext.patches.v7_2.set_null_value_to_fields diff --git a/erpnext/patches/v7_2/set_null_value_to_fields.py b/erpnext/patches/v7_2/set_null_value_to_fields.py new file mode 100644 index 0000000000..6388be438d --- /dev/null +++ b/erpnext/patches/v7_2/set_null_value_to_fields.py @@ -0,0 +1,11 @@ +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + fields = {"Cost Center": "project", "Project": "cost_center"} + for budget_against, field in fields.items(): + frappe.db.sql(""" update `tabBudget` set {field} = null + where budget_against = %s """.format(field = field), budget_against) diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js index 8844528f5f..73a04f2b7c 100644 --- a/erpnext/stock/doctype/item/item.js +++ b/erpnext/stock/doctype/item/item.js @@ -113,6 +113,12 @@ frappe.ui.form.on("Item", { has_variants: function(frm) { erpnext.item.toggle_attributes(frm); + }, + + show_in_website: function(frm) { + if (frm.doc.default_warehouse && !frm.doc.website_warehouse){ + frm.set_value("website_warehouse", frm.doc.default_warehouse); + } } }); diff --git a/erpnext/stock/doctype/item/item.json b/erpnext/stock/doctype/item/item.json index da3de1eac9..316d35bc07 100644 --- a/erpnext/stock/doctype/item/item.json +++ b/erpnext/stock/doctype/item/item.json @@ -26,6 +26,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "", "length": 0, "no_copy": 0, @@ -54,6 +55,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Series", "length": 0, "no_copy": 0, @@ -82,6 +84,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Item Code", "length": 0, "no_copy": 1, @@ -112,6 +115,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 1, "label": "Variant Of", "length": 0, "no_copy": 0, @@ -140,6 +144,7 @@ "ignore_xss_filter": 0, "in_filter": 1, "in_list_view": 0, + "in_standard_filter": 0, "label": "Item Name", "length": 0, "no_copy": 0, @@ -168,6 +173,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Barcode", "length": 0, "no_copy": 1, @@ -195,6 +201,7 @@ "ignore_xss_filter": 0, "in_filter": 1, "in_list_view": 1, + "in_standard_filter": 1, "label": "Item Group", "length": 0, "no_copy": 0, @@ -225,6 +232,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Default Unit of Measure", "length": 0, "no_copy": 0, @@ -254,6 +262,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "length": 0, "no_copy": 0, "permlevel": 0, @@ -279,6 +288,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Disabled", "length": 0, "no_copy": 0, @@ -308,6 +318,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Maintain Stock", "length": 0, "no_copy": 0, @@ -338,6 +349,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Opening Stock", "length": 0, "no_copy": 0, @@ -353,39 +365,40 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:(doc.__islocal && doc.is_stock_item && !doc.has_serial_no && !doc.has_batch_no && doc.opening_stock)", - "fieldname": "valuation_rate", - "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Valuation Rate", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_on_submit": 0, "bold": 0, "collapsible": 0, "columns": 0, + "depends_on": "eval:(doc.is_stock_item && !doc.has_serial_no && !doc.has_batch_no)", + "fieldname": "valuation_rate", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Valuation Rate", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "columns": 0, "fieldname": "standard_rate", "fieldtype": "Currency", "hidden": 0, @@ -393,6 +406,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Standard Selling Rate", "length": 0, "no_copy": 0, @@ -420,6 +434,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Is Fixed Asset", "length": 0, "no_copy": 0, @@ -448,6 +463,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Asset Category", "length": 0, "no_copy": 0, @@ -476,6 +492,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Image", "length": 0, "no_copy": 0, @@ -504,6 +521,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Description", "length": 0, "no_copy": 0, @@ -531,6 +549,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Brand", "length": 0, "no_copy": 0, @@ -560,6 +579,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Description", "length": 0, "no_copy": 0, @@ -590,6 +610,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Inventory", "length": 0, "no_copy": 0, @@ -620,6 +641,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Default Warehouse", "length": 0, "no_copy": 0, @@ -651,6 +673,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "End of Life", "length": 0, "no_copy": 0, @@ -681,6 +704,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Has Batch No", "length": 0, "no_copy": 0, @@ -713,6 +737,7 @@ "ignore_xss_filter": 0, "in_filter": 1, "in_list_view": 0, + "in_standard_filter": 0, "label": "Has Serial No", "length": 0, "no_copy": 0, @@ -744,6 +769,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Serial Number Series", "length": 0, "no_copy": 0, @@ -771,6 +797,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Default Material Request Type", "length": 0, "no_copy": 0, @@ -800,6 +827,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "length": 0, "no_copy": 0, "oldfieldtype": "Column Break", @@ -829,6 +857,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Allow over delivery or receipt upto this percent", "length": 0, "no_copy": 0, @@ -858,6 +887,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Valuation Method", "length": 0, "no_copy": 0, @@ -886,6 +916,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Warranty Period (in days)", "length": 0, "no_copy": 0, @@ -916,6 +947,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Net Weight", "length": 0, "no_copy": 0, @@ -943,6 +975,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Weight UOM", "length": 0, "no_copy": 0, @@ -972,6 +1005,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Auto re-order", "length": 0, "no_copy": 0, @@ -1001,6 +1035,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Reorder level based on Warehouse", "length": 0, "no_copy": 0, @@ -1091,6 +1126,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Variants", "length": 0, "no_copy": 0, @@ -1121,6 +1157,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Has Variants", "length": 0, "no_copy": 1, @@ -1150,6 +1187,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Attributes", "length": 0, "no_copy": 1, @@ -1178,6 +1216,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Purchase Details", "length": 0, "no_copy": 0, @@ -1207,6 +1246,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Is Purchase Item", "length": 0, "no_copy": 0, @@ -1237,6 +1277,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Minimum Order Qty", "length": 0, "no_copy": 0, @@ -1265,6 +1306,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Safety Stock", "length": 0, "no_copy": 0, @@ -1294,6 +1336,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Lead Time in days", "length": 0, "no_copy": 0, @@ -1324,6 +1367,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Default Buying Cost Center", "length": 0, "no_copy": 0, @@ -1355,6 +1399,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Default Expense Account", "length": 0, "no_copy": 0, @@ -1385,6 +1430,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Last Purchase Rate", "length": 0, "no_copy": 1, @@ -1414,6 +1460,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Supplier Details", "length": 0, "no_copy": 0, @@ -1442,6 +1489,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Default Supplier", "length": 0, "no_copy": 0, @@ -1469,6 +1517,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Delivered by Supplier (Drop Ship)", "length": 0, "no_copy": 0, @@ -1497,6 +1546,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Manufacturer", "length": 0, "no_copy": 0, @@ -1525,6 +1575,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Manufacturer Part Number", "length": 0, "no_copy": 0, @@ -1552,6 +1603,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Item Code for Suppliers", "length": 0, "no_copy": 0, @@ -1581,6 +1633,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Supplier Items", "length": 0, "no_copy": 0, @@ -1608,6 +1661,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Sales Details", "length": 0, "no_copy": 0, @@ -1637,6 +1691,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Is Sales Item", "length": 0, "no_copy": 0, @@ -1666,6 +1721,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Publish in Hub", "length": 0, "no_copy": 0, @@ -1694,6 +1750,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Synced With Hub", "length": 0, "no_copy": 0, @@ -1722,6 +1779,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Default Income Account", "length": 0, "no_copy": 0, @@ -1750,6 +1808,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Default Selling Cost Center", "length": 0, "no_copy": 0, @@ -1778,6 +1837,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Customer Item Codes", "length": 0, "no_copy": 0, @@ -1808,6 +1868,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Customer Items", "length": 0, "no_copy": 0, @@ -1836,6 +1897,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Max Discount (%)", "length": 0, "no_copy": 0, @@ -1864,6 +1926,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Item Tax", "length": 0, "no_copy": 0, @@ -1893,6 +1956,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Taxes", "length": 0, "no_copy": 0, @@ -1922,6 +1986,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Inspection Criteria", "length": 0, "no_copy": 0, @@ -1951,6 +2016,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Inspection Required before Purchase", "length": 0, "no_copy": 0, @@ -1980,6 +2046,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Inspection Required before Delivery", "length": 0, "no_copy": 0, @@ -2009,6 +2076,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Quality Parameters", "length": 0, "no_copy": 0, @@ -2039,6 +2107,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Manufacturing", "length": 0, "no_copy": 0, @@ -2068,6 +2137,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Default BOM", "length": 0, "no_copy": 1, @@ -2099,6 +2169,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Supply Raw Materials for Purchase", "length": 0, "no_copy": 0, @@ -2128,6 +2199,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "length": 0, "no_copy": 0, "permlevel": 0, @@ -2154,6 +2226,7 @@ "ignore_xss_filter": 0, "in_filter": 1, "in_list_view": 0, + "in_standard_filter": 0, "label": "Customer Code", "length": 0, "no_copy": 1, @@ -2180,6 +2253,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Website", "length": 0, "no_copy": 0, @@ -2208,6 +2282,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Show in Website", "length": 0, "no_copy": 0, @@ -2235,6 +2310,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Show in Website (Variant)", "length": 0, "no_copy": 0, @@ -2263,6 +2339,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Route", "length": 0, "no_copy": 0, @@ -2292,6 +2369,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Weightage", "length": 0, "no_copy": 0, @@ -2320,6 +2398,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Slideshow", "length": 0, "no_copy": 0, @@ -2349,6 +2428,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Image", "length": 0, "no_copy": 0, @@ -2376,6 +2456,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Thumbnail", "length": 0, "no_copy": 0, @@ -2403,6 +2484,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "length": 0, "no_copy": 0, "permlevel": 0, @@ -2430,6 +2512,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Website Warehouse", "length": 0, "no_copy": 0, @@ -2459,6 +2542,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Website Item Groups", "length": 0, "no_copy": 0, @@ -2488,6 +2572,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Website Specifications", "length": 0, "no_copy": 0, @@ -2515,6 +2600,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Copy From Item Group", "length": 0, "no_copy": 0, @@ -2542,6 +2628,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Website Specifications", "length": 0, "no_copy": 0, @@ -2570,6 +2657,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Website Description", "length": 0, "no_copy": 0, @@ -2596,6 +2684,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Total Projected Qty", "length": 0, "no_copy": 0, @@ -2624,7 +2713,7 @@ "issingle": 0, "istable": 0, "max_attachments": 1, - "modified": "2017-01-10 12:02:51.807965", + "modified": "2017-01-18 17:43:20.262925", "modified_by": "Administrator", "module": "Stock", "name": "Item", diff --git a/erpnext/stock/doctype/item/test_records.json b/erpnext/stock/doctype/item/test_records.json index c05c5f39bf..aad8ed0fc2 100644 --- a/erpnext/stock/doctype/item/test_records.json +++ b/erpnext/stock/doctype/item/test_records.json @@ -15,6 +15,7 @@ "item_group": "_Test Item Group", "item_name": "_Test Item", "apply_warehouse_wise_reorder_level": 1, + "valuation_rate": 100, "reorder_levels": [ { "material_request_type": "Purchase", @@ -61,6 +62,7 @@ "item_code": "_Test Item Home Desktop 100", "item_group": "_Test Item Group Desktops", "item_name": "_Test Item Home Desktop 100", + "valuation_rate": 100, "taxes": [ { "doctype": "Item Tax", diff --git a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py index aacf02c4e0..0eaf5ba8ca 100644 --- a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py +++ b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py @@ -12,22 +12,23 @@ class LandedCostVoucher(Document): def get_items_from_purchase_receipts(self): self.set("items", []) for pr in self.get("purchase_receipts"): - pr_items = frappe.db.sql("""select pr_item.item_code, pr_item.description, - pr_item.qty, pr_item.base_rate, pr_item.base_amount, pr_item.name - from `tab{doctype} Item` pr_item where parent = %s - and exists(select name from tabItem where name = pr_item.item_code and is_stock_item = 1) - """.format(doctype=pr.receipt_document_type), pr.receipt_document, as_dict=True) + if pr.receipt_document_type and pr.receipt_document: + pr_items = frappe.db.sql("""select pr_item.item_code, pr_item.description, + pr_item.qty, pr_item.base_rate, pr_item.base_amount, pr_item.name + from `tab{doctype} Item` pr_item where parent = %s + and exists(select name from tabItem where name = pr_item.item_code and is_stock_item = 1) + """.format(doctype=pr.receipt_document_type), pr.receipt_document, as_dict=True) - for d in pr_items: - item = self.append("items") - item.item_code = d.item_code - item.description = d.description - item.qty = d.qty - item.rate = d.base_rate - item.amount = d.base_amount - item.receipt_document_type = pr.receipt_document_type - item.receipt_document = pr.receipt_document - item.purchase_receipt_item = d.name + for d in pr_items: + item = self.append("items") + item.item_code = d.item_code + item.description = d.description + item.qty = d.qty + item.rate = d.base_rate + item.amount = d.base_amount + item.receipt_document_type = pr.receipt_document_type + item.receipt_document = pr.receipt_document + item.purchase_receipt_item = d.name def validate(self): self.check_mandatory() diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index a980ed0aff..a4cc512c9f 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -258,6 +258,10 @@ class update_entries_after(object): if not self.valuation_rate and actual_qty > 0: self.valuation_rate = sle.incoming_rate + + if not self.valuation_rate: + self.valuation_rate = get_valuation_rate(sle.item_code, sle.warehouse, + sle.voucher_type, sle.voucher_no, self.allow_zero_rate) def get_fifo_values(self, sle): incoming_rate = flt(sle.incoming_rate) @@ -281,10 +285,9 @@ class update_entries_after(object): qty_to_pop = abs(actual_qty) while qty_to_pop: if not self.stock_queue: - if self.qty_after_transaction > 0: - _rate = get_valuation_rate(sle.item_code, sle.warehouse, self.allow_zero_rate) - else: - _rate = 0 + # Get valuation rate from last sle if exists or from valuation rate field in item master + _rate = get_valuation_rate(sle.item_code, sle.warehouse, + sle.voucher_type, sle.voucher_no, self.allow_zero_rate) self.stock_queue.append([0, _rate]) index = None @@ -404,7 +407,8 @@ def get_stock_ledger_entries(previous_sle, operator=None, order="desc", limit=No "order": order }, previous_sle, as_dict=1, debug=debug) -def get_valuation_rate(item_code, warehouse, allow_zero_rate=False): +def get_valuation_rate(item_code, warehouse, voucher_type, voucher_no, allow_zero_rate=False): + # Get valuation rate from last sle for the same item and warehouse last_valuation_rate = frappe.db.sql("""select valuation_rate from `tabStock Ledger Entry` where item_code = %s and warehouse = %s @@ -412,6 +416,7 @@ def get_valuation_rate(item_code, warehouse, allow_zero_rate=False): order by posting_date desc, posting_time desc, name desc limit 1""", (item_code, warehouse)) if not last_valuation_rate: + # Get valuation rate from last sle for the item against any warehouse last_valuation_rate = frappe.db.sql("""select valuation_rate from `tabStock Ledger Entry` where item_code = %s and valuation_rate > 0 @@ -420,9 +425,14 @@ def get_valuation_rate(item_code, warehouse, allow_zero_rate=False): valuation_rate = flt(last_valuation_rate[0][0]) if last_valuation_rate else 0 if not valuation_rate: - valuation_rate = frappe.db.get_value("Item Price", {"item_code": item_code, "buying": 1}, "price_list_rate") + # If negative stock allowed, and item delivered without any incoming entry, + # syste does not found any SLE, then take valuation rate from Item + valuation_rate = frappe.db.get_value("Item", item_code, "valuation_rate") - if not allow_zero_rate and not valuation_rate and cint(frappe.db.get_value("Accounts Settings", None, "auto_accounting_for_stock")): - frappe.throw(_("Purchase rate for item: {0} not found, which is required to book accounting entry (expense). Please mention item price against a buying price list.").format(item_code)) + if not allow_zero_rate and not valuation_rate \ + and cint(frappe.db.get_value("Accounts Settings", None, "auto_accounting_for_stock")): + + frappe.throw(_("Valuation rate not found for the Item {0}, which is required to do accounting entries (for booking expenses). Please create an incoming stock transaction or mention valuation rate in Item record, and then try submiting {1} {2}") + .format(item_code, voucher_type, voucher_no)) return valuation_rate