2d8363a983
* feat: add `Has Serial No` and `Has Batch No` fields in SRE * chore: set `Has Serial No` and `Has Batch No` while creating SRE * feat: add field `Reserved Serial and Batch` in SRE * fix(ux): hide `Amend` button on cancelled SRE * fix: add validation for SRE amended doc * fix(ux): hide `Reserved Serial and Batch` Table for non-serial/batch item * fix(ux): set `Display Depends On` for `Has Serial No` and `Has Batch No` in SRE * fix(ux): make `serial_no` and `batch_no` fields read-only based on `has_serial_no` and `has_batch_no` * chore: remove table `Serial and Batch Entry` fieldlabel * fix(ux): set warehouse for new row * fix(ux): make qty field read-only for serial item * fix(ux): set rows qty to `1` before making the field read-only * chore: add filters for serial no * chore: add filters for batch no * chore: don't show Serial NO if already selected * chore: hide rate related fields * feat: add field `Reservation Based On` in SRE * chore: make `Reserved Qty` field editable in SCR * chore: add method to get total reserved qty against a voucher * fix: add validation for `Reserved Qty` * fix: update SRE status and Voucher's Reserved Qty * chore: enable `Track Changes` in SRE * fix: add validation to prevent delivered SRE to get updated * fix(ux): make fields `Reserved Qty` and `Reservation Based On` read-only for delivered SRE * fix: consider voucher's delivered qty while calculating max reserved qty * fix: add UOM validation for SRE Reserved Qty * fix: SRE warehouse mismatch error in DN * fix: auto cancel SRE on update if item is fully delivered for the SO * fix: skip SRE creation for group warehouse * feat: add `Set Warehouse` field in SO stock reservation dialog * fix(ux): hide `Add Row` button in SO stock reservation dialog * fix: group warehouse validation in SO * fix(ux): don't show Batch No if already selected * feat: add field `Auto Reserve Serial and Batch Nos` in `Stock Settings` * refactor: SRE reserved qty validation * feat: auto serial and batch reservation * chore: add section for `Serial and Batch Reservation` in `Stock Settings` * fix: make SRE sb_entries warehouse mandatory * fix(ux): unreserved qty calculation * fix: add validation for `Reserved Qty` against `Batch` * refactor: combine `get_available_qty_to_reserve()` and `get_available_qty_to_reserve_batch()` * fix: validate disabled batch * fix: add validation to validate serial nos availability * fix: update row qty if `Partial Reservation` is enabled * fix: ignore reserved serial nos while getting available serial nos * fix: add validation to prevent repeat batches * fix(ux): add validation for duplicate Serial No * fix: don't allow to update SRE with delivered stock * fix: ignore reserved serial and batch if reservation based on is not Serial and Batch * fix(ux): stock un-reservation confirmation before `Update Items` * chore: return list instead os set * feat: add field `Delivered Qty` in `Serial and Batch Entry` * feat: option to get SO reserved stock in Delivery Note * fix: ignore reserved batches while getting available batches * chore: `conflicts` * fix: incorrect available qty * fix: 'str' object has no attribute 'nodes_' * fix: `linter` * fix(ux): hide `Get Items From > Stock Reservation` if Stock Reservation is disabled * fix(ux): add `depends_on` for `Auto Reserve Serial and Batch Nos` * fix(ux): hide Stock Reservation field description in submitted SO * fix(ux): confirm before unreserve stock * feat: option to create DN for reserved stock from SO * fix: update delivered qty in SRE sb_entries * fix: Delivery Note (Reserved Stock) based on Delivery Date * fix(ux): SO `Update Items` confirmation on `Update` button click * feat: add dialog box to select SRE to unreserve * fix: `ZeroDivisionError` while saving the DN (Reserved Stock) * fix: don't allow to create Pick List if stock is reserved against SO * fix(ux): hide Create > Pick List button for SO with reserved stock * refactor: map reserved stock by default in DN * refactor: code cleanup and comments * fix: don't allow Stock Reservation against SO having Pick List * refactor: `create_stock_reservation_entries()` * feat: add fields to hold Pick List ref in SRE * feat: add field `Stock Reserved Qty` in Pick List Item * feat: provision to reserve stock from Pick List against Sales Order * fix: don't allow to update SRE if created against a Pick List * fix(ux): confirm before unreserve stock in Pick List * fix: don't allow to update Pick List having reserved stock * fix: circular dependency while cancelling the DN created from Pick List with Reserved Stock * chore: update `Max Reserve Qty` err msg to be more descriptive * refactor: rename field `Reserve Stock on Sales Order Submission` * fix: msg on partial reservation if disabled in stock settings * chore: add field description for `Enable Stock Reservation` * fix(test): `test_stock_reservation_against_sales_order` * fix(test): `test_stock_reservation_against_sales_order` * test: add test cases for serial and batch reservation * fix: batch stock levels qty * refactor: method `get_sre_reserved_qty_for_item_and_warehouse` * feat: show `Reserved Stock` in item master stock levels * feat: Reserved Stock Report * fix(ux): SO stock reservation dialogs width * refactor: get previous values from `_doc_before_save` instead of db * fix(ux): make `Reservation Based On` read-only if created against Pick List * feat: option to open `Reserved Stock` report from Sales Order * fix(ux): Sales Order - Reserve and Unreserve dialog box * fix: decrease SRE Delivered Qty on DN cancel * fix(ux): hide `Unreserve` button once reserved stock is delivered * chore: `linter` * fix(test): `test_reserved_stock_report` * test: add test case for DN cancellation * chore: rename field `Auto Reserve Stock on Sales Order Submission` * fix: `Insufficient Stock` error msg
82 lines
2.6 KiB
Python
82 lines
2.6 KiB
Python
import frappe
|
|
from frappe.model.db_query import DatabaseQuery
|
|
from frappe.utils import cint, flt
|
|
|
|
from erpnext.stock.doctype.stock_reservation_entry.stock_reservation_entry import (
|
|
get_sre_reserved_qty_for_item_and_warehouse as get_reserved_stock,
|
|
)
|
|
|
|
|
|
@frappe.whitelist()
|
|
def get_data(
|
|
item_code=None, warehouse=None, item_group=None, start=0, sort_by="actual_qty", sort_order="desc"
|
|
):
|
|
"""Return data to render the item dashboard"""
|
|
filters = []
|
|
if item_code:
|
|
filters.append(["item_code", "=", item_code])
|
|
if warehouse:
|
|
filters.append(["warehouse", "=", warehouse])
|
|
if item_group:
|
|
lft, rgt = frappe.db.get_value("Item Group", item_group, ["lft", "rgt"])
|
|
items = frappe.db.sql_list(
|
|
"""
|
|
select i.name from `tabItem` i
|
|
where exists(select name from `tabItem Group`
|
|
where name=i.item_group and lft >=%s and rgt<=%s)
|
|
""",
|
|
(lft, rgt),
|
|
)
|
|
filters.append(["item_code", "in", items])
|
|
try:
|
|
# check if user has any restrictions based on user permissions on warehouse
|
|
if DatabaseQuery("Warehouse", user=frappe.session.user).build_match_conditions():
|
|
filters.append(["warehouse", "in", [w.name for w in frappe.get_list("Warehouse")]])
|
|
except frappe.PermissionError:
|
|
# user does not have access on warehouse
|
|
return []
|
|
|
|
items = frappe.db.get_all(
|
|
"Bin",
|
|
fields=[
|
|
"item_code",
|
|
"warehouse",
|
|
"projected_qty",
|
|
"reserved_qty",
|
|
"reserved_qty_for_production",
|
|
"reserved_qty_for_sub_contract",
|
|
"actual_qty",
|
|
"valuation_rate",
|
|
],
|
|
or_filters={
|
|
"projected_qty": ["!=", 0],
|
|
"reserved_qty": ["!=", 0],
|
|
"reserved_qty_for_production": ["!=", 0],
|
|
"reserved_qty_for_sub_contract": ["!=", 0],
|
|
"actual_qty": ["!=", 0],
|
|
},
|
|
filters=filters,
|
|
order_by=sort_by + " " + sort_order,
|
|
limit_start=start,
|
|
limit_page_length=21,
|
|
)
|
|
|
|
sre_reserved_stock_details = get_reserved_stock(item_code, warehouse)
|
|
precision = cint(frappe.db.get_single_value("System Settings", "float_precision"))
|
|
|
|
for item in items:
|
|
item.update(
|
|
{
|
|
"item_name": frappe.get_cached_value("Item", item.item_code, "item_name"),
|
|
"disable_quick_entry": frappe.get_cached_value("Item", item.item_code, "has_batch_no")
|
|
or frappe.get_cached_value("Item", item.item_code, "has_serial_no"),
|
|
"projected_qty": flt(item.projected_qty, precision),
|
|
"reserved_qty": flt(item.reserved_qty, precision),
|
|
"reserved_qty_for_production": flt(item.reserved_qty_for_production, precision),
|
|
"reserved_qty_for_sub_contract": flt(item.reserved_qty_for_sub_contract, precision),
|
|
"actual_qty": flt(item.actual_qty, precision),
|
|
"reserved_stock": sre_reserved_stock_details.get((item.item_code, item.warehouse), 0),
|
|
}
|
|
)
|
|
return items
|