[cleanup] contextual buttons in sales & purchase and fix rate setting in opp -> quotation and material request -> purchase order

This commit is contained in:
Rushabh Mehta 2016-01-15 16:59:26 +05:30
parent 2e3d2b8426
commit b46069d44b
30 changed files with 1901 additions and 1684 deletions

View File

@ -1,8 +1,8 @@
{
"allow_copy": 0,
"allow_import": 1,
"allow_rename": 0,
"autoname": "PRULE.#####",
"allow_rename": 1,
"autoname": "field:title",
"creation": "2014-02-21 15:02:51",
"custom": 0,
"docstatus": 0,
@ -24,6 +24,7 @@
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -47,6 +48,7 @@
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
@ -71,6 +73,7 @@
"options": "\nItem Code\nItem Group\nBrand",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
@ -95,6 +98,7 @@
"options": "Item",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -119,6 +123,7 @@
"options": "Brand",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -143,6 +148,7 @@
"options": "Item Group",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -165,6 +171,7 @@
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -189,6 +196,7 @@
"options": "\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -211,6 +219,7 @@
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -233,6 +242,7 @@
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -255,6 +265,7 @@
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -277,6 +288,7 @@
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -299,6 +311,7 @@
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -323,6 +336,7 @@
"options": "\nCustomer\nCustomer Group\nTerritory\nSales Partner\nCampaign\nSupplier\nSupplier Type",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -347,6 +361,7 @@
"options": "Customer",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -371,6 +386,7 @@
"options": "Customer Group",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -395,6 +411,7 @@
"options": "Territory",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -419,6 +436,7 @@
"options": "Sales Partner",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -443,6 +461,7 @@
"options": "Campaign",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -467,6 +486,7 @@
"options": "Supplier",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -491,6 +511,7 @@
"options": "Supplier Type",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -513,6 +534,7 @@
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -535,6 +557,7 @@
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -557,6 +580,7 @@
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -579,6 +603,7 @@
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -601,6 +626,7 @@
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -624,6 +650,7 @@
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -646,6 +673,7 @@
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -667,6 +695,7 @@
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -690,6 +719,7 @@
"options": "Company",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -712,6 +742,7 @@
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -736,6 +767,7 @@
"options": "\nPrice\nDiscount Percentage",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
@ -757,6 +789,7 @@
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -780,6 +813,7 @@
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -803,6 +837,7 @@
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -827,6 +862,7 @@
"options": "Price List",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -850,6 +886,7 @@
"options": "Simple",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -872,6 +909,7 @@
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@ -890,7 +928,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2015-11-16 06:29:51.958974",
"modified": "2016-01-15 04:05:11.633824",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Pricing Rule",
@ -1001,5 +1039,5 @@
"read_only_onload": 0,
"sort_field": "modified",
"sort_order": "DESC",
"title_field": "title"
"title_field": ""
}

View File

@ -76,7 +76,7 @@ class PricingRule(Document):
def apply_pricing_rule(args):
"""
args = {
"item_list": [{"doctype": "", "name": "", "item_code": "", "brand": "", "item_group": ""}, ...],
"items": [{"doctype": "", "name": "", "item_code": "", "brand": "", "item_group": ""}, ...],
"customer": "something",
"customer_group": "something",
"territory": "something",
@ -101,14 +101,10 @@ def apply_pricing_rule(args):
# list of dictionaries
out = []
if args.get("parenttype") == "Material Request": return out
if args.get("doctype") == "Material Request": return out
if not args.transaction_type:
args.transaction_type = "buying" if frappe.get_meta(args.parenttype).get_field("supplier") \
else "selling"
item_list = args.get("item_list")
args.pop("item_list")
item_list = args.get("items")
args.pop("items")
for item in item_list:
args_copy = copy.deepcopy(args)
@ -184,9 +180,12 @@ def get_pricing_rules(args):
conditions = ""
values = {"item_code": args.get("item_code"), "brand": args.get("brand")}
for field in ["company", "customer", "supplier", "supplier_type", "campaign", "sales_partner"]:
if args.get(field):
conditions += " and ifnull("+field+", '') in (%("+field+")s, '')"
values[field] = args.get(field)
else:
conditions += " and ifnull("+field+", '') = ''"
@ -194,12 +193,15 @@ def get_pricing_rules(args):
group_condition = _get_tree_conditions(parenttype)
if group_condition:
conditions += " and " + group_condition
if not args.price_list: args.price_list = None
conditions += " and ifnull(for_price_list, '') in (%(price_list)s, '')"
values["price_list"] = args.get("price_list")
if args.get("transaction_date"):
conditions += """ and %(transaction_date)s between ifnull(valid_from, '2000-01-01')
and ifnull(valid_upto, '2500-12-31')"""
values['transaction_date'] = args.get('transaction_date')
item_group_condition = _get_tree_conditions("Item Group", False)
if item_group_condition: item_group_condition = " or " + item_group_condition
@ -210,7 +212,8 @@ def get_pricing_rules(args):
and {transaction_type} = 1 {conditions}
order by priority desc, name desc""".format(
item_group_condition=item_group_condition,
transaction_type=args.transaction_type, conditions=conditions), args, as_dict=1)
transaction_type= "selling" if (args.customer or args.lead) else "buying",
conditions=conditions), values, as_dict=1)
def filter_pricing_rules(args, pricing_rules):
# filter for qty

View File

@ -36,7 +36,6 @@ class TestPricingRule(unittest.TestCase):
"price_list_currency": "_Test Currency",
"plc_conversion_rate": 1,
"order_type": "Sales",
"transaction_type": "selling",
"customer": "_Test Customer",
"doctype": "Sales Order Item",
"name": None

