Merge pull request #57104 from frappe/mergify/bp/version-15-hotfix/pr-57091

fix(stock): show qty (company) and qty (warehouse) in sales transactions  (backport #57091)
This commit is contained in:
Mihir Kandoi
2026-07-14 12:43:29 +05:30
committed by GitHub
3 changed files with 42 additions and 11 deletions

View File

@@ -280,19 +280,17 @@ erpnext.sales_common = {
set_actual_qty(doc, cdt, cdn) {
let row = locals[cdt][cdn];
let sales_doctypes = ["Sales Invoice", "Delivery Note", "Sales Order"];
let sales_doctypes = ["Sales Invoice", "Delivery Note", "Sales Order", "Quotation"];
if (row.item_code && row.warehouse && sales_doctypes.includes(doc.doctype)) {
frappe.call({
return this.frm.call({
method: "erpnext.stock.get_item_details.get_bin_details",
child: row,
args: {
item_code: row.item_code,
warehouse: row.warehouse,
},
callback(r) {
if (r.message) {
frappe.model.set_value(cdt, cdn, "actual_qty", r.message.actual_qty);
}
company: doc.company,
include_child_warehouses: true,
},
});
}

View File

@@ -177,10 +177,9 @@ def update_bin_details(args, out, doc):
out.update(get_bin_details(args.item_code, args.get("from_warehouse")))
elif out.get("warehouse"):
company = args.company if (doc and doc.get("doctype") == "Purchase Order") else None
# calculate company_total_stock only for po
bin_details = get_bin_details(args.item_code, out.warehouse, company, include_child_warehouses=True)
bin_details = get_bin_details(
args.item_code, out.warehouse, args.company, include_child_warehouses=True
)
out.update(bin_details)

View File

@@ -35,6 +35,40 @@ class TestGetItemDetail(FrappeTestCase):
details = get_item_details(args)
self.assertEqual(details.get("price_list_rate"), 100)
def test_bin_details_for_selling_doctypes(self):
from erpnext.stock.doctype.item.test_item import make_item
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt
item_code = make_item(properties={"is_stock_item": 1}).name
make_purchase_receipt(item_code=item_code, warehouse="_Test Warehouse - _TC", qty=100, rate=100)
make_purchase_receipt(item_code=item_code, warehouse="_Test Warehouse 1 - _TC", qty=50, rate=100)
args = frappe._dict(
{
"item_code": item_code,
"warehouse": "_Test Warehouse - _TC",
"company": "_Test Company",
"customer": "_Test Customer",
"currency": "INR",
"conversion_rate": 1.0,
"price_list": "_Test Price List",
"price_list_currency": "INR",
"plc_conversion_rate": 1.0,
"transaction_date": None,
"name": None,
"ignore_pricing_rule": 1,
"qty": 1,
}
)
for doctype in ("Sales Order", "Quotation", "Sales Invoice", "Delivery Note", "Purchase Order"):
with self.subTest(doctype=doctype):
details = get_item_details(args.copy().update({"doctype": doctype}))
self.assertEqual(details.get("actual_qty"), 100)
self.assertEqual(details.get("company_total_stock"), 150)
def test_fetch_asset_category_expense_account_on_purchase_receipt(self):
from erpnext.stock.doctype.item.test_item import make_item