mirror of
https://github.com/frappe/erpnext.git
synced 2026-02-16 08:05:00 +00:00
Merge pull request #42247 from ruthra-kumar/fix_purchase_receipt_tax_on_stock_rbnb
fix: don't merge tax into stock account on purchase receipt repost
This commit is contained in:
@@ -776,7 +776,6 @@ class PurchaseReceipt(BuyingController):
|
||||
|
||||
def make_tax_gl_entries(self, gl_entries, via_landed_cost_voucher=False):
|
||||
negative_expense_to_be_booked = sum([flt(d.item_tax_amount) for d in self.get("items")])
|
||||
is_asset_pr = any(d.is_fixed_asset for d in self.get("items"))
|
||||
# Cost center-wise amount breakup for other charges included for valuation
|
||||
valuation_tax = {}
|
||||
for tax in self.get("taxes"):
|
||||
@@ -801,26 +800,10 @@ class PurchaseReceipt(BuyingController):
|
||||
against_accounts = ", ".join([d.account for d in gl_entries if flt(d.debit) > 0])
|
||||
total_valuation_amount = sum(valuation_tax.values())
|
||||
amount_including_divisional_loss = negative_expense_to_be_booked
|
||||
stock_rbnb = (
|
||||
self.get("asset_received_but_not_billed")
|
||||
if is_asset_pr
|
||||
else self.get_company_default("stock_received_but_not_billed")
|
||||
)
|
||||
i = 1
|
||||
for tax in self.get("taxes"):
|
||||
if valuation_tax.get(tax.name):
|
||||
if via_landed_cost_voucher or self.is_landed_cost_booked_for_any_item():
|
||||
account = tax.account_head
|
||||
else:
|
||||
negative_expense_booked_in_pi = 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, tax.account_head),
|
||||
)
|
||||
account = stock_rbnb if negative_expense_booked_in_pi else tax.account_head
|
||||
|
||||
account = tax.account_head
|
||||
if i == len(valuation_tax):
|
||||
applicable_amount = amount_including_divisional_loss
|
||||
else:
|
||||
|
||||
@@ -3211,6 +3211,110 @@ class TestPurchaseReceipt(FrappeTestCase):
|
||||
lcv.save().submit()
|
||||
return lcv
|
||||
|
||||
def test_tax_account_heads_on_item_repost_without_lcv(self):
|
||||
"""
|
||||
PO -> PR -> PI
|
||||
Backdated `Repost Item valuation` should not merge tax account heads into stock_rbnb if Purchase Receipt was created first
|
||||
This scenario is without LCV
|
||||
"""
|
||||
from erpnext.accounts.doctype.account.test_account import create_account
|
||||
from erpnext.buying.doctype.purchase_order.test_purchase_order import (
|
||||
create_purchase_order,
|
||||
make_pr_against_po,
|
||||
)
|
||||
from erpnext.stock.doctype.purchase_receipt.purchase_receipt import make_purchase_invoice
|
||||
|
||||
stock_rbnb = "Stock Received But Not Billed - _TC"
|
||||
stock_in_hand = "Stock In Hand - _TC"
|
||||
test_cc = "_Test Cost Center - _TC"
|
||||
test_company = "_Test Company"
|
||||
creditors = "Creditors - _TC"
|
||||
|
||||
company_doc = frappe.get_doc("Company", test_company)
|
||||
company_doc.enable_perpetual_inventory = True
|
||||
company_doc.stock_received_but_not_billed = stock_rbnb
|
||||
company_doc.default_inventory_account = stock_in_hand
|
||||
company_doc.save()
|
||||
|
||||
packaging_charges_account = create_account(
|
||||
account_name="Packaging Charges",
|
||||
parent_account="Indirect Expenses - _TC",
|
||||
company=test_company,
|
||||
account_type="Tax",
|
||||
)
|
||||
|
||||
po = create_purchase_order(qty=10, rate=100, do_not_save=1)
|
||||
po.taxes = []
|
||||
po.append(
|
||||
"taxes",
|
||||
{
|
||||
"category": "Valuation and Total",
|
||||
"account_head": packaging_charges_account,
|
||||
"cost_center": test_cc,
|
||||
"description": "Test",
|
||||
"add_deduct_tax": "Add",
|
||||
"charge_type": "Actual",
|
||||
"tax_amount": 250,
|
||||
},
|
||||
)
|
||||
po.save().submit()
|
||||
|
||||
pr = make_pr_against_po(po.name, received_qty=10)
|
||||
pr_gl_entries = get_gl_entries(pr.doctype, pr.name, skip_cancelled=True)
|
||||
expected_pr_gles = [
|
||||
{"account": stock_rbnb, "debit": 0.0, "credit": 1000.0, "cost_center": test_cc},
|
||||
{"account": stock_in_hand, "debit": 1250.0, "credit": 0.0, "cost_center": test_cc},
|
||||
{"account": packaging_charges_account, "debit": 0.0, "credit": 250.0, "cost_center": test_cc},
|
||||
]
|
||||
self.assertEqual(expected_pr_gles, pr_gl_entries)
|
||||
|
||||
# Make PI against Purchase Receipt
|
||||
pi = make_purchase_invoice(pr.name).save().submit()
|
||||
pi_gl_entries = get_gl_entries(pi.doctype, pi.name, skip_cancelled=True)
|
||||
expected_pi_gles = [
|
||||
{"account": stock_rbnb, "debit": 1000.0, "credit": 0.0, "cost_center": test_cc},
|
||||
{"account": packaging_charges_account, "debit": 250.0, "credit": 0.0, "cost_center": test_cc},
|
||||
{"account": creditors, "debit": 0.0, "credit": 1250.0, "cost_center": None},
|
||||
]
|
||||
self.assertEqual(expected_pi_gles, pi_gl_entries)
|
||||
|
||||
# Trigger Repost Item Valudation on a older date
|
||||
repost_doc = frappe.get_doc(
|
||||
{
|
||||
"doctype": "Repost Item Valuation",
|
||||
"based_on": "Item and Warehouse",
|
||||
"item_code": pr.items[0].item_code,
|
||||
"warehouse": pr.items[0].warehouse,
|
||||
"posting_date": add_days(pr.posting_date, -1),
|
||||
"posting_time": "00:00:00",
|
||||
"company": pr.company,
|
||||
"allow_negative_stock": 1,
|
||||
"via_landed_cost_voucher": 0,
|
||||
"allow_zero_rate": 0,
|
||||
}
|
||||
)
|
||||
repost_doc.save().submit()
|
||||
|
||||
pr_gles_after_repost = get_gl_entries(pr.doctype, pr.name, skip_cancelled=True)
|
||||
expected_pr_gles_after_repost = [
|
||||
{"account": stock_rbnb, "debit": 0.0, "credit": 1000.0, "cost_center": test_cc},
|
||||
{"account": stock_in_hand, "debit": 1250.0, "credit": 0.0, "cost_center": test_cc},
|
||||
{"account": packaging_charges_account, "debit": 0.0, "credit": 250.0, "cost_center": test_cc},
|
||||
]
|
||||
self.assertEqual(len(pr_gles_after_repost), len(expected_pr_gles_after_repost))
|
||||
self.assertEqual(expected_pr_gles_after_repost, pr_gles_after_repost)
|
||||
|
||||
# teardown
|
||||
pi.reload()
|
||||
pi.cancel()
|
||||
pr.reload()
|
||||
pr.cancel()
|
||||
|
||||
company_doc.enable_perpetual_inventory = False
|
||||
company_doc.stock_received_but_not_billed = None
|
||||
company_doc.default_inventory_account = None
|
||||
company_doc.save()
|
||||
|
||||
def test_do_not_use_batchwise_valuation_rate(self):
|
||||
from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
|
||||
|
||||
|
||||
Reference in New Issue
Block a user