diff --git a/asset_customizations/asset_modification/customizations/asset/asset.js b/asset_customizations/asset_modification/customizations/asset/asset.js index 0d539dd..3450898 100644 --- a/asset_customizations/asset_modification/customizations/asset/asset.js +++ b/asset_customizations/asset_modification/customizations/asset/asset.js @@ -34,7 +34,8 @@ erpnext.asset.scrap_asset = function (frm) { args: { "asset_name":frm.doc.name, "scrap_date": values.scrap_date, - "purchase_date": frm.doc.purchase_date + "purchase_date": frm.doc.purchase_date, + "calculate_depreciation": frm.doc.calculate_depreciation }, method: "asset_customizations.asset_modification.customizations.asset.asset.asset_scrap_date_validation", callback: function(r) { diff --git a/asset_customizations/asset_modification/customizations/asset/asset.py b/asset_customizations/asset_modification/customizations/asset/asset.py index aef880d..1b5bf0e 100644 --- a/asset_customizations/asset_modification/customizations/asset/asset.py +++ b/asset_customizations/asset_modification/customizations/asset/asset.py @@ -4,7 +4,7 @@ @frappe.whitelist() -def asset_scrap_date_validation(asset_name, scrap_date, purchase_date): +def asset_scrap_date_validation(asset_name, scrap_date, purchase_date, calculate_depreciation): scrap_date = getdate(scrap_date) today_date = getdate(today()) purchase_date = getdate(purchase_date) @@ -13,7 +13,11 @@ def asset_scrap_date_validation(asset_name, scrap_date, purchase_date): frappe.throw("Future Date Is Not Allowed") elif scrap_date < purchase_date: frappe.throw("Scrap Date Cannot Be Before Purchase Date") - + + if calculate_depreciation == "0" and scrap_date >= purchase_date: + scrap_asset(asset_name, scrap_date) + return + depriciation_list = frappe.db.get_all("Asset Depreciation Schedule", {"asset": asset_name}, pluck="name") for depriciation in depriciation_list: asset_depr_schedule_list = frappe.db.get_all( diff --git a/asset_customizations/asset_modification/customizations/asset_capitalization/doc_events/asset_capitalization_target_account.py b/asset_customizations/asset_modification/customizations/asset_capitalization/asset_capitalization_target_account.py similarity index 98% rename from asset_customizations/asset_modification/customizations/asset_capitalization/doc_events/asset_capitalization_target_account.py rename to asset_customizations/asset_modification/customizations/asset_capitalization/asset_capitalization_target_account.py index a5c64ed..0b0ff30 100644 --- a/asset_customizations/asset_modification/customizations/asset_capitalization/doc_events/asset_capitalization_target_account.py +++ b/asset_customizations/asset_modification/customizations/asset_capitalization/asset_capitalization_target_account.py @@ -8,7 +8,7 @@ get_disposal_account_and_cost_center ) from erpnext.assets.doctype.asset_capitalization.asset_capitalization import AssetCapitalization -from frappe.utils import flt,getdate,get_link_to_form +from frappe.utils import flt, getdate, get_link_to_form class CustomAssetCapitalization(AssetCapitalization): @@ -52,7 +52,6 @@ def get_gl_entries_for_consumed_asset_items( AssetCapitalization.get_gl_entries_for_consumed_asset_items(self, gl_entries, target_account, target_against, precision) - def get_gl_entries_on_asset_disposal( asset, selling_amount=0, finance_book=None, voucher_type=None, voucher_no=None, date=None ): diff --git a/asset_customizations/asset_modification/customizations/asset_depreciation_schedule/doc_event/asset_depreciation_schedule_override.py b/asset_customizations/asset_modification/customizations/asset_depreciation_schedule/asset_depreciation_schedule_override.py similarity index 100% rename from asset_customizations/asset_modification/customizations/asset_depreciation_schedule/doc_event/asset_depreciation_schedule_override.py rename to asset_customizations/asset_modification/customizations/asset_depreciation_schedule/asset_depreciation_schedule_override.py diff --git a/asset_customizations/asset_modification/customizations/asset_movement/asset_movement.py b/asset_customizations/asset_modification/customizations/asset_movement/asset_movement.py index b16a6a1..023bb5c 100644 --- a/asset_customizations/asset_modification/customizations/asset_movement/asset_movement.py +++ b/asset_customizations/asset_modification/customizations/asset_movement/asset_movement.py @@ -140,51 +140,56 @@ def set_depr_schedule_value(previous_schedule, next_schedule, depreciation_entry @frappe.whitelist() def create_journal_entry(**kwargs): - asset_movemet_name = kwargs.get("name") - transaction_date = getdate(kwargs.get("transaction_date")) - - asset_name_list = frappe.db.get_all("Asset Movement Item", - filters={"parent": asset_movemet_name}, - pluck="asset") - fieldnames = frappe.get_list("Accounting Dimension", pluck="fieldname") - - for asset_name in asset_name_list: - asset_values = frappe.db.get_value("Asset", {"name": asset_name}, "*") - - asset_category_value = frappe.db.get_value("Asset Category Account", - {"parent": asset_values.asset_category, - "company_name": asset_values.company}, - ["fixed_asset_account", "accumulated_depreciation_account"], - as_dict=True) - - asset_depr_schedule = frappe.db.get_all("Asset Depreciation Schedule", - {"asset":asset_name}, pluck="name") - - old_dimension_value = {} - new_dimension_value = {} - - asset_movement_child_data = frappe.db.get_value("Asset Movement Item", - {"parent": asset_movemet_name, "asset":asset_name}, - "*", as_dict= True) - - for fieldname in fieldnames: - old_dimension_value[fieldname] = asset_movement_child_data.get("from_"+fieldname) - new_dimension_value[fieldname] = asset_movement_child_data.get("target_"+fieldname) - - for schedule in asset_depr_schedule: - accumulated_depreciation_amount = frappe.db.get_value("Depreciation Schedule", - {"parent": schedule, "schedule_date": transaction_date}, - "accumulated_depreciation_amount") + asset_movemet_name = kwargs.get("name") + transaction_date = getdate(kwargs.get("transaction_date")) - je_name = set_value_in_journal_entry(asset_values, + asset_name_list = frappe.db.get_all("Asset Movement Item", + filters={"parent": asset_movemet_name}, + pluck="asset") + fieldnames = frappe.get_list("Accounting Dimension", pluck="fieldname") + for asset_name in asset_name_list: + asset_values = frappe.db.get_value("Asset", {"name": asset_name}, "*") + + asset_category_value = frappe.db.get_value("Asset Category Account", + {"parent": asset_values.asset_category, + "company_name": asset_values.company}, + ["fixed_asset_account", "accumulated_depreciation_account"], + as_dict=True) + asset_depr_schedule = frappe.db.get_all("Asset Depreciation Schedule", + {"asset":asset_name}, pluck="name") + + old_dimension_value = {} + new_dimension_value = {} + asset_movement_child_data = frappe.db.get_value("Asset Movement Item", + {"parent": asset_movemet_name, "asset":asset_name}, + "*", as_dict= True) + + for fieldname in fieldnames: + old_dimension_value[fieldname] = asset_movement_child_data.get("from_"+fieldname) + new_dimension_value[fieldname] = asset_movement_child_data.get("target_"+fieldname) + if asset_values.calculate_depreciation: + for schedule in asset_depr_schedule: + accumulated_depreciation_amount = frappe.db.get_value("Depreciation Schedule", + {"parent": schedule, "schedule_date": transaction_date}, + "accumulated_depreciation_amount") + + return set_value_in_journal_entry(asset_values, + transaction_date, + asset_category_value, + asset_movement_child_data, + new_dimension_value, + old_dimension_value, + accumulated_depreciation_amount, + asset_movemet_name) + else: + return set_value_in_journal_entry(asset_values, transaction_date, asset_category_value, asset_movement_child_data, new_dimension_value, old_dimension_value, - accumulated_depreciation_amount, + None, asset_movemet_name) - return je_name def set_value_in_journal_entry(asset_values, @@ -198,39 +203,54 @@ def set_value_in_journal_entry(asset_values, company = asset_values.company posting_date = transaction_date - - row1 = { - "account" : asset_category_value.fixed_asset_account, - "debit_in_account_currency": asset_values.total_asset_cost, - "cost_center": asset_movement_child_data.target_cost_center - } - row1.update(new_dimension_value) - row2 = { - "account" : asset_category_value.fixed_asset_account, - "credit_in_account_currency": asset_values.total_asset_cost, - "cost_center": asset_movement_child_data.from_cost_center - } - row2.update(old_dimension_value) - - row3 = { - "account" : asset_category_value.accumulated_depreciation_account, - "debit_in_account_currency" : accumulated_depreciation_amount, - "cost_center": asset_movement_child_data.from_cost_center - } - row3.update(old_dimension_value) - row4 = { - "account" : asset_category_value.accumulated_depreciation_account, - "credit_in_account_currency": accumulated_depreciation_amount, - "cost_center": asset_movement_child_data.target_cost_center - } - row4.update(new_dimension_value) - + if accumulated_depreciation_amount: + row1 = { + "account" : asset_category_value.fixed_asset_account, + "debit_in_account_currency": asset_values.total_asset_cost, + "cost_center": asset_movement_child_data.target_cost_center + } + row1.update(new_dimension_value) + row2 = { + "account" : asset_category_value.fixed_asset_account, + "credit_in_account_currency": asset_values.total_asset_cost, + "cost_center": asset_movement_child_data.from_cost_center + } + row2.update(old_dimension_value) + + row3 = { + "account" : asset_category_value.accumulated_depreciation_account, + "debit_in_account_currency" : accumulated_depreciation_amount, + "cost_center": asset_movement_child_data.from_cost_center + } + row3.update(old_dimension_value) + row4 = { + "account" : asset_category_value.accumulated_depreciation_account, + "credit_in_account_currency": accumulated_depreciation_amount, + "cost_center": asset_movement_child_data.target_cost_center + } + row4.update(new_dimension_value) + rows = [row1, row2, row3, row4] + else: + row1 = { + "account" : asset_category_value.fixed_asset_account, + "debit_in_account_currency": asset_values.total_asset_cost, + "cost_center": asset_movement_child_data.target_cost_center + } + row1.update(new_dimension_value) + row2 = { + "account" : asset_category_value.fixed_asset_account, + "credit_in_account_currency": asset_values.total_asset_cost, + "cost_center": asset_movement_child_data.from_cost_center + } + row2.update(old_dimension_value) + rows = [row1, row2] + doc = frappe.get_doc({ 'doctype': 'Journal Entry', "voucher_type": "Journal Entry", "posting_date": posting_date, "company": company, - "accounts":[row1, row2, row3, row4], + "accounts":rows, "remark": f"Asset Movement Entry against {asset_movemet_name}" }) doc.save() diff --git a/asset_customizations/asset_modification/customizations/asset_movement/asset_movement_override.js b/asset_customizations/asset_modification/customizations/asset_movement/asset_movement_override.js new file mode 100644 index 0000000..3cc9696 --- /dev/null +++ b/asset_customizations/asset_modification/customizations/asset_movement/asset_movement_override.js @@ -0,0 +1,105 @@ + +frappe.ui.form.on("Asset Movement", { + refresh: function(frm) { + if(frm.doc.purpose == "Issue" && frm.doc.docstatus == 1){ + if (!frm.doc.custom_journal_entry){ + frm.add_custom_button(__("Make Journal Entry"), function(){ + frappe.confirm('Are you sure you want to proceed?', + () => { + frappe.call({ + method: "asset_customizations.asset_modification.customizations.asset_movement.asset_movement.create_journal_entry", + args: { + "name": frm.doc.name, + "transaction_date": frm.doc.transaction_date + }, + callback: function (r) { + frm.set_value("custom_journal_entry", r.message) + frm.save("Submit") + }, + }); + } + ) + }, __("Create")); + } + frm.add_custom_button(__('Make Delivery Note'), function() { + frappe.confirm('Are you sure you want to proceed?', + () => { + frappe.call({ + method: "asset_customizations.asset_modification.customizations.asset_movement.asset_movement.make_delivery_note", + args: { + "name": frm.doc.name, + "transaction_date": frm.doc.transaction_date + }, + callback: function (r) { + frappe.model.with_doctype('Delivery Note', function() { + var doc = frappe.model.get_new_doc('Delivery Note'); + var items = r.message; + var child = frappe.model.add_child(doc, 'items'); + + items.forEach(function(item) { + for (var key in item) { + if (item.hasOwnProperty(key)) { + child[key] = item[key]; + } + } + }); + frappe.set_route('Form', 'Delivery Note', doc.name); + }); + }, + }); + }, () => { + // action to perform if No is selected + }) + }, __("Create")); + } + }, +}); + + +frappe.ui.form.off("Asset Movement Item", "asset"); +frappe.ui.form.on("Asset Movement Item", { + asset: function (frm, cdt, cdn) { + // Fetch the fields from "Accounting Dimension" + frappe.db.get_list("Accounting Dimension", { + fields: ["name"] + }).then(fields => { + // Extract and convert field names to the required format + const field_names = fields.map(field => `from_${field.name.toLowerCase().replace(/ /g, '_')}`); + + // on manual entry of an asset auto sets their source location / employee + const asset_name = locals[cdt][cdn].asset; + console.log("Selected Asset:", asset_name); + + if (asset_name) { + frappe.db.get_doc("Asset", asset_name) + .then(asset_doc => { + if (asset_doc.location) { + console.log("Setting Source Location:", asset_doc.location); + frappe.model.set_value(cdt, cdn, "source_location", asset_doc.location); + } + if (asset_doc.custodian) { + frappe.model.set_value(cdt, cdn, "from_employee", asset_doc.custodian); + } + if (asset_doc.cost_center) { + console.log("Setting From Cost Center:", asset_doc.cost_center); + frappe.model.set_value(cdt, cdn, "custom_from_cost_center", asset_doc.cost_center); + } + + // Dynamically set other fields + field_names.forEach(field => { + const original_field = field.replace("from_", ""); + if (asset_doc[original_field]) { + console.log(`Setting ${field}:`, asset_doc[original_field]); + frappe.model.set_value(cdt, cdn, field, asset_doc[original_field]); + } + }); + }) + .catch(err => { + console.log("Error fetching asset:", err); + }); + } + }).catch(err => { + console.log("Error fetching fields:", err); + }); + }, +}); \ No newline at end of file diff --git a/asset_customizations/asset_modification/customizations/asset_movement/doc_events/asset_movement_override.py b/asset_customizations/asset_modification/customizations/asset_movement/asset_movement_override.py similarity index 89% rename from asset_customizations/asset_modification/customizations/asset_movement/doc_events/asset_movement_override.py rename to asset_customizations/asset_modification/customizations/asset_movement/asset_movement_override.py index 0b424ec..008cb52 100644 --- a/asset_customizations/asset_modification/customizations/asset_movement/doc_events/asset_movement_override.py +++ b/asset_customizations/asset_modification/customizations/asset_movement/asset_movement_override.py @@ -17,10 +17,11 @@ def set_latest_location_and_custodian_in_asset(self): current_values = {} for tf in transformed_fields: field_mapping[tf] = tf.split('_', 1)[1] - if fields: - current_values[tf] = "" + # if fields: + # current_values[tf] = "" current_location, current_employee = "", "" + custom_target_cost_center = "" cond = "1=1" for d in self.assets: @@ -56,9 +57,6 @@ def set_latest_location_and_custodian_in_asset(self): current_values[original_field] = latest_movement_entry[0][3 + idx] if fields else "" else: - current_location = "" - current_employee = "" - custom_target_cost_center = "" for original_field in field_mapping.values(): current_values[original_field] = "" @@ -70,23 +68,24 @@ def set_latest_location_and_custodian_in_asset(self): frappe.db.set_value("Asset", d.asset, original_field, current_values[original_field], update_modified=False) if len(frappe.db.get_all("Asset Movement Item", {"asset": d.asset})) > 1: - asset_depr_schedule_doc = frappe.get_doc("Asset Depreciation Schedule", {"asset":d.asset}) - update_depreciation_schedule(d.asset, asset_depr_schedule_doc.name, self.transaction_date) - make_depreciation_entry(asset_depr_schedule_doc.name) + if frappe.db.exists("Asset Depreciation Schedule", {"asset": d.asset}): + asset_depr_schedule_doc = frappe.get_doc("Asset Depreciation Schedule", {"asset":d.asset}) + update_depreciation_schedule(d.asset, asset_depr_schedule_doc.name, self.transaction_date) + make_depreciation_entry(asset_depr_schedule_doc.name) - frappe.db.set_value("Asset Depreciation Schedule", - asset_depr_schedule_doc.name, - "custom_cost_center", - custom_target_cost_center, - update_modified=True) - - for original_field in field_mapping.values(): frappe.db.set_value("Asset Depreciation Schedule", asset_depr_schedule_doc.name, - original_field, - current_values[original_field], + "custom_cost_center", + custom_target_cost_center, update_modified=True) + for original_field in field_mapping.values(): + frappe.db.set_value("Asset Depreciation Schedule", + asset_depr_schedule_doc.name, + original_field, + current_values[original_field], + update_modified=True) + if current_location and current_employee: add_asset_activity( d.asset, @@ -162,12 +161,19 @@ def update_depreciation_schedule(asset_name, asset_depriciation_schedule_name, t asset_available_for_use_date = frappe.db.get_value("Asset", asset_name, "available_for_use_date") asset_depr_schedule_list = get_asset_depr_schedule_list(asset_depriciation_schedule_name) - previous_schedule, next_schedule = find_previous_and_next_schedules(asset_depr_schedule_list, transaction_date) + previous_schedule, next_schedule = find_previous_and_next_schedules(asset_depr_schedule_list, + transaction_date) if not (previous_schedule or next_schedule): return - set_depreciation_schedule(previous_schedule, next_schedule, asset_available_for_use_date, transaction_date, asset_depriciation_schedule_name) + set_depreciation_schedule( + previous_schedule, + next_schedule, + asset_available_for_use_date, + transaction_date, + asset_depriciation_schedule_name + ) def find_previous_and_next_schedules(schedule_list, transaction_date): diff --git a/asset_customizations/asset_modification/customizations/asset_movement/doc_events/asset_movement_override.js b/asset_customizations/asset_modification/customizations/asset_movement/doc_events/asset_movement_override.js deleted file mode 100644 index db6ddfe..0000000 --- a/asset_customizations/asset_modification/customizations/asset_movement/doc_events/asset_movement_override.js +++ /dev/null @@ -1,142 +0,0 @@ - -frappe.ui.form.off("Asset Movement", "set_required_fields"); -frappe.ui.form.on("Asset Movement", { - refresh: function(frm) { - if (!frm.doc.custom_journal_entry){ - frm.add_custom_button(__("Make Journal Entry"), function(){ - frappe.confirm('Are you sure you want to proceed?', - () => { - frappe.call({ - method: "asset_customizations.asset_modification.customizations.asset_movement.asset_movement.create_journal_entry", - args: { - "name": frm.doc.name, - "transaction_date": frm.doc.transaction_date - }, - callback: function (r) { - frm.set_value("custom_journal_entry", r.message) - frm.save("Submit") - }, - }); - } - ) - }, __("Create")); - } - frm.add_custom_button(__('Make Delivery Note'), function() { - frappe.confirm('Are you sure you want to proceed?', - () => { - frappe.call({ - method: "asset_customizations.asset_modification.customizations.asset_movement.asset_movement.make_delivery_note", - args: { - "name": frm.doc.name, - "transaction_date": frm.doc.transaction_date - }, - callback: function (r) { - frappe.model.with_doctype('Delivery Note', function() { - var doc = frappe.model.get_new_doc('Delivery Note'); - var items = r.message; - var child = frappe.model.add_child(doc, 'items'); - - items.forEach(function(item) { - for (var key in item) { - if (item.hasOwnProperty(key)) { - child[key] = item[key]; - } - } - }); - frappe.set_route('Form', 'Delivery Note', doc.name); - }); - }, - }); - }, () => { - // action to perform if No is selected - }) - }, __("Create")); - }, - - set_required_fields: (frm, cdt, cdn) => { - let fieldnames_to_be_altered; - if (frm.doc.purpose === "Transfer") { - fieldnames_to_be_altered = { - target_location: { read_only: 0, reqd: 1 }, - source_location: { read_only: 1, reqd: 1 }, - from_employee: { read_only: 1, reqd: 0 }, - to_employee: { read_only: 0, reqd: 0 }, - }; - } else if (frm.doc.purpose === "Receipt") { - fieldnames_to_be_altered = { - target_location: { read_only: 0, reqd: 1 }, - source_location: { read_only: 1, reqd: 0 }, - from_employee: { read_only: 0, reqd: 0 }, - to_employee: { read_only: 1, reqd: 0 }, - }; - } else if (frm.doc.purpose === "Issue") { - fieldnames_to_be_altered = { - target_location: { read_only: 0, reqd: 0 }, - source_location: { read_only: 1, reqd: 0 }, - from_employee: { read_only: 1, reqd: 0 }, - to_employee: { read_only: 0, reqd: 1 }, - }; - } - if (fieldnames_to_be_altered) { - Object.keys(fieldnames_to_be_altered).forEach((fieldname) => { - let property_to_be_altered = fieldnames_to_be_altered[fieldname]; - Object.keys(property_to_be_altered).forEach((property) => { - let value = property_to_be_altered[property]; - frm.fields_dict["assets"].grid.update_docfield_property(fieldname, property, value); - }); - }); - frm.refresh_field("assets"); - } - }, -}); - -frappe.ui.form.off("Asset Movement Item", "asset"); -frappe.ui.form.on("Asset Movement Item", { - asset: function (frm, cdt, cdn) { - // Fetch the fields from "Accounting Dimension" - frappe.db.get_list("Accounting Dimension", { - fields: ["name"] - }).then(fields => { - // Extract and convert field names to the required format - const field_names = fields.map(field => `from_${field.name.toLowerCase().replace(/ /g, '_')}`); - - console.log("Override jssssssssssss"); - console.log("Converted Field Names:", field_names); - - // on manual entry of an asset auto sets their source location / employee - const asset_name = locals[cdt][cdn].asset; - console.log("Selected Asset:", asset_name); - - if (asset_name) { - frappe.db.get_doc("Asset", asset_name) - .then(asset_doc => { - if (asset_doc.location) { - console.log("Setting Source Location:", asset_doc.location); - frappe.model.set_value(cdt, cdn, "source_location", asset_doc.location); - } - if (asset_doc.custodian) { - frappe.model.set_value(cdt, cdn, "from_employee", asset_doc.custodian); - } - if (asset_doc.cost_center) { - console.log("Setting From Cost Center:", asset_doc.cost_center); - frappe.model.set_value(cdt, cdn, "custom_from_cost_center", asset_doc.cost_center); - } - - // Dynamically set other fields - field_names.forEach(field => { - const original_field = field.replace("from_", ""); - if (asset_doc[original_field]) { - console.log(`Setting ${field}:`, asset_doc[original_field]); - frappe.model.set_value(cdt, cdn, field, asset_doc[original_field]); - } - }); - }) - .catch(err => { - console.log("Error fetching asset:", err); - }); - } - }).catch(err => { - console.log("Error fetching fields:", err); - }); - }, -}); \ No newline at end of file diff --git a/asset_customizations/asset_modification/customizations/asset_repair/doc_events/asset_repair.py b/asset_customizations/asset_modification/customizations/asset_repair/asset_repair.py similarity index 60% rename from asset_customizations/asset_modification/customizations/asset_repair/doc_events/asset_repair.py rename to asset_customizations/asset_modification/customizations/asset_repair/asset_repair.py index 86f2b37..0f99161 100644 --- a/asset_customizations/asset_modification/customizations/asset_repair/doc_events/asset_repair.py +++ b/asset_customizations/asset_modification/customizations/asset_repair/asset_repair.py @@ -1,9 +1,6 @@ import frappe from datetime import datetime -from frappe import _ -from erpnext.assets.doctype.asset_repair.asset_repair import AssetRepair -from frappe.utils import get_link_to_form -from erpnext.assets.doctype.asset_activity.asset_activity import add_asset_activity + def before_save(self, method=None): repair_cost_value = 0 @@ -129,75 +126,3 @@ def create_gl_entry(self, account_details): ge.fiscal_year = fiscal_year_value ge.save(ignore_permissions=True) -class AssetRepairMaster(AssetRepair): - def before_submit(self): - self.check_repair_status() - - self.asset_doc.flags.increase_in_asset_value_due_to_repair = False - - if self.get("stock_consumption") or self.get("capitalize_repair_cost"): - self.asset_doc.flags.increase_in_asset_value_due_to_repair = True - - self.increase_asset_value() - - if self.capitalize_repair_cost: - self.asset_doc.total_asset_cost += self.repair_cost - self.asset_doc.additional_asset_cost += self.repair_cost - - if self.get("stock_consumption"): - self.check_for_stock_items_and_warehouse() - self.decrease_stock_quantity() - if self.get("capitalize_repair_cost"): - if self.asset_doc.calculate_depreciation and self.increase_in_asset_life: - self.modify_depreciation_schedule() - - notes = _( - "This schedule was created when Asset {0} was repaired through Asset Repair {1}." - ).format( - get_link_to_form(self.asset_doc.doctype, self.asset_doc.name), - get_link_to_form(self.doctype, self.name), - ) - self.asset_doc.flags.ignore_validate_update_after_submit = True - self.asset_doc.save() - - add_asset_activity( - self.asset, - _("Asset updated after completion of Asset Repair {0}").format( - get_link_to_form("Asset Repair", self.name) - ), - ) - - def before_cancel(self): - self.asset_doc = frappe.get_doc("Asset", self.asset) - - self.asset_doc.flags.increase_in_asset_value_due_to_repair = False - - if self.get("stock_consumption") or self.get("capitalize_repair_cost"): - self.asset_doc.flags.increase_in_asset_value_due_to_repair = True - - self.decrease_asset_value() - - if self.capitalize_repair_cost: - self.asset_doc.total_asset_cost -= self.repair_cost - self.asset_doc.additional_asset_cost -= self.repair_cost - - if self.get("capitalize_repair_cost"): - self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry") - if self.asset_doc.calculate_depreciation and self.increase_in_asset_life: - self.revert_depreciation_schedule_on_cancellation() - - notes = _( - "This schedule was created when Asset {0}'s Asset Repair {1} was cancelled." - ).format( - get_link_to_form(self.asset_doc.doctype, self.asset_doc.name), - get_link_to_form(self.doctype, self.name), - ) - self.asset_doc.flags.ignore_validate_update_after_submit = True - self.asset_doc.save() - - add_asset_activity( - self.asset, - _("Asset updated after cancellation of Asset Repair {0}").format( - get_link_to_form("Asset Repair", self.name) - ), - ) \ No newline at end of file diff --git a/asset_customizations/asset_modification/customizations/asset_repair/asset_repair_override.py b/asset_customizations/asset_modification/customizations/asset_repair/asset_repair_override.py new file mode 100644 index 0000000..d19897d --- /dev/null +++ b/asset_customizations/asset_modification/customizations/asset_repair/asset_repair_override.py @@ -0,0 +1,79 @@ +import frappe +from frappe import _ +from erpnext.assets.doctype.asset_repair.asset_repair import AssetRepair +from frappe.utils import get_link_to_form +from erpnext.assets.doctype.asset_activity.asset_activity import add_asset_activity + + +class CustomAssetRepair(AssetRepair): + def before_submit(self): + self.check_repair_status() + + self.asset_doc.flags.increase_in_asset_value_due_to_repair = False + + if self.get("stock_consumption") or self.get("capitalize_repair_cost"): + self.asset_doc.flags.increase_in_asset_value_due_to_repair = True + + self.increase_asset_value() + + if self.capitalize_repair_cost: + self.asset_doc.total_asset_cost += self.repair_cost + self.asset_doc.additional_asset_cost += self.repair_cost + + if self.get("stock_consumption"): + self.check_for_stock_items_and_warehouse() + self.decrease_stock_quantity() + if self.get("capitalize_repair_cost"): + if self.asset_doc.calculate_depreciation and self.increase_in_asset_life: + self.modify_depreciation_schedule() + + notes = _( + "This schedule was created when Asset {0} was repaired through Asset Repair {1}." + ).format( + get_link_to_form(self.asset_doc.doctype, self.asset_doc.name), + get_link_to_form(self.doctype, self.name), + ) + self.asset_doc.flags.ignore_validate_update_after_submit = True + self.asset_doc.save() + + add_asset_activity( + self.asset, + _("Asset updated after completion of Asset Repair {0}").format( + get_link_to_form("Asset Repair", self.name) + ), + ) + + def before_cancel(self): + self.asset_doc = frappe.get_doc("Asset", self.asset) + + self.asset_doc.flags.increase_in_asset_value_due_to_repair = False + + if self.get("stock_consumption") or self.get("capitalize_repair_cost"): + self.asset_doc.flags.increase_in_asset_value_due_to_repair = True + + self.decrease_asset_value() + + if self.capitalize_repair_cost: + self.asset_doc.total_asset_cost -= self.repair_cost + self.asset_doc.additional_asset_cost -= self.repair_cost + + if self.get("capitalize_repair_cost"): + self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry") + if self.asset_doc.calculate_depreciation and self.increase_in_asset_life: + self.revert_depreciation_schedule_on_cancellation() + + notes = _( + "This schedule was created when Asset {0}'s Asset Repair {1} was cancelled." + ).format( + get_link_to_form(self.asset_doc.doctype, self.asset_doc.name), + get_link_to_form(self.doctype, self.name), + ) + self.asset_doc.flags.ignore_validate_update_after_submit = True + self.asset_doc.save() + + add_asset_activity( + self.asset, + _("Asset updated after cancellation of Asset Repair {0}").format( + get_link_to_form("Asset Repair", self.name) + ), + ) \ No newline at end of file diff --git a/asset_customizations/asset_modification/customizations/buying_controller/doc_events/buying_controller_override.py b/asset_customizations/asset_modification/customizations/buying_controller/buying_controller_override.py similarity index 100% rename from asset_customizations/asset_modification/customizations/buying_controller/doc_events/buying_controller_override.py rename to asset_customizations/asset_modification/customizations/buying_controller/buying_controller_override.py diff --git a/asset_customizations/asset_modification/doctype/asset_component_capitalization/__init__.py b/asset_customizations/asset_modification/doctype/asset_component_capitalization/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/asset_customizations/asset_modification/doctype/asset_component_capitalization/asset_component_capitalization.js b/asset_customizations/asset_modification/doctype/asset_component_capitalization/asset_component_capitalization.js new file mode 100644 index 0000000..6afc99b --- /dev/null +++ b/asset_customizations/asset_modification/doctype/asset_component_capitalization/asset_component_capitalization.js @@ -0,0 +1,49 @@ +// Copyright (c) 2024, manoj and contributors +// For license information, please see license.txt + +frappe.ui.form.on("Asset Component Capitalization", { + refresh: (frm) => { + if (frm.doc.docstatus > 0) { + cur_frm.add_custom_button( + __("Accounting Ledger"), + function () { + frappe.route_options = { + voucher_no: frm.doc.name, + from_date: frm.doc.posting_date, + to_date: moment(frm.doc.modified).format("YYYY-MM-DD"), + company: frm.doc.company, + group_by: "Group by Voucher (Consolidated)", + show_cancelled_entries: frm.doc.docstatus === 2, + }; + frappe.set_route("query-report", "General Ledger"); + }, + __("View") + ); + } + }, + parent_asset(frm) { + if (frm.doc.parent_asset) { + frappe.call({ + method: "asset_customizations.asset_modification.doctype.asset_component_capitalization.asset_component_capitalization.fetch_asset", + args: { + "parent_asset": frm.doc.parent_asset, + }, + callback: function (r) { + frm.clear_table("component_asset"); + + r.message.forEach(asset => { + let new_row = frm.add_child("component_asset"); + new_row.asset = asset.name; + new_row.asset_name = asset.asset_name; + new_row.gross_amount = asset.gross_purchase_amount; + }); + + frm.refresh_field("component_asset"); + }, + }); + } else { + frm.clear_table("component_asset"); + frm.refresh_field("component_asset"); + } + } +}); diff --git a/asset_customizations/asset_modification/doctype/asset_component_capitalization/asset_component_capitalization.json b/asset_customizations/asset_modification/doctype/asset_component_capitalization/asset_component_capitalization.json new file mode 100644 index 0000000..13f790d --- /dev/null +++ b/asset_customizations/asset_modification/doctype/asset_component_capitalization/asset_component_capitalization.json @@ -0,0 +1,78 @@ +{ + "actions": [], + "allow_rename": 1, + "autoname": "naming_series:", + "creation": "2024-07-24 14:17:19.671668", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "naming_series", + "company", + "parent_asset", + "component_asset", + "amended_from" + ], + "fields": [ + { + "fieldname": "naming_series", + "fieldtype": "Select", + "label": "Naming Series", + "options": "ACC-" + }, + { + "fieldname": "company", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Company", + "options": "Company" + }, + { + "fieldname": "parent_asset", + "fieldtype": "Link", + "label": "Parent Asset", + "options": "Parent Asset" + }, + { + "fieldname": "component_asset", + "fieldtype": "Table", + "label": "Component Asset", + "options": "Component Asset" + }, + { + "fieldname": "amended_from", + "fieldtype": "Link", + "label": "Amended From", + "no_copy": 1, + "options": "Asset Component Capitalization", + "print_hide": 1, + "read_only": 1, + "search_index": 1 + } + ], + "index_web_pages_for_search": 1, + "is_submittable": 1, + "links": [], + "modified": "2024-07-24 16:15:07.446333", + "modified_by": "Administrator", + "module": "asset_modification", + "name": "Asset Component Capitalization", + "naming_rule": "By \"Naming Series\" field", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/asset_customizations/asset_modification/doctype/asset_component_capitalization/asset_component_capitalization.py b/asset_customizations/asset_modification/doctype/asset_component_capitalization/asset_component_capitalization.py new file mode 100644 index 0000000..cd20f11 --- /dev/null +++ b/asset_customizations/asset_modification/doctype/asset_component_capitalization/asset_component_capitalization.py @@ -0,0 +1,89 @@ +# Copyright (c) 2024, manoj and contributors +# For license information, please see license.txt + +import frappe +from frappe.model.document import Document +from erpnext.accounts.utils import get_fiscal_year +from frappe.utils import today + +class AssetComponentCapitalization(Document): + def on_submit(self): + self.create_je() + + + def create_je(self): + posting_date = today() + current_fiscal_year = get_fiscal_year(posting_date(), as_dict=True) + + components = [] + for row in self.component_asset: + account_credit_entries ={} + asset_category = frappe.db.get_value("Asset", + row.asset, + ["asset_category","gross_purchase_amount"], + as_dict=True) + cwip_account = frappe.db.get_value("Asset Category Account", + {"parent":asset_category["asset_category"], "company_name":self.company}, + "capital_work_in_progress_account") + + account_credit_entries["account"] = cwip_account + account_credit_entries["credit_in_account_currency"] = asset_category["gross_purchase_amount"] + if components: + for component in components: + if account_credit_entries["account"] == component["account"]: + component["credit_in_account_currency"] += account_credit_entries["credit_in_account_currency"] + else: + components.append(account_credit_entries) + + + asset_category_name = frappe.db.get_value("Parent Asset", self.parent_asset, "asset_category") + fixed_account = frappe.db.get_value("Asset Category Account", + {"parent":asset_category_name, "company_name":self.company}, + "fixed_asset_account") + + account_debit_entries ={} + account_debit_entries["account"] = fixed_account + total_debit_in_account_currency = 0 + all_accounts = [] + + for component in components: + component["against"] = fixed_account + total_debit_in_account_currency += component["credit_in_account_currency"] + all_accounts.append(component["account"]) + account_debit_entries["debit_in_account_currency"] = total_debit_in_account_currency + account_debit_entries["against"] = ', '.join(all_accounts) + components.append(account_debit_entries) + + for component in components: + debit = component.get("debit_in_account_currency") if component.get("debit_in_account_currency") else 0 + credit = component.get("credit_in_account_currency") if component.get("credit_in_account_currency") else 0 + doc = frappe.get_doc({ + 'doctype': 'GL Entry', + "posting_date": posting_date, + 'account': component["account"], + # 'cost_center': "Main - AD", + 'debit': debit, + 'credit': credit, + 'debit_in_account_currency': debit, + 'credit_in_account_currency': credit, + 'against': component["against"], + "voucher_type": self.doctype, + "voucher_subtype": self.doctype, + "voucher_no": self.name, + "fiscal_year": current_fiscal_year, + "company": self.company, + "debit_in_transaction_currency": debit, + "credit_in_transaction_currency": credit, + # "state": "27-Maharashtra", + # "remark": f"Asset Movement Entry against {asset_movemet_name}" + }) + doc.save() + return doc.name + + +@frappe.whitelist() +def fetch_asset(parent_asset): + asset_list = frappe.db.get_all("Asset", + filters={"custom_parent_asset":parent_asset}, + fields=["name", "asset_name", "gross_purchase_amount"]) + return asset_list \ No newline at end of file diff --git a/asset_customizations/asset_modification/doctype/asset_component_capitalization/test_asset_component_capitalization.py b/asset_customizations/asset_modification/doctype/asset_component_capitalization/test_asset_component_capitalization.py new file mode 100644 index 0000000..340e6c1 --- /dev/null +++ b/asset_customizations/asset_modification/doctype/asset_component_capitalization/test_asset_component_capitalization.py @@ -0,0 +1,9 @@ +# Copyright (c) 2024, manoj and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestAssetComponentCapitalization(FrappeTestCase): + pass diff --git a/asset_customizations/asset_modification/doctype/component_asset/__init__.py b/asset_customizations/asset_modification/doctype/component_asset/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/asset_customizations/asset_modification/doctype/component_asset/component_asset.json b/asset_customizations/asset_modification/doctype/component_asset/component_asset.json new file mode 100644 index 0000000..065884d --- /dev/null +++ b/asset_customizations/asset_modification/doctype/component_asset/component_asset.json @@ -0,0 +1,44 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2024-07-24 14:21:02.287777", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "asset", + "asset_name", + "gross_amount" + ], + "fields": [ + { + "fieldname": "asset", + "fieldtype": "Link", + "label": "Asset", + "options": "Asset" + }, + { + "fetch_from": "asset.asset_name", + "fieldname": "asset_name", + "fieldtype": "Data", + "label": "Asset Name" + }, + { + "fieldname": "gross_amount", + "fieldtype": "Float", + "label": "Gross Amount" + } + ], + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2024-07-24 15:51:06.656492", + "modified_by": "Administrator", + "module": "asset_modification", + "name": "Component Asset", + "owner": "Administrator", + "permissions": [], + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/asset_customizations/asset_modification/doctype/component_asset/component_asset.py b/asset_customizations/asset_modification/doctype/component_asset/component_asset.py new file mode 100644 index 0000000..b688d6e --- /dev/null +++ b/asset_customizations/asset_modification/doctype/component_asset/component_asset.py @@ -0,0 +1,9 @@ +# Copyright (c) 2024, manoj and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class ComponentAsset(Document): + pass diff --git a/asset_customizations/asset_modification/doctype/parent_asset/parent_asset.json b/asset_customizations/asset_modification/doctype/parent_asset/parent_asset.json index 90118b7..9923893 100644 --- a/asset_customizations/asset_modification/doctype/parent_asset/parent_asset.json +++ b/asset_customizations/asset_modification/doctype/parent_asset/parent_asset.json @@ -60,8 +60,9 @@ { "fetch_from": "item_code.asset_category", "fieldname": "asset_category", - "fieldtype": "Data", + "fieldtype": "Link", "label": "Asset Category", + "options": "Asset Category", "read_only": 1 }, { @@ -78,7 +79,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2024-07-18 17:34:11.145270", + "modified": "2024-07-24 17:59:41.641995", "modified_by": "Administrator", "module": "asset_modification", "name": "Parent Asset", diff --git a/asset_customizations/hooks.py b/asset_customizations/hooks.py index 11caf61..9a9e54b 100644 --- a/asset_customizations/hooks.py +++ b/asset_customizations/hooks.py @@ -18,14 +18,14 @@ # Override standard doctype classes override_doctype_class = { - "Purchase Receipt":"asset_customizations.asset_modification.customizations.buying_controller.doc_events.buying_controller_override.CustomPurchaseReceipt", + "Purchase Receipt":"asset_customizations.asset_modification.customizations.buying_controller.buying_controller_override.CustomPurchaseReceipt", "Asset":"asset_customizations.asset_modification.customizations.asset.asset_override.CustomAsset", "Accounting Dimension":"asset_customizations.asset_modification.customizations.accounting_dimension.accounting_dimension_override.CustomAccountingDimension", - "Asset Movement":"asset_customizations.asset_modification.customizations.asset_movement.doc_events.asset_movement_override.CustomAssetMovement", - "Asset Depreciation Schedule":"asset_customizations.asset_modification.customizations.asset_depreciation_schedule.doc_event.asset_depreciation_schedule_override.CustomAssetDepreciationSchedule", + "Asset Movement":"asset_customizations.asset_modification.customizations.asset_movement.asset_movement_override.CustomAssetMovement", + "Asset Depreciation Schedule":"asset_customizations.asset_modification.customizations.asset_depreciation_schedule.asset_depreciation_schedule_override.CustomAssetDepreciationSchedule", "Asset Value Adjustment": "asset_customizations.asset_modification.customizations.asset_value_adjustment.asset_value_adjustment_override.CustomAssetValueAdjustment", - "Asset Capitalization": "asset_customizations.asset_modification.customizations.asset_capitalization.doc_events.asset_capitalization_target_account.CustomAssetCapitalization", - "Asset Repair": "asset_customizations.asset_modification.customizations.asset_repair.doc_events.asset_repair.AssetRepairMaster" + "Asset Capitalization": "asset_customizations.asset_modification.customizations.asset_capitalization.asset_capitalization_target_account.CustomAssetCapitalization", + "Asset Repair": "asset_customizations.asset_modification.customizations.asset_repair.asset_repair_override.CustomAssetRepair" } # Document Events @@ -42,8 +42,8 @@ "on_cancel": "asset_customizations.asset_modification.customizations.journal_entry.journal_entry.on_cancel", }, "Asset Repair": { - "before_save": "asset_customizations.asset_modification.customizations.asset_repair.doc_events.asset_repair.before_save", - "on_submit": "asset_customizations.asset_modification.customizations.asset_repair.doc_events.asset_repair.on_submit", + "before_save": "asset_customizations.asset_modification.customizations.asset_repair.asset_repair.before_save", + "on_submit": "asset_customizations.asset_modification.customizations.asset_repair.asset_repair.on_submit", } } @@ -59,7 +59,7 @@ doctype_js = {"Asset" : "asset_modification/customizations/asset/asset.js", "Asset Value Adjustment": "asset_modification/customizations/asset_value_adjustment/asset_value_adjustment_override.js", - "Asset Movement": "asset_modification/customizations/asset_movement/doc_events/asset_movement_override.js" + "Asset Movement": "asset_modification/customizations/asset_movement/asset_movement_override.js" }