View File

@ -44,7 +44,7 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({
company: cur_frm.doc.company
}
})
});
}, __("Get items from"));
cur_frm.add_custom_button(__('Purchase Receipt'), function() {
frappe.model.map_current_doc({
@ -57,7 +57,7 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({
company: cur_frm.doc.company
}
})
});
}, __("Get items from"));
}
}
},
@ -77,7 +77,7 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({
me.apply_pricing_rule();
})
},
credit_to: function() {
var me = this;
if(this.frm.doc.credit_to) {

View File

@ -50,13 +50,13 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte
if(doc.update_stock) this.show_stock_ledger();
if(doc.docstatus==1 && !doc.is_return) {
var is_delivered_by_supplier = false;
is_delivered_by_supplier = cur_frm.doc.items.some(function(item){
return item.is_delivered_by_supplier ? true : false;
})
cur_frm.add_custom_button(doc.update_stock ? __('Sales Return') : __('Credit Note'),
this.make_sales_return, __("Make"));
cur_frm.page.set_inner_btn_group_as_primary(__("Make"));
@ -70,12 +70,12 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte
});
if(!from_delivery_note && !is_delivered_by_supplier) {
cur_frm.add_custom_button(__('Delivery'), cur_frm.cscript['Make Delivery Note'], __("Make"));
cur_frm.add_custom_button(__('Delivery'), cur_frm.cscript['Delivery Note'], __("Make"));
}
}
if(doc.outstanding_amount!=0 && !cint(doc.is_return)) {
cur_frm.add_custom_button(__('Make Payment Request'), this.make_payment_request, __("Make"));
cur_frm.add_custom_button(__('Payment Request'), this.make_payment_request, __("Make"));
cur_frm.add_custom_button(__('Payment'), cur_frm.cscript.make_bank_entry, __("Make"));
}
@ -106,7 +106,7 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte
},
sales_order_btn: function() {
this.$sales_order_btn = cur_frm.add_custom_button(__('From Sales Order'),
this.$sales_order_btn = cur_frm.add_custom_button(__('Sales Order'),
function() {
frappe.model.map_current_doc({
method: "erpnext.selling.doctype.sales_order.sales_order.make_sales_invoice",
@ -119,11 +119,11 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte
company: cur_frm.doc.company
}
})
}, __("From"));
}, __("Get items from"));
},
delivery_note_btn: function() {
this.$delivery_note_btn = cur_frm.add_custom_button(__('From Delivery Note'),
this.$delivery_note_btn = cur_frm.add_custom_button(__('Delivery Note'),
function() {
frappe.model.map_current_doc({
method: "erpnext.stock.doctype.delivery_note.delivery_note.make_sales_invoice",
@ -139,7 +139,7 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte
};
}
});
}, __("From"));
}, __("Get items from"));
},
tc_name: function() {

View File

@ -169,7 +169,7 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({
var me = this;
this.frm.add_custom_button(__("Product Bundle"), function() {
erpnext.buying.get_items_from_product_bundle(me.frm);
}, __("From"));
}, __("Get items from"));
}
});

View File

