Skip to content

Commit

Permalink
feat: asset component capitalization with gl entry creation on submit
Browse files Browse the repository at this point in the history
  • Loading branch information
“rahulgupta8848” committed Jul 25, 2024
1 parent eb7dfd0 commit 54477f8
Show file tree
Hide file tree
Showing 21 changed files with 594 additions and 318 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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
):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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()
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
});
},
});
Loading

0 comments on commit 54477f8

Please sign in to comment.