feat: Allow to make landed cost voucher against the asset item (#19121)
diff --git a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
index 2e1636a..d001a91 100644
--- a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
+++ b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
@@ -15,12 +15,17 @@
for pr in self.get("purchase_receipts"):
if pr.receipt_document_type and pr.receipt_document:
pr_items = frappe.db.sql("""select pr_item.item_code, pr_item.description,
- pr_item.qty, pr_item.base_rate, pr_item.base_amount, pr_item.name, pr_item.cost_center
+ pr_item.qty, pr_item.base_rate, pr_item.base_amount, pr_item.name,
+ pr_item.cost_center, pr_item.asset
from `tab{doctype} Item` pr_item where parent = %s
- and exists(select name from tabItem where name = pr_item.item_code and is_stock_item = 1)
+ and exists(select name from tabItem
+ where name = pr_item.item_code and (is_stock_item = 1 or is_fixed_asset=1))
""".format(doctype=pr.receipt_document_type), pr.receipt_document, as_dict=True)
for d in pr_items:
+ if d.asset and frappe.db.get_value("Asset", d.asset, 'docstatus') == 1:
+ continue
+
item = self.append("items")
item.item_code = d.item_code
item.description = d.description
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index df28bec..0c8e9a0 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -15,6 +15,7 @@
from frappe.model.mapper import get_mapped_doc
from erpnext.buying.utils import check_on_hold_or_closed_status
from erpnext.assets.doctype.asset.asset import get_asset_account, is_cwip_accounting_disabled
+from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account
from six import iteritems
form_grid_templates = {
@@ -278,8 +279,7 @@
d.rejected_warehouse not in warehouse_with_no_account:
warehouse_with_no_account.append(d.warehouse)
- if not is_cwip_accounting_disabled():
- self.get_asset_gl_entry(gl_entries)
+ self.get_asset_gl_entry(gl_entries, expenses_included_in_valuation)
# Cost center-wise amount breakup for other charges included for valuation
valuation_tax = {}
for tax in self.get("taxes"):
@@ -333,15 +333,24 @@
return process_gl_map(gl_entries)
- def get_asset_gl_entry(self, gl_entries):
+ def get_asset_gl_entry(self, gl_entries, expenses_included_in_valuation=None):
+ arbnb_account, cwip_account = None, None
+
+ cwip_disabled = is_cwip_accounting_disabled()
+
+ if not expenses_included_in_valuation:
+ expenses_included_in_valuation = self.get_company_default("expenses_included_in_valuation")
+
for d in self.get("items"):
- if d.is_fixed_asset:
+ if d.is_fixed_asset and not (arbnb_account and cwip_account):
arbnb_account = self.get_company_default("asset_received_but_not_billed")
# CWIP entry
cwip_account = get_asset_account("capital_work_in_progress_account", d.asset,
company = self.company)
+ if d.is_fixed_asset and not cwip_disabled:
+
asset_amount = flt(d.net_amount) + flt(d.item_tax_amount/self.conversion_rate)
base_asset_amount = flt(d.base_net_amount + d.item_tax_amount)
@@ -368,6 +377,36 @@
if asset_rbnb_currency == self.company_currency else asset_amount)
}, item=d))
+ if d.is_fixed_asset and flt(d.landed_cost_voucher_amount):
+ asset_account = (get_asset_category_account(d.asset, 'fixed_asset_account',
+ company = self.company) if cwip_disabled else cwip_account)
+
+ gl_entries.append(self.get_gl_dict({
+ "account": expenses_included_in_valuation,
+ "against": asset_account,
+ "cost_center": d.cost_center,
+ "remarks": self.get("remarks") or _("Accounting Entry for Stock"),
+ "credit": flt(d.landed_cost_voucher_amount),
+ "project": d.project
+ }, item=d))
+
+ gl_entries.append(self.get_gl_dict({
+ "account": asset_account,
+ "against": expenses_included_in_valuation,
+ "cost_center": d.cost_center,
+ "remarks": self.get("remarks") or _("Accounting Entry for Stock"),
+ "debit": flt(d.landed_cost_voucher_amount),
+ "project": d.project
+ }, item=d))
+
+ if d.asset:
+ doc = frappe.get_doc("Asset", d.asset)
+ frappe.db.set_value("Asset", d.asset, "gross_purchase_amount",
+ doc.gross_purchase_amount + flt(d.landed_cost_voucher_amount))
+
+ frappe.db.set_value("Asset", d.asset, "purchase_receipt_amount",
+ doc.purchase_receipt_amount + flt(d.landed_cost_voucher_amount))
+
return gl_entries
def update_status(self, status):