From e418a5bdc1ca48773c7f718a70dd8b90c68627bd Mon Sep 17 00:00:00 2001 From: schilgod Date: Wed, 15 Nov 2017 12:19:49 +0800 Subject: [PATCH] Option to disable fetching last purchase details in Purchase Order (#11573) * add check for enable/disable last purchase details in Purchase Order * fix tabs --- .../buying_settings/buying_settings.json | 32 +++++++++++ .../doctype/purchase_order/purchase_order.py | 35 ++++++------ ..._purchase_order_with_last_purchase_rate.js | 57 ++++++++++++++++++- 3 files changed, 106 insertions(+), 18 deletions(-) diff --git a/erpnext/buying/doctype/buying_settings/buying_settings.json b/erpnext/buying/doctype/buying_settings/buying_settings.json index ac97255c3f..25e9c15376 100644 --- a/erpnext/buying/doctype/buying_settings/buying_settings.json +++ b/erpnext/buying/doctype/buying_settings/buying_settings.json @@ -182,6 +182,38 @@ "search_index": 0, "set_only_once": 0, "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "description": "If enabled, last purchase details of items will not be fetched from previous purchase order or purchase receipt", + "fieldname": "disable_fetch_last_purchase_rate", + "fieldtype": "Check", + "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": "Disable Fetching Last Purchase Details in Purchase Order", + "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 } ], "hide_heading": 0, diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 415099328b..bbaa043208 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import frappe import json -from frappe.utils import cstr, flt +from frappe.utils import cstr, flt, cint from frappe import msgprint, _ from frappe.model.mapper import get_mapped_doc from erpnext.controllers.buying_controller import BuyingController @@ -105,25 +105,26 @@ class PurchaseOrder(BuyingController): def get_last_purchase_rate(self): """get last purchase rates for all items""" - conversion_rate = flt(self.get('conversion_rate')) or 1.0 + if not cint(frappe.db.get_single_value("Buying Settings", "disable_fetch_last_purchase_rate")): + conversion_rate = flt(self.get('conversion_rate')) or 1.0 - for d in self.get("items"): - if d.item_code: - last_purchase_details = get_last_purchase_details(d.item_code, self.name) + for d in self.get("items"): + if d.item_code: + last_purchase_details = get_last_purchase_details(d.item_code, self.name) - if last_purchase_details: - d.base_price_list_rate = (last_purchase_details['base_price_list_rate'] * - (flt(d.conversion_factor) or 1.0)) - d.discount_percentage = last_purchase_details['discount_percentage'] - d.base_rate = last_purchase_details['base_rate'] * (flt(d.conversion_factor) or 1.0) - d.price_list_rate = d.base_price_list_rate / conversion_rate - d.last_purchase_rate = d.base_rate / conversion_rate - else: + if last_purchase_details: + d.base_price_list_rate = (last_purchase_details['base_price_list_rate'] * + (flt(d.conversion_factor) or 1.0)) + d.discount_percentage = last_purchase_details['discount_percentage'] + d.base_rate = last_purchase_details['base_rate'] * (flt(d.conversion_factor) or 1.0) + d.price_list_rate = d.base_price_list_rate / conversion_rate + d.last_purchase_rate = d.base_rate / conversion_rate + else: - item_last_purchase_rate = frappe.db.get_value("Item", d.item_code, "last_purchase_rate") - if item_last_purchase_rate: - d.base_price_list_rate = d.base_rate = d.price_list_rate \ - = d.last_purchase_rate = item_last_purchase_rate + item_last_purchase_rate = frappe.db.get_value("Item", d.item_code, "last_purchase_rate") + if item_last_purchase_rate: + d.base_price_list_rate = d.base_rate = d.price_list_rate \ + = d.last_purchase_rate = item_last_purchase_rate # Check for Closed status def check_for_closed_status(self): diff --git a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_last_purchase_rate.js b/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_last_purchase_rate.js index d19f017425..bd5881b1f8 100644 --- a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_last_purchase_rate.js +++ b/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_last_purchase_rate.js @@ -1,7 +1,7 @@ QUnit.module('Buying'); QUnit.test("test: purchase order with last purchase rate", function(assert) { - assert.expect(5); + assert.expect(9); let done = assert.async(); frappe.run_serially([ @@ -77,9 +77,11 @@ QUnit.test("test: purchase order with last purchase rate", function(assert) { // Get the last purchase rate of items () => { assert.ok(cur_frm.doc.items[0].last_purchase_rate == 800, "Last purchase rate of item 1 correct"); + assert.ok(cur_frm.doc.items[1].last_purchase_rate != 0); }, () => { assert.ok(cur_frm.doc.items[1].last_purchase_rate == 400, "Last purchase rate of item 2 correct"); + assert.ok(cur_frm.doc.items[1].last_purchase_rate != 0); }, () => frappe.tests.click_button('Submit'), @@ -94,6 +96,59 @@ QUnit.test("test: purchase order with last purchase rate", function(assert) { assert.ok(cur_frm.doc.status == 'To Receive and Bill', "Submitted successfully"); }, + // enable allow_last_purchase_rate + () => frappe.tests.make('Buying Settings', [ + // values to be set + {"disable_fetch_last_purchase_rate": 1} + ]), + + () => { + return frappe.tests.make('Purchase Order', [ + {supplier: 'Test Supplier'}, + {is_subcontracted: 'No'}, + {currency: 'INR'}, + {items: [ + [ + {"item_code": 'Test Product 4'}, + {"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)}, + {"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)}, + {"qty": 1}, + {"rate": 800}, + {"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))} + ], + [ + {"item_code": 'Test Product 1'}, + {"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)}, + {"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)}, + {"qty": 1}, + {"rate": 400}, + {"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))} + ] + ]} + ]); + }, + + () => { + // Get item details + assert.ok(cur_frm.doc.items[0].last_purchase_rate == 0); + assert.ok(cur_frm.doc.items[1].last_purchase_rate == 0); + }, + + () => frappe.timeout(1), + + () => frappe.tests.click_button('Submit'), + () => frappe.tests.click_button('Yes'), + () => frappe.timeout(3), + + () => frappe.tests.click_button('Close'), + () => frappe.timeout(1), + + // enable allow_last_purchase_rate + () => frappe.tests.make('Buying Settings', [ + // values to be set + {"disable_fetch_last_purchase_rate": 0} + ]), + () => done() ]); }); \ No newline at end of file