|
3 | 3 |
|
4 | 4 |
|
5 | 5 | import frappe |
| 6 | +from frappe.query_builder.functions import Coalesce, Sum |
6 | 7 | from frappe.utils import cstr, flt, now, nowdate, nowtime |
7 | 8 |
|
8 | 9 | from erpnext.controllers.stock_controller import create_repost_item_valuation_entry |
@@ -182,18 +183,67 @@ def get_indented_qty(item_code, warehouse): |
182 | 183 |
|
183 | 184 |
|
184 | 185 | def get_ordered_qty(item_code, warehouse): |
185 | | - ordered_qty = frappe.db.sql( |
186 | | - """ |
187 | | - select sum((po_item.qty - po_item.received_qty)*po_item.conversion_factor) |
188 | | - from `tabPurchase Order Item` po_item, `tabPurchase Order` po |
189 | | - where po_item.item_code=%s and po_item.warehouse=%s |
190 | | - and po_item.qty > po_item.received_qty and po_item.parent=po.name |
191 | | - and po.status not in ('Closed', 'Delivered') and po.docstatus=1 |
192 | | - and po_item.delivered_by_supplier = 0""", |
193 | | - (item_code, warehouse), |
| 186 | + """Return total pending ordered quantity for an item in a warehouse. |
| 187 | + Includes outstanding quantities from Purchase Orders and Subcontracting Orders""" |
| 188 | + |
| 189 | + purchase_order_qty = get_purchase_order_qty(item_code, warehouse) |
| 190 | + subcontracting_order_qty = get_subcontracting_order_qty(item_code, warehouse) |
| 191 | + |
| 192 | + return flt(purchase_order_qty) + flt(subcontracting_order_qty) |
| 193 | + |
| 194 | + |
| 195 | +def get_purchase_order_qty(item_code, warehouse): |
| 196 | + PurchaseOrder = frappe.qb.DocType("Purchase Order") |
| 197 | + PurchaseOrderItem = frappe.qb.DocType("Purchase Order Item") |
| 198 | + |
| 199 | + purchase_order_qty = ( |
| 200 | + frappe.qb.from_(PurchaseOrderItem) |
| 201 | + .join(PurchaseOrder) |
| 202 | + .on(PurchaseOrderItem.parent == PurchaseOrder.name) |
| 203 | + .select( |
| 204 | + Sum( |
| 205 | + (PurchaseOrderItem.qty - PurchaseOrderItem.received_qty) * PurchaseOrderItem.conversion_factor |
| 206 | + ) |
| 207 | + ) |
| 208 | + .where( |
| 209 | + (PurchaseOrderItem.item_code == item_code) |
| 210 | + & (PurchaseOrderItem.warehouse == warehouse) |
| 211 | + & (PurchaseOrderItem.qty > PurchaseOrderItem.received_qty) |
| 212 | + & (PurchaseOrder.status.notin(["Closed", "Delivered"])) |
| 213 | + & (PurchaseOrder.docstatus == 1) |
| 214 | + & (Coalesce(PurchaseOrderItem.delivered_by_supplier, 0) == 0) |
| 215 | + ) |
| 216 | + .run() |
| 217 | + ) |
| 218 | + |
| 219 | + return purchase_order_qty[0][0] if purchase_order_qty else 0 |
| 220 | + |
| 221 | + |
| 222 | +def get_subcontracting_order_qty(item_code, warehouse): |
| 223 | + SubcontractingOrder = frappe.qb.DocType("Subcontracting Order") |
| 224 | + SubcontractingOrderItem = frappe.qb.DocType("Subcontracting Order Item") |
| 225 | + |
| 226 | + subcontracting_order_qty = ( |
| 227 | + frappe.qb.from_(SubcontractingOrderItem) |
| 228 | + .join(SubcontractingOrder) |
| 229 | + .on(SubcontractingOrderItem.parent == SubcontractingOrder.name) |
| 230 | + .select( |
| 231 | + Sum( |
| 232 | + (SubcontractingOrderItem.qty - SubcontractingOrderItem.received_qty) |
| 233 | + * SubcontractingOrderItem.conversion_factor |
| 234 | + ) |
| 235 | + ) |
| 236 | + .where( |
| 237 | + (SubcontractingOrderItem.item_code == item_code) |
| 238 | + & (SubcontractingOrderItem.warehouse == warehouse) |
| 239 | + & (SubcontractingOrderItem.qty > SubcontractingOrderItem.received_qty) |
| 240 | + & (SubcontractingOrder.status.notin(["Closed", "Completed"])) |
| 241 | + & (SubcontractingOrder.docstatus == 1) |
| 242 | + ) |
| 243 | + .run() |
194 | 244 | ) |
195 | 245 |
|
196 | | - return flt(ordered_qty[0][0]) if ordered_qty else 0 |
| 246 | + return subcontracting_order_qty[0][0] if subcontracting_order_qty else 0 |
197 | 247 |
|
198 | 248 |
|
199 | 249 | def get_planned_qty(item_code, warehouse): |
|
0 commit comments