| // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors |
| // License: GNU General Public License v3. See license.txt |
| |
| |
| cur_frm.cscript.tax_table = "Sales Taxes and Charges"; |
| {% include 'accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template.js' %} |
| |
| frappe.provide("erpnext.selling"); |
| frappe.require("assets/erpnext/js/controllers/transaction.js"); |
| |
| cur_frm.email_field = "contact_email"; |
| |
| erpnext.selling.SellingController = erpnext.TransactionController.extend({ |
| onload: function() { |
| this._super(); |
| this.setup_queries(); |
| }, |
| |
| setup_queries: function() { |
| var me = this; |
| |
| this.frm.add_fetch("sales_partner", "commission_rate", "commission_rate"); |
| |
| $.each([["customer_address", "customer_filter"], |
| ["shipping_address_name", "customer_filter"], |
| ["contact_person", "customer_filter"], |
| ["customer", "customer"], |
| ["lead", "lead"]], |
| function(i, opts) { |
| if(me.frm.fields_dict[opts[0]]) |
| me.frm.set_query(opts[0], erpnext.queries[opts[1]]); |
| }); |
| |
| if(this.frm.fields_dict.taxes_and_charges) { |
| this.frm.set_query("taxes_and_charges", function() { |
| return { |
| filters: [ |
| ['Sales Taxes and Charges Template', 'company', '=', me.frm.doc.company], |
| ['Sales Taxes and Charges Template', 'docstatus', '!=', 2] |
| ] |
| } |
| }); |
| } |
| |
| if(this.frm.fields_dict.selling_price_list) { |
| this.frm.set_query("selling_price_list", function() { |
| return { filters: { selling: 1 } }; |
| }); |
| } |
| |
| if(!this.frm.fields_dict["items"]) { |
| return; |
| } |
| |
| if(this.frm.fields_dict["items"].grid.get_field('item_code')) { |
| this.frm.set_query("item_code", "items", function() { |
| return { |
| query: "erpnext.controllers.queries.item_query", |
| filters: (me.frm.doc.order_type === "Maintenance" ? |
| {'is_service_item': 1}: |
| {'is_sales_item': 1 }) |
| } |
| }); |
| } |
| |
| if(this.frm.fields_dict["items"].grid.get_field('batch_no')) { |
| this.frm.set_query("batch_no", "items", function(doc, cdt, cdn) { |
| var item = frappe.get_doc(cdt, cdn); |
| if(!item.item_code) { |
| frappe.throw(__("Please enter Item Code to get batch no")); |
| } else { |
| filters = { |
| 'item_code': item.item_code, |
| 'posting_date': me.frm.doc.posting_date || nowdate(), |
| } |
| if(item.warehouse) filters["warehouse"] = item.warehouse |
| |
| return { |
| query : "erpnext.controllers.queries.get_batch_no", |
| filters: filters |
| } |
| } |
| }); |
| } |
| |
| if(this.frm.fields_dict.sales_team && this.frm.fields_dict.sales_team.grid.get_field("sales_person")) { |
| this.frm.set_query("sales_person", "sales_team", erpnext.queries.not_a_group_filter); |
| } |
| }, |
| |
| refresh: function() { |
| this._super(); |
| this.frm.toggle_display("customer_name", |
| (this.frm.doc.customer_name && this.frm.doc.customer_name!==this.frm.doc.customer)); |
| if(this.frm.fields_dict.packed_items) { |
| var packing_list_exists = (this.frm.doc.packed_items || []).length; |
| this.frm.toggle_display("packing_list", packing_list_exists ? true : false); |
| } |
| this.toggle_editable_price_list_rate(); |
| }, |
| |
| customer: function() { |
| var me = this; |
| erpnext.utils.get_party_details(this.frm, null, null, function(){me.apply_pricing_rule()}); |
| }, |
| |
| customer_address: function() { |
| erpnext.utils.get_address_display(this.frm, "customer_address"); |
| }, |
| |
| shipping_address_name: function() { |
| erpnext.utils.get_address_display(this.frm, "shipping_address_name", "shipping_address"); |
| }, |
| |
| sales_partner: function() { |
| this.apply_pricing_rule(); |
| }, |
| |
| campaign: function() { |
| this.apply_pricing_rule(); |
| }, |
| |
| selling_price_list: function() { |
| this.apply_price_list(); |
| }, |
| |
| price_list_rate: function(doc, cdt, cdn) { |
| var item = frappe.get_doc(cdt, cdn); |
| frappe.model.round_floats_in(item, ["price_list_rate", "discount_percentage"]); |
| |
| item.rate = flt(item.price_list_rate * (1 - item.discount_percentage / 100.0), |
| precision("rate", item)); |
| |
| this.calculate_taxes_and_totals(); |
| }, |
| |
| discount_percentage: function(doc, cdt, cdn) { |
| var item = frappe.get_doc(cdt, cdn); |
| if(!item.price_list_rate) { |
| item.discount_percentage = 0.0; |
| } else { |
| this.price_list_rate(doc, cdt, cdn); |
| } |
| }, |
| |
| commission_rate: function() { |
| this.calculate_commission(); |
| refresh_field("total_commission"); |
| }, |
| |
| total_commission: function() { |
| if(this.frm.doc.base_net_total) { |
| frappe.model.round_floats_in(this.frm.doc, ["base_net_total", "total_commission"]); |
| |
| if(this.frm.doc.base_net_total < this.frm.doc.total_commission) { |
| var msg = (__("[Error]") + " " + |
| __(frappe.meta.get_label(this.frm.doc.doctype, "total_commission", |
| this.frm.doc.name)) + " > " + |
| __(frappe.meta.get_label(this.frm.doc.doctype, "base_net_total", this.frm.doc.name))); |
| msgprint(msg); |
| throw msg; |
| } |
| |
| this.frm.set_value("commission_rate", |
| flt(this.frm.doc.total_commission * 100.0 / this.frm.doc.base_net_total)); |
| } |
| }, |
| |
| allocated_percentage: function(doc, cdt, cdn) { |
| var sales_person = frappe.get_doc(cdt, cdn); |
| |
| if(sales_person.allocated_percentage) { |
| sales_person.allocated_percentage = flt(sales_person.allocated_percentage, |
| precision("allocated_percentage", sales_person)); |
| sales_person.allocated_amount = flt(this.frm.doc.base_net_total * |
| sales_person.allocated_percentage / 100.0, |
| precision("allocated_amount", sales_person)); |
| |
| refresh_field(["allocated_percentage", "allocated_amount"], sales_person.name, |
| sales_person.parentfield); |
| } |
| }, |
| |
| warehouse: function(doc, cdt, cdn) { |
| var me = this; |
| this.batch_no(doc, cdt, cdn); |
| var item = frappe.get_doc(cdt, cdn); |
| if(item.item_code && item.warehouse) { |
| return this.frm.call({ |
| method: "erpnext.stock.get_item_details.get_available_qty", |
| child: item, |
| args: { |
| item_code: item.item_code, |
| warehouse: item.warehouse, |
| }, |
| }); |
| } |
| }, |
| |
| toggle_editable_price_list_rate: function() { |
| var df = frappe.meta.get_docfield(this.frm.doc.doctype + " Item", "price_list_rate", this.frm.doc.name); |
| var editable_price_list_rate = cint(frappe.defaults.get_default("editable_price_list_rate")); |
| |
| if(df && editable_price_list_rate) { |
| df.read_only = 0; |
| } |
| }, |
| |
| calculate_commission: function() { |
| if(this.frm.fields_dict.commission_rate) { |
| if(this.frm.doc.commission_rate > 100) { |
| var msg = __(frappe.meta.get_label(this.frm.doc.doctype, "commission_rate", this.frm.doc.name)) + |
| " " + __("cannot be greater than 100"); |
| msgprint(msg); |
| throw msg; |
| } |
| |
| this.frm.doc.total_commission = flt(this.frm.doc.base_net_total * this.frm.doc.commission_rate / 100.0, |
| precision("total_commission")); |
| } |
| }, |
| |
| calculate_contribution: function() { |
| var me = this; |
| $.each(this.frm.doc.doctype.sales_team || [], function(i, sales_person) { |
| frappe.model.round_floats_in(sales_person); |
| if(sales_person.allocated_percentage) { |
| sales_person.allocated_amount = flt( |
| me.frm.doc.base_net_total * sales_person.allocated_percentage / 100.0, |
| precision("allocated_amount", sales_person)); |
| } |
| }); |
| }, |
| |
| shipping_rule: function() { |
| var me = this; |
| if(this.frm.doc.shipping_rule) { |
| return this.frm.call({ |
| doc: this.frm.doc, |
| method: "apply_shipping_rule", |
| callback: function(r) { |
| if(!r.exc) { |
| me.calculate_taxes_and_totals(); |
| } |
| } |
| }) |
| } |
| }, |
| |
| batch_no: function(doc, cdt, cdn) { |
| var me = this; |
| var item = frappe.get_doc(cdt, cdn); |
| |
| if(item.warehouse && item.item_code && item.batch_no) { |
| return this.frm.call({ |
| method: "erpnext.stock.get_item_details.get_batch_qty", |
| child: item, |
| args: { |
| "batch_no": item.batch_no, |
| "warehouse": item.warehouse, |
| "item_code": item.item_code |
| }, |
| "fieldname": "actual_batch_qty" |
| }); |
| } |
| }, |
| |
| set_dynamic_labels: function() { |
| this._super(); |
| this.set_product_bundle_help(this.frm.doc); |
| }, |
| |
| set_product_bundle_help: function(doc) { |
| if(!cur_frm.fields_dict.packing_list) return; |
| if ((doc.packed_items || []).length) { |
| $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(true); |
| |
| if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) { |
| help_msg = "<div class='alert alert-warning'>" + |
| __("For 'Product Bundle' items, Warehouse, Serial No and Batch No will be considered from the 'Packing List' table. If Warehouse and Batch No are same for all packing items for any 'Product Bundle' item, those values can be entered in the main Item table, values will be copied to 'Packing List' table.")+ |
| "</div>"; |
| frappe.meta.get_docfield(doc.doctype, 'product_bundle_help', doc.name).options = help_msg; |
| } |
| } else { |
| $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(false); |
| if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) { |
| frappe.meta.get_docfield(doc.doctype, 'product_bundle_help', doc.name).options = ''; |
| } |
| } |
| refresh_field('product_bundle_help'); |
| }, |
| |
| make_payment_request: function() { |
| if (!cur_frm.doc.contact_email){ |
| cur_frm.cscript.get_customer_email(); |
| } |
| else { |
| cur_frm.cscript.create_payment_request(cur_frm.doc.contact_email) |
| } |
| }, |
| |
| get_customer_email: function() { |
| var dialog = new frappe.ui.Dialog({ |
| title: __("Recipient Details"), |
| fields: [ |
| {"fieldtype": "Data", "label": __("Recipient Email Id"), "fieldname": "recipient_id", |
| "reqd": 1}, |
| {"fieldtype": "Button", "label": __("Make Payment Request"), |
| "fieldname": "make_pr", "cssClass": "btn-primary"} |
| ] |
| }); |
| |
| dialog.fields_dict.make_pr.$input.click(function() { |
| args = dialog.get_values(); |
| if(!args) return; |
| dialog.hide(); |
| cur_frm.cscript.create_payment_request(args.recipient_id) |
| |
| }); |
| dialog.show(); |
| }, |
| |
| create_payment_request: function(recipient_id){ |
| frappe.call({ |
| method:"erpnext.accounts.doctype.payment_request.payment_request.make_payment_request", |
| args: { |
| "dt": cur_frm.doc.doctype, |
| "dn": cur_frm.doc.name, |
| "recipient_id": recipient_id |
| }, |
| callback: function(r) { |
| |
| } |
| }) |
| } |
| }); |
| |
| frappe.ui.form.on(cur_frm.doctype,"project_name", function(frm) { |
| if(in_list(["Delivery Note", "Sales Invoice"], frm.doc.doctype)) { |
| frappe.call({ |
| method:'erpnext.projects.doctype.project.project.get_cost_center_name' , |
| args: { project_name: frm.doc.project_name }, |
| callback: function(r, rt) { |
| if(!r.exc) { |
| $.each(frm.doc["items"] || [], function(i, row) { |
| frappe.model.set_value(row.doctype, row.name, "cost_center", r.message); |
| msgprint(__("Cost Center For Item with Item Code '"+row.item_name+"' has been Changed to "+ r.message)); |
| }) |
| } |
| } |
| }) |
| } |
| }) |