From 5999ade43a1ba75d88906e936220547dd4181569 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Wed, 9 Aug 2017 17:24:13 +0530 Subject: [PATCH 1/6] [Fix] Auto batch creation not working for purchase invoice is update stock is enabled (#10348) --- .../purchase_invoice/purchase_invoice.py | 3 +++ .../purchase_invoice/test_purchase_invoice.py | 21 +++++++++++++++++++ erpnext/public/js/controllers/transaction.js | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 589bc40cd5..7ab790118a 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -53,6 +53,9 @@ class PurchaseInvoice(BuyingController): if (self.is_paid == 1): self.validate_cash() + if self._action=="submit" and self.update_stock: + self.make_batches('warehouse') + self.check_conversion_rate() self.validate_credit_to_acc() self.clear_unallocated_advances("Purchase Invoice Advance", "advances") diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 8bbd6c5f05..3454a2e9b4 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -403,6 +403,27 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertEquals(expected_gl_entries[gle.account][1], gle.debit) self.assertEquals(expected_gl_entries[gle.account][2], gle.credit) + def test_auto_batch(self): + item_code = frappe.db.get_value('Item', + {'has_batch_no': 1, 'create_new_batch':1}, 'name') + + if not item_code: + doc = frappe.get_doc({ + 'doctype': 'Item', + 'is_stock_item': 1, + 'item_code': 'test batch item', + 'item_group': 'Products', + 'has_batch_no': 1, + 'create_new_batch': 1 + }).insert(ignore_permissions=True) + item_code = doc.name + + pi = make_purchase_invoice(update_stock=1, posting_date=frappe.utils.nowdate(), + posting_time=frappe.utils.nowtime(), item_code=item_code) + + self.assertTrue(frappe.db.get_value('Batch', + {'item': item_code, 'reference_name': pi.name})) + def test_update_stock_and_purchase_return(self): actual_qty_0 = get_qty_after_transaction() diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index c798ade137..3a8ddb5927 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -261,7 +261,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ var item = frappe.get_doc(cdt, cdn); var update_stock = 0, show_batch_dialog = 0; - if(['Sales Invoice', 'Purchase Invoice'].includes(this.frm.doc.doctype)) { + if(['Sales Invoice'].includes(this.frm.doc.doctype)) { update_stock = cint(me.frm.doc.update_stock); show_batch_dialog = update_stock; From 35438b6fc0bcb5752dfd8e572f4b06fc42f8ff0c Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Thu, 10 Aug 2017 11:15:50 +0530 Subject: [PATCH 2/6] [Fix] Opportunity status has not changed after making of quotation against it if items has not added in the opportunity (#10351) --- .../crm/doctype/opportunity/opportunity.py | 20 ++++++--- .../doctype/opportunity/test_opportunity.py | 43 ++++++++++++++++++- .../selling/doctype/quotation/quotation.json | 33 +++++++++++++- .../selling/doctype/quotation/quotation.py | 15 +++++-- 4 files changed, 101 insertions(+), 10 deletions(-) diff --git a/erpnext/crm/doctype/opportunity/opportunity.py b/erpnext/crm/doctype/opportunity/opportunity.py index 93a294174d..8bc7ad8461 100644 --- a/erpnext/crm/doctype/opportunity/opportunity.py +++ b/erpnext/crm/doctype/opportunity/opportunity.py @@ -84,11 +84,19 @@ class Opportunity(TransactionBase): self.delete_events() def has_active_quotation(self): - return frappe.db.sql(""" - select q.name - from `tabQuotation` q, `tabQuotation Item` qi - where q.name = qi.parent and q.docstatus=1 and qi.prevdoc_docname =%s - and q.status not in ('Lost', 'Closed')""", self.name) + if not self.with_items: + return frappe.get_all('Quotation', + { + 'opportunity': self.name, + 'status': ("not in", ['Lost', 'Closed']), + 'docstatus': 1 + }, 'name') + else: + return frappe.db.sql(""" + select q.name + from `tabQuotation` q, `tabQuotation Item` qi + where q.name = qi.parent and q.docstatus=1 and qi.prevdoc_docname =%s + and q.status not in ('Lost', 'Closed')""", self.name) def has_ordered_quotation(self): return frappe.db.sql(""" @@ -212,6 +220,8 @@ def make_quotation(source_name, target_doc=None): quotation.run_method("set_missing_values") quotation.run_method("calculate_taxes_and_totals") + if not source.with_items: + quotation.opportunity = source.name doclist = get_mapped_doc("Opportunity", source_name, { "Opportunity": { diff --git a/erpnext/crm/doctype/opportunity/test_opportunity.py b/erpnext/crm/doctype/opportunity/test_opportunity.py index 0957afe697..4cd20ea72d 100644 --- a/erpnext/crm/doctype/opportunity/test_opportunity.py +++ b/erpnext/crm/doctype/opportunity/test_opportunity.py @@ -3,9 +3,50 @@ from __future__ import unicode_literals import frappe +from frappe.utils import today +from erpnext.crm.doctype.opportunity.opportunity import make_quotation import unittest test_records = frappe.get_test_records('Opportunity') class TestOpportunity(unittest.TestCase): - pass + def test_opportunity_status(self): + doc = make_opportunity(with_items=0) + quotation = make_quotation(doc.name) + quotation.append('items', { + "item_code": "_Test Item", + "qty": 1 + }) + + quotation.run_method("set_missing_values") + quotation.run_method("calculate_taxes_and_totals") + quotation.submit() + + doc = frappe.get_doc('Opportunity', doc.name) + self.assertEquals(doc.status, "Quotation") + +def make_opportunity(**args): + args = frappe._dict(args) + + opp_doc = frappe.get_doc({ + "doctype": "Opportunity", + "enquiry_from": "Customer" or args.enquiry_from, + "enquiry_type": "Sales", + "with_items": args.with_items or 0, + "transaction_date": today() + }) + + if opp_doc.enquiry_from == 'Customer': + opp_doc.customer = args.customer or "_Test Customer" + + if opp_doc.enquiry_from == 'Lead': + opp_doc.customer = args.lead or "_T-Lead-00001" + + if args.with_items: + opp_doc.append('items', { + "item_code": args.item_code or "_Test Item", + "qty": args.qty or 1 + }) + + opp_doc.insert() + return opp_doc \ No newline at end of file diff --git a/erpnext/selling/doctype/quotation/quotation.json b/erpnext/selling/doctype/quotation/quotation.json index ab3e8c9c21..0afc5ca3d0 100644 --- a/erpnext/selling/doctype/quotation/quotation.json +++ b/erpnext/selling/doctype/quotation/quotation.json @@ -2588,6 +2588,37 @@ "search_index": 0, "set_only_once": 0, "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "opportunity", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Opportunity", + "length": 0, + "no_copy": 0, + "options": "Opportunity", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 } ], "has_web_view": 0, @@ -2602,7 +2633,7 @@ "istable": 0, "max_attachments": 1, "menu_index": 0, - "modified": "2017-08-09 01:16:21.104135", + "modified": "2017-08-09 06:35:48.691648", "modified_by": "Administrator", "module": "Selling", "name": "Quotation", diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py index 5eb8b06ed8..ce5fb49c52 100644 --- a/erpnext/selling/doctype/quotation/quotation.py +++ b/erpnext/selling/doctype/quotation/quotation.py @@ -49,9 +49,18 @@ class Quotation(SellingController): def update_opportunity(self): for opportunity in list(set([d.prevdoc_docname for d in self.get("items")])): if opportunity: - opp = frappe.get_doc("Opportunity", opportunity) - opp.status = None - opp.set_status(update=True) + self.update_opportunity_status(opportunity) + + if self.opportunity: + self.update_opportunity_status() + + def update_opportunity_status(self, opportunity=None): + if not opportunity: + opportunity = self.opportunity + + opp = frappe.get_doc("Opportunity", opportunity) + opp.status = None + opp.set_status(update=True) def declare_order_lost(self, arg): if not self.has_sales_order(): From aac8349391f6edf43e6d5620947e3fb1b0aed6c0 Mon Sep 17 00:00:00 2001 From: Makarand Bauskar Date: Thu, 10 Aug 2017 11:25:49 +0530 Subject: [PATCH 3/6] [hotfix] remove the white spaces from condition and formula fields (#10331) * [hotfix] remove the white spaces from condition and formula fields * [tests] added tests cases for whitespaces in formula and condition fields --- erpnext/hr/doctype/salary_slip/salary_slip.py | 10 ++++++---- .../salary_structure/salary_structure.py | 11 ++++++++++ .../salary_structure/test_salary_structure.py | 20 +++++++++++++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py index 1cee02203d..2bd08c22c1 100644 --- a/erpnext/hr/doctype/salary_slip/salary_slip.py +++ b/erpnext/hr/doctype/salary_slip/salary_slip.py @@ -75,13 +75,15 @@ class SalarySlip(TransactionBase): def eval_condition_and_formula(self, d, data): try: - if d.condition: - if not frappe.safe_eval(d.condition, None, data): + condition = d.condition.strip() if d.condition else None + if condition: + if not frappe.safe_eval(condition, None, data): return None amount = d.amount if d.amount_based_on_formula: - if d.formula: - amount = frappe.safe_eval(d.formula, None, data) + formula = d.formula.strip() if d.formula else None + if formula: + amount = frappe.safe_eval(formula, None, data) if amount: data[d.abbr] = amount diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.py b/erpnext/hr/doctype/salary_structure/salary_structure.py index dc1c04d439..d8b56e3045 100644 --- a/erpnext/hr/doctype/salary_structure/salary_structure.py +++ b/erpnext/hr/doctype/salary_structure/salary_structure.py @@ -17,6 +17,7 @@ class SalaryStructure(Document): for e in self.get('employees'): set_employee_name(e) self.validate_date() + self.strip_condition_and_formula_fields() def get_ss_values(self,employee): basic_info = frappe.db.sql("""select bank_name, bank_ac_no @@ -62,6 +63,16 @@ class SalaryStructure(Document): frappe.throw(_("Active Salary Structure {0} found for employee {1} for the given dates") .format(st_name[0][0], employee.employee)) + def strip_condition_and_formula_fields(self): + # remove whitespaces from condition and formula fields + for row in self.earnings: + row.condition = row.condition.strip() if row.condition else "" + row.formula = row.formula.strip() if row.formula else "" + + for row in self.deductions: + row.condition = row.condition.strip() if row.condition else "" + row.formula = row.formula.strip() if row.formula else "" + @frappe.whitelist() def make_salary_slip(source_name, target_doc = None, employee = None, as_print = False, print_format = None): def postprocess(source, target): diff --git a/erpnext/hr/doctype/salary_structure/test_salary_structure.py b/erpnext/hr/doctype/salary_structure/test_salary_structure.py index 3abdaf3e64..6b1404c81c 100644 --- a/erpnext/hr/doctype/salary_structure/test_salary_structure.py +++ b/erpnext/hr/doctype/salary_structure/test_salary_structure.py @@ -44,6 +44,26 @@ class TestSalaryStructure(unittest.TestCase): self.assertEquals(sal_slip.get("deductions")[1].amount, 2500) self.assertEquals(sal_slip.get("total_deduction"), 7500) self.assertEquals(sal_slip.get("net_pay"), 7500) + + def test_whitespaces_in_formula_conditions_fields(self): + make_salary_structure("Salary Structure Sample") + salary_structure = frappe.get_doc("Salary Structure", "Salary Structure Sample") + + for row in salary_structure.earnings: + row.formula = "\n%s\n\n"%row.formula + row.condition = "\n%s\n\n"%row.condition + + for row in salary_structure.deductions: + row.formula = "\n%s\n\n"%row.formula + row.condition = "\n%s\n\n"%row.condition + + salary_structure.save() + + for row in salary_structure.earnings: + self.assertFalse("\n" in row.formula or "\n" in row.condition) + + for row in salary_structure.deductions: + self.assertFalse(("\n" in row.formula) or ("\n" in row.condition)) def make_employee(user): if not frappe.db.get_value("User", user): From 2e8232e7aa2f046a46af69c088f49bcd29e41c21 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Thu, 10 Aug 2017 11:32:59 +0530 Subject: [PATCH 4/6] [Fix] Getting an error cost center is not defined in the purchase receipt, even if it's defined in the company (#10320) --- erpnext/__init__.py | 10 +++ erpnext/controllers/buying_controller.py | 6 +- .../landed_cost_item/landed_cost_item.json | 87 ++++++++++++++++++- .../landed_cost_voucher.py | 10 ++- 4 files changed, 107 insertions(+), 6 deletions(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index d6fa3f82cf..011dbb6a93 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -28,6 +28,16 @@ def get_default_currency(): if company: return frappe.db.get_value('Company', company, 'default_currency') +def get_default_cost_center(company): + '''Returns the default cost center of the company''' + if not company: + return None + + if not frappe.flags.company_cost_center: + frappe.flags.company_cost_center = {} + if not company in frappe.flags.company_cost_center: + frappe.flags.company_cost_center[company] = frappe.db.get_value('Company', company, 'cost_center') + return frappe.flags.company_cost_center[company] def get_company_currency(company): '''Returns the default company currency''' diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index 9ccf7f4de1..5a0b967bd1 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -83,10 +83,12 @@ class BuyingController(StockController): def set_landed_cost_voucher_amount(self): for d in self.get("items"): - lc_voucher_amount = frappe.db.sql("""select sum(applicable_charges) + lc_voucher_data = frappe.db.sql("""select sum(applicable_charges), cost_center from `tabLanded Cost Item` where docstatus = 1 and purchase_receipt_item = %s""", d.name) - d.landed_cost_voucher_amount = lc_voucher_amount[0][0] if lc_voucher_amount else 0.0 + d.landed_cost_voucher_amount = lc_voucher_data[0][0] if lc_voucher_data else 0.0 + if not d.cost_center and lc_voucher_data and lc_voucher_data[0][1]: + d.db_set('cost_center', lc_voucher_data[0][1]) def set_total_in_words(self): from frappe.utils import money_in_words diff --git a/erpnext/stock/doctype/landed_cost_item/landed_cost_item.json b/erpnext/stock/doctype/landed_cost_item/landed_cost_item.json index 61c19f0583..4140bbc847 100644 --- a/erpnext/stock/doctype/landed_cost_item/landed_cost_item.json +++ b/erpnext/stock/doctype/landed_cost_item/landed_cost_item.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_guest_to_view": 0, "allow_import": 0, "allow_rename": 0, "beta": 0, @@ -12,6 +13,7 @@ "engine": "InnoDB", "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -22,6 +24,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, "label": "Item Code", @@ -41,6 +44,7 @@ "width": "100px" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -51,6 +55,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, "label": "Description", @@ -72,6 +77,7 @@ "width": "120px" }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -82,6 +88,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Receipt Document Type", @@ -101,6 +108,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -111,6 +119,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Receipt Document", @@ -130,6 +139,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -140,6 +150,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "length": 0, @@ -156,6 +167,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -166,6 +178,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, "label": "Qty", @@ -183,6 +196,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -193,6 +207,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Rate", @@ -211,6 +226,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -221,6 +237,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, "label": "Amount", @@ -241,6 +258,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -251,6 +269,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 0, "label": "Applicable Charges", @@ -269,6 +288,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -279,6 +299,7 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Purchase Receipt Item", @@ -294,19 +315,79 @@ "search_index": 0, "set_only_once": 0, "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_11", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "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_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "cost_center", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Cost Center", + "length": 0, + "no_copy": 0, + "options": "Cost Center", + "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 } ], + "has_web_view": 0, "hide_heading": 0, "hide_toolbar": 0, "idx": 1, "image_view": 0, "in_create": 0, - "in_dialog": 0, "is_submittable": 0, "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2016-12-20 04:50:19.785273", + "modified": "2017-08-08 19:51:36.501765", "modified_by": "Administrator", "module": "Stock", "name": "Landed Cost Item", @@ -315,5 +396,7 @@ "quick_entry": 0, "read_only": 0, "read_only_onload": 0, + "show_name_in_global_search": 0, + "track_changes": 0, "track_seen": 0 } \ No newline at end of file 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 a2d3606a89..f51652cf15 100644 --- a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py +++ b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py @@ -2,7 +2,7 @@ # For license information, please see license.txt from __future__ import unicode_literals -import frappe +import frappe, erpnext from frappe import _ from frappe.utils import flt from frappe.model.meta import get_field_precision @@ -15,7 +15,7 @@ class LandedCostVoucher(Document): for pr in self.get("purchase_receipts"): 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 + pr_item.qty, pr_item.base_rate, pr_item.base_amount, pr_item.name, pr_item.cost_center 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) @@ -26,6 +26,8 @@ class LandedCostVoucher(Document): item.description = d.description item.qty = d.qty item.rate = d.base_rate + item.cost_center = d.cost_center or \ + erpnext.get_default_cost_center(self.company) item.amount = d.base_amount item.receipt_document_type = pr.receipt_document_type item.receipt_document = pr.receipt_document @@ -61,6 +63,10 @@ class LandedCostVoucher(Document): frappe.throw(_("Item Row {idx}: {doctype} {docname} does not exist in above '{doctype}' table") .format(idx=item.idx, doctype=item.receipt_document_type, docname=item.receipt_document)) + if not item.cost_center: + frappe.throw(_("Row {0}: Cost center is required for an item {1}") + .format(item.idx, item.item_code)) + def set_total_taxes_and_charges(self): self.total_taxes_and_charges = sum([flt(d.amount) for d in self.get("taxes")]) From 041b9c3c32531c22efd78bd1be922de18c720f50 Mon Sep 17 00:00:00 2001 From: tundebabzy Date: Mon, 14 Aug 2017 04:46:08 +0100 Subject: [PATCH 5/6] make item name read only and add hide if not saved (#10382) --- erpnext/manufacturing/doctype/bom/bom.json | 60 ++++++++++++++++++++-- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/erpnext/manufacturing/doctype/bom/bom.json b/erpnext/manufacturing/doctype/bom/bom.json index 7dc6f2c358..f41087b686 100644 --- a/erpnext/manufacturing/doctype/bom/bom.json +++ b/erpnext/manufacturing/doctype/bom/bom.json @@ -12,6 +12,7 @@ "editable_grid": 0, "fields": [ { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -44,10 +45,12 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, "columns": 0, + "depends_on": "eval:!doc.__islocal", "fieldname": "item_name", "fieldtype": "Data", "hidden": 0, @@ -64,7 +67,7 @@ "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, - "read_only": 0, + "read_only": 1, "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, @@ -73,6 +76,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -105,6 +109,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -132,6 +137,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -163,6 +169,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -194,6 +201,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -223,6 +231,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -252,6 +261,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -282,6 +292,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -311,6 +322,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -341,6 +353,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -369,6 +382,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -398,6 +412,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -429,6 +444,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -460,6 +476,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -489,6 +506,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -520,6 +538,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 1, @@ -549,6 +568,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -579,6 +599,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -608,6 +629,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -637,6 +659,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -666,6 +689,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -696,6 +720,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -723,6 +748,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -753,6 +779,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -783,6 +810,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -813,6 +841,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -841,6 +870,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -870,6 +900,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -898,6 +929,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -928,6 +960,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -956,6 +989,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -987,6 +1021,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1017,6 +1052,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1046,6 +1082,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1073,6 +1110,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1102,6 +1140,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1130,6 +1169,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1158,6 +1198,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1186,6 +1227,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1215,6 +1257,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1245,6 +1288,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1274,6 +1318,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 0, @@ -1305,6 +1350,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 1, @@ -1335,6 +1381,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -1365,6 +1412,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -1394,6 +1442,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -1425,6 +1474,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -1454,6 +1504,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, "collapsible": 1, @@ -1485,6 +1536,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -1515,6 +1567,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -1545,6 +1598,7 @@ "unique": 0 }, { + "allow_bulk_edit": 0, "allow_on_submit": 1, "bold": 0, "collapsible": 0, @@ -1586,7 +1640,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-05-20 13:10:59.630780", + "modified": "2017-08-11 14:09:30.492628", "modified_by": "Administrator", "module": "Manufacturing", "name": "BOM", @@ -1642,4 +1696,4 @@ "sort_order": "DESC", "track_changes": 1, "track_seen": 0 -} +} \ No newline at end of file From b2f160eef00ff40143a599fcf965282fbb29bf42 Mon Sep 17 00:00:00 2001 From: mbauskar Date: Mon, 14 Aug 2017 10:01:00 +0600 Subject: [PATCH 6/6] bumped to version 8.8.2 --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 011dbb6a93..f9e2c16684 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from erpnext.hooks import regional_overrides -__version__ = '8.8.1' +__version__ = '8.8.2' def get_default_company(user=None): '''Get default company for user'''