@ -37,7 +37,7 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
}
cur_frm.set_df_property("drop_ship", "hidden", !is_drop_ship);
if(doc.docstatus == 1 && !in_list(["Stopped", "Closed", "Delivered"], doc.status)) {
if (this.frm.has_perm("submit")) {
if(flt(doc.per_billed, 2) < 100 || doc.per_received < 100) {
@ -47,25 +47,23 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
cur_frm.add_custom_button(__('Close'), this.close_purchase_order, __("Status"));
}
if(is_drop_ship && doc.status!="Delivered"){
cur_frm.add_custom_button(__('Delivered'),
this.delivered_by_supplier, __("Status"));
cur_frm.page.set_inner_btn_group_as_primary(__("Status"));
}
} else if(doc.docstatus===0) {
cur_frm.add_custom_button(__('Get Last Purchase Rate'), this.get_last_purchase_rate);
cur_frm.cscript.add_from_mappers();
}
if(doc.docstatus == 1 && in_list(["Stopped", "Closed", "Delivered"], doc.status)) {
if (this.frm.has_perm("submit")) {
cur_frm.add_custom_button(__('Re-open'), this.unstop_purchase_order, __("Status"));
}
}
if(doc.docstatus == 1 && !in_list(["Stopped", "Closed"], doc.status)) {
if(flt(doc.per_received, 2) < 100 && allow_receipt) {
cur_frm.add_custom_button(__('Receive'), this.make_purchase_receipt, __("Make"));
@ -79,15 +77,25 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
if(flt(doc.per_billed, 2) < 100)
cur_frm.add_custom_button(__('Invoice'),
this.make_purchase_invoice, __("Make"));
if(flt(doc.per_billed)==0 && doc.status != "Delivered") {
cur_frm.add_custom_button(__('Payment'), cur_frm.cscript.make_bank_entry, __("Make"));
}
cur_frm.page.set_inner_btn_group_as_primary(__("Make"));
}
},
get_items_from_open_material_requests: function() {
frappe.model.map_current_doc({
method: "erpnext.stock.doctype.material_request.material_request.make_purchase_order_based_on_supplier",
source_name: this.frm.doc.supplier,
get_query_filters: {
docstatus: ["!=", 2],
}
});
},
make_stock_entry: function() {
var items = $.map(cur_frm.doc.items, function(d) { return d.bom ? d.item_code : false; });
var me = this;
@ -144,7 +152,7 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
company: cur_frm.doc.company
}
})
}, __("From"));
}, __("Add items from"));
cur_frm.add_custom_button(__('Supplier Quotation'),
function() {
@ -157,18 +165,8 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
company: cur_frm.doc.company
}
})
}, __("From"));
}, __("Add items from"));
cur_frm.add_custom_button(__('Supplier'),
function() {
frappe.model.map_current_doc({
method: "erpnext.stock.doctype.material_request.material_request.make_purchase_order_based_on_supplier",
source_doctype: "Supplier",
get_query_filters: {
docstatus: ["!=", 2],
}
})
}, __("For"));
},
tc_name: function() {
@ -209,12 +207,13 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
delivered_by_supplier: function(){
cur_frm.cscript.update_status('Deliver', 'Delivered')
},
get_last_purchase_rate: function() {
frappe.call({
"method": "get_last_purchase_rate",
"doc": cur_frm.doc,
callback: function(r, rt) {
cur_frm.dirty();
cur_frm.cscript.calculate_taxes_and_totals();
}
})
@ -267,54 +266,12 @@ cur_frm.fields_dict['items'].grid.get_field('bom').get_query = function(doc, cdt
}
}
cur_frm.pformat.indent_no = function(doc, cdt, cdn){
//function to make row of table
var make_row = function(title,val1, val2, bold){
var bstart = '<b>'; var bend = '</b>';
return '<tr><td style="width:39%;">'+(bold?bstart:'')+title+(bold?bend:'')+'</td>'
+'<td style="width:61%;text-align:left;">'+val1+(val2?' ('+dateutil.str_to_user(val2)+')':'')+'</td>'
+'</tr>'
}
out ='';
var cl = doc.items || [];
// outer table
var out='<div><table class="noborder" style="width:100%"><tr><td style="width: 50%"></td><td>';
// main table
out +='<table class="noborder" style="width:100%">';
// add rows
if(cl.length){
prevdoc_list = new Array();
for(var i=0;i<cl.length;i++){
if(cl[i].prevdoc_doctype == 'Material Request' && cl[i].prevdoc_docname && prevdoc_list.indexOf(cl[i].prevdoc_docname) == -1) {
prevdoc_list.push(cl[i].prevdoc_docname);
if(prevdoc_list.length ==1)
out += make_row(cl[i].prevdoc_doctype, cl[i].prevdoc_docname, null,0);
else
out += make_row('', cl[i].prevdoc_docname,null,0);
}
}
}
out +='</table></td></tr></table></div>';
return out;
}
cur_frm.cscript.on_submit = function(doc, cdt, cdn) {
if(cint(frappe.boot.notification_settings.purchase_order)) {
cur_frm.email_doc(frappe.boot.notification_settings.purchase_order_message);
}
}
cur_frm.cscript.schedule_date = function(doc, cdt, cdn) {
erpnext.utils.copy_value_in_all_row(doc, cdt, cdn, "items", "schedule_date");
}

View File

@ -111,6 +111,31 @@
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"depends_on": "eval:doc.supplier && doc.docstatus===0 && !(doc.items && doc.items.length)",
"fieldname": "get_items_from_open_material_requests",
"fieldtype": "Button",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Get Items from Open Material Requests",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
@ -847,6 +872,31 @@
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"depends_on": "eval:doc.docstatus===0 && (doc.items && doc.items.length)",
"fieldname": "get_last_purchase_rate",
"fieldtype": "Button",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Get last purchase rate",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
@ -2458,7 +2508,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2015-12-17 16:18:39.096762",
"modified": "2016-01-15 04:13:35.179163",
"modified_by": "Administrator",
"module": "Buying",
"name": "Purchase Order",

View File

@ -1,24 +1,44 @@
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
// License: GNU General Public License v3. See license.txt
cur_frm.cscript.refresh = function(doc, dt, dn) {
cur_frm.cscript.make_dashboard(doc);
frappe.ui.form.on("Supplier", {
refresh: function(frm) {
frm.cscript.make_dashboard(frm.doc);
if(frappe.defaults.get_default("supp_master_name")!="Naming Series") {
cur_frm.toggle_display("naming_series", false);
} else {
erpnext.toggle_naming_series();
}
if(frappe.defaults.get_default("supp_master_name")!="Naming Series") {
frm.toggle_display("naming_series", false);
} else {
erpnext.toggle_naming_series();
}
if(doc.__islocal){
hide_field(['address_html','contact_html']);
erpnext.utils.clear_address_and_contact(cur_frm);
}
else{
unhide_field(['address_html','contact_html']);
erpnext.utils.render_address_and_contact(cur_frm)
}
}
if(frm.doc.__islocal){
hide_field(['address_html','contact_html']);
erpnext.utils.clear_address_and_contact(frm);
}
else {
unhide_field(['address_html','contact_html']);
erpnext.utils.render_address_and_contact(frm);
}
frm.events.add_custom_buttons(frm);
},
add_custom_buttons: function(frm) {
["Supplier Quotation", "Purchase Order", "Purchase Receipt", "Purchase Invoice"].forEach(function(doctype, i) {
if(frappe.model.can_read(doctype)) {
frm.add_custom_button(__(doctype), function() {
frappe.route_options = {"supplier": frm.doc.name};
frappe.set_route("List", doctype);
}, __("View"));
}
if(frappe.model.can_create(doctype)) {
frm.add_custom_button(__(doctype), function() {
frappe.route_options = {"supplier": frm.doc.name};
new_doc(doctype);
}, __("Make"));
}
});
},
});
cur_frm.cscript.make_dashboard = function(doc) {
cur_frm.dashboard.reset();

View File

@ -27,7 +27,7 @@ erpnext.buying.SupplierQuotationController = erpnext.buying.BuyingController.ext
company: cur_frm.doc.company
}
})
}, __("From"));
}, __("Get items from"));
}
},

