From 702b5c32c1e4c1e30bf9e84ac738df30a3b4a435 Mon Sep 17 00:00:00 2001 From: Saif Ur Rehman Date: Wed, 8 Sep 2021 16:36:07 +0500 Subject: [PATCH] feat(Asset Capitalization): Accounting Fields --- .../asset_capitalization.js | 43 ++++++++++------ .../asset_capitalization.json | 43 +++++++++++++++- .../asset_capitalization.py | 50 +++++++++++++++++-- .../asset_capitalization_asset_item.json | 31 +++++++++++- .../asset_capitalization_service_item.json | 11 +--- .../asset_capitalization_stock_item.json | 23 ++++++++- 6 files changed, 166 insertions(+), 35 deletions(-) diff --git a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js index 9276d00c05..b42634a509 100644 --- a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js +++ b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js @@ -148,6 +148,10 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s this.calculate_totals(); } + target_qty() { + this.calculate_totals(); + } + rate() { this.calculate_totals(); } @@ -156,26 +160,29 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s var me = this; if (me.frm.doc.company) { - frappe.call({ - method: "frappe.client.get_value", - args: { - doctype: "Company", - filters: {"name": me.frm.doc.company}, - fieldname: "cost_center" - }, - callback: function (r) { - if (r.message) { - $.each(me.frm.doc.service_items || [], function (i, d) { - frappe.model.set_value(d.doctype, d.name, "cost_center", r.message.cost_center); - }); - } - } + frappe.model.set_value(me.frm.doc.doctype, me.frm.doc.name, "cost_center", null); + $.each(me.frm.doc.stock_items || [], function (i, d) { + frappe.model.set_value(d.doctype, d.name, "cost_center", null); + }); + $.each(me.frm.doc.asset_items || [], function (i, d) { + frappe.model.set_value(d.doctype, d.name, "cost_center", null); + }); + $.each(me.frm.doc.service_items || [], function (i, d) { + frappe.model.set_value(d.doctype, d.name, "cost_center", null); }); } erpnext.accounts.dimensions.update_dimension(me.frm, me.frm.doctype); } + stock_items_add(doc, cdt, cdn) { + erpnext.accounts.dimensions.copy_dimension_from_first_row(this.frm, cdt, cdn, 'stock_items'); + } + + asset_items_add(doc, cdt, cdn) { + erpnext.accounts.dimensions.copy_dimension_from_first_row(this.frm, cdt, cdn, 'asset_items'); + } + serivce_items_add(doc, cdt, cdn) { erpnext.accounts.dimensions.copy_dimension_from_first_row(this.frm, cdt, cdn, 'service_items'); } @@ -189,6 +196,7 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s child: me.frm.doc, args: { item_code: me.frm.doc.target_item_code, + company: me.frm.doc.company, }, callback: function (r) { if (!r.exc) { @@ -207,7 +215,8 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s method: "erpnext.assets.doctype.asset_capitalization.asset_capitalization.get_target_asset_details", child: me.frm.doc, args: { - asset: me.frm.doc.target_asset + asset: me.frm.doc.target_asset, + company: me.frm.doc.company, }, callback: function (r) { if (!r.exc) { @@ -381,6 +390,10 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s me.frm.doc.total_value = me.frm.doc.stock_items_total + me.frm.doc.asset_items_total + me.frm.doc.service_items_total; me.frm.doc.total_value = flt(me.frm.doc.total_value, precision('total_value')); + me.frm.doc.target_qty = flt(me.frm.doc.target_qty, precision('target_qty')); + me.frm.doc.target_incoming_rate = me.frm.doc.target_qty ? me.frm.doc.total_value / flt(me.frm.doc.target_qty) + : me.frm.doc.total_value; + me.frm.refresh_fields(); } }; diff --git a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.json b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.json index b697c206bf..0582b1ebc1 100644 --- a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.json +++ b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.json @@ -41,7 +41,13 @@ "service_items", "service_items_total", "totals_section", - "total_value" + "total_value", + "column_break_36", + "target_incoming_rate", + "accounting_dimensions_section", + "cost_center", + "dimension_col_break", + "target_fixed_asset_account" ], "fields": [ { @@ -289,12 +295,45 @@ "label": "Total Value", "options": "Company:company:default_currency", "read_only": 1 + }, + { + "fieldname": "column_break_36", + "fieldtype": "Column Break" + }, + { + "fieldname": "target_incoming_rate", + "fieldtype": "Currency", + "label": "Target Incoming Rate", + "options": "Company:company:default_currency" + }, + { + "collapsible": 1, + "fieldname": "accounting_dimensions_section", + "fieldtype": "Section Break", + "label": "Accounting Dimensions" + }, + { + "fieldname": "cost_center", + "fieldtype": "Link", + "label": "Cost Center", + "options": "Cost Center" + }, + { + "fieldname": "dimension_col_break", + "fieldtype": "Column Break" + }, + { + "fieldname": "target_fixed_asset_account", + "fieldtype": "Link", + "label": "Target Fixed Asset Account", + "options": "Account", + "read_only": 1 } ], "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2021-09-06 17:18:31.881006", + "modified": "2021-09-08 15:58:40.417579", "modified_by": "Administrator", "module": "Assets", "name": "Asset Capitalization", diff --git a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py index 586710a635..64f13887c2 100644 --- a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py +++ b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py @@ -11,13 +11,14 @@ from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults from erpnext.setup.doctype.brand.brand import get_brand_defaults from erpnext.stock.utils import get_incoming_rate from erpnext.stock.stock_ledger import get_previous_sle +from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account from erpnext.assets.doctype.asset_value_adjustment.asset_value_adjustment import get_current_asset_value from six import string_types import json force_fields = ['target_item_name', 'target_asset_name', 'item_name', 'asset_name', 'target_is_fixed_asset', 'target_has_serial_no', 'target_has_batch_no', - 'target_stock_uom', 'stock_uom'] + 'target_stock_uom', 'stock_uom', 'target_fixed_asset_account', 'fixed_asset_account'] class AssetCapitalization(AccountsController): @@ -42,7 +43,7 @@ class AssetCapitalization(AccountsController): self.title = self.target_asset_name or self.target_item_name or self.target_item_code def set_missing_values(self, for_validate=False): - target_item_details = get_target_item_details(self.target_item_code) + target_item_details = get_target_item_details(self.target_item_code, self.company) for k, v in target_item_details.items(): if self.meta.has_field(k) and (not self.get(k) or k in force_fields): self.set(k, v) @@ -51,7 +52,7 @@ class AssetCapitalization(AccountsController): if not self.target_is_fixed_asset: self.target_asset = None - target_asset_details = get_target_asset_details(self.target_asset) + target_asset_details = get_target_asset_details(self.target_asset, self.company) for k, v in target_asset_details.items(): if self.meta.has_field(k) and (not self.get(k) or k in force_fields): self.set(k, v) @@ -95,6 +96,8 @@ class AssetCapitalization(AccountsController): if target_item.is_fixed_asset: self.target_qty = 1 + if flt(self.target_qty) <= 0: + frappe.throw(_("Target Qty must be a positive number")) if not target_item.is_stock_item: self.target_warehouse = None @@ -233,9 +236,12 @@ class AssetCapitalization(AccountsController): self.total_value = self.stock_items_total + self.asset_items_total + self.service_items_total self.total_value = flt(self.total_value, self.precision('total_value')) + self.target_qty = flt(self.target_qty, self.precision('target_qty')) + self.target_incoming_rate = self.total_value / self.target_qty + @frappe.whitelist() -def get_target_item_details(item_code=None): +def get_target_item_details(item_code=None, company=None): out = frappe._dict() # Get Item Details @@ -261,6 +267,13 @@ def get_target_item_details(item_code=None): if not out.target_has_serial_no: out.target_serial_no = "" + # Cost Center + item_defaults = get_item_defaults(item.name, company) + item_group_defaults = get_item_group_defaults(item.name, company) + brand_defaults = get_brand_defaults(item.name, company) + out.cost_center = get_default_cost_center(frappe._dict({'item_code': item.name, 'company': company}), + item_defaults, item_group_defaults, brand_defaults) + # Set Entry Type if not item_code: out.entry_type = "" @@ -273,7 +286,7 @@ def get_target_item_details(item_code=None): @frappe.whitelist() -def get_target_asset_details(asset=None): +def get_target_asset_details(asset=None, company=None): out = frappe._dict() # Get Asset Details @@ -289,6 +302,12 @@ def get_target_asset_details(asset=None): # Set Asset Details out.asset_name = asset_details.asset_name + if asset_details.item_code: + out.target_fixed_asset_account = get_asset_category_account('fixed_asset_account', item=asset_details.item_code, + company=company) + else: + out.target_fixed_asset_account = None + return out @@ -313,6 +332,12 @@ def get_consumed_stock_item_details(args, get_valuation_rate=True): out.warehouse = get_item_warehouse(item, args, overwrite_warehouse=True) if item else None + # Cost Center + item_defaults = get_item_defaults(item.name, args.company) + item_group_defaults = get_item_group_defaults(item.name, args.company) + brand_defaults = get_brand_defaults(item.name, args.company) + out.cost_center = get_default_cost_center(args, item_defaults, item_group_defaults, brand_defaults) + if get_valuation_rate: if args.item_code and out.warehouse: incoming_rate_args = frappe._dict({ @@ -373,6 +398,21 @@ def get_consumed_asset_details(args, get_asset_value=True): else: out.asset_value = 0 + # Account + if asset_details.item_code: + out.fixed_asset_account = get_asset_category_account('fixed_asset_account', item=asset_details.item_code, + company=args.company) + else: + out.fixed_asset_account = None + + # Cost Center + if asset_details.item_code: + item = frappe.get_cached_doc("Item", asset_details.item_code) + item_defaults = get_item_defaults(item.name, args.company) + item_group_defaults = get_item_group_defaults(item.name, args.company) + brand_defaults = get_brand_defaults(item.name, args.company) + out.cost_center = get_default_cost_center(args, item_defaults, item_group_defaults, brand_defaults) + return out diff --git a/erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json b/erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json index a0040338c0..93ec336b15 100644 --- a/erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json +++ b/erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json @@ -12,7 +12,11 @@ "item_name", "section_break_6", "asset_value", - "column_break_9" + "column_break_9", + "accounting_dimensions_section", + "fixed_asset_account", + "dimension_col_break", + "cost_center" ], "fields": [ { @@ -68,12 +72,35 @@ { "fieldname": "column_break_9", "fieldtype": "Column Break" + }, + { + "fieldname": "fixed_asset_account", + "fieldtype": "Link", + "label": "Fixed Asset Account", + "options": "Account", + "read_only": 1 + }, + { + "fieldname": "cost_center", + "fieldtype": "Link", + "label": "Cost Center", + "options": "Cost Center" + }, + { + "collapsible": 1, + "fieldname": "accounting_dimensions_section", + "fieldtype": "Section Break", + "label": "Accounting Dimensions" + }, + { + "fieldname": "dimension_col_break", + "fieldtype": "Column Break" } ], "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2021-09-06 13:46:04.892863", + "modified": "2021-09-08 15:54:24.885547", "modified_by": "Administrator", "module": "Assets", "name": "Asset Capitalization Asset Item", diff --git a/erpnext/assets/doctype/asset_capitalization_service_item/asset_capitalization_service_item.json b/erpnext/assets/doctype/asset_capitalization_service_item/asset_capitalization_service_item.json index 2d3584dce4..0ae1c1428e 100644 --- a/erpnext/assets/doctype/asset_capitalization_service_item/asset_capitalization_service_item.json +++ b/erpnext/assets/doctype/asset_capitalization_service_item/asset_capitalization_service_item.json @@ -17,8 +17,7 @@ "amount", "accounting_dimensions_section", "cost_center", - "dimension_col_break", - "project" + "dimension_col_break" ], "fields": [ { @@ -106,18 +105,12 @@ { "fieldname": "dimension_col_break", "fieldtype": "Column Break" - }, - { - "fieldname": "project", - "fieldtype": "Link", - "label": "Project", - "options": "Project" } ], "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2021-09-06 14:06:34.768152", + "modified": "2021-09-08 15:52:08.598100", "modified_by": "Administrator", "module": "Assets", "name": "Asset Capitalization Service Item", diff --git a/erpnext/assets/doctype/asset_capitalization_stock_item/asset_capitalization_stock_item.json b/erpnext/assets/doctype/asset_capitalization_stock_item/asset_capitalization_stock_item.json index 19c455894a..14eb0f6ef2 100644 --- a/erpnext/assets/doctype/asset_capitalization_stock_item/asset_capitalization_stock_item.json +++ b/erpnext/assets/doctype/asset_capitalization_stock_item/asset_capitalization_stock_item.json @@ -19,7 +19,10 @@ "batch_and_serial_no_section", "batch_no", "column_break_13", - "serial_no" + "serial_no", + "accounting_dimensions_section", + "cost_center", + "dimension_col_break" ], "fields": [ { @@ -120,12 +123,28 @@ "label": "Actual Qty in Warehouse", "no_copy": 1, "read_only": 1 + }, + { + "collapsible": 1, + "fieldname": "accounting_dimensions_section", + "fieldtype": "Section Break", + "label": "Accounting Dimensions" + }, + { + "fieldname": "cost_center", + "fieldtype": "Link", + "label": "Cost Center", + "options": "Cost Center" + }, + { + "fieldname": "dimension_col_break", + "fieldtype": "Column Break" } ], "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2021-09-06 13:46:13.579140", + "modified": "2021-09-08 15:56:20.230548", "modified_by": "Administrator", "module": "Assets", "name": "Asset Capitalization Stock Item",