diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 3b6ad82cdc0..27f2064bef3 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -316,16 +316,25 @@ class PurchaseInvoice(BuyingController): stock_item_and_auto_accounting_for_stock = False stock_items = self.get_stock_items() for item in self.get("entries"): - if auto_accounting_for_stock and item.item_code in stock_items: - if flt(item.valuation_rate): + if flt(item.base_amount): + gl_entries.append( + self.get_gl_dict({ + "account": item.expense_account, + "against": self.credit_to, + "debit": item.base_amount, + "remarks": self.remarks, + "cost_center": item.cost_center + }) + ) + + if auto_accounting_for_stock and item.item_code in stock_items and item.valuation_rate: # if auto inventory accounting enabled and stock item, # then do stock related gl entries # expense will be booked in sales invoice stock_item_and_auto_accounting_for_stock = True - valuation_amt = flt(item.base_amount + item.item_tax_amount, - self.precision("base_amount", item)) - + + gl_entries.append( self.get_gl_dict({ "account": item.expense_account, @@ -352,7 +361,10 @@ class PurchaseInvoice(BuyingController): # this will balance out valuation amount included in cost of goods sold expenses_included_in_valuation = \ self.get_company_default("expenses_included_in_valuation") - + + # Backward compatibility: + # Post expenses_included_in_valuation only if it is not booked in Purchase Receipt + for cost_center, amount in valuation_tax.items(): gl_entries.append( self.get_gl_dict({ diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 4eb355351d2..1f02f361b8d 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -312,7 +312,7 @@ class PurchaseReceipt(BuyingController): "against": warehouse_account[d.warehouse], "cost_center": d.cost_center, "remarks": self.get("remarks") or "Accounting Entry for Stock", - "credit": flt(d.base_amount + d.item_tax_amount, self.precision("base_amount", d)) + "credit": flt(d.base_amount, self.precision("base_amount", d)) })) # Amount added through landed-cost-voucher @@ -338,6 +338,40 @@ class PurchaseReceipt(BuyingController): elif d.warehouse not in warehouse_with_no_account or \ d.rejected_warehouse not in warehouse_with_no_account: warehouse_with_no_account.append(d.warehouse) + + # Cost center-wise amount breakup for other charges included for valuation + valuation_tax = {} + for tax in self.get("other_charges"): + if tax.category in ("Valuation", "Valuation and Total") and flt(tax.tax_amount): + if not tax.cost_center: + frappe.throw(_("Cost Center is required in row {0} in Taxes table for type {1}").format(tax.idx, _(tax.category))) + valuation_tax.setdefault(tax.cost_center, 0) + valuation_tax[tax.cost_center] += \ + (tax.add_deduct_tax == "Add" and 1 or -1) * flt(tax.tax_amount) + + # Backward compatibility: + # If expenses_included_in_valuation account has been credited in against PI + # and charges added via Landed Cost Voucher, + # post valuation related charges on "Stock Received But Not Billed" + + pi_exists = frappe.db.sql("""select name from `tabPurchase Invoice Item` pi + where docstatus = 1 and purchase_receipt=%s + and exists(select name from `tabGL Entry` where voucher_type='Purchase Invoice' + and voucher_no=pi.parent and account=%s)""", (self.name, expenses_included_in_valuation)) + + if pi_exists: + expenses_included_in_valuation = stock_rbnb + + # Expense included in valuation + for cost_center, amount in valuation_tax.items(): + gl_entries.append( + self.get_gl_dict({ + "account": expenses_included_in_valuation, + "cost_center": cost_center, + "credit": amount, + "remarks": self.remarks or "Accounting Entry for Stock" + }) + ) if warehouse_with_no_account: frappe.msgprint(_("No accounting entries for the following warehouses") + ": \n" +