diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 6b3abfd8bef..cd44e3ab03d 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -732,12 +732,12 @@ def get_events(start, end, filters=None): @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 @@ def make_purchase_order_for_drop_shipment(source_name, for_supplier, target_doc= 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 @@ def get_supplier(doctype, txt, searchfield, start, page_len, filters): 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),