Update sales_order.py
1. filter out the suppliers by which the dropship purchase order already created
2. allow create multi dropship draft purchase orders
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index 6b3abfd..cd44e3a 100755
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -732,12 +732,12 @@
@frappe.whitelist()
def make_purchase_order_for_drop_shipment(source_name, for_supplier, target_doc=None):
def set_missing_values(source, target):
- target.supplier = for_supplier
+ target.supplier = supplier
target.apply_discount_on = ""
target.additional_discount_percentage = 0.0
target.discount_amount = 0.0
- default_price_list = frappe.get_value("Supplier", for_supplier, "default_price_list")
+ default_price_list = frappe.get_value("Supplier", supplier, "default_price_list")
if default_price_list:
target.buying_price_list = default_price_list
@@ -767,41 +767,61 @@
target.stock_qty = (flt(source.qty) - flt(source.ordered_qty)) * flt(source.conversion_factor)
target.project = source_parent.project
- doclist = get_mapped_doc("Sales Order", source_name, {
- "Sales Order": {
- "doctype": "Purchase Order",
- "field_no_map": [
- "address_display",
- "contact_display",
- "contact_mobile",
- "contact_email",
- "contact_person",
- "taxes_and_charges"
- ],
- "validation": {
- "docstatus": ["=", 1]
- }
- },
- "Sales Order Item": {
- "doctype": "Purchase Order Item",
- "field_map": [
- ["name", "sales_order_item"],
- ["parent", "sales_order"],
- ["stock_uom", "stock_uom"],
- ["uom", "uom"],
- ["conversion_factor", "conversion_factor"],
- ["delivery_date", "schedule_date"]
- ],
- "field_no_map": [
- "rate",
- "price_list_rate"
- ],
- "postprocess": update_item,
- "condition": lambda doc: doc.ordered_qty < doc.qty and doc.supplier == for_supplier
- }
- }, target_doc, set_missing_values)
+ suppliers =[]
+ if for_supplier:
+ suppliers.append(for_supplier)
+ else:
+ sales_order = frappe.get_doc("Sales Order", source_name)
+ for item in sales_order.items:
+ if item.supplier and item.supplier not in suppliers:
+ suppliers.append(item.supplier)
+ for supplier in suppliers:
+ po =frappe.get_list("Purchase Order", filters={"sales_order":source_name, "supplier":supplier, "docstatus": ("<", "2")})
+ if len(po) == 0:
+ doc = get_mapped_doc("Sales Order", source_name, {
+ "Sales Order": {
+ "doctype": "Purchase Order",
+ "field_no_map": [
+ "address_display",
+ "contact_display",
+ "contact_mobile",
+ "contact_email",
+ "contact_person",
+ "taxes_and_charges"
+ ],
+ "validation": {
+ "docstatus": ["=", 1]
+ }
+ },
+ "Sales Order Item": {
+ "doctype": "Purchase Order Item",
+ "field_map": [
+ ["name", "sales_order_item"],
+ ["parent", "sales_order"],
+ ["stock_uom", "stock_uom"],
+ ["uom", "uom"],
+ ["conversion_factor", "conversion_factor"],
+ ["delivery_date", "schedule_date"]
+ ],
+ "field_no_map": [
+ "rate",
+ "price_list_rate"
+ ],
+ "postprocess": update_item,
+ "condition": lambda doc: doc.ordered_qty < doc.qty and doc.supplier == supplier
+ }
+ }, target_doc, set_missing_values)
+ if not for_supplier:
+ doc.insert()
+ else:
+ suppliers =[]
+ if suppliers:
+ if not for_supplier:
+ frappe.db.commit()
+ return doc
+ else:
+ frappe.msgprint(_("PO already created for all sales order items"))
- return doclist
@frappe.whitelist()
def get_supplier(doctype, txt, searchfield, start, page_len, filters):
@@ -817,6 +837,8 @@
and ({key} like %(txt)s
or supplier_name like %(txt)s)
and name in (select supplier from `tabSales Order Item` where parent = %(parent)s)
+ and name not in (select supplier from `tabPurchase Order` po inner join `tabPurchase Order Item` poi
+ on po.name=poi.parent where po.docstatus<2 and poi.sales_order=%(parent)s)
order by
if(locate(%(_txt)s, name), locate(%(_txt)s, name), 99999),
if(locate(%(_txt)s, supplier_name), locate(%(_txt)s, supplier_name), 99999),