Multiselect dialog for getting items (#8583)
* Concatenate docnames and send to mapper * Multiselect with checkboxes * set setters as separate filters * Map filter fields to target_doc * Get items from quotation (in SO) working * [major] Set dialog setters for all forms * Add date field * Specify non-default date_fields * [minor] add test_mapper.py * [minor] remove cur_frm * [minor][fix] test * [minor] fix test with make_test_records
This commit is contained in:
parent
62e3e75555
commit
edeb4dc7e0
@ -49,29 +49,37 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(doc.docstatus===0) {
|
if(doc.docstatus===0) {
|
||||||
cur_frm.add_custom_button(__('Purchase Order'), function() {
|
var me = this;
|
||||||
|
this.frm.add_custom_button(__('Purchase Order'), function() {
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.buying.doctype.purchase_order.purchase_order.make_purchase_invoice",
|
method: "erpnext.buying.doctype.purchase_order.purchase_order.make_purchase_invoice",
|
||||||
source_doctype: "Purchase Order",
|
source_doctype: "Purchase Order",
|
||||||
|
target: me.frm,
|
||||||
|
setters: {
|
||||||
|
supplier: me.frm.doc.supplier || undefined,
|
||||||
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
supplier: cur_frm.doc.supplier || undefined,
|
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
status: ["!=", "Closed"],
|
status: ["!=", "Closed"],
|
||||||
per_billed: ["<", 99.99],
|
per_billed: ["<", 99.99],
|
||||||
company: cur_frm.doc.company
|
company: me.frm.doc.company
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, __("Get items from"));
|
}, __("Get items from"));
|
||||||
|
|
||||||
cur_frm.add_custom_button(__('Purchase Receipt'), function() {
|
this.frm.add_custom_button(__('Purchase Receipt'), function() {
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.stock.doctype.purchase_receipt.purchase_receipt.make_purchase_invoice",
|
method: "erpnext.stock.doctype.purchase_receipt.purchase_receipt.make_purchase_invoice",
|
||||||
source_doctype: "Purchase Receipt",
|
source_doctype: "Purchase Receipt",
|
||||||
|
target: me.frm,
|
||||||
|
date_field: "posting_date",
|
||||||
|
setters: {
|
||||||
|
supplier: me.frm.doc.supplier || undefined,
|
||||||
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
supplier: cur_frm.doc.supplier || undefined,
|
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
status: ["!=", "Closed"],
|
status: ["!=", "Closed"],
|
||||||
company: cur_frm.doc.company
|
company: me.frm.doc.company
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, __("Get items from"));
|
}, __("Get items from"));
|
||||||
@ -120,7 +128,7 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({
|
|||||||
hide_fields(this.frm.doc);
|
hide_fields(this.frm.doc);
|
||||||
if(cint(this.frm.doc.is_paid)) {
|
if(cint(this.frm.doc.is_paid)) {
|
||||||
if(!this.frm.doc.company) {
|
if(!this.frm.doc.company) {
|
||||||
cur_frm.set_value("is_paid", 0)
|
this.frm.set_value("is_paid", 0)
|
||||||
msgprint(__("Please specify Company to proceed"));
|
msgprint(__("Please specify Company to proceed"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -112,33 +112,43 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte
|
|||||||
},
|
},
|
||||||
|
|
||||||
sales_order_btn: function() {
|
sales_order_btn: function() {
|
||||||
this.$sales_order_btn = cur_frm.add_custom_button(__('Sales Order'),
|
var me = this;
|
||||||
|
this.$sales_order_btn = this.frm.add_custom_button(__('Sales Order'),
|
||||||
function() {
|
function() {
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.selling.doctype.sales_order.sales_order.make_sales_invoice",
|
method: "erpnext.selling.doctype.sales_order.sales_order.make_sales_invoice",
|
||||||
source_doctype: "Sales Order",
|
source_doctype: "Sales Order",
|
||||||
|
target: me.frm,
|
||||||
|
setters: {
|
||||||
|
customer: me.frm.doc.customer || undefined,
|
||||||
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
status: ["!=", "Closed"],
|
status: ["!=", "Closed"],
|
||||||
per_billed: ["<", 99.99],
|
per_billed: ["<", 99.99],
|
||||||
customer: cur_frm.doc.customer || undefined,
|
company: me.frm.doc.company
|
||||||
company: cur_frm.doc.company
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, __("Get items from"));
|
}, __("Get items from"));
|
||||||
},
|
},
|
||||||
|
|
||||||
delivery_note_btn: function() {
|
delivery_note_btn: function() {
|
||||||
this.$delivery_note_btn = cur_frm.add_custom_button(__('Delivery Note'),
|
var me = this;
|
||||||
|
this.$delivery_note_btn = this.frm.add_custom_button(__('Delivery Note'),
|
||||||
function() {
|
function() {
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.stock.doctype.delivery_note.delivery_note.make_sales_invoice",
|
method: "erpnext.stock.doctype.delivery_note.delivery_note.make_sales_invoice",
|
||||||
source_doctype: "Delivery Note",
|
source_doctype: "Delivery Note",
|
||||||
|
target: me.frm,
|
||||||
|
date_field: "posting_date",
|
||||||
|
setters: {
|
||||||
|
company: me.frm.doc.company
|
||||||
|
},
|
||||||
get_query: function() {
|
get_query: function() {
|
||||||
var filters = {
|
var filters = {
|
||||||
company: cur_frm.doc.company
|
docstatus: 1,
|
||||||
};
|
};
|
||||||
if(cur_frm.doc.customer) filters["customer"] = cur_frm.doc.customer;
|
if(me.frm.doc.customer) filters["customer"] = me.frm.doc.customer;
|
||||||
return {
|
return {
|
||||||
query: "erpnext.controllers.queries.get_delivery_notes_to_be_billed",
|
query: "erpnext.controllers.queries.get_delivery_notes_to_be_billed",
|
||||||
filters: filters
|
filters: filters
|
||||||
|
@ -153,30 +153,37 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
|
|||||||
},
|
},
|
||||||
|
|
||||||
add_from_mappers: function() {
|
add_from_mappers: function() {
|
||||||
cur_frm.add_custom_button(__('Material Request'),
|
var me = this;
|
||||||
|
this.frm.add_custom_button(__('Material Request'),
|
||||||
function() {
|
function() {
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.stock.doctype.material_request.material_request.make_purchase_order",
|
method: "erpnext.stock.doctype.material_request.material_request.make_purchase_order",
|
||||||
source_doctype: "Material Request",
|
source_doctype: "Material Request",
|
||||||
|
target: me.frm,
|
||||||
|
setters: {
|
||||||
|
company: me.frm.doc.company
|
||||||
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
material_request_type: "Purchase",
|
material_request_type: "Purchase",
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
status: ["!=", "Stopped"],
|
status: ["!=", "Stopped"],
|
||||||
per_ordered: ["<", 99.99],
|
per_ordered: ["<", 99.99],
|
||||||
company: cur_frm.doc.company
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, __("Add items from"));
|
}, __("Add items from"));
|
||||||
|
|
||||||
cur_frm.add_custom_button(__('Supplier Quotation'),
|
this.frm.add_custom_button(__('Supplier Quotation'),
|
||||||
function() {
|
function() {
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.buying.doctype.supplier_quotation.supplier_quotation.make_purchase_order",
|
method: "erpnext.buying.doctype.supplier_quotation.supplier_quotation.make_purchase_order",
|
||||||
source_doctype: "Supplier Quotation",
|
source_doctype: "Supplier Quotation",
|
||||||
|
target: me.frm,
|
||||||
|
setters: {
|
||||||
|
company: me.frm.doc.company
|
||||||
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
status: ["!=", "Stopped"],
|
status: ["!=", "Stopped"],
|
||||||
company: cur_frm.doc.company
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, __("Add items from"));
|
}, __("Add items from"));
|
||||||
|
@ -124,24 +124,28 @@ frappe.ui.form.on("Request for Quotation Supplier",{
|
|||||||
|
|
||||||
erpnext.buying.RequestforQuotationController = erpnext.buying.BuyingController.extend({
|
erpnext.buying.RequestforQuotationController = erpnext.buying.BuyingController.extend({
|
||||||
refresh: function() {
|
refresh: function() {
|
||||||
|
var me = this;
|
||||||
this._super();
|
this._super();
|
||||||
if (this.frm.doc.docstatus===0) {
|
if (this.frm.doc.docstatus===0) {
|
||||||
cur_frm.add_custom_button(__('Material Request'),
|
this.frm.add_custom_button(__('Material Request'),
|
||||||
function() {
|
function() {
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.stock.doctype.material_request.material_request.make_request_for_quotation",
|
method: "erpnext.stock.doctype.material_request.material_request.make_request_for_quotation",
|
||||||
source_doctype: "Material Request",
|
source_doctype: "Material Request",
|
||||||
|
target: me.frm,
|
||||||
|
setters: {
|
||||||
|
company: me.frm.doc.company
|
||||||
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
material_request_type: "Purchase",
|
material_request_type: "Purchase",
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
status: ["!=", "Stopped"],
|
status: ["!=", "Stopped"],
|
||||||
per_ordered: ["<", 99.99],
|
per_ordered: ["<", 99.99]
|
||||||
company: cur_frm.doc.company
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, __("Get items from"));
|
}, __("Get items from"));
|
||||||
// Get items from open Material Requests based on supplier
|
// Get items from open Material Requests based on supplier
|
||||||
cur_frm.add_custom_button(__('Possible Supplier'), function() {
|
this.frm.add_custom_button(__('Possible Supplier'), function() {
|
||||||
// Create a dialog window for the user to pick their supplier
|
// Create a dialog window for the user to pick their supplier
|
||||||
var d = new frappe.ui.Dialog({
|
var d = new frappe.ui.Dialog({
|
||||||
title: __('Select Possible Supplier'),
|
title: __('Select Possible Supplier'),
|
||||||
@ -161,12 +165,15 @@ erpnext.buying.RequestforQuotationController = erpnext.buying.BuyingController.e
|
|||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.buying.doctype.request_for_quotation.request_for_quotation.get_item_from_material_requests_based_on_supplier",
|
method: "erpnext.buying.doctype.request_for_quotation.request_for_quotation.get_item_from_material_requests_based_on_supplier",
|
||||||
source_name: v.supplier,
|
source_name: v.supplier,
|
||||||
|
target: me.frm,
|
||||||
|
setters: {
|
||||||
|
company: me.frm.doc.company
|
||||||
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
material_request_type: "Purchase",
|
material_request_type: "Purchase",
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
status: ["!=", "Stopped"],
|
status: ["!=", "Stopped"],
|
||||||
per_ordered: ["<", 99.99],
|
per_ordered: ["<", 99.99]
|
||||||
company: cur_frm.doc.company
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
$(btn).done_working();
|
$(btn).done_working();
|
||||||
|
@ -14,6 +14,7 @@ frappe.ui.form.on('Suppier Quotation', {
|
|||||||
|
|
||||||
erpnext.buying.SupplierQuotationController = erpnext.buying.BuyingController.extend({
|
erpnext.buying.SupplierQuotationController = erpnext.buying.BuyingController.extend({
|
||||||
refresh: function() {
|
refresh: function() {
|
||||||
|
var me = this;
|
||||||
this._super();
|
this._super();
|
||||||
if (this.frm.doc.docstatus === 1) {
|
if (this.frm.doc.docstatus === 1) {
|
||||||
cur_frm.add_custom_button(__("Purchase Order"), this.make_purchase_order,
|
cur_frm.add_custom_button(__("Purchase Order"), this.make_purchase_order,
|
||||||
@ -25,17 +26,20 @@ erpnext.buying.SupplierQuotationController = erpnext.buying.BuyingController.ext
|
|||||||
}
|
}
|
||||||
else if (this.frm.doc.docstatus===0) {
|
else if (this.frm.doc.docstatus===0) {
|
||||||
|
|
||||||
cur_frm.add_custom_button(__('Material Request'),
|
this.frm.add_custom_button(__('Material Request'),
|
||||||
function() {
|
function() {
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.stock.doctype.material_request.material_request.make_supplier_quotation",
|
method: "erpnext.stock.doctype.material_request.material_request.make_supplier_quotation",
|
||||||
source_doctype: "Material Request",
|
source_doctype: "Material Request",
|
||||||
|
target: me.frm,
|
||||||
|
setters: {
|
||||||
|
company: me.frm.doc.company
|
||||||
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
material_request_type: "Purchase",
|
material_request_type: "Purchase",
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
status: ["!=", "Stopped"],
|
status: ["!=", "Stopped"],
|
||||||
per_ordered: ["<", 99.99],
|
per_ordered: ["<", 99.99]
|
||||||
company: cur_frm.doc.company
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, __("Get items from"));
|
}, __("Get items from"));
|
||||||
|
73
erpnext/controllers/tests/test_mapper.py
Normal file
73
erpnext/controllers/tests/test_mapper.py
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
import unittest
|
||||||
|
import frappe
|
||||||
|
|
||||||
|
import random, json
|
||||||
|
import frappe.utils
|
||||||
|
from frappe.utils import nowdate
|
||||||
|
from frappe.model import mapper
|
||||||
|
from frappe.test_runner import make_test_records
|
||||||
|
|
||||||
|
class TestMapper(unittest.TestCase):
|
||||||
|
def test_map_docs(self):
|
||||||
|
'''Test mapping of multiple source docs on a single target doc'''
|
||||||
|
|
||||||
|
make_test_records("Item")
|
||||||
|
items = frappe.get_all("Item", fields = ["name", "item_code"], filters = {'is_sales_item': 1, 'has_variants': 0})
|
||||||
|
customers = frappe.get_all("Customer")
|
||||||
|
if items and customers:
|
||||||
|
# Make source docs (quotations) and a target doc (sales order)
|
||||||
|
customer = random.choice(customers).name
|
||||||
|
qtn1, item_list_1 = self.make_quotation(items, customer)
|
||||||
|
qtn2, item_list_2 = self.make_quotation(items, customer)
|
||||||
|
so, item_list_3 = self.make_sales_order()
|
||||||
|
|
||||||
|
# Map source docs to target with corresponding mapper method
|
||||||
|
method = "erpnext.selling.doctype.quotation.quotation.make_sales_order"
|
||||||
|
updated_so = mapper.map_docs(method, json.dumps([qtn1.name, qtn2.name]), so)
|
||||||
|
|
||||||
|
# Assert that all inserted items are present in updated sales order
|
||||||
|
src_items = item_list_1 + item_list_2 + item_list_3
|
||||||
|
self.assertEqual(set([d.item_code for d in src_items]),
|
||||||
|
set([d.item_code for d in updated_so.items]))
|
||||||
|
|
||||||
|
def get_random_items(self, items, limit):
|
||||||
|
'''Get a number of random items from a list of given items'''
|
||||||
|
random_items = []
|
||||||
|
for i in range(0, limit):
|
||||||
|
random_items.append(random.choice(items))
|
||||||
|
return random_items
|
||||||
|
|
||||||
|
def make_quotation(self, items, customer):
|
||||||
|
item_list = self.get_random_items(items, 3)
|
||||||
|
qtn = frappe.get_doc({
|
||||||
|
"doctype": "Quotation",
|
||||||
|
"quotation_to": "Customer",
|
||||||
|
"customer": customer,
|
||||||
|
"order_type": "Sales"
|
||||||
|
})
|
||||||
|
for item in item_list:
|
||||||
|
qtn.append("items", {"qty": "2", "item_code": item.item_code})
|
||||||
|
|
||||||
|
qtn.submit()
|
||||||
|
return qtn, item_list
|
||||||
|
|
||||||
|
def make_sales_order(self):
|
||||||
|
item = frappe.get_doc({
|
||||||
|
"base_amount": 1000.0,
|
||||||
|
"base_rate": 100.0,
|
||||||
|
"description": "CPU",
|
||||||
|
"doctype": "Sales Order Item",
|
||||||
|
"item_code": "_Test Item Home Desktop 100",
|
||||||
|
"item_name": "CPU",
|
||||||
|
"parentfield": "items",
|
||||||
|
"qty": 10.0,
|
||||||
|
"rate": 100.0,
|
||||||
|
"warehouse": "_Test Warehouse - _TC",
|
||||||
|
"stock_uom": "_Test UOM",
|
||||||
|
"conversion_factor": 1.0,
|
||||||
|
"uom": "_Test UOM"
|
||||||
|
})
|
||||||
|
so = frappe.get_doc(frappe.get_test_records('Sales Order')[0])
|
||||||
|
so.insert(ignore_permissions=True)
|
||||||
|
return so, [item]
|
@ -33,10 +33,13 @@ erpnext.maintenance.MaintenanceSchedule = frappe.ui.form.Controller.extend({
|
|||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_schedule",
|
method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_schedule",
|
||||||
source_doctype: "Sales Order",
|
source_doctype: "Sales Order",
|
||||||
|
target: me.frm,
|
||||||
|
setters: {
|
||||||
|
customer: me.frm.doc.customer || undefined,
|
||||||
|
order_type: me.frm.doc.order_type,
|
||||||
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
order_type: me.frm.doc.order_type,
|
|
||||||
customer: me.frm.doc.customer || undefined,
|
|
||||||
company: me.frm.doc.company
|
company: me.frm.doc.company
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -27,41 +27,53 @@ erpnext.maintenance.MaintenanceVisit = frappe.ui.form.Controller.extend({
|
|||||||
refresh: function() {
|
refresh: function() {
|
||||||
frappe.dynamic_link = {doc: this.frm.doc, fieldname: 'customer', doctype: 'Customer'}
|
frappe.dynamic_link = {doc: this.frm.doc, fieldname: 'customer', doctype: 'Customer'}
|
||||||
|
|
||||||
|
var me = this;
|
||||||
|
|
||||||
if (this.frm.doc.docstatus===0) {
|
if (this.frm.doc.docstatus===0) {
|
||||||
cur_frm.add_custom_button(__('Maintenance Schedule'),
|
this.frm.add_custom_button(__('Maintenance Schedule'),
|
||||||
function() {
|
function() {
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.maintenance.doctype.maintenance_schedule.maintenance_schedule.make_maintenance_visit",
|
method: "erpnext.maintenance.doctype.maintenance_schedule.maintenance_schedule.make_maintenance_visit",
|
||||||
source_doctype: "Maintenance Schedule",
|
source_doctype: "Maintenance Schedule",
|
||||||
|
target: me.frm,
|
||||||
|
setters: {
|
||||||
|
customer: me.frm.doc.customer || undefined,
|
||||||
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
customer: cur_frm.doc.customer || undefined,
|
company: me.frm.doc.company
|
||||||
company: cur_frm.doc.company
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, __("Get items from"));
|
}, __("Get items from"));
|
||||||
cur_frm.add_custom_button(__('Warranty Claim'),
|
this.frm.add_custom_button(__('Warranty Claim'),
|
||||||
function() {
|
function() {
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.support.doctype.warranty_claim.warranty_claim.make_maintenance_visit",
|
method: "erpnext.support.doctype.warranty_claim.warranty_claim.make_maintenance_visit",
|
||||||
source_doctype: "Warranty Claim",
|
source_doctype: "Warranty Claim",
|
||||||
|
target: me.frm,
|
||||||
|
date_field: "complaint_date",
|
||||||
|
setters: {
|
||||||
|
customer: me.frm.doc.customer || undefined,
|
||||||
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
status: ["in", "Open, Work in Progress"],
|
status: ["in", "Open, Work in Progress"],
|
||||||
customer: cur_frm.doc.customer || undefined,
|
company: me.frm.doc.company
|
||||||
company: cur_frm.doc.company
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, __("Get items from"));
|
}, __("Get items from"));
|
||||||
cur_frm.add_custom_button(__('Sales Order'),
|
this.frm.add_custom_button(__('Sales Order'),
|
||||||
function() {
|
function() {
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_visit",
|
method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_visit",
|
||||||
source_doctype: "Sales Order",
|
source_doctype: "Sales Order",
|
||||||
|
target: me.frm,
|
||||||
|
setters: {
|
||||||
|
customer: me.frm.doc.customer || undefined,
|
||||||
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
order_type: cur_frm.doc.order_type,
|
company: me.frm.doc.company,
|
||||||
customer: cur_frm.doc.customer || undefined,
|
order_type: me.frm.doc.order_type,
|
||||||
company: cur_frm.doc.company
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, __("Get items from"));
|
}, __("Get items from"));
|
||||||
|
@ -114,8 +114,8 @@ erpnext.utils.map_current_doc = function(opts) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
var _map = function() {
|
var _map = function() {
|
||||||
// remove first item row if empty
|
|
||||||
if($.isArray(cur_frm.doc.items) && cur_frm.doc.items.length > 0) {
|
if($.isArray(cur_frm.doc.items) && cur_frm.doc.items.length > 0) {
|
||||||
|
// remove first item row if empty
|
||||||
if(!cur_frm.doc.items[0].item_code) {
|
if(!cur_frm.doc.items[0].item_code) {
|
||||||
cur_frm.doc.items = cur_frm.doc.items.splice(1);
|
cur_frm.doc.items = cur_frm.doc.items.splice(1);
|
||||||
}
|
}
|
||||||
@ -134,43 +134,48 @@ erpnext.utils.map_current_doc = function(opts) {
|
|||||||
var item_qty_map = {};
|
var item_qty_map = {};
|
||||||
|
|
||||||
$.each(cur_frm.doc.items, function(i, d) {
|
$.each(cur_frm.doc.items, function(i, d) {
|
||||||
if(d[link_fieldname]==opts.source_name) {
|
opts.source_name.forEach(function(src) {
|
||||||
already_set = true;
|
if(d[link_fieldname]==src) {
|
||||||
if (item_qty_map[d.item_code])
|
already_set = true;
|
||||||
item_qty_map[d.item_code] += flt(d.qty);
|
if (item_qty_map[d.item_code])
|
||||||
else
|
item_qty_map[d.item_code] += flt(d.qty);
|
||||||
item_qty_map[d.item_code] = flt(d.qty);
|
else
|
||||||
}
|
item_qty_map[d.item_code] = flt(d.qty);
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
if(already_set) {
|
if(already_set) {
|
||||||
frappe.model.with_doc(opts.source_doctype, opts.source_name, function(r) {
|
opts.source_name.forEach(function(src) {
|
||||||
var source_doc = frappe.model.get_doc(opts.source_doctype, opts.source_name);
|
frappe.model.with_doc(opts.source_doctype, src, function(r) {
|
||||||
$.each(source_doc.items || [], function(i, row) {
|
var source_doc = frappe.model.get_doc(opts.source_doctype, src);
|
||||||
if(row.qty > flt(item_qty_map[row.item_code])) {
|
$.each(source_doc.items || [], function(i, row) {
|
||||||
already_set = false;
|
if(row.qty > flt(item_qty_map[row.item_code])) {
|
||||||
return false;
|
already_set = false;
|
||||||
}
|
return false;
|
||||||
|
}
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
|
||||||
|
|
||||||
if(already_set) {
|
if(already_set) {
|
||||||
frappe.msgprint(__("You have already selected items from {0} {1}",
|
frappe.msgprint(__("You have already selected items from {0} {1}",
|
||||||
[opts.source_doctype, opts.source_name]));
|
[opts.source_doctype, src]));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return frappe.call({
|
return frappe.call({
|
||||||
// Sometimes we hit the limit for URL length of a GET request
|
// Sometimes we hit the limit for URL length of a GET request
|
||||||
// as we send the full target_doc. Hence this is a POST request.
|
// as we send the full target_doc. Hence this is a POST request.
|
||||||
type: "POST",
|
type: "POST",
|
||||||
method: opts.method,
|
method: 'frappe.model.mapper.map_docs',
|
||||||
args: {
|
args: {
|
||||||
"source_name": opts.source_name,
|
"method": opts.method,
|
||||||
"target_doc": cur_frm.doc
|
"source_names": opts.source_name,
|
||||||
|
"target_doc": cur_frm.doc,
|
||||||
},
|
},
|
||||||
callback: function(r) {
|
callback: function(r) {
|
||||||
if(!r.exc) {
|
if(!r.exc) {
|
||||||
@ -181,29 +186,26 @@ erpnext.utils.map_current_doc = function(opts) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
if(opts.source_doctype) {
|
if(opts.source_doctype) {
|
||||||
var d = new frappe.ui.Dialog({
|
var d = new frappe.ui.form.MultiSelectDialog({
|
||||||
title: __("Get From ") + __(opts.source_doctype),
|
doctype: opts.source_doctype,
|
||||||
fields: [
|
target: opts.target,
|
||||||
{
|
date_field: opts.date_field || undefined,
|
||||||
fieldtype: "Link",
|
setters: opts.setters,
|
||||||
label: __(opts.source_doctype),
|
get_query: opts.get_query,
|
||||||
fieldname: opts.source_doctype,
|
action: function(selections, args) {
|
||||||
options: opts.source_doctype,
|
let values = selections;
|
||||||
get_query: opts.get_query,
|
if(values.length === 0){
|
||||||
reqd:1
|
frappe.msgprint(__("Please select Quotations"))
|
||||||
},
|
return;
|
||||||
]
|
}
|
||||||
|
opts.source_name = values;
|
||||||
|
opts.setters = args;
|
||||||
|
d.dialog.hide();
|
||||||
|
_map();
|
||||||
|
},
|
||||||
});
|
});
|
||||||
d.set_primary_action(__('Get Items'), function() {
|
|
||||||
var values = d.get_values();
|
|
||||||
if(!values)
|
|
||||||
return;
|
|
||||||
opts.source_name = values[opts.source_doctype];
|
|
||||||
d.hide();
|
|
||||||
_map();
|
|
||||||
})
|
|
||||||
d.show();
|
|
||||||
} else if(opts.source_name) {
|
} else if(opts.source_name) {
|
||||||
|
opts.source_name = [opts.source_name];
|
||||||
_map();
|
_map();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,18 +42,23 @@ erpnext.selling.InstallationNote = frappe.ui.form.Controller.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
refresh: function() {
|
refresh: function() {
|
||||||
|
var me = this;
|
||||||
if (this.frm.doc.docstatus===0) {
|
if (this.frm.doc.docstatus===0) {
|
||||||
cur_frm.add_custom_button(__('From Delivery Note'),
|
this.frm.add_custom_button(__('From Delivery Note'),
|
||||||
function() {
|
function() {
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.stock.doctype.delivery_note.delivery_note.make_installation_note",
|
method: "erpnext.stock.doctype.delivery_note.delivery_note.make_installation_note",
|
||||||
source_doctype: "Delivery Note",
|
source_doctype: "Delivery Note",
|
||||||
|
target: me.frm,
|
||||||
|
date_field: "posting_date",
|
||||||
|
setters: {
|
||||||
|
customer: me.frm.doc.customer || undefined,
|
||||||
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
status: ["not in", ["Stopped", "Closed"]],
|
status: ["not in", ["Stopped", "Closed"]],
|
||||||
per_installed: ["<", 99.99],
|
per_installed: ["<", 99.99],
|
||||||
customer: cur_frm.doc.customer || undefined,
|
company: me.frm.doc.company
|
||||||
company: cur_frm.doc.company
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, "fa fa-download", "btn-default"
|
}, "fa fa-download", "btn-default"
|
||||||
|
@ -25,6 +25,8 @@ erpnext.selling.QuotationController = erpnext.selling.SellingController.extend({
|
|||||||
refresh: function(doc, dt, dn) {
|
refresh: function(doc, dt, dn) {
|
||||||
this._super(doc, dt, dn);
|
this._super(doc, dt, dn);
|
||||||
|
|
||||||
|
var me = this;
|
||||||
|
|
||||||
if(doc.docstatus == 1 && doc.status!=='Lost') {
|
if(doc.docstatus == 1 && doc.status!=='Lost') {
|
||||||
cur_frm.add_custom_button(__('Make Sales Order'),
|
cur_frm.add_custom_button(__('Make Sales Order'),
|
||||||
cur_frm.cscript['Make Sales Order']);
|
cur_frm.cscript['Make Sales Order']);
|
||||||
@ -36,17 +38,24 @@ erpnext.selling.QuotationController = erpnext.selling.SellingController.extend({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this.frm.doc.docstatus===0) {
|
if (this.frm.doc.docstatus===0) {
|
||||||
cur_frm.add_custom_button(__('Opportunity'),
|
this.frm.add_custom_button(__('Opportunity'),
|
||||||
function() {
|
function() {
|
||||||
|
var setters = {};
|
||||||
|
if(me.frm.doc.customer) {
|
||||||
|
setters.customer = me.frm.doc.customer || undefined;
|
||||||
|
} else if (me.frm.doc.lead) {
|
||||||
|
setters.lead = me.frm.doc.lead || undefined;
|
||||||
|
}
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.crm.doctype.opportunity.opportunity.make_quotation",
|
method: "erpnext.crm.doctype.opportunity.opportunity.make_quotation",
|
||||||
source_doctype: "Opportunity",
|
source_doctype: "Opportunity",
|
||||||
|
target: me.frm,
|
||||||
|
setters: setters,
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
status: ["not in", ["Lost", "Closed"]],
|
status: ["not in", ["Lost", "Closed"]],
|
||||||
enquiry_type: cur_frm.doc.order_type,
|
company: me.frm.doc.company,
|
||||||
customer: cur_frm.doc.customer || undefined,
|
// cannot set enquiry_type as setter, as the fieldname is order_type
|
||||||
lead: cur_frm.doc.lead || undefined,
|
enquiry_type: me.frm.doc.order_type,
|
||||||
company: cur_frm.doc.company
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, __("Get items from"), "btn-default");
|
}, __("Get items from"), "btn-default");
|
||||||
|
@ -136,12 +136,15 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
|
|||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.selling.doctype.quotation.quotation.make_sales_order",
|
method: "erpnext.selling.doctype.quotation.quotation.make_sales_order",
|
||||||
source_doctype: "Quotation",
|
source_doctype: "Quotation",
|
||||||
|
target: me.frm,
|
||||||
|
setters: {
|
||||||
|
customer: me.frm.doc.customer || undefined,
|
||||||
|
order_type: me.frm.doc.order_type,
|
||||||
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
|
company: me.frm.doc.company,
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
status: ["!=", "Lost"],
|
status: ["!=", "Lost"],
|
||||||
order_type: me.frm.doc.order_type,
|
|
||||||
customer: me.frm.doc.customer || undefined,
|
|
||||||
company: me.frm.doc.company
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, __("Get items from"));
|
}, __("Get items from"));
|
||||||
|
@ -119,13 +119,16 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend(
|
|||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.selling.doctype.sales_order.sales_order.make_delivery_note",
|
method: "erpnext.selling.doctype.sales_order.sales_order.make_delivery_note",
|
||||||
source_doctype: "Sales Order",
|
source_doctype: "Sales Order",
|
||||||
|
target: me.frm,
|
||||||
|
setters: {
|
||||||
|
customer: me.frm.doc.customer || undefined,
|
||||||
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
status: ["!=", "Closed"],
|
status: ["!=", "Closed"],
|
||||||
per_delivered: ["<", 99.99],
|
per_delivered: ["<", 99.99],
|
||||||
|
company: me.frm.doc.company,
|
||||||
project: me.frm.doc.project || undefined,
|
project: me.frm.doc.project || undefined,
|
||||||
customer: me.frm.doc.customer || undefined,
|
|
||||||
company: me.frm.doc.company
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, __("Get items from"));
|
}, __("Get items from"));
|
||||||
|
@ -95,16 +95,19 @@ erpnext.buying.MaterialRequestController = erpnext.buying.BuyingController.exten
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this.frm.doc.docstatus===0) {
|
if (this.frm.doc.docstatus===0) {
|
||||||
cur_frm.add_custom_button(__('Sales Order'),
|
this.frm.add_custom_button(__('Sales Order'),
|
||||||
function() {
|
function() {
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.selling.doctype.sales_order.sales_order.make_material_request",
|
method: "erpnext.selling.doctype.sales_order.sales_order.make_material_request",
|
||||||
source_doctype: "Sales Order",
|
source_doctype: "Sales Order",
|
||||||
|
target: me.frm,
|
||||||
|
setters: {
|
||||||
|
company: me.frm.doc.company
|
||||||
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
status: ["!=", "Closed"],
|
status: ["!=", "Closed"],
|
||||||
per_delivered: ["<", 99.99],
|
per_delivered: ["<", 99.99],
|
||||||
company: cur_frm.doc.company
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, __("Get items from"));
|
}, __("Get items from"));
|
||||||
|
@ -43,6 +43,7 @@ erpnext.stock.PurchaseReceiptController = erpnext.buying.BuyingController.extend
|
|||||||
},
|
},
|
||||||
|
|
||||||
refresh: function() {
|
refresh: function() {
|
||||||
|
var me = this;
|
||||||
this._super();
|
this._super();
|
||||||
if(this.frm.doc.docstatus===1) {
|
if(this.frm.doc.docstatus===1) {
|
||||||
this.show_stock_ledger();
|
this.show_stock_ledger();
|
||||||
@ -53,17 +54,20 @@ erpnext.stock.PurchaseReceiptController = erpnext.buying.BuyingController.extend
|
|||||||
|
|
||||||
if(!this.frm.doc.is_return && this.frm.doc.status!="Closed") {
|
if(!this.frm.doc.is_return && this.frm.doc.status!="Closed") {
|
||||||
if(this.frm.doc.docstatus==0) {
|
if(this.frm.doc.docstatus==0) {
|
||||||
cur_frm.add_custom_button(__('Purchase Order'),
|
this.frm.add_custom_button(__('Purchase Order'),
|
||||||
function() {
|
function() {
|
||||||
erpnext.utils.map_current_doc({
|
erpnext.utils.map_current_doc({
|
||||||
method: "erpnext.buying.doctype.purchase_order.purchase_order.make_purchase_receipt",
|
method: "erpnext.buying.doctype.purchase_order.purchase_order.make_purchase_receipt",
|
||||||
source_doctype: "Purchase Order",
|
source_doctype: "Purchase Order",
|
||||||
|
target: me.frm,
|
||||||
|
setters: {
|
||||||
|
supplier: me.frm.doc.supplier || undefined,
|
||||||
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
supplier: cur_frm.doc.supplier || undefined,
|
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
status: ["!=", "Closed"],
|
status: ["!=", "Closed"],
|
||||||
per_received: ["<", 99.99],
|
per_received: ["<", 99.99],
|
||||||
company: cur_frm.doc.company
|
company: me.frm.doc.company
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, __("Get items from"));
|
}, __("Get items from"));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user