diff --git a/erpnext/stock/deprecated_serial_batch.py b/erpnext/stock/deprecated_serial_batch.py index bae60c26344..dd7a3830c9b 100644 --- a/erpnext/stock/deprecated_serial_batch.py +++ b/erpnext/stock/deprecated_serial_batch.py @@ -97,6 +97,7 @@ class DeprecatedBatchNoValuation: for ledger in entries: self.stock_value_differece[ledger.batch_no] += flt(ledger.batch_value) self.available_qty[ledger.batch_no] += flt(ledger.batch_qty) + self.total_qty[ledger.batch_no] += flt(ledger.batch_qty) @deprecated( "erpnext.stock.serial_batch_bundle.BatchNoValuation.get_sle_for_batches", @@ -270,6 +271,7 @@ class DeprecatedBatchNoValuation: batch_data = query.run(as_dict=True) for d in batch_data: self.available_qty[d.batch_no] += flt(d.batch_qty) + self.total_qty[d.batch_no] += flt(d.batch_qty) for d in batch_data: if self.available_qty.get(d.batch_no): @@ -381,6 +383,7 @@ class DeprecatedBatchNoValuation: batch_data = query.run(as_dict=True) for d in batch_data: self.available_qty[d.batch_no] += flt(d.batch_qty) + self.total_qty[d.batch_no] += flt(d.batch_qty) if not self.last_sle: return diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py index 4bf408839eb..bde9e3fb864 100644 --- a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py +++ b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py @@ -519,12 +519,15 @@ class SerialandBatchBundle(Document): else: d.incoming_rate = abs(flt(sn_obj.batch_avg_rate.get(d.batch_no))) - available_qty = flt(sn_obj.available_qty.get(d.batch_no), d.precision("qty")) - if self.docstatus == 1: - available_qty += flt(d.qty, d.precision("qty")) + precision = d.precision("qty") + for field in ["available_qty", "total_qty"]: + value = getattr(sn_obj, field) + available_qty = flt(value.get(d.batch_no), precision) + if self.docstatus == 1: + available_qty += flt(d.qty, precision) - if not allow_negative_stock: - self.validate_negative_batch(d.batch_no, available_qty) + if not allow_negative_stock: + self.validate_negative_batch(d.batch_no, available_qty) d.stock_value_difference = flt(d.qty) * flt(d.incoming_rate) diff --git a/erpnext/stock/serial_batch_bundle.py b/erpnext/stock/serial_batch_bundle.py index 2e9943578b4..19f3c0ee598 100644 --- a/erpnext/stock/serial_batch_bundle.py +++ b/erpnext/stock/serial_batch_bundle.py @@ -3,6 +3,7 @@ from collections import defaultdict import frappe from frappe import _, bold from frappe.model.naming import make_autoname +from frappe.query_builder import Case from frappe.query_builder.functions import CombineDatetime, Sum, Timestamp from frappe.utils import add_days, cint, cstr, flt, get_link_to_form, getdate, now, nowtime, today from pypika import Order @@ -716,6 +717,7 @@ class BatchNoValuation(DeprecatedBatchNoValuation): for key, value in kwargs.items(): setattr(self, key, value) + self.total_qty = defaultdict(float) self.stock_queue = [] self.batch_nos = self.get_batch_nos() self.prepare_batches() @@ -737,6 +739,7 @@ class BatchNoValuation(DeprecatedBatchNoValuation): for ledger in entries: self.stock_value_differece[ledger.batch_no] += flt(ledger.incoming_rate) self.available_qty[ledger.batch_no] += flt(ledger.qty) + self.total_qty[ledger.batch_no] += flt(ledger.total_qty) self.calculate_avg_rate_from_deprecarated_ledgers() self.calculate_avg_rate_for_non_batchwise_valuation() @@ -764,13 +767,16 @@ class BatchNoValuation(DeprecatedBatchNoValuation): .on(parent.name == child.parent) .select( child.batch_no, - Sum(child.stock_value_difference).as_("incoming_rate"), - Sum(child.qty).as_("qty"), + Sum(Case().when(timestamp_condition, child.stock_value_difference).else_(0)).as_( + "incoming_rate" + ), + Sum(Case().when(timestamp_condition, child.qty).else_(0)).as_("qty"), + Sum(child.qty).as_("total_qty"), ) .where( - (child.batch_no.isin(self.batchwise_valuation_batches)) - & (parent.warehouse == self.sle.warehouse) + (parent.warehouse == self.sle.warehouse) & (parent.item_code == self.sle.item_code) + & (child.batch_no.isin(self.batchwise_valuation_batches)) & (parent.docstatus == 1) & (parent.is_cancelled == 0) & (parent.type_of_transaction.isin(["Inward", "Outward"])) @@ -786,8 +792,6 @@ class BatchNoValuation(DeprecatedBatchNoValuation): query = query.where(parent.voucher_no != self.sle.voucher_no) query = query.where(parent.voucher_type != "Pick List") - if timestamp_condition: - query = query.where(timestamp_condition) return query.run(as_dict=True)