View File

@ -135,7 +135,7 @@ def get_data():
{
"type": "help",
"label": _("Product Bundle"),
"youtube_id": "yk-7kPrRyRRc"
"youtube_id": "yk3kPrRyRRc"
},
{
"type": "help",

View File

@ -133,13 +133,13 @@ class AccountsController(TransactionBase):
def set_missing_item_details(self):
"""set missing item values"""
from erpnext.stock.get_item_details import get_item_details
if self.doctype == "Purchase Invoice":
auto_accounting_for_stock = cint(frappe.defaults.get_global_default("auto_accounting_for_stock"))
if auto_accounting_for_stock:
stock_not_billed_account = self.get_company_default("stock_received_but_not_billed")
stock_items = self.get_stock_items()
if hasattr(self, "items"):
@ -151,6 +151,10 @@ class AccountsController(TransactionBase):
if item.get("item_code"):
args = parent_dict.copy()
args.update(item.as_dict())
args["doctype"] = parent_dict.get("doctype")
args["name"] = parent_dict.get("name")
if not args.get("transaction_date"):
args["transaction_date"] = args.get("posting_date")
@ -178,13 +182,13 @@ class AccountsController(TransactionBase):
if item.price_list_rate:
item.rate = flt(item.price_list_rate *
(1.0 - (flt(item.discount_percentage) / 100.0)), item.precision("rate"))
if self.doctype == "Purchase Invoice":
if auto_accounting_for_stock and item.item_code in stock_items \
and self.is_opening == 'No' \
and (not item.po_detail or not frappe.db.get_value("Purchase Order Item",
and (not item.po_detail or not frappe.db.get_value("Purchase Order Item",
item.po_detail, "delivered_by_supplier")):
item.expense_account = stock_not_billed_account
item.cost_center = None

View File

@ -29,7 +29,7 @@ erpnext.LeadController = frappe.ui.form.Controller.extend({
if(!this.frm.doc.__islocal && this.frm.doc.__onload && !this.frm.doc.__onload.is_customer) {
this.frm.add_custom_button(__("Customer"), this.create_customer, __("Make"));
this.frm.add_custom_button(__("Opportunity"), this.create_opportunity, __("Make"));
this.frm.add_custom_button(__("Make Quotation"), this.make_quotation, __("Make"));
this.frm.add_custom_button(__("Quotation"), this.make_quotation, __("Make"));
cur_frm.page.set_inner_btn_group_as_primary(__("Make"));
}
@ -53,7 +53,7 @@ erpnext.LeadController = frappe.ui.form.Controller.extend({
frm: cur_frm
})
},
make_quotation: function() {
frappe.model.open_mapped_doc({
method: "erpnext.crm.doctype.lead.lead.make_quotation",

View File

@ -92,13 +92,13 @@ cur_frm.cscript.refresh = function(doc, cdt, cdn) {
}, __("Status"));
}
}
if(doc.status!=="Lost") {
if(doc.status!=="Quotation") {
cur_frm.add_custom_button(__('Opportunity Lost'),
cur_frm.cscript['Declare Opportunity Lost'], __("Mark"));
cur_frm.add_custom_button(__('Lost'),
cur_frm.cscript['Declare Opportunity Lost'], __("Status"));
}
cur_frm.add_custom_button(__('Quotation'),cur_frm.cscript.create_quotation, __("Make"));
cur_frm.page.set_inner_btn_group_as_primary(__("Make"));
}

View File

@ -9,6 +9,7 @@ from frappe.model.mapper import get_mapped_doc
from erpnext.setup.utils import get_exchange_rate
from erpnext.utilities.transaction_base import TransactionBase
from erpnext.accounts.party import get_party_account_currency
from erpnext.stock.get_item_details import apply_price_list
subject_field = "title"
sender_field = "contact_email"
@ -192,6 +193,8 @@ def make_quotation(source_name, target_doc=None):
quotation.currency = party_account_currency or company_currency
quotation.conversion_rate = exchange_rate
quotation.update(apply_price_list(quotation.as_dict(), as_doc = True))
quotation.run_method("set_missing_values")
quotation.run_method("calculate_taxes_and_totals")

View File

@ -61,7 +61,7 @@ erpnext.production_order = {
set_custom_buttons: function(frm) {
var doc = frm.doc;
if (doc.docstatus === 1) {
frm.add_custom_button(__("Show Stock Entries"), function() {
frm.add_custom_button(__("Stock Entries"), function() {
frappe.route_options = {
production_order: frm.doc.name
}
@ -76,12 +76,12 @@ erpnext.production_order = {
// opertions
if ((doc.operations || []).length) {
frm.add_custom_button(__('Show Time Logs'), function() {
frm.add_custom_button(__('Time Logs'), function() {
frappe.route_options = {"production_order": frm.doc.name};
frappe.set_route("List", "Time Log");
}, __("View"));
}
if (flt(doc.material_transferred_for_manufacturing) < flt(doc.qty)) {
frm.add_custom_button(__('Transfer Materials for Manufacture'),
cur_frm.cscript['Transfer Raw Materials'], __("Stock Entry"));

View File

@ -559,7 +559,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
apply_pricing_rule: function(item, calculate_taxes_and_totals) {
var me = this;
var args = this._get_args(item);
if (!(args.item_list && args.item_list.length)) {
if (!(args.items && args.items.length)) {
if(calculate_taxes_and_totals) me.calculate_taxes_and_totals();
return;
}
@ -579,7 +579,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
_get_args: function(item) {
var me = this;
return {
"item_list": this._get_item_list(item),
"items": this._get_item_list(item),
"customer": me.frm.doc.customer,
"customer_group": me.frm.doc.customer_group,
"territory": me.frm.doc.territory,
@ -595,8 +595,8 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
"campaign": me.frm.doc.campaign,
"sales_partner": me.frm.doc.sales_partner,
"ignore_pricing_rule": me.frm.doc.ignore_pricing_rule,
"parenttype": me.frm.doc.doctype,
"parent": me.frm.doc.name
"doctype": me.frm.doc.doctype,
"name": me.frm.doc.name
};
},
@ -654,7 +654,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
apply_price_list: function(item) {
var me = this;
var args = this._get_args(item);
if (!((args.item_list && args.item_list.length) || args.price_list)) {
if (!((args.items && args.items.length) || args.price_list)) {
return;
}
@ -668,7 +668,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
me.frm.set_value("plc_conversion_rate", r.message.parent.plc_conversion_rate);
me.in_apply_price_list = false;
if(args.item_list.length) {
if(args.items.length) {
me._set_values_for_item_list(r.message.children);
}
}

View File

@ -1,28 +1,50 @@
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
// License: GNU General Public License v3. See license.txt
frappe.ui.form.on("Customer", "refresh", function(frm) {
cur_frm.cscript.setup_dashboard(frm.doc);
frappe.ui.form.on("Customer", {
refresh: function(frm) {
frm.cscript.setup_dashboard(frm.doc);
if(frappe.defaults.get_default("cust_master_name")!="Naming Series") {
frm.toggle_display("naming_series", false);
} else {
erpnext.toggle_naming_series();
if(frappe.defaults.get_default("cust_master_name")!="Naming Series") {
frm.toggle_display("naming_series", false);
} else {
erpnext.toggle_naming_series();
}
frm.toggle_display(['address_html','contact_html'], !frm.doc.__islocal);
if(!frm.doc.__islocal) {
erpnext.utils.render_address_and_contact(frm);
} else {
erpnext.utils.clear_address_and_contact(frm);
}
var grid = cur_frm.get_field("sales_team").grid;
grid.set_column_disp("allocated_amount", false);
grid.set_column_disp("incentives", false);
frm.events.add_custom_buttons(frm);
},
add_custom_buttons: function(frm) {
["Opportunity", "Quotation", "Sales Order", "Delivery Note", "Sales Invoice"].forEach(function(doctype, i) {
if(frappe.model.can_read(doctype)) {
frm.add_custom_button(__(doctype), function() {
frappe.route_options = {"customer": frm.doc.name};
frappe.set_route("List", doctype);
}, __("View"));
}
if(frappe.model.can_create(doctype)) {
frm.add_custom_button(__(doctype), function() {
frappe.route_options = {"customer": frm.doc.name};
new_doc(doctype);
}, __("Make"));
}
});
},
validate: function(frm) {
if(frm.doc.lead_name) frappe.model.clear_doc("Lead", frm.doc.lead_name);
}
frm.toggle_display(['address_html','contact_html'], !frm.doc.__islocal);
if(!frm.doc.__islocal) {
erpnext.utils.render_address_and_contact(frm);
} else {
erpnext.utils.clear_address_and_contact(frm);
}
var grid = cur_frm.get_field("sales_team").grid;
grid.set_column_disp("allocated_amount", false);
grid.set_column_disp("incentives", false);
})
});
cur_frm.cscript.onload = function(doc, dt, dn) {
cur_frm.cscript.load_defaults(doc, dt, dn);
@ -39,10 +61,6 @@ cur_frm.cscript.load_defaults = function(doc, dt, dn) {
cur_frm.add_fetch('lead_name', 'company_name', 'customer_name');
cur_frm.add_fetch('default_sales_partner','commission_rate','default_commission_rate');
cur_frm.cscript.validate = function(doc, dt, dn) {
if(doc.lead_name) frappe.model.clear_doc("Lead", doc.lead_name);
}
cur_frm.cscript.setup_dashboard = function(doc) {
cur_frm.dashboard.reset(doc);
if(doc.__islocal)

View File

@ -20,16 +20,16 @@ erpnext.selling.QuotationController = erpnext.selling.SellingController.extend({
if(doc.docstatus == 1 && doc.status!=='Lost') {
cur_frm.add_custom_button(__('Sales Order'),
cur_frm.cscript['Make Sales Order'], __("Make"));
if(doc.status!=="Ordered") {
cur_frm.add_custom_button(__('Lost'),
cur_frm.cscript['Declare Order Lost'], __("Mark"));
cur_frm.cscript['Declare Order Lost'], __("Status"));
}
}
if (this.frm.doc.docstatus===0) {
cur_frm.add_custom_button(__('From Opportunity'),
cur_frm.add_custom_button(__('Opportunity'),
function() {
frappe.model.map_current_doc({
method: "erpnext.crm.doctype.opportunity.opportunity.make_quotation",
@ -42,7 +42,7 @@ erpnext.selling.QuotationController = erpnext.selling.SellingController.extend({
company: cur_frm.doc.company
}
})
}, __("From"), "btn-default");
}, __("Get items from"), "btn-default");
}
this.toggle_reqd_lead_customer();

View File

@ -88,13 +88,13 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
} else {
if (this.frm.has_perm("submit")) {
// un-stop
cur_frm.add_custom_button(__('Re-open'), cur_frm.cscript['Unstop Sales Order']);
cur_frm.add_custom_button(__('Re-open'), cur_frm.cscript['Unstop Sales Order'], __("Status"));
}
}
}
if (this.frm.doc.docstatus===0) {
cur_frm.add_custom_button(__('From Quotation'),
cur_frm.add_custom_button(__('Quotation'),
function() {
frappe.model.map_current_doc({
method: "erpnext.selling.doctype.quotation.quotation.make_sales_order",
@ -107,7 +107,7 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
company: cur_frm.doc.company
}
})
});
}, __("Get items from"));
}
this.order_type(doc);

View File

@ -21,8 +21,11 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend(
cur_frm.add_custom_button(__('Packing Slip'),
cur_frm.cscript['Make Packing Slip'], __("Make"));
}
cur_frm.page.set_inner_btn_group_as_primary(__("Make"));
if (!doc.__islocal && doc.docstatus==1) {
cur_frm.page.set_inner_btn_group_as_primary(__("Make"));
}
if (this.frm.doc.docstatus===0) {
cur_frm.add_custom_button(__('Sales Order'),
function() {
@ -38,7 +41,7 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend(
company: cur_frm.doc.company
}
})
}, __("From"));
}, __("Get items from"));
}
}

View File

@ -93,7 +93,6 @@ class TestItem(unittest.TestCase):
"price_list_currency": "_Test Currency",
"plc_conversion_rate": 1,
"order_type": "Sales",
"transaction_type": "selling"
})
for key, value in to_check.iteritems():

View File

@ -34,23 +34,28 @@ erpnext.buying.MaterialRequestController = erpnext.buying.BuyingController.exten
}
if(doc.docstatus == 1 && doc.status != 'Stopped') {
if(doc.material_request_type === "Purchase")
cur_frm.add_custom_button(__("Make Supplier Quotation"),
this.make_supplier_quotation, __("Make"));
cur_frm.page.set_inner_btn_group_as_primary(__("Make"));
if(flt(doc.per_ordered, 2) < 100) {
// make
if(doc.material_request_type === "Material Transfer" && doc.status === "Submitted")
cur_frm.add_custom_button(__("Transfer Material"), this.make_stock_entry, __("Make"));
cur_frm.add_custom_button(__("Transfer Material"),
this.make_stock_entry, __("Make"));
if(doc.material_request_type === "Material Issue" && doc.status === "Submitted")
cur_frm.add_custom_button(__("Issue Material"), this.make_stock_entry, __("Make"));
cur_frm.add_custom_button(__("Issue Material"),
this.make_stock_entry, __("Make"));
if(doc.material_request_type === "Purchase")
cur_frm.add_custom_button(__('Make Purchase Order'),
cur_frm.add_custom_button(__('Purchase Order'),
this.make_purchase_order, __("Make"));
if(doc.material_request_type === "Purchase")
cur_frm.add_custom_button(__("Supplier Quotation"),
this.make_supplier_quotation, __("Make"));
cur_frm.page.set_inner_btn_group_as_primary(__("Make"));
// stop
cur_frm.add_custom_button(__('Stop'),
cur_frm.cscript['Stop Material Request'], __("Status"));
@ -70,7 +75,7 @@ erpnext.buying.MaterialRequestController = erpnext.buying.BuyingController.exten
company: cur_frm.doc.company
}
})
}, __("From"));
}, __("Get items from"));
}
if(doc.docstatus == 1 && doc.status == 'Stopped')

View File

@ -11,7 +11,7 @@ from frappe.utils import cstr, flt, getdate
from frappe import _
from frappe.model.mapper import get_mapped_doc
from erpnext.stock.stock_balance import update_bin_qty, get_indented_qty
from erpnext.stock.get_item_details import apply_price_list
from erpnext.controllers.buying_controller import BuyingController
@ -182,6 +182,10 @@ def update_item(obj, target, source_parent):
@frappe.whitelist()
def make_purchase_order(source_name, target_doc=None):
def postprocess(source, target_doc):
target_doc.update(apply_price_list(target_doc.as_dict(), as_doc = True))
set_missing_values(source, target_doc)
doclist = get_mapped_doc("Material Request", source_name, {
"Material Request": {
"doctype": "Purchase Order",
@ -202,7 +206,7 @@ def make_purchase_order(source_name, target_doc=None):
"postprocess": update_item,
"condition": lambda doc: doc.ordered_qty < doc.qty
}
}, target_doc, set_missing_values)
}, target_doc, postprocess)
return doclist
@ -218,11 +222,13 @@ def make_purchase_order_based_on_supplier(source_name, target_doc=None):
def postprocess(source, target_doc):
target_doc.supplier = source_name
set_missing_values(source, target_doc)
target_doc.set("items", [d for d in target_doc.get("items")
if d.get("item_code") in supplier_items and d.get("qty") > 0])
return target_doc
target_doc.update(apply_price_list(target_doc.as_dict(), as_doc = True))
set_missing_values(source, target_doc)
for mr in material_requests:
target_doc = get_mapped_doc("Material Request", mr, {
@ -264,6 +270,10 @@ def get_material_requests_based_on_supplier(supplier):
@frappe.whitelist()
def make_supplier_quotation(source_name, target_doc=None):
def postprocess(source, target_doc):
target_doc.update(apply_price_list(target_doc.as_dict(), as_doc = True))
set_missing_values(source, target_doc)
doclist = get_mapped_doc("Material Request", source_name, {
"Material Request": {
"doctype": "Supplier Quotation",
@ -280,7 +290,7 @@ def make_supplier_quotation(source_name, target_doc=None):
"parenttype": "prevdoc_doctype"
}
}
}, target_doc, set_missing_values)
}, target_doc, postprocess)
return doclist

View File

@ -51,7 +51,7 @@ erpnext.stock.PurchaseReceiptController = erpnext.buying.BuyingController.extend
company: cur_frm.doc.company
}
})
}, __("From"));
}, __("Get items from"));
}
if(this.frm.doc.docstatus == 1 && this.frm.doc.status!="Closed") {

View File

@ -644,7 +644,7 @@
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Get Current Stock",
"label": "Get current stock",
"length": 0,
"no_copy": 0,
"oldfieldtype": "Button",
@ -2302,7 +2302,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
"modified": "2015-12-30 18:15:06.678001",
"modified": "2016-01-15 04:14:16.311445",
"modified_by": "Administrator",
"module": "Stock",
"name": "Purchase Receipt",

View File

@ -21,14 +21,13 @@ def get_item_details(args):
"selling_price_list": None,
"price_list_currency": None,
"plc_conversion_rate": 1.0,
"parenttype": "",
"parent": "",
"doctype": "",
"name": "",
"supplier": None,
"transaction_date": None,
"conversion_rate": 1.0,
"buying_price_list": None,
"is_subcontracted": "Yes" / "No",
"transaction_type": "selling",
"ignore_pricing_rule": 0/1
"project_name": ""
}
@ -49,7 +48,7 @@ def get_item_details(args):
get_price_list_rate(args, item_doc, out)
if args.transaction_type == "selling" and cint(args.is_pos):
if args.customer and cint(args.is_pos):
out.update(get_pos_profile_item_details(args.company, args))
# update args with out, if key or value not exists
@ -59,7 +58,7 @@ def get_item_details(args):
out.update(get_pricing_rule_for_item(args))
if args.get("parenttype") in ("Sales Invoice", "Delivery Note"):
if args.get("doctype") in ("Sales Invoice", "Delivery Note"):
if item_doc.has_serial_no == 1 and not args.serial_no:
out.serial_no = get_serial_nos_by_fifo(args, item_doc)
@ -78,13 +77,6 @@ def process_args(args):
args = frappe._dict(args)
if not args.get("transaction_type"):
if args.get("parenttype")=="Material Request" or \
frappe.get_meta(args.get("parenttype")).get_field("supplier"):
args.transaction_type = "buying"
else:
args.transaction_type = "selling"
if not args.get("price_list"):
args.price_list = args.get("selling_price_list") or args.get("buying_price_list")
@ -115,7 +107,7 @@ def validate_item_details(args, item):
from erpnext.stock.doctype.item.item import validate_end_of_life
validate_end_of_life(item.name, item.end_of_life, item.disabled)
if args.transaction_type == "selling":
if args.customer or args.doctype=="Opportunity":
# validate if sales item or service item
if args.get("order_type") == "Maintenance":
if item.is_service_item != 1:
@ -127,7 +119,7 @@ def validate_item_details(args, item):
if cint(item.has_variants):
throw(_("Item {0} is a template, please select one of its variants").format(item.name))
elif args.transaction_type == "buying" and args.parenttype != "Material Request":
elif args.supplier and args.doctype != "Material Request":
# validate if purchase item or subcontracted item
if item.is_purchase_item != 1:
throw(_("Item {0} must be a Purchase Item").format(item.name))
@ -160,7 +152,7 @@ def get_basic_details(args, item):
"item_tax_rate": json.dumps(dict(([d.tax_type, d.tax_rate] for d in
item.get("taxes")))),
"uom": item.stock_uom,
"min_order_qty": flt(item.min_order_qty) if args.parenttype == "Material Request" else "",
"min_order_qty": flt(item.min_order_qty) if args.doctype == "Material Request" else "",
"conversion_factor": 1.0,
"qty": args.qty or 1.0,
"stock_qty": 1.0,
@ -201,7 +193,7 @@ def get_default_expense_account(args, item):
def get_default_cost_center(args, item):
return (frappe.db.get_value("Project", args.get("project_name"), "cost_center")
or (item.selling_cost_center if args.get("transaction_type") == "selling" else item.buying_cost_center)
or (item.selling_cost_center if args.get("customer") else item.buying_cost_center)
or frappe.db.get_value("Item Group", item.item_group, "default_cost_center")
or args.get("cost_center"))
@ -212,10 +204,13 @@ def get_price_list_rate(args, item_doc, out):
validate_price_list(args)
validate_conversion_rate(args, meta)
price_list_rate = get_price_list_rate_for(args, item_doc.name)
if not price_list_rate and item_doc.variant_of:
price_list_rate = get_price_list_rate_for(args, item_doc.variant_of)
price_list_rate = get_price_list_rate_for(args.price_list, item_doc.name)
# variant
if not price_list_rate and item_doc.variant_of:
price_list_rate = get_price_list_rate_for(args.price_list, item_doc.variant_of)
# insert in database
if not price_list_rate:
if args.price_list and args.rate:
insert_item_price(args)
@ -224,10 +219,10 @@ def get_price_list_rate(args, item_doc, out):
out.price_list_rate = flt(price_list_rate) * flt(args.plc_conversion_rate) \
/ flt(args.conversion_rate)
if not out.price_list_rate and args.transaction_type == "buying":
if not out.price_list_rate and args.supplier:
from erpnext.stock.doctype.item.item import get_last_purchase_details
out.update(get_last_purchase_details(item_doc.name,
args.parent, args.conversion_rate))
args.name, args.conversion_rate))
def insert_item_price(args):
"""Insert Item Price if Price List and Price List Rate are specified and currency is the same"""
@ -249,14 +244,14 @@ def insert_item_price(args):
frappe.msgprint(_("Item Price added for {0} in Price List {1}").format(args.item_code,
args.price_list))
def get_price_list_rate_for(args, item_code):
def get_price_list_rate_for(price_list, item_code):
return frappe.db.get_value("Item Price",
{"price_list": args.price_list, "item_code": item_code}, "price_list_rate")
{"price_list": price_list, "item_code": item_code}, "price_list_rate")
def validate_price_list(args):
if args.get("price_list"):
if not frappe.db.get_value("Price List",
{"name": args.price_list, args.transaction_type: 1, "enabled": 1}):
{"name": args.price_list, "selling" if (args.customer or args.lead) else "buying": 1, "enabled": 1}):
throw(_("Price List {0} is disabled").format(args.price_list))
else:
throw(_("Price List not selected"))
@ -288,7 +283,7 @@ def validate_conversion_rate(args, meta):
frappe._dict({"fields": args})))
def get_party_item_code(args, item_doc, out):
if args.transaction_type == "selling":
if args.customer:
customer_item_code = item_doc.get("customer_items", {"customer_name": args.customer})
out.customer_item_code = customer_item_code[0].ref_code if customer_item_code else None
else:
@ -369,21 +364,27 @@ def get_batch_qty(batch_no,warehouse,item_code):
return {'actual_batch_qty': actual_batch_qty}
@frappe.whitelist()
def apply_price_list(args):
"""
def apply_price_list(args, as_doc=False):
"""Apply pricelist on a document-like dict object and return as
{'parent': dict, 'children': list}
:param args: See below
:param as_doc: Updates value in the passed dict
args = {
"item_list": [{"doctype": "", "name": "", "item_code": "", "brand": "", "item_group": ""}, ...],
"doctype": "",
"name": "",
"items": [{"doctype": "", "name": "", "item_code": "", "brand": "", "item_group": ""}, ...],
"conversion_rate": 1.0,
"selling_price_list": None,
"price_list_currency": None,
"plc_conversion_rate": 1.0,
"parenttype": "",
"parent": "",
"doctype": "",
"name": "",
"supplier": None,
"transaction_date": None,
"conversion_rate": 1.0,
"buying_price_list": None,
"transaction_type": "selling",
"ignore_pricing_rule": 0/1
}
"""
@ -392,10 +393,8 @@ def apply_price_list(args):
parent = get_price_list_currency_and_exchange_rate(args)
children = []
if "item_list" in args:
item_list = args.get("item_list")
del args["item_list"]
if "items" in args:
item_list = args.get("items")
args.update(parent)
for item in item_list:
@ -404,16 +403,31 @@ def apply_price_list(args):
item_details = apply_price_list_on_item(args_copy)
children.append(item_details)
return {
"parent": parent,
"children": children
}
if as_doc:
args.price_list_currency = parent.price_list_currency
args.plc_conversion_rate = parent.plc_conversion_rate
if args.get('items'):
for i, item in enumerate(args.get('items')):
for fieldname in children[i]:
# if the field exists in the original doc
# update the value
if fieldname in item and fieldname not in ("name", "doctype"):
item[fieldname] = children[i][fieldname]
return args
else:
return {
"parent": parent,
"children": children
}
def apply_price_list_on_item(args):
item_details = frappe._dict()
item_doc = frappe.get_doc("Item", args.item_code)
get_price_list_rate(args, item_doc, item_details)
item_details.update(get_pricing_rule_for_item(args))
return item_details
def get_price_list_currency(price_list):
@ -437,10 +451,10 @@ def get_price_list_currency_and_exchange_rate(args):
and price_list_currency != args.price_list_currency):
plc_conversion_rate = get_exchange_rate(price_list_currency, args.currency) or plc_conversion_rate
return {
return frappe._dict({
"price_list_currency": price_list_currency,
"plc_conversion_rate": plc_conversion_rate
}
})
@frappe.whitelist()
def get_default_bom(item_code=None):

View File

@ -28,7 +28,7 @@ erpnext.support.MaintenanceSchedule = frappe.ui.form.Controller.extend({
company: me.frm.doc.company
}
});
}, __("From"));
}, __("Get items from"));
} else if (this.frm.doc.docstatus === 1) {
this.frm.add_custom_button(__("Make Maintenance Visit"), function() {
frappe.model.open_mapped_doc({

View File

@ -26,7 +26,7 @@ erpnext.support.MaintenanceVisit = frappe.ui.form.Controller.extend({
company: cur_frm.doc.company
}
})
}, __("From"));
}, __("Get items from"));
cur_frm.add_custom_button(__('Warranty Claim'),
function() {
frappe.model.map_current_doc({
@ -38,7 +38,7 @@ erpnext.support.MaintenanceVisit = frappe.ui.form.Controller.extend({
company: cur_frm.doc.company
}
})
}, __("From"));
}, __("Get items from"));
cur_frm.add_custom_button(__('Sales Order'),
function() {
frappe.model.map_current_doc({
@ -51,7 +51,7 @@ erpnext.support.MaintenanceVisit = frappe.ui.form.Controller.extend({
company: cur_frm.doc.company
}
})
}, __("From"));
}, __("Get items from"));
}
},
});