feat: purchase order against sales order (#17975)
* feat: purchase order against sales order * fix: remove unwanted checks * fix:Related tests
This commit is contained in:
parent
359a73e1aa
commit
bdec7fea82
@ -107,7 +107,6 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
|
|||||||
refresh: function(doc, dt, dn) {
|
refresh: function(doc, dt, dn) {
|
||||||
var me = this;
|
var me = this;
|
||||||
this._super();
|
this._super();
|
||||||
var allow_purchase = false;
|
|
||||||
var allow_delivery = false;
|
var allow_delivery = false;
|
||||||
|
|
||||||
if(doc.docstatus==1) {
|
if(doc.docstatus==1) {
|
||||||
@ -129,28 +128,9 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
|
|||||||
me.frm.cscript.update_status('Re-open', 'Draft')
|
me.frm.cscript.update_status('Re-open', 'Draft')
|
||||||
}, __("Status"));
|
}, __("Status"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(doc.status !== 'Closed') {
|
if(doc.status !== 'Closed') {
|
||||||
if(doc.status !== 'On Hold') {
|
if(doc.status !== 'On Hold') {
|
||||||
for (var i in this.frm.doc.items) {
|
|
||||||
var item = this.frm.doc.items[i];
|
|
||||||
if(item.delivered_by_supplier === 1 || item.supplier){
|
|
||||||
if(item.qty > flt(item.ordered_qty)
|
|
||||||
&& item.qty > flt(item.delivered_qty)) {
|
|
||||||
allow_purchase = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (item.delivered_by_supplier===0) {
|
|
||||||
if(item.qty > flt(item.delivered_qty)) {
|
|
||||||
allow_delivery = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (allow_delivery && allow_purchase) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.frm.has_perm("submit")) {
|
if (this.frm.has_perm("submit")) {
|
||||||
if(flt(doc.per_delivered, 6) < 100 || flt(doc.per_billed) < 100) {
|
if(flt(doc.per_delivered, 6) < 100 || flt(doc.per_billed) < 100) {
|
||||||
@ -180,9 +160,8 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// make purchase order
|
// make purchase order
|
||||||
if(flt(doc.per_delivered, 6) < 100 && allow_purchase) {
|
|
||||||
this.frm.add_custom_button(__('Purchase Order'), () => this.make_purchase_order(), __('Create'));
|
this.frm.add_custom_button(__('Purchase Order'), () => this.make_purchase_order(), __('Create'));
|
||||||
}
|
|
||||||
// maintenance
|
// maintenance
|
||||||
if(flt(doc.per_delivered, 2) < 100 &&
|
if(flt(doc.per_delivered, 2) < 100 &&
|
||||||
["Sales", "Shopping Cart"].indexOf(doc.order_type)===-1) {
|
["Sales", "Shopping Cart"].indexOf(doc.order_type)===-1) {
|
||||||
@ -543,6 +522,42 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
|
|||||||
filters: {'parent': me.frm.doc.name}
|
filters: {'parent': me.frm.doc.name}
|
||||||
}
|
}
|
||||||
}},
|
}},
|
||||||
|
{fieldname: 'items_for_po', fieldtype: 'Table', label: 'Select Items',
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
fieldtype:'Data',
|
||||||
|
fieldname:'item_code',
|
||||||
|
label: __('Item'),
|
||||||
|
read_only:1,
|
||||||
|
in_list_view:1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fieldtype:'Data',
|
||||||
|
fieldname:'item_name',
|
||||||
|
label: __('Item name'),
|
||||||
|
read_only:1,
|
||||||
|
in_list_view:1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fieldtype:'Float',
|
||||||
|
fieldname:'qty',
|
||||||
|
label: __('Quantity'),
|
||||||
|
read_only: 1,
|
||||||
|
in_list_view:1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fieldtype:'Link',
|
||||||
|
read_only:1,
|
||||||
|
fieldname:'uom',
|
||||||
|
label: __('UOM'),
|
||||||
|
in_list_view:1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
data: cur_frm.doc.items,
|
||||||
|
get_data: function() {
|
||||||
|
return cur_frm.doc.items
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
{"fieldtype": "Button", "label": __('Create Purchase Order'), "fieldname": "make_purchase_order", "cssClass": "btn-primary"},
|
{"fieldtype": "Button", "label": __('Create Purchase Order'), "fieldname": "make_purchase_order", "cssClass": "btn-primary"},
|
||||||
]
|
]
|
||||||
@ -550,13 +565,22 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
|
|||||||
|
|
||||||
dialog.fields_dict.make_purchase_order.$input.click(function() {
|
dialog.fields_dict.make_purchase_order.$input.click(function() {
|
||||||
var args = dialog.get_values();
|
var args = dialog.get_values();
|
||||||
|
let selected_items = dialog.fields_dict.items_for_po.grid.get_selected_children()
|
||||||
|
if(selected_items.length == 0) {
|
||||||
|
frappe.throw({message: 'Please select Item form Table', title: __('Message'), indicator:'blue'})
|
||||||
|
}
|
||||||
|
let selected_items_list = []
|
||||||
|
for(let i in selected_items){
|
||||||
|
selected_items_list.push(selected_items[i].item_code)
|
||||||
|
}
|
||||||
dialog.hide();
|
dialog.hide();
|
||||||
return frappe.call({
|
return frappe.call({
|
||||||
type: "GET",
|
type: "GET",
|
||||||
method: "erpnext.selling.doctype.sales_order.sales_order.make_purchase_order_for_drop_shipment",
|
method: "erpnext.selling.doctype.sales_order.sales_order.make_purchase_order",
|
||||||
args: {
|
args: {
|
||||||
"source_name": me.frm.doc.name,
|
"source_name": me.frm.doc.name,
|
||||||
"for_supplier": args.supplier
|
"for_supplier": args.supplier,
|
||||||
|
"selected_items": selected_items_list
|
||||||
},
|
},
|
||||||
freeze: true,
|
freeze: true,
|
||||||
callback: function(r) {
|
callback: function(r) {
|
||||||
@ -576,6 +600,8 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
dialog.get_field("items_for_po").grid.only_sortable()
|
||||||
|
dialog.get_field("items_for_po").refresh()
|
||||||
dialog.show();
|
dialog.show();
|
||||||
},
|
},
|
||||||
hold_sales_order: function(){
|
hold_sales_order: function(){
|
||||||
|
@ -764,7 +764,10 @@ def get_events(start, end, filters=None):
|
|||||||
return data
|
return data
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_purchase_order_for_drop_shipment(source_name, for_supplier=None, target_doc=None):
|
def make_purchase_order(source_name, for_supplier=None, selected_items=[], target_doc=None):
|
||||||
|
if isinstance(selected_items, string_types):
|
||||||
|
selected_items = json.loads(selected_items)
|
||||||
|
|
||||||
def set_missing_values(source, target):
|
def set_missing_values(source, target):
|
||||||
target.supplier = supplier
|
target.supplier = supplier
|
||||||
target.apply_discount_on = ""
|
target.apply_discount_on = ""
|
||||||
@ -843,7 +846,7 @@ def make_purchase_order_for_drop_shipment(source_name, for_supplier=None, target
|
|||||||
"price_list_rate"
|
"price_list_rate"
|
||||||
],
|
],
|
||||||
"postprocess": update_item,
|
"postprocess": update_item,
|
||||||
"condition": lambda doc: doc.ordered_qty < doc.qty and doc.supplier == supplier
|
"condition": lambda doc: doc.ordered_qty < doc.qty and doc.supplier == supplier and doc.item_code in selected_items
|
||||||
}
|
}
|
||||||
}, target_doc, set_missing_values)
|
}, target_doc, set_missing_values)
|
||||||
if not for_supplier:
|
if not for_supplier:
|
||||||
|
@ -449,7 +449,7 @@ class TestSalesOrder(unittest.TestCase):
|
|||||||
frappe.db.set_value("Stock Settings", None, "auto_insert_price_list_rate_if_missing", 1)
|
frappe.db.set_value("Stock Settings", None, "auto_insert_price_list_rate_if_missing", 1)
|
||||||
|
|
||||||
def test_drop_shipping(self):
|
def test_drop_shipping(self):
|
||||||
from erpnext.selling.doctype.sales_order.sales_order import make_purchase_order_for_drop_shipment
|
from erpnext.selling.doctype.sales_order.sales_order import make_purchase_order
|
||||||
from erpnext.buying.doctype.purchase_order.purchase_order import update_status
|
from erpnext.buying.doctype.purchase_order.purchase_order import update_status
|
||||||
|
|
||||||
make_stock_entry(target="_Test Warehouse - _TC", qty=10, rate=100)
|
make_stock_entry(target="_Test Warehouse - _TC", qty=10, rate=100)
|
||||||
@ -495,7 +495,7 @@ class TestSalesOrder(unittest.TestCase):
|
|||||||
so = make_sales_order(item_list=so_items, do_not_submit=True)
|
so = make_sales_order(item_list=so_items, do_not_submit=True)
|
||||||
so.submit()
|
so.submit()
|
||||||
|
|
||||||
po = make_purchase_order_for_drop_shipment(so.name, '_Test Supplier')
|
po = make_purchase_order(so.name, '_Test Supplier', selected_items=[so_items[0]['item_code']])
|
||||||
po.submit()
|
po.submit()
|
||||||
|
|
||||||
dn = create_dn_against_so(so.name, delivered_qty=1)
|
dn = create_dn_against_so(so.name, delivered_qty=1)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user