fix: incorrect serial and batch get reserved

This commit is contained in:
s-aga-r 2023-10-19 19:57:50 +05:30
parent 961d2d9926
commit 45395027d3
4 changed files with 47 additions and 24 deletions

View File

@ -3,6 +3,7 @@
import json
from typing import Literal
import frappe
import frappe.utils
@ -534,14 +535,24 @@ class SalesOrder(SellingController):
return False
@frappe.whitelist()
def create_stock_reservation_entries(self, items_details=None, notify=True) -> None:
def create_stock_reservation_entries(
self,
items_details: list[dict] = None,
from_voucher_type: Literal["Pick List", "Purchase Receipt"] = None,
notify=True,
) -> None:
"""Creates Stock Reservation Entries for Sales Order Items."""
from erpnext.stock.doctype.stock_reservation_entry.stock_reservation_entry import (
create_stock_reservation_entries_for_so_items as create_stock_reservation_entries,
)
create_stock_reservation_entries(sales_order=self, items_details=items_details, notify=notify)
create_stock_reservation_entries(
sales_order=self,
items_details=items_details,
from_voucher_type=from_voucher_type,
notify=notify,
)
@frappe.whitelist()
def cancel_stock_reservation_entries(self, sre_list=None, notify=True) -> None:

View File

@ -229,20 +229,27 @@ class PickList(Document):
def create_stock_reservation_entries(self, notify=True) -> None:
"""Creates Stock Reservation Entries for Sales Order Items against Pick List."""
from erpnext.stock.doctype.stock_reservation_entry.stock_reservation_entry import (
create_stock_reservation_entries_for_so_items,
)
so_details = {}
so_items_details_map = {}
for location in self.locations:
if location.warehouse and location.sales_order and location.sales_order_item:
so_details.setdefault(location.sales_order, []).append(location)
item_details = {
"name": location.sales_order_item,
"item_code": location.item_code,
"warehouse": location.warehouse,
"qty_to_reserve": (flt(location.picked_qty) - flt(location.stock_reserved_qty)),
"from_voucher_no": location.parent,
"from_voucher_detail_no": location.name,
"serial_and_batch_bundle": location.serial_and_batch_bundle,
}
so_items_details_map.setdefault(location.sales_order, []).append(item_details)
if so_details:
for so, locations in so_details.items():
if so_items_details_map:
for so, items_details in so_items_details_map.items():
so_doc = frappe.get_doc("Sales Order", so)
create_stock_reservation_entries_for_so_items(
sales_order=so_doc, items_details=locations, from_voucher_type="Pick List", notify=notify
so_doc.create_stock_reservation_entries(
items_details=items_details,
from_voucher_type="Pick List",
notify=notify,
)
@frappe.whitelist()

View File

@ -846,14 +846,20 @@ class PurchaseReceipt(BuyingController):
"item_code": item.item_code,
"warehouse": item.warehouse,
"qty_to_reserve": item.stock_qty,
"serial_and_batch_bundle": item.get("serial_and_batch_bundle"),
"from_voucher_no": item.parent,
"from_voucher_detail_no": item.name,
"serial_and_batch_bundle": item.serial_and_batch_bundle,
}
so_items_details_map.setdefault(item.sales_order, []).append(item_details)
if so_items_details_map:
for so, items_details in so_items_details_map.items():
so_doc = frappe.get_doc("Sales Order", so)
so_doc.create_stock_reservation_entries(items_details)
so_doc.create_stock_reservation_entries(
items_details=items_details,
from_voucher_type="Purchase Receipt",
notify=True,
)
def update_billed_amount_based_on_po(po_details, update_modified=True):

View File

@ -794,22 +794,21 @@ def create_stock_reservation_entries_for_so_items(
items = []
if items_details:
item_field = "sales_order_item" if from_voucher_type == "Pick List" else "name"
for item in items_details:
so_item = frappe.get_doc("Sales Order Item", item.get(item_field))
so_item = frappe.get_doc("Sales Order Item", item.get("name"))
so_item.warehouse = item.get("warehouse")
so_item.qty_to_reserve = (
item.get("picked_qty") - item.get("stock_reserved_qty", 0)
if from_voucher_type == "Pick List"
else (flt(item.get("qty_to_reserve")) * flt(so_item.conversion_factor, 1))
flt(item.get("qty_to_reserve"))
if from_voucher_type in ["Pick List", "Purchase Receipt"]
else (
flt(item.get("qty_to_reserve"))
* (flt(item.get("conversion_factor")) or flt(so_item.conversion_factor) or 1)
)
)
so_item.from_voucher_no = item.get("from_voucher_no")
so_item.from_voucher_detail_no = item.get("from_voucher_detail_no")
so_item.serial_and_batch_bundle = item.get("serial_and_batch_bundle")
if from_voucher_type == "Pick List":
so_item.from_voucher_no = item.get("parent")
so_item.from_voucher_detail_no = item.get("name")
items.append(so_item)
sre_count = 0