feat: update ordered qty for packed items
This commit is contained in:
parent
40a45a3139
commit
8005fee656
@ -316,6 +316,16 @@ class PurchaseOrder(BuyingController):
|
|||||||
'target_ref_field': 'stock_qty',
|
'target_ref_field': 'stock_qty',
|
||||||
'source_field': 'stock_qty'
|
'source_field': 'stock_qty'
|
||||||
})
|
})
|
||||||
|
self.status_updater.append({
|
||||||
|
'source_dt': 'Purchase Order Item',
|
||||||
|
'target_dt': 'Packed Item',
|
||||||
|
'target_field': 'ordered_qty',
|
||||||
|
'target_parent_dt': 'Sales Order',
|
||||||
|
'target_parent_field': '',
|
||||||
|
'join_field': 'sales_order_packed_item',
|
||||||
|
'target_ref_field': 'qty',
|
||||||
|
'source_field': 'stock_qty'
|
||||||
|
})
|
||||||
|
|
||||||
def update_delivered_qty_in_sales_order(self):
|
def update_delivered_qty_in_sales_order(self):
|
||||||
"""Update delivered qty in Sales Order for drop ship"""
|
"""Update delivered qty in Sales Order for drop ship"""
|
||||||
|
@ -63,6 +63,7 @@
|
|||||||
"material_request_item",
|
"material_request_item",
|
||||||
"sales_order",
|
"sales_order",
|
||||||
"sales_order_item",
|
"sales_order_item",
|
||||||
|
"sales_order_packed_item",
|
||||||
"supplier_quotation",
|
"supplier_quotation",
|
||||||
"supplier_quotation_item",
|
"supplier_quotation_item",
|
||||||
"col_break5",
|
"col_break5",
|
||||||
@ -837,21 +838,31 @@
|
|||||||
"label": "Product Bundle",
|
"label": "Product Bundle",
|
||||||
"options": "Product Bundle",
|
"options": "Product Bundle",
|
||||||
"read_only": 1
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "sales_order_packed_item",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Sales Order Packed Item",
|
||||||
|
"no_copy": 1,
|
||||||
|
"print_hide": 1,
|
||||||
|
"search_index": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2021-08-30 20:06:26.712097",
|
"modified": "2022-02-02 13:10:18.398976",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Buying",
|
"module": "Buying",
|
||||||
"name": "Purchase Order Item",
|
"name": "Purchase Order Item",
|
||||||
|
"naming_rule": "Random",
|
||||||
"owner": "Administrator",
|
"owner": "Administrator",
|
||||||
"permissions": [],
|
"permissions": [],
|
||||||
"quick_entry": 1,
|
"quick_entry": 1,
|
||||||
"search_fields": "item_name",
|
"search_fields": "item_name",
|
||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
|
"states": [],
|
||||||
"track_changes": 1
|
"track_changes": 1
|
||||||
}
|
}
|
@ -562,6 +562,7 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex
|
|||||||
var me = this;
|
var me = this;
|
||||||
var dialog = new frappe.ui.Dialog({
|
var dialog = new frappe.ui.Dialog({
|
||||||
title: __("Select Items"),
|
title: __("Select Items"),
|
||||||
|
size: "large",
|
||||||
fields: [
|
fields: [
|
||||||
{
|
{
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
@ -663,7 +664,8 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex
|
|||||||
} else {
|
} else {
|
||||||
let po_items = [];
|
let po_items = [];
|
||||||
me.frm.doc.items.forEach(d => {
|
me.frm.doc.items.forEach(d => {
|
||||||
let pending_qty = (flt(d.stock_qty) - flt(d.ordered_qty)) / flt(d.conversion_factor);
|
let ordered_qty = me.get_ordered_qty(d, me.frm.doc);
|
||||||
|
let pending_qty = (flt(d.stock_qty) - ordered_qty) / flt(d.conversion_factor);
|
||||||
if (pending_qty > 0) {
|
if (pending_qty > 0) {
|
||||||
po_items.push({
|
po_items.push({
|
||||||
"doctype": "Sales Order Item",
|
"doctype": "Sales Order Item",
|
||||||
@ -689,6 +691,24 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex
|
|||||||
dialog.show();
|
dialog.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get_ordered_qty(item, so) {
|
||||||
|
let ordered_qty = item.ordered_qty;
|
||||||
|
if (so.packed_items) {
|
||||||
|
// calculate ordered qty based on packed items in case of product bundle
|
||||||
|
let packed_items = so.packed_items.filter(
|
||||||
|
(pi) => pi.parent_detail_docname == item.name
|
||||||
|
);
|
||||||
|
if (packed_items) {
|
||||||
|
ordered_qty = packed_items.reduce(
|
||||||
|
(sum, pi) => sum + flt(pi.ordered_qty),
|
||||||
|
0
|
||||||
|
);
|
||||||
|
ordered_qty = ordered_qty / packed_items.length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ordered_qty;
|
||||||
|
}
|
||||||
|
|
||||||
hold_sales_order(){
|
hold_sales_order(){
|
||||||
var me = this;
|
var me = this;
|
||||||
var d = new frappe.ui.Dialog({
|
var d = new frappe.ui.Dialog({
|
||||||
|
@ -877,6 +877,9 @@ def make_purchase_order(source_name, selected_items=None, target_doc=None):
|
|||||||
target.stock_qty = (flt(source.stock_qty) - flt(source.ordered_qty))
|
target.stock_qty = (flt(source.stock_qty) - flt(source.ordered_qty))
|
||||||
target.project = source_parent.project
|
target.project = source_parent.project
|
||||||
|
|
||||||
|
def update_item_for_packed_item(source, target, source_parent):
|
||||||
|
target.qty = flt(source.qty) - flt(source.ordered_qty)
|
||||||
|
|
||||||
# po = frappe.get_list("Purchase Order", filters={"sales_order":source_name, "supplier":supplier, "docstatus": ("<", "2")})
|
# po = frappe.get_list("Purchase Order", filters={"sales_order":source_name, "supplier":supplier, "docstatus": ("<", "2")})
|
||||||
doc = get_mapped_doc("Sales Order", source_name, {
|
doc = get_mapped_doc("Sales Order", source_name, {
|
||||||
"Sales Order": {
|
"Sales Order": {
|
||||||
@ -920,6 +923,7 @@ def make_purchase_order(source_name, selected_items=None, target_doc=None):
|
|||||||
"Packed Item": {
|
"Packed Item": {
|
||||||
"doctype": "Purchase Order Item",
|
"doctype": "Purchase Order Item",
|
||||||
"field_map": [
|
"field_map": [
|
||||||
|
["name", "sales_order_packed_item"],
|
||||||
["parent", "sales_order"],
|
["parent", "sales_order"],
|
||||||
["uom", "uom"],
|
["uom", "uom"],
|
||||||
["conversion_factor", "conversion_factor"],
|
["conversion_factor", "conversion_factor"],
|
||||||
@ -934,6 +938,7 @@ def make_purchase_order(source_name, selected_items=None, target_doc=None):
|
|||||||
"supplier",
|
"supplier",
|
||||||
"pricing_rules"
|
"pricing_rules"
|
||||||
],
|
],
|
||||||
|
"postprocess": update_item_for_packed_item,
|
||||||
"condition": lambda doc: doc.parent_item in items_to_map
|
"condition": lambda doc: doc.parent_item in items_to_map
|
||||||
}
|
}
|
||||||
}, target_doc, set_missing_values)
|
}, target_doc, set_missing_values)
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
"section_break_13",
|
"section_break_13",
|
||||||
"actual_qty",
|
"actual_qty",
|
||||||
"projected_qty",
|
"projected_qty",
|
||||||
|
"ordered_qty",
|
||||||
"column_break_16",
|
"column_break_16",
|
||||||
"incoming_rate",
|
"incoming_rate",
|
||||||
"page_break",
|
"page_break",
|
||||||
@ -224,13 +225,21 @@
|
|||||||
"label": "Rate",
|
"label": "Rate",
|
||||||
"print_hide": 1,
|
"print_hide": 1,
|
||||||
"read_only": 1
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_on_submit": 1,
|
||||||
|
"fieldname": "ordered_qty",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"label": "Ordered Qty",
|
||||||
|
"no_copy": 1,
|
||||||
|
"read_only": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2022-01-28 16:03:30.780111",
|
"modified": "2022-02-22 12:57:45.325488",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Packed Item",
|
"name": "Packed Item",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user