Merge pull request #34808 from rohitwaghchaure/fixed-reposting-issue-for-stock-reco
fix: reposting record not created for backdated stock reconciliation
This commit is contained in:
commit
2f9856436e
@ -5,7 +5,7 @@ from typing import Optional
|
|||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
from frappe import _, bold, msgprint
|
from frappe import _, bold, msgprint
|
||||||
from frappe.query_builder.functions import Sum
|
from frappe.query_builder.functions import CombineDatetime, Sum
|
||||||
from frappe.utils import cint, cstr, flt
|
from frappe.utils import cint, cstr, flt
|
||||||
|
|
||||||
import erpnext
|
import erpnext
|
||||||
@ -575,7 +575,9 @@ class StockReconciliation(StockController):
|
|||||||
if not (row.item_code == item_code and row.batch_no == batch_no):
|
if not (row.item_code == item_code and row.batch_no == batch_no):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
row.current_qty = get_batch_qty_for_stock_reco(item_code, row.warehouse, batch_no)
|
row.current_qty = get_batch_qty_for_stock_reco(
|
||||||
|
item_code, row.warehouse, batch_no, self.posting_date, self.posting_time, self.name
|
||||||
|
)
|
||||||
|
|
||||||
qty, val_rate = get_stock_balance(
|
qty, val_rate = get_stock_balance(
|
||||||
item_code,
|
item_code,
|
||||||
@ -596,7 +598,9 @@ class StockReconciliation(StockController):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_batch_qty_for_stock_reco(item_code, warehouse, batch_no):
|
def get_batch_qty_for_stock_reco(
|
||||||
|
item_code, warehouse, batch_no, posting_date, posting_time, voucher_no
|
||||||
|
):
|
||||||
ledger = frappe.qb.DocType("Stock Ledger Entry")
|
ledger = frappe.qb.DocType("Stock Ledger Entry")
|
||||||
|
|
||||||
query = (
|
query = (
|
||||||
@ -610,6 +614,12 @@ def get_batch_qty_for_stock_reco(item_code, warehouse, batch_no):
|
|||||||
& (ledger.docstatus == 1)
|
& (ledger.docstatus == 1)
|
||||||
& (ledger.is_cancelled == 0)
|
& (ledger.is_cancelled == 0)
|
||||||
& (ledger.batch_no == batch_no)
|
& (ledger.batch_no == batch_no)
|
||||||
|
& (ledger.posting_date <= posting_date)
|
||||||
|
& (
|
||||||
|
CombineDatetime(ledger.posting_date, ledger.posting_time)
|
||||||
|
<= CombineDatetime(posting_date, posting_time)
|
||||||
|
)
|
||||||
|
& (ledger.voucher_no != voucher_no)
|
||||||
)
|
)
|
||||||
.groupby(ledger.batch_no)
|
.groupby(ledger.batch_no)
|
||||||
)
|
)
|
||||||
|
@ -676,6 +676,79 @@ class TestStockReconciliation(FrappeTestCase, StockTestMixin):
|
|||||||
self.assertEqual(flt(sl_entry.actual_qty), 1.0)
|
self.assertEqual(flt(sl_entry.actual_qty), 1.0)
|
||||||
self.assertEqual(flt(sl_entry.qty_after_transaction), 1.0)
|
self.assertEqual(flt(sl_entry.qty_after_transaction), 1.0)
|
||||||
|
|
||||||
|
def test_backdated_stock_reco_entry(self):
|
||||||
|
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
|
||||||
|
|
||||||
|
item_code = self.make_item(
|
||||||
|
"Test New Batch Item ABCV",
|
||||||
|
{
|
||||||
|
"is_stock_item": 1,
|
||||||
|
"has_batch_no": 1,
|
||||||
|
"batch_number_series": "BNS9.####",
|
||||||
|
"create_new_batch": 1,
|
||||||
|
},
|
||||||
|
).name
|
||||||
|
|
||||||
|
warehouse = "_Test Warehouse - _TC"
|
||||||
|
|
||||||
|
# Added 100 Qty, Balace Qty 100
|
||||||
|
se1 = make_stock_entry(
|
||||||
|
item_code=item_code, posting_time="09:00:00", target=warehouse, qty=100, basic_rate=700
|
||||||
|
)
|
||||||
|
|
||||||
|
# Removed 50 Qty, Balace Qty 50
|
||||||
|
se2 = make_stock_entry(
|
||||||
|
item_code=item_code,
|
||||||
|
batch_no=se1.items[0].batch_no,
|
||||||
|
posting_time="10:00:00",
|
||||||
|
source=warehouse,
|
||||||
|
qty=50,
|
||||||
|
basic_rate=700,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Stock Reco for 100, Balace Qty 100
|
||||||
|
stock_reco = create_stock_reconciliation(
|
||||||
|
item_code=item_code,
|
||||||
|
posting_time="11:00:00",
|
||||||
|
warehouse=warehouse,
|
||||||
|
batch_no=se1.items[0].batch_no,
|
||||||
|
qty=100,
|
||||||
|
rate=100,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Removed 50 Qty, Balace Qty 50
|
||||||
|
make_stock_entry(
|
||||||
|
item_code=item_code,
|
||||||
|
batch_no=se1.items[0].batch_no,
|
||||||
|
posting_time="12:00:00",
|
||||||
|
source=warehouse,
|
||||||
|
qty=50,
|
||||||
|
basic_rate=700,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertFalse(frappe.db.exists("Repost Item Valuation", {"voucher_no": stock_reco.name}))
|
||||||
|
|
||||||
|
# Cancel the backdated Stock Entry se2,
|
||||||
|
# Since Stock Reco entry in the future the Balace Qty should remain as it's (50)
|
||||||
|
|
||||||
|
se2.cancel()
|
||||||
|
|
||||||
|
self.assertTrue(frappe.db.exists("Repost Item Valuation", {"voucher_no": stock_reco.name}))
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
frappe.db.get_value("Repost Item Valuation", {"voucher_no": stock_reco.name}, "status"),
|
||||||
|
"Completed",
|
||||||
|
)
|
||||||
|
|
||||||
|
sle = frappe.get_all(
|
||||||
|
"Stock Ledger Entry",
|
||||||
|
filters={"item_code": item_code, "warehouse": warehouse, "is_cancelled": 0},
|
||||||
|
fields=["qty_after_transaction"],
|
||||||
|
order_by="posting_time desc, creation desc",
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(flt(sle[0].qty_after_transaction), flt(50.0))
|
||||||
|
|
||||||
|
|
||||||
def create_batch_item_with_batch(item_name, batch_id):
|
def create_batch_item_with_batch(item_name, batch_id):
|
||||||
batch_item_doc = create_item(item_name, is_stock_item=1)
|
batch_item_doc = create_item(item_name, is_stock_item=1)
|
||||||
|
@ -1375,6 +1375,7 @@ def regenerate_sle_for_batch_stock_reco(detail):
|
|||||||
doc.recalculate_current_qty(detail.item_code, detail.batch_no)
|
doc.recalculate_current_qty(detail.item_code, detail.batch_no)
|
||||||
doc.docstatus = 1
|
doc.docstatus = 1
|
||||||
doc.update_stock_ledger()
|
doc.update_stock_ledger()
|
||||||
|
doc.repost_future_sle_and_gle()
|
||||||
|
|
||||||
|
|
||||||
def get_stock_reco_qty_shift(args):
|
def get_stock_reco_qty_shift(args):
|
||||||
|
Loading…
Reference in New Issue
Block a user