From abf9a28d6af8b3c9bfab1e892e56bf3adb18ee8e Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Thu, 2 Mar 2023 16:40:37 +0530 Subject: [PATCH 01/10] fix: hide `+` button based on `Blanket Order Type` --- .../manufacturing/doctype/blanket_order/blanket_order.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/erpnext/manufacturing/doctype/blanket_order/blanket_order.js b/erpnext/manufacturing/doctype/blanket_order/blanket_order.js index d3bb33e86e0..7b26a14a57b 100644 --- a/erpnext/manufacturing/doctype/blanket_order/blanket_order.js +++ b/erpnext/manufacturing/doctype/blanket_order/blanket_order.js @@ -7,6 +7,12 @@ frappe.ui.form.on('Blanket Order', { }, setup: function(frm) { + frm.custom_make_buttons = { + 'Purchase Order': 'Purchase Order', + 'Sales Order': 'Sales Order', + 'Quotation': 'Quotation', + }; + frm.add_fetch("customer", "customer_name", "customer_name"); frm.add_fetch("supplier", "supplier_name", "supplier_name"); }, From f5937f46cb60f3521463f7a4c80c765f8a65e52b Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Thu, 2 Mar 2023 17:04:09 +0530 Subject: [PATCH 02/10] feat: add field `Over Order Allowance (%)` in `Buying Settings` --- .../doctype/buying_settings/buying_settings.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/erpnext/buying/doctype/buying_settings/buying_settings.json b/erpnext/buying/doctype/buying_settings/buying_settings.json index 95857e4604d..8c73e56a99e 100644 --- a/erpnext/buying/doctype/buying_settings/buying_settings.json +++ b/erpnext/buying/doctype/buying_settings/buying_settings.json @@ -16,6 +16,7 @@ "transaction_settings_section", "po_required", "pr_required", + "over_order_allowance", "column_break_12", "maintain_same_rate", "set_landed_cost_based_on_purchase_invoice_rate", @@ -156,6 +157,13 @@ "fieldname": "set_landed_cost_based_on_purchase_invoice_rate", "fieldtype": "Check", "label": "Set Landed Cost Based on Purchase Invoice Rate" + }, + { + "default": "0", + "description": "Percentage you are allowed to order more against the Blanket Order Quantity. For example: If you have a Blanket Order of Quantity 100 units. and your Allowance is 10% then you are allowed to order 110 units.", + "fieldname": "over_order_allowance", + "fieldtype": "Float", + "label": "Over Order Allowance (%)" } ], "icon": "fa fa-cog", @@ -163,7 +171,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-02-28 15:41:32.686805", + "modified": "2023-03-02 17:02:14.404622", "modified_by": "Administrator", "module": "Buying", "name": "Buying Settings", From f3993783a3fc431a2909b445e9d09d9f584ff73e Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Thu, 2 Mar 2023 17:18:46 +0530 Subject: [PATCH 03/10] refactor: rewrite `blanket_order.py` queries in `QB` --- .../doctype/blanket_order/blanket_order.py | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py index ff2140199de..3298f43ac36 100644 --- a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py +++ b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py @@ -6,6 +6,7 @@ import frappe from frappe import _ from frappe.model.document import Document from frappe.model.mapper import get_mapped_doc +from frappe.query_builder.functions import Sum from frappe.utils import flt, getdate from erpnext.stock.doctype.item.item import get_item_defaults @@ -29,21 +30,23 @@ class BlanketOrder(Document): def update_ordered_qty(self): ref_doctype = "Sales Order" if self.blanket_order_type == "Selling" else "Purchase Order" + + trans = frappe.qb.DocType(ref_doctype) + trans_item = frappe.qb.DocType(f"{ref_doctype} Item") + item_ordered_qty = frappe._dict( - frappe.db.sql( - """ - select trans_item.item_code, sum(trans_item.stock_qty) as qty - from `tab{0} Item` trans_item, `tab{0}` trans - where trans.name = trans_item.parent - and trans_item.blanket_order=%s - and trans.docstatus=1 - and trans.status not in ('Closed', 'Stopped') - group by trans_item.item_code - """.format( - ref_doctype - ), - self.name, - ) + ( + frappe.qb.from_(trans_item) + .from_(trans) + .select(trans_item.item_code, Sum(trans_item.stock_qty).as_("qty")) + .where( + (trans.name == trans_item.parent) + & (trans_item.blanket_order == self.name) + & (trans.docstatus == 1) + & (trans.status.notin(["Stopped", "Closed"])) + ) + .groupby(trans_item.item_code) + ).run() ) for d in self.items: From fc1088d9c4787b12bd9734597604492044eff4a0 Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Fri, 3 Mar 2023 10:49:25 +0530 Subject: [PATCH 04/10] fix: don't map item row having `0` qty --- erpnext/manufacturing/doctype/blanket_order/blanket_order.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py index 3298f43ac36..d03f019b084 100644 --- a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py +++ b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py @@ -82,6 +82,7 @@ def make_order(source_name): "doctype": doctype + " Item", "field_map": {"rate": "blanket_order_rate", "parent": "blanket_order"}, "postprocess": update_item, + "condition": lambda item: (flt(item.qty) - flt(item.ordered_qty)) > 0, }, }, ) From 8bcbc45add7767ac947fa7c9b3aaca99fc9dda9b Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Fri, 3 Mar 2023 11:11:33 +0530 Subject: [PATCH 05/10] feat: consider `over_order_allowance` while validating order qty --- .../doctype/purchase_order/purchase_order.py | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 2415aec8cb9..d9ff9813225 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -69,6 +69,7 @@ class PurchaseOrder(BuyingController): self.validate_with_previous_doc() self.validate_for_subcontracting() self.validate_minimum_order_qty() + self.validate_against_blanket_order() if self.is_old_subcontracting_flow: self.validate_bom_for_subcontracting_items() @@ -197,6 +198,33 @@ class PurchaseOrder(BuyingController): ).format(item_code, qty, itemwise_min_order_qty.get(item_code)) ) + def validate_against_blanket_order(self): + po_data = {} + for item in self.get("items"): + if item.against_blanket_order and item.blanket_order: + if item.blanket_order in po_data: + if item.item_code in po_data[item.blanket_order]: + po_data[item.blanket_order][item.item_code] += item.qty + else: + po_data[item.blanket_order][item.item_code] = item.qty + else: + po_data[item.blanket_order] = {item.item_code: item.qty} + + if po_data: + allowance = flt(frappe.db.get_single_value("Buying Settings", "over_order_allowance")) + for bo_name, item_data in po_data.items(): + bo_doc = frappe.get_doc("Blanket Order", bo_name) + for item in bo_doc.get("items"): + if item.item_code in item_data: + remaining_qty = item.qty - item.ordered_qty + allowed_qty = remaining_qty + (remaining_qty * (allowance / 100)) + if allowed_qty < item_data[item.item_code]: + frappe.throw( + _( + f"Item {item.item_code} cannot be ordered more than {allowed_qty} against Blanket Order {bo_name}." + ) + ) + def validate_bom_for_subcontracting_items(self): for item in self.items: if not item.bom: From d7da8928ac44df3a84f6099fc7bfbc9a9161be20 Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Fri, 3 Mar 2023 11:19:28 +0530 Subject: [PATCH 06/10] feat: add field `Over Order Allowance (%)` in `Selling Settings` --- .../doctype/selling_settings/selling_settings.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.json b/erpnext/selling/doctype/selling_settings/selling_settings.json index 6ea66a02378..45ad7d95a15 100644 --- a/erpnext/selling/doctype/selling_settings/selling_settings.json +++ b/erpnext/selling/doctype/selling_settings/selling_settings.json @@ -24,6 +24,7 @@ "so_required", "dn_required", "sales_update_frequency", + "over_order_allowance", "column_break_5", "allow_multiple_items", "allow_against_multiple_purchase_orders", @@ -179,6 +180,12 @@ "fieldname": "allow_sales_order_creation_for_expired_quotation", "fieldtype": "Check", "label": "Allow Sales Order Creation For Expired Quotation" + }, + { + "description": "Percentage you are allowed to order more against the Blanket Order Quantity. For example: If you have a Blanket Order of Quantity 100 units. and your Allowance is 10% then you are allowed to order 110 units.", + "fieldname": "over_order_allowance", + "fieldtype": "Float", + "label": "Over Order Allowance (%)" } ], "icon": "fa fa-cog", @@ -186,7 +193,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2023-02-04 12:37:53.380857", + "modified": "2023-03-03 11:16:54.333615", "modified_by": "Administrator", "module": "Selling", "name": "Selling Settings", From 53701c37b18c7aecfaa00efabf4d3be768e59cb3 Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Fri, 3 Mar 2023 22:03:54 +0530 Subject: [PATCH 07/10] feat: consider `over_order_allowance` while validating sales order qty --- .../doctype/purchase_order/purchase_order.py | 32 +++-------------- .../doctype/blanket_order/blanket_order.py | 35 +++++++++++++++++++ .../doctype/sales_order/sales_order.py | 4 +++ 3 files changed, 43 insertions(+), 28 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index d9ff9813225..06b9d29e69c 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -21,6 +21,9 @@ from erpnext.accounts.doctype.tax_withholding_category.tax_withholding_category from erpnext.accounts.party import get_party_account, get_party_account_currency from erpnext.buying.utils import check_on_hold_or_closed_status, validate_for_items from erpnext.controllers.buying_controller import BuyingController +from erpnext.manufacturing.doctype.blanket_order.blanket_order import ( + validate_against_blanket_order, +) from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults from erpnext.stock.doctype.item.item import get_item_defaults, get_last_purchase_details from erpnext.stock.stock_balance import get_ordered_qty, update_bin_qty @@ -69,7 +72,7 @@ class PurchaseOrder(BuyingController): self.validate_with_previous_doc() self.validate_for_subcontracting() self.validate_minimum_order_qty() - self.validate_against_blanket_order() + validate_against_blanket_order(self) if self.is_old_subcontracting_flow: self.validate_bom_for_subcontracting_items() @@ -198,33 +201,6 @@ class PurchaseOrder(BuyingController): ).format(item_code, qty, itemwise_min_order_qty.get(item_code)) ) - def validate_against_blanket_order(self): - po_data = {} - for item in self.get("items"): - if item.against_blanket_order and item.blanket_order: - if item.blanket_order in po_data: - if item.item_code in po_data[item.blanket_order]: - po_data[item.blanket_order][item.item_code] += item.qty - else: - po_data[item.blanket_order][item.item_code] = item.qty - else: - po_data[item.blanket_order] = {item.item_code: item.qty} - - if po_data: - allowance = flt(frappe.db.get_single_value("Buying Settings", "over_order_allowance")) - for bo_name, item_data in po_data.items(): - bo_doc = frappe.get_doc("Blanket Order", bo_name) - for item in bo_doc.get("items"): - if item.item_code in item_data: - remaining_qty = item.qty - item.ordered_qty - allowed_qty = remaining_qty + (remaining_qty * (allowance / 100)) - if allowed_qty < item_data[item.item_code]: - frappe.throw( - _( - f"Item {item.item_code} cannot be ordered more than {allowed_qty} against Blanket Order {bo_name}." - ) - ) - def validate_bom_for_subcontracting_items(self): for item in self.items: if not item.bom: diff --git a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py index d03f019b084..32f1c365ade 100644 --- a/erpnext/manufacturing/doctype/blanket_order/blanket_order.py +++ b/erpnext/manufacturing/doctype/blanket_order/blanket_order.py @@ -87,3 +87,38 @@ def make_order(source_name): }, ) return target_doc + + +def validate_against_blanket_order(order_doc): + if order_doc.doctype in ("Sales Order", "Purchase Order"): + order_data = {} + + for item in order_doc.get("items"): + if item.against_blanket_order and item.blanket_order: + if item.blanket_order in order_data: + if item.item_code in order_data[item.blanket_order]: + order_data[item.blanket_order][item.item_code] += item.qty + else: + order_data[item.blanket_order][item.item_code] = item.qty + else: + order_data[item.blanket_order] = {item.item_code: item.qty} + + if order_data: + allowance = flt( + frappe.db.get_single_value( + "Selling Settings" if order_doc.doctype == "Sales Order" else "Buying Settings", + "over_order_allowance", + ) + ) + for bo_name, item_data in order_data.items(): + bo_doc = frappe.get_doc("Blanket Order", bo_name) + for item in bo_doc.get("items"): + if item.item_code in item_data: + remaining_qty = item.qty - item.ordered_qty + allowed_qty = remaining_qty + (remaining_qty * (allowance / 100)) + if allowed_qty < item_data[item.item_code]: + frappe.throw( + _("Item {0} cannot be ordered more than {1} against Blanket Order {2}.").format( + item.item_code, allowed_qty, bo_name + ) + ) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 385d0f3a585..ee9161bee48 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -21,6 +21,9 @@ from erpnext.accounts.doctype.sales_invoice.sales_invoice import ( ) from erpnext.accounts.party import get_party_account from erpnext.controllers.selling_controller import SellingController +from erpnext.manufacturing.doctype.blanket_order.blanket_order import ( + validate_against_blanket_order, +) from erpnext.manufacturing.doctype.production_plan.production_plan import ( get_items_for_material_requests, ) @@ -52,6 +55,7 @@ class SalesOrder(SellingController): self.validate_warehouse() self.validate_drop_ship() self.validate_serial_no_based_delivery() + validate_against_blanket_order(self) validate_inter_company_party( self.doctype, self.customer, self.company, self.inter_company_order_reference ) From 66f650061dbae8c1093878f5b808e2a62f3a144a Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Mon, 13 Mar 2023 17:21:07 +0530 Subject: [PATCH 08/10] test: add test cases for `Over Order Allowance` against `Blanket Order` --- .../blanket_order/test_blanket_order.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py b/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py index 2f1f3ae0f52..58f3c950598 100644 --- a/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py +++ b/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py @@ -63,6 +63,33 @@ class TestBlanketOrder(FrappeTestCase): po1.currency = get_company_currency(po1.company) self.assertEqual(po1.items[0].qty, (bo.items[0].qty - bo.items[0].ordered_qty)) + def test_over_order_allowance(self): + # Sales Order + bo = make_blanket_order(blanket_order_type="Selling", quantity=100) + + frappe.flags.args.doctype = "Sales Order" + so = make_order(bo.name) + so.currency = get_company_currency(so.company) + so.delivery_date = today() + so.items[0].qty = 110 + self.assertRaises(frappe.ValidationError, so.submit) + + frappe.db.set_single_value("Selling Settings", "over_order_allowance", 10) + so.submit() + + # Purchase Order + bo = make_blanket_order(blanket_order_type="Purchasing", quantity=100) + + frappe.flags.args.doctype = "Purchase Order" + po = make_order(bo.name) + po.currency = get_company_currency(po.company) + po.schedule_date = today() + po.items[0].qty = 110 + self.assertRaises(frappe.ValidationError, po.submit) + + frappe.db.set_single_value("Buying Settings", "over_order_allowance", 10) + po.submit() + def make_blanket_order(**args): args = frappe._dict(args) From bd2dd7dfac38d91d47a417d2f9a18a0a6f9809b9 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 16 Mar 2023 16:20:21 +0530 Subject: [PATCH 09/10] ci: use version specific payments repo (backport #34468) (#34470) ci: use version specific payments repo (#34468) ci: use version-14 branch of payments repo for v14 erpnext (cherry picked from commit befd1a0f918d8dc35ef071b8d00dd4ae95e167ab) Co-authored-by: Ritwik Puri --- .github/helper/install.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/helper/install.sh b/.github/helper/install.sh index 0c71b41a7cd..48337cee640 100644 --- a/.github/helper/install.sh +++ b/.github/helper/install.sh @@ -8,8 +8,9 @@ sudo apt update && sudo apt install redis-server libcups2-dev pip install frappe-bench +githubbranch=${GITHUB_BASE_REF:-${GITHUB_REF##*/}} frappeuser=${FRAPPE_USER:-"frappe"} -frappebranch=${FRAPPE_BRANCH:-${GITHUB_BASE_REF:-${GITHUB_REF##*/}}} +frappebranch=${FRAPPE_BRANCH:-$githubbranch} git clone "https://github.com/${frappeuser}/frappe" --branch "${frappebranch}" --depth 1 bench init --skip-assets --frappe-path ~/frappe --python "$(which python)" frappe-bench @@ -60,7 +61,7 @@ sed -i 's/schedule:/# schedule:/g' Procfile sed -i 's/socketio:/# socketio:/g' Procfile sed -i 's/redis_socketio:/# redis_socketio:/g' Procfile -bench get-app payments +bench get-app payments --branch ${githubbranch%"-hotfix"} bench get-app erpnext "${GITHUB_WORKSPACE}" if [ "$TYPE" == "server" ]; then bench setup requirements --dev; fi From b6b83924137bfbf3c2769f8207c72c51f0c64acd Mon Sep 17 00:00:00 2001 From: Anand Baburajan Date: Thu, 16 Mar 2023 18:18:47 +0530 Subject: [PATCH 10/10] fix: refactor asset depr schedule and remove unnecessary depr method (#34434) * fix: remove depr method from depr schedule and refactor assetdeprsch * chore: use assetdeprsch's depr method, not deprschedule's * fix: use default 0 value for NDB and OAD * chore: fix rounded numbers * chore: correct rounding in test_website_item_price_for_logged_in_user --- erpnext/assets/doctype/asset/test_asset.py | 4 +-- .../asset_depreciation_schedule.py | 35 ++++++++----------- .../depreciation_schedule.json | 14 ++------ .../doctype/website_item/test_website_item.py | 4 +-- 4 files changed, 21 insertions(+), 36 deletions(-) diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py index 9a152638f90..2c9772d12a0 100644 --- a/erpnext/assets/doctype/asset/test_asset.py +++ b/erpnext/assets/doctype/asset/test_asset.py @@ -828,8 +828,8 @@ class TestDepreciationMethods(AssetSetup): expected_schedules = [ ["2030-12-31", 28630.14, 28630.14], ["2031-12-31", 35684.93, 64315.07], - ["2032-12-31", 17842.47, 82157.54], - ["2033-06-06", 5342.46, 87500.0], + ["2032-12-31", 17842.46, 82157.53], + ["2033-06-06", 5342.47, 87500.0], ] schedules = [ diff --git a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py index b75fbcbeb3d..5912329846a 100644 --- a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py +++ b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py @@ -140,8 +140,8 @@ class AssetDepreciationSchedule(Document): self.asset = asset_doc.name self.finance_book = row.finance_book self.finance_book_id = row.idx - self.opening_accumulated_depreciation = asset_doc.opening_accumulated_depreciation - self.number_of_depreciations_booked = asset_doc.number_of_depreciations_booked + self.opening_accumulated_depreciation = asset_doc.opening_accumulated_depreciation or 0 + self.number_of_depreciations_booked = asset_doc.number_of_depreciations_booked or 0 self.gross_purchase_amount = asset_doc.gross_purchase_amount self.depreciation_method = row.depreciation_method self.total_number_of_depreciations = row.total_number_of_depreciations @@ -185,14 +185,14 @@ class AssetDepreciationSchedule(Document): ): asset_doc.validate_asset_finance_books(row) - value_after_depreciation = _get_value_after_depreciation_for_making_schedule(asset_doc, row) + value_after_depreciation = self._get_value_after_depreciation_for_making_schedule(asset_doc, row) row.value_after_depreciation = value_after_depreciation if update_asset_finance_book_row: row.db_update() number_of_pending_depreciations = cint(row.total_number_of_depreciations) - cint( - asset_doc.number_of_depreciations_booked + self.number_of_depreciations_booked ) has_pro_rata = asset_doc.check_is_pro_rata(row) @@ -235,13 +235,12 @@ class AssetDepreciationSchedule(Document): self.add_depr_schedule_row( date_of_disposal, depreciation_amount, - row.depreciation_method, ) break # For first row - if has_pro_rata and not asset_doc.opening_accumulated_depreciation and n == 0: + if has_pro_rata and not self.opening_accumulated_depreciation and n == 0: from_date = add_days( asset_doc.available_for_use_date, -1 ) # needed to calc depr amount for available_for_use_date too @@ -260,7 +259,7 @@ class AssetDepreciationSchedule(Document): # In case of increase_in_asset_life, the asset.to_date is already set on asset_repair submission asset_doc.to_date = add_months( asset_doc.available_for_use_date, - (n + asset_doc.number_of_depreciations_booked) * cint(row.frequency_of_depreciation), + (n + self.number_of_depreciations_booked) * cint(row.frequency_of_depreciation), ) depreciation_amount_without_pro_rata = depreciation_amount @@ -298,7 +297,6 @@ class AssetDepreciationSchedule(Document): self.add_depr_schedule_row( schedule_date, depreciation_amount, - row.depreciation_method, ) # to ensure that final accumulated depreciation amount is accurate @@ -325,14 +323,12 @@ class AssetDepreciationSchedule(Document): self, schedule_date, depreciation_amount, - depreciation_method, ): self.append( "depreciation_schedule", { "schedule_date": schedule_date, "depreciation_amount": depreciation_amount, - "depreciation_method": depreciation_method, }, ) @@ -346,7 +342,7 @@ class AssetDepreciationSchedule(Document): straight_line_idx = [ d.idx for d in self.get("depreciation_schedule") - if d.depreciation_method == "Straight Line" or d.depreciation_method == "Manual" + if self.depreciation_method == "Straight Line" or self.depreciation_method == "Manual" ] accumulated_depreciation = flt(self.opening_accumulated_depreciation) @@ -377,16 +373,15 @@ class AssetDepreciationSchedule(Document): accumulated_depreciation, d.precision("accumulated_depreciation_amount") ) + def _get_value_after_depreciation_for_making_schedule(self, asset_doc, fb_row): + if asset_doc.docstatus == 1 and fb_row.value_after_depreciation: + value_after_depreciation = flt(fb_row.value_after_depreciation) + else: + value_after_depreciation = flt(self.gross_purchase_amount) - flt( + self.opening_accumulated_depreciation + ) -def _get_value_after_depreciation_for_making_schedule(asset_doc, fb_row): - if asset_doc.docstatus == 1 and fb_row.value_after_depreciation: - value_after_depreciation = flt(fb_row.value_after_depreciation) - else: - value_after_depreciation = flt(asset_doc.gross_purchase_amount) - flt( - asset_doc.opening_accumulated_depreciation - ) - - return value_after_depreciation + return value_after_depreciation def make_draft_asset_depr_schedules_if_not_present(asset_doc): diff --git a/erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json b/erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json index 882c4bf00b1..abe295c6805 100644 --- a/erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json +++ b/erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json @@ -12,8 +12,7 @@ "column_break_3", "accumulated_depreciation_amount", "journal_entry", - "make_depreciation_entry", - "depreciation_method" + "make_depreciation_entry" ], "fields": [ { @@ -58,20 +57,11 @@ "fieldname": "make_depreciation_entry", "fieldtype": "Button", "label": "Make Depreciation Entry" - }, - { - "fieldname": "depreciation_method", - "fieldtype": "Select", - "hidden": 1, - "label": "Depreciation Method", - "options": "\nStraight Line\nDouble Declining Balance\nWritten Down Value\nManual", - "print_hide": 1, - "read_only": 1 } ], "istable": 1, "links": [], - "modified": "2022-12-06 20:35:50.264281", + "modified": "2023-03-13 23:17:15.849950", "modified_by": "Administrator", "module": "Assets", "name": "Depreciation Schedule", diff --git a/erpnext/e_commerce/doctype/website_item/test_website_item.py b/erpnext/e_commerce/doctype/website_item/test_website_item.py index bbe04d5514d..e41c9da594b 100644 --- a/erpnext/e_commerce/doctype/website_item/test_website_item.py +++ b/erpnext/e_commerce/doctype/website_item/test_website_item.py @@ -226,11 +226,11 @@ class TestWebsiteItem(unittest.TestCase): self.assertTrue(bool(data.product_info["price"])) price_object = data.product_info["price"] - self.assertEqual(price_object.get("discount_percent"), 25) + self.assertEqual(price_object.get("discount_percent"), 25.0) self.assertEqual(price_object.get("price_list_rate"), 750) self.assertEqual(price_object.get("formatted_mrp"), "₹ 1,000.00") self.assertEqual(price_object.get("formatted_price"), "₹ 750.00") - self.assertEqual(price_object.get("formatted_discount_percent"), "25%") + self.assertEqual(price_object.get("formatted_discount_percent"), "25.0%") # switch to admin and disable show price frappe.set_user("Administrator")