From 2bfa1803e9877abe54fd99e944e0613ad75143d6 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 17 Jan 2018 14:39:05 +0530 Subject: [PATCH] GL Entry on asset sale (#12514) * GL Entry on asset sale * Asset sale test case fixed --- .../doctype/sales_invoice/sales_invoice.py | 26 +++++++++---------- erpnext/assets/doctype/asset/asset.py | 22 +++++++++------- erpnext/assets/doctype/asset/depreciation.py | 20 +++++++------- erpnext/assets/doctype/asset/test_asset.py | 3 +-- erpnext/public/js/controllers/transaction.js | 2 +- erpnext/selling/doctype/customer/customer.py | 3 ++- 6 files changed, 40 insertions(+), 36 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index c457f9ad51..477e37d45e 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -675,28 +675,28 @@ class SalesInvoice(SellingController): # income account gl entries for item in self.get("items"): if flt(item.base_net_amount): - account_currency = get_account_currency(item.income_account) - gl_entries.append( - self.get_gl_dict({ - "account": item.income_account, - "against": self.customer, - "credit": item.base_net_amount, - "credit_in_account_currency": item.base_net_amount \ - if account_currency==self.company_currency else item.net_amount, - "cost_center": item.cost_center - }, account_currency) - ) - if item.is_fixed_asset: asset = frappe.get_doc("Asset", item.asset) - fixed_asset_gl_entries = get_gl_entries_on_asset_disposal(asset, is_sale=True) + fixed_asset_gl_entries = get_gl_entries_on_asset_disposal(asset, item.base_net_amount) for gle in fixed_asset_gl_entries: gle["against"] = self.customer gl_entries.append(self.get_gl_dict(gle)) asset.db_set("disposal_date", self.posting_date) asset.set_status("Sold" if self.docstatus==1 else None) + else: + account_currency = get_account_currency(item.income_account) + gl_entries.append( + self.get_gl_dict({ + "account": item.income_account, + "against": self.customer, + "credit": item.base_net_amount, + "credit_in_account_currency": item.base_net_amount \ + if account_currency==self.company_currency else item.net_amount, + "cost_center": item.cost_center + }, account_currency) + ) # expense account gl entries if cint(self.update_stock) and \ diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index 857aadef61..8bba0b6936 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -51,9 +51,6 @@ class Asset(Document): if not self.get(field): self.set(field, value) - self.value_after_depreciation = (flt(self.gross_purchase_amount) - - flt(self.opening_accumulated_depreciation)) - def validate_asset_values(self): if flt(self.expected_value_after_useful_life) >= flt(self.gross_purchase_amount): frappe.throw(_("Expected Value After Useful Life must be less than Gross Purchase Amount")) @@ -61,7 +58,10 @@ class Asset(Document): if not flt(self.gross_purchase_amount): frappe.throw(_("Gross Purchase Amount is mandatory"), frappe.MandatoryError) - if not self.is_existing_asset and self.calculate_depreciation: + if not self.calculate_depreciation: + return + + if not self.is_existing_asset: self.opening_accumulated_depreciation = 0 self.number_of_depreciations_booked = 0 if not self.next_depreciation_date: @@ -81,6 +81,9 @@ class Asset(Document): if cint(self.number_of_depreciations_booked) > cint(self.total_number_of_depreciations): frappe.throw(_("Number of Depreciations Booked cannot be greater than Total Number of Depreciations")) + self.value_after_depreciation = (flt(self.gross_purchase_amount) - + flt(self.opening_accumulated_depreciation)) + if self.next_depreciation_date and getdate(self.next_depreciation_date) < getdate(nowdate()): frappe.msgprint(_("Next Depreciation Date is entered as past date"), title=_('Warning'), indicator='red') @@ -106,12 +109,13 @@ class Asset(Document): n * cint(self.frequency_of_depreciation)) depreciation_amount = self.get_depreciation_amount(value_after_depreciation) - value_after_depreciation -= flt(depreciation_amount) + if depreciation_amount: + value_after_depreciation -= flt(depreciation_amount) - self.append("schedules", { - "schedule_date": schedule_date, - "depreciation_amount": depreciation_amount - }) + self.append("schedules", { + "schedule_date": schedule_date, + "depreciation_amount": depreciation_amount + }) def set_accumulated_depreciation(self): accumulated_depreciation = flt(self.opening_accumulated_depreciation) diff --git a/erpnext/assets/doctype/asset/depreciation.py b/erpnext/assets/doctype/asset/depreciation.py index c72cb968da..92a251e4fa 100644 --- a/erpnext/assets/doctype/asset/depreciation.py +++ b/erpnext/assets/doctype/asset/depreciation.py @@ -151,13 +151,11 @@ def restore_asset(asset_name): asset.set_status() @frappe.whitelist() -def get_gl_entries_on_asset_disposal(asset, is_sale=False): +def get_gl_entries_on_asset_disposal(asset, selling_amount=0): fixed_asset_account, accumulated_depr_account, depr_expense_account = get_depreciation_accounts(asset) - accumulated_depr_amount = flt(asset.gross_purchase_amount) - flt(asset.value_after_depreciation) + disposal_account, depreciation_cost_center = get_disposal_account_and_cost_center(asset.company) - expense_account, cost_center = get_disposal_account_and_cost_center(asset.company) - if is_sale: - expense_account = depr_expense_account + accumulated_depr_amount = flt(asset.gross_purchase_amount) - flt(asset.value_after_depreciation) gl_entries = [ { @@ -172,12 +170,14 @@ def get_gl_entries_on_asset_disposal(asset, is_sale=False): } ] - if flt(asset.value_after_depreciation): + profit_amount = flt(selling_amount) - flt(asset.value_after_depreciation) + if profit_amount: + debit_or_credit = "debit" if profit_amount < 0 else "credit" gl_entries.append({ - "account": expense_account, - "cost_center": cost_center, - "debit": flt(asset.value_after_depreciation), - "debit_in_account_currency": flt(asset.value_after_depreciation) + "account": disposal_account, + "cost_center": depreciation_cost_center, + debit_or_credit: abs(profit_amount), + debit_or_credit + "_in_account_currency": abs(profit_amount) }) return gl_entries diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py index 107ffec038..76c46cff7a 100644 --- a/erpnext/assets/doctype/asset/test_asset.py +++ b/erpnext/assets/doctype/asset/test_asset.py @@ -234,9 +234,8 @@ class TestAsset(unittest.TestCase): expected_gle = ( ("_Test Accumulated Depreciations - _TC", 30000.0, 0.0), - ("_Test Depreciations - _TC", 70000.0, 0.0), ("_Test Fixed Asset - _TC", 0.0, 100000.0), - ("_Test Gain/Loss on Asset Disposal - _TC", 0.0, 25000.0), + ("_Test Gain/Loss on Asset Disposal - _TC", 45000.0, 0.0), ("Debtors - _TC", 25000.0, 0.0) ) diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index e198c7eecf..c37a61739e 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -549,7 +549,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ final_message = final_message + message1; } - if (this.frm.doc.payment_schedule.length) { + if ((this.frm.doc.payment_schedule || []).length) { message2 = "Payment Schedule Table"; if (message1.length !== 0) message2 = " and " + message2; final_message = final_message + message2; diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py index 6c9e4501f8..eaa82b3713 100644 --- a/erpnext/selling/doctype/customer/customer.py +++ b/erpnext/selling/doctype/customer/customer.py @@ -146,7 +146,8 @@ class Customer(TransactionBase): frappe.throw(_("A Customer Group exists with same name please change the Customer name or rename the Customer Group"), frappe.NameError) def validate_credit_limit_on_change(self): - if self.get("__islocal") or self.credit_limit == frappe.db.get_value("Customer", self.name, "credit_limit"): + if self.get("__islocal") or not self.credit_limit \ + or self.credit_limit == frappe.db.get_value("Customer", self.name, "credit_limit"): return for company in frappe.get_all("Company"):