GL Entry on asset sale (#12514)
* GL Entry on asset sale * Asset sale test case fixed
This commit is contained in:
parent
b44ef0b249
commit
2bfa1803e9
@ -675,28 +675,28 @@ class SalesInvoice(SellingController):
|
|||||||
# income account gl entries
|
# income account gl entries
|
||||||
for item in self.get("items"):
|
for item in self.get("items"):
|
||||||
if flt(item.base_net_amount):
|
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:
|
if item.is_fixed_asset:
|
||||||
asset = frappe.get_doc("Asset", item.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:
|
for gle in fixed_asset_gl_entries:
|
||||||
gle["against"] = self.customer
|
gle["against"] = self.customer
|
||||||
gl_entries.append(self.get_gl_dict(gle))
|
gl_entries.append(self.get_gl_dict(gle))
|
||||||
|
|
||||||
asset.db_set("disposal_date", self.posting_date)
|
asset.db_set("disposal_date", self.posting_date)
|
||||||
asset.set_status("Sold" if self.docstatus==1 else None)
|
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
|
# expense account gl entries
|
||||||
if cint(self.update_stock) and \
|
if cint(self.update_stock) and \
|
||||||
|
@ -51,9 +51,6 @@ class Asset(Document):
|
|||||||
if not self.get(field):
|
if not self.get(field):
|
||||||
self.set(field, value)
|
self.set(field, value)
|
||||||
|
|
||||||
self.value_after_depreciation = (flt(self.gross_purchase_amount) -
|
|
||||||
flt(self.opening_accumulated_depreciation))
|
|
||||||
|
|
||||||
def validate_asset_values(self):
|
def validate_asset_values(self):
|
||||||
if flt(self.expected_value_after_useful_life) >= flt(self.gross_purchase_amount):
|
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"))
|
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):
|
if not flt(self.gross_purchase_amount):
|
||||||
frappe.throw(_("Gross Purchase Amount is mandatory"), frappe.MandatoryError)
|
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.opening_accumulated_depreciation = 0
|
||||||
self.number_of_depreciations_booked = 0
|
self.number_of_depreciations_booked = 0
|
||||||
if not self.next_depreciation_date:
|
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):
|
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"))
|
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()):
|
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')
|
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))
|
n * cint(self.frequency_of_depreciation))
|
||||||
|
|
||||||
depreciation_amount = self.get_depreciation_amount(value_after_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", {
|
self.append("schedules", {
|
||||||
"schedule_date": schedule_date,
|
"schedule_date": schedule_date,
|
||||||
"depreciation_amount": depreciation_amount
|
"depreciation_amount": depreciation_amount
|
||||||
})
|
})
|
||||||
|
|
||||||
def set_accumulated_depreciation(self):
|
def set_accumulated_depreciation(self):
|
||||||
accumulated_depreciation = flt(self.opening_accumulated_depreciation)
|
accumulated_depreciation = flt(self.opening_accumulated_depreciation)
|
||||||
|
@ -151,13 +151,11 @@ def restore_asset(asset_name):
|
|||||||
asset.set_status()
|
asset.set_status()
|
||||||
|
|
||||||
@frappe.whitelist()
|
@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)
|
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)
|
accumulated_depr_amount = flt(asset.gross_purchase_amount) - flt(asset.value_after_depreciation)
|
||||||
if is_sale:
|
|
||||||
expense_account = depr_expense_account
|
|
||||||
|
|
||||||
gl_entries = [
|
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({
|
gl_entries.append({
|
||||||
"account": expense_account,
|
"account": disposal_account,
|
||||||
"cost_center": cost_center,
|
"cost_center": depreciation_cost_center,
|
||||||
"debit": flt(asset.value_after_depreciation),
|
debit_or_credit: abs(profit_amount),
|
||||||
"debit_in_account_currency": flt(asset.value_after_depreciation)
|
debit_or_credit + "_in_account_currency": abs(profit_amount)
|
||||||
})
|
})
|
||||||
|
|
||||||
return gl_entries
|
return gl_entries
|
||||||
|
@ -234,9 +234,8 @@ class TestAsset(unittest.TestCase):
|
|||||||
|
|
||||||
expected_gle = (
|
expected_gle = (
|
||||||
("_Test Accumulated Depreciations - _TC", 30000.0, 0.0),
|
("_Test Accumulated Depreciations - _TC", 30000.0, 0.0),
|
||||||
("_Test Depreciations - _TC", 70000.0, 0.0),
|
|
||||||
("_Test Fixed Asset - _TC", 0.0, 100000.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)
|
("Debtors - _TC", 25000.0, 0.0)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -549,7 +549,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
|||||||
final_message = final_message + message1;
|
final_message = final_message + message1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.frm.doc.payment_schedule.length) {
|
if ((this.frm.doc.payment_schedule || []).length) {
|
||||||
message2 = "Payment Schedule Table";
|
message2 = "Payment Schedule Table";
|
||||||
if (message1.length !== 0) message2 = " and " + message2;
|
if (message1.length !== 0) message2 = " and " + message2;
|
||||||
final_message = final_message + message2;
|
final_message = final_message + message2;
|
||||||
|
@ -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)
|
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):
|
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
|
return
|
||||||
|
|
||||||
for company in frappe.get_all("Company"):
|
for company in frappe.get_all("Company"):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user