blob: 002cfe41e18c9747557e7f842db1f32379b3189c [file] [log] [blame]
Anand Doshi885e0742015-03-03 14:55:30 +05301// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
Rushabh Mehtae67d1fb2013-08-05 14:59:54 +05302// License: GNU General Public License v3. See license.txt
Rushabh Mehta3966f1d2012-02-23 12:35:32 +05303
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +05304
Nabin Hait613d0812015-02-23 11:58:15 +05305cur_frm.cscript.tax_table = "Sales Taxes and Charges";
Rushabh Mehta621283c2016-04-21 19:00:34 +05306{% include 'erpnext/accounts/doctype/sales_taxes_and_charges_template/sales_taxes_and_charges_template.js' %}
Nabin Hait613d0812015-02-23 11:58:15 +05307
Rushabh Mehtab09d9da2014-01-02 11:47:23 +05308
Rushabh Mehtae10cf022014-09-12 13:09:41 +05309cur_frm.email_field = "contact_email";
10
Rushabh Mehtabe2ee182016-04-29 17:22:42 +053011frappe.provide("erpnext.selling");
Anand Doshi3543f302013-05-24 19:25:01 +053012erpnext.selling.SellingController = erpnext.TransactionController.extend({
Rushabh Mehta532eedf2016-05-19 18:22:49 +053013 setup: function() {
14 this._super();
deepeshgarg00786152eb2018-09-25 19:08:16 +053015 this.frm.add_fetch("sales_partner", "commission_rate", "commission_rate");
16 this.frm.add_fetch("sales_person", "commission_rate", "commission_rate");
Rushabh Mehta532eedf2016-05-19 18:22:49 +053017 },
18
Anand Doshi9b496142013-07-11 19:13:58 +053019 onload: function() {
20 this._super();
Anand Doshi9b496142013-07-11 19:13:58 +053021 this.setup_queries();
Rushabh Mehta30dc9a12017-11-17 14:31:09 +053022 this.frm.set_query('shipping_rule', function() {
23 return {
24 filters: {
25 "shipping_rule_type": "Selling"
26 }
27 };
28 });
Anand Doshi9b496142013-07-11 19:13:58 +053029 },
Anand Doshibd67e872014-04-11 16:51:27 +053030
Anand Doshi9b496142013-07-11 19:13:58 +053031 setup_queries: function() {
Anand Doshi99100a42013-07-04 17:13:53 +053032 var me = this;
Anand Doshibd67e872014-04-11 16:51:27 +053033
Rushabh Mehtab92087c2017-01-13 18:53:11 +053034 $.each([["customer", "customer"],
Anand Doshibd67e872014-04-11 16:51:27 +053035 ["lead", "lead"]],
Anand Doshid5d39ac2013-07-29 13:28:37 +053036 function(i, opts) {
Anand Doshibd67e872014-04-11 16:51:27 +053037 if(me.frm.fields_dict[opts[0]])
Anand Doshid5d39ac2013-07-29 13:28:37 +053038 me.frm.set_query(opts[0], erpnext.queries[opts[1]]);
39 });
Anand Doshibd67e872014-04-11 16:51:27 +053040
Rushabh Mehtab92087c2017-01-13 18:53:11 +053041 me.frm.set_query('contact_person', erpnext.queries.contact_query);
42 me.frm.set_query('customer_address', erpnext.queries.address_query);
43 me.frm.set_query('shipping_address_name', erpnext.queries.address_query);
44
Akhilesh Darjee4f721562014-01-29 16:31:38 +053045 if(this.frm.fields_dict.taxes_and_charges) {
46 this.frm.set_query("taxes_and_charges", function() {
Saurabhf52dc072013-07-10 13:07:49 +053047 return {
48 filters: [
Rushabh Mehtaab1ed012015-05-08 11:08:48 +053049 ['Sales Taxes and Charges Template', 'company', '=', me.frm.doc.company],
50 ['Sales Taxes and Charges Template', 'docstatus', '!=', 2]
Saurabhf52dc072013-07-10 13:07:49 +053051 ]
52 }
Anand Doshi99100a42013-07-04 17:13:53 +053053 });
54 }
Anand Doshi99100a42013-07-04 17:13:53 +053055
Rushabh Mehta4a404e92013-08-09 18:11:35 +053056 if(this.frm.fields_dict.selling_price_list) {
57 this.frm.set_query("selling_price_list", function() {
Nabin Haitdc15b4f2014-01-20 16:48:49 +053058 return { filters: { selling: 1 } };
Anand Doshi720a01a2013-07-26 11:32:02 +053059 });
Anand Doshi720a01a2013-07-26 11:32:02 +053060 }
Anand Doshibd67e872014-04-11 16:51:27 +053061
karthikeyan57fc60212019-07-04 22:46:16 +053062 if(this.frm.fields_dict.tc_name) {
63 this.frm.set_query("tc_name", function() {
64 return { filters: { selling: 1 } };
65 });
66 }
67
Nabin Haitdd38a262014-12-26 13:15:21 +053068 if(!this.frm.fields_dict["items"]) {
Anand Doshi99100a42013-07-04 17:13:53 +053069 return;
70 }
Anand Doshibd67e872014-04-11 16:51:27 +053071
Nabin Haitdd38a262014-12-26 13:15:21 +053072 if(this.frm.fields_dict["items"].grid.get_field('item_code')) {
73 this.frm.set_query("item_code", "items", function() {
Anand Doshi9b496142013-07-11 19:13:58 +053074 return {
Rushabh Mehtad973c162016-08-16 11:32:08 +053075 query: "erpnext.controllers.queries.item_query",
76 filters: {'is_sales_item': 1}
Anand Doshi9b496142013-07-11 19:13:58 +053077 }
Anand Doshi99100a42013-07-04 17:13:53 +053078 });
79 }
Anand Doshibd67e872014-04-11 16:51:27 +053080
Rushabh Mehta698c0402016-11-22 23:16:40 +053081 if(this.frm.fields_dict["packed_items"] &&
82 this.frm.fields_dict["packed_items"].grid.get_field('batch_no')) {
Rohit Waghchauree887e922016-11-18 12:16:22 +053083 this.frm.set_query("batch_no", "packed_items", function(doc, cdt, cdn) {
84 return me.set_query_for_batch(doc, cdt, cdn)
85 });
86 }
Deepesh Gargef0d26c2020-01-06 15:34:15 +053087
88 if(this.frm.fields_dict["items"].grid.get_field('item_code')) {
89 this.frm.set_query("item_tax_template", "items", function(doc, cdt, cdn) {
90 return me.set_query_for_item_tax_template(doc, cdt, cdn)
91 });
92 }
93
Rohit Waghchauree887e922016-11-18 12:16:22 +053094 },
95
Anand Doshic4a54fe2013-08-01 18:19:51 +053096 refresh: function() {
97 this._super();
Rushabh Mehtab92087c2017-01-13 18:53:11 +053098
Rushabh Mehta8d39fd92017-01-16 13:06:07 +053099 frappe.dynamic_link = {doc: this.frm.doc, fieldname: 'customer', doctype: 'Customer'}
Rushabh Mehtab92087c2017-01-13 18:53:11 +0530100
Anand Doshibd67e872014-04-11 16:51:27 +0530101 this.frm.toggle_display("customer_name",
Akhilesh Darjee5ce1b8b2013-12-09 16:29:04 +0530102 (this.frm.doc.customer_name && this.frm.doc.customer_name!==this.frm.doc.customer));
Nabin Haite7d15362014-12-25 16:01:55 +0530103 if(this.frm.fields_dict.packed_items) {
104 var packing_list_exists = (this.frm.doc.packed_items || []).length;
Anand Doshic4a54fe2013-08-01 18:19:51 +0530105 this.frm.toggle_display("packing_list", packing_list_exists ? true : false);
106 }
Nabin Hait2029ea92015-04-16 17:55:35 +0530107 this.toggle_editable_price_list_rate();
Rushabh Mehta8aded132013-07-04 12:50:52 +0530108 },
Anand Doshibd67e872014-04-11 16:51:27 +0530109
Anand Doshi3543f302013-05-24 19:25:01 +0530110 customer: function() {
Nabin Haita3dd72a2014-05-28 12:49:20 +0530111 var me = this;
Nabin Haite45ec662018-08-01 17:44:34 +0530112 erpnext.utils.get_party_details(this.frm, null, null, function() {
113 me.apply_price_list();
114 });
Anand Doshi3543f302013-05-24 19:25:01 +0530115 },
Anand Doshibd67e872014-04-11 16:51:27 +0530116
Nabin Haita279d782013-07-15 13:04:33 +0530117 customer_address: function() {
Rushabh Mehtab09d9da2014-01-02 11:47:23 +0530118 erpnext.utils.get_address_display(this.frm, "customer_address");
Saif Ur Rehmanfd531a62018-12-29 01:49:11 +0500119 erpnext.utils.set_taxes_from_address(this.frm, "customer_address", "customer_address", "shipping_address_name");
Nabin Haita279d782013-07-15 13:04:33 +0530120 },
Anand Doshibd67e872014-04-11 16:51:27 +0530121
Nabin Hait9d1f0772014-02-19 17:43:24 +0530122 shipping_address_name: function() {
123 erpnext.utils.get_address_display(this.frm, "shipping_address_name", "shipping_address");
Saif Ur Rehmanfd531a62018-12-29 01:49:11 +0500124 erpnext.utils.set_taxes_from_address(this.frm, "shipping_address_name", "customer_address", "shipping_address_name");
Nabin Hait9d1f0772014-02-19 17:43:24 +0530125 },
Anand Doshibd67e872014-04-11 16:51:27 +0530126
Nabin Haita3dd72a2014-05-28 12:49:20 +0530127 sales_partner: function() {
128 this.apply_pricing_rule();
129 },
130
131 campaign: function() {
132 this.apply_pricing_rule();
133 },
134
Rushabh Mehta4a404e92013-08-09 18:11:35 +0530135 selling_price_list: function() {
Anand Doshidffec8f2014-07-01 17:45:15 +0530136 this.apply_price_list();
rohitwaghchaure8e675eb2018-02-13 17:11:06 +0530137 this.set_dynamic_labels();
Anand Doshif3096132013-05-21 19:35:06 +0530138 },
Anand Doshibd67e872014-04-11 16:51:27 +0530139
Nabin Haita7f757a2014-02-10 17:54:04 +0530140 price_list_rate: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530141 var item = frappe.get_doc(cdt, cdn);
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530142 frappe.model.round_floats_in(item, ["price_list_rate", "discount_percentage"]);
Anand Doshibd67e872014-04-11 16:51:27 +0530143
mbauskara52472c2016-03-05 15:10:25 +0530144 // check if child doctype is Sales Order Item/Qutation Item and calculate the rate
Saqiba6f98d42020-07-23 18:51:26 +0530145 if(in_list(["Quotation Item", "Sales Order Item", "Delivery Note Item", "Sales Invoice Item", "POS Invoice Item"]), cdt)
Rohit Waghchaure6087fe12016-04-09 14:31:09 +0530146 this.apply_pricing_rule_on_item(item);
mbauskara52472c2016-03-05 15:10:25 +0530147 else
148 item.rate = flt(item.price_list_rate * (1 - item.discount_percentage / 100.0),
149 precision("rate", item));
150
Anand Doshif3096132013-05-21 19:35:06 +0530151 this.calculate_taxes_and_totals();
152 },
Anand Doshibd67e872014-04-11 16:51:27 +0530153
Nabin Haita7f757a2014-02-10 17:54:04 +0530154 discount_percentage: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530155 var item = frappe.get_doc(cdt, cdn);
Rohit Waghchaure8bfe3302019-03-18 14:34:19 +0530156 item.discount_amount = 0.0;
157 this.apply_discount_on_item(doc, cdt, cdn, 'discount_percentage');
158 },
159
160 discount_amount: function(doc, cdt, cdn) {
deepeshgarg007a9ea49c2019-07-04 15:56:34 +0530161
162 if(doc.name === cdn) {
163 return;
164 }
165
Nabin Hait593242f2019-04-05 19:35:02 +0530166 var item = frappe.get_doc(cdt, cdn);
167 item.discount_percentage = 0.0;
Rohit Waghchaure8bfe3302019-03-18 14:34:19 +0530168 this.apply_discount_on_item(doc, cdt, cdn, 'discount_amount');
169 },
170
171 apply_discount_on_item: function(doc, cdt, cdn, field) {
172 var item = frappe.get_doc(cdt, cdn);
Nabin Haita7f757a2014-02-10 17:54:04 +0530173 if(!item.price_list_rate) {
Rohit Waghchaure8bfe3302019-03-18 14:34:19 +0530174 item[field] = 0.0;
Anand Doshi923d41d2013-05-28 17:23:36 +0530175 } else {
Nabin Haita7f757a2014-02-10 17:54:04 +0530176 this.price_list_rate(doc, cdt, cdn);
Anand Doshi923d41d2013-05-28 17:23:36 +0530177 }
Saurabh5ada14b2016-02-26 18:02:55 +0530178 this.set_gross_profit(item);
Anand Doshif3096132013-05-21 19:35:06 +0530179 },
Anand Doshibd67e872014-04-11 16:51:27 +0530180
Anand Doshif3096132013-05-21 19:35:06 +0530181 commission_rate: function() {
182 this.calculate_commission();
183 refresh_field("total_commission");
184 },
Anand Doshibd67e872014-04-11 16:51:27 +0530185
Anand Doshif3096132013-05-21 19:35:06 +0530186 total_commission: function() {
Nabin Hait5690be12015-02-12 16:09:11 +0530187 if(this.frm.doc.base_net_total) {
188 frappe.model.round_floats_in(this.frm.doc, ["base_net_total", "total_commission"]);
Anand Doshibd67e872014-04-11 16:51:27 +0530189
Nabin Hait5690be12015-02-12 16:09:11 +0530190 if(this.frm.doc.base_net_total < this.frm.doc.total_commission) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530191 var msg = (__("[Error]") + " " +
192 __(frappe.meta.get_label(this.frm.doc.doctype, "total_commission",
Anand Doshibd67e872014-04-11 16:51:27 +0530193 this.frm.doc.name)) + " > " +
Nabin Hait5690be12015-02-12 16:09:11 +0530194 __(frappe.meta.get_label(this.frm.doc.doctype, "base_net_total", this.frm.doc.name)));
Faris Ansariab74ca72017-05-30 12:54:42 +0530195 frappe.msgprint(msg);
Anand Doshif3096132013-05-21 19:35:06 +0530196 throw msg;
197 }
Anand Doshibd67e872014-04-11 16:51:27 +0530198
199 this.frm.set_value("commission_rate",
Nabin Hait5690be12015-02-12 16:09:11 +0530200 flt(this.frm.doc.total_commission * 100.0 / this.frm.doc.base_net_total));
Anand Doshif3096132013-05-21 19:35:06 +0530201 }
202 },
Anand Doshibd67e872014-04-11 16:51:27 +0530203
Anand Doshif3096132013-05-21 19:35:06 +0530204 allocated_percentage: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530205 var sales_person = frappe.get_doc(cdt, cdn);
Anand Doshif3096132013-05-21 19:35:06 +0530206 if(sales_person.allocated_percentage) {
deepeshgarg00786152eb2018-09-25 19:08:16 +0530207
Anand Doshif3096132013-05-21 19:35:06 +0530208 sales_person.allocated_percentage = flt(sales_person.allocated_percentage,
209 precision("allocated_percentage", sales_person));
deepeshgarg00786152eb2018-09-25 19:08:16 +0530210
Nabin Hait5690be12015-02-12 16:09:11 +0530211 sales_person.allocated_amount = flt(this.frm.doc.base_net_total *
Anand Doshibd67e872014-04-11 16:51:27 +0530212 sales_person.allocated_percentage / 100.0,
Anand Doshif3096132013-05-21 19:35:06 +0530213 precision("allocated_amount", sales_person));
deepeshgarg00786152eb2018-09-25 19:08:16 +0530214 refresh_field(["allocated_amount"], sales_person);
Anand Doshif3096132013-05-21 19:35:06 +0530215
deepeshgarg00786152eb2018-09-25 19:08:16 +0530216 this.calculate_incentive(sales_person);
217 refresh_field(["allocated_percentage", "allocated_amount", "commission_rate","incentives"], sales_person.name,
Anand Doshif3096132013-05-21 19:35:06 +0530218 sales_person.parentfield);
deepeshgarg007d9a768a2018-12-29 19:33:44 +0530219 }
deepeshgarg00786152eb2018-09-25 19:08:16 +0530220 },
221
222 sales_person: function(doc, cdt, cdn) {
223 var row = frappe.get_doc(cdt, cdn);
224 this.calculate_incentive(row);
225 refresh_field("incentives",row.name,row.parentfield);
Anand Doshif3096132013-05-21 19:35:06 +0530226 },
Anand Doshibd67e872014-04-11 16:51:27 +0530227
Anand Doshifc777182013-05-27 19:29:07 +0530228 warehouse: function(doc, cdt, cdn) {
Sambhaji Kolate98dbccd2015-03-10 15:04:28 +0530229 var me = this;
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530230 var item = frappe.get_doc(cdt, cdn);
Saqib14cdb242020-04-16 16:21:35 +0530231
232 if (item.serial_no && item.qty === item.serial_no.split(`\n`).length) {
233 return;
234 }
235
Shreyaa20157a2018-04-13 12:03:42 +0530236 if (item.serial_no && !item.batch_no) {
237 item.serial_no = null;
Anand Doshifc777182013-05-27 19:29:07 +0530238 }
Saqib14cdb242020-04-16 16:21:35 +0530239
Shreyaa20157a2018-04-13 12:03:42 +0530240 var has_batch_no;
241 frappe.db.get_value('Item', {'item_code': item.item_code}, 'has_batch_no', (r) => {
242 has_batch_no = r && r.has_batch_no;
243 if(item.item_code && item.warehouse) {
244 return this.frm.call({
245 method: "erpnext.stock.get_item_details.get_bin_details_and_serial_nos",
246 child: item,
247 args: {
248 item_code: item.item_code,
249 warehouse: item.warehouse,
Rohit Waghchaure6daab3c2019-09-19 17:01:26 +0530250 has_batch_no: has_batch_no || 0,
Shreyaa20157a2018-04-13 12:03:42 +0530251 stock_qty: item.stock_qty,
252 serial_no: item.serial_no || "",
253 },
254 callback:function(r){
255 if (in_list(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
Deepesh Gargfb29ffc2019-06-28 14:08:08 +0530256
257 if (doc.doctype === 'Sales Invoice' && (!doc.update_stock)) return;
258
Shreyaa20157a2018-04-13 12:03:42 +0530259 me.set_batch_number(cdt, cdn);
260 me.batch_no(doc, cdt, cdn);
261 }
262 }
263 });
264 }
265 })
Anand Doshifc777182013-05-27 19:29:07 +0530266 },
Anand Doshibd67e872014-04-11 16:51:27 +0530267
Anand Doshi33fe8672013-08-02 12:39:10 +0530268 toggle_editable_price_list_rate: function() {
Nabin Haitdd38a262014-12-26 13:15:21 +0530269 var df = frappe.meta.get_docfield(this.frm.doc.doctype + " Item", "price_list_rate", this.frm.doc.name);
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530270 var editable_price_list_rate = cint(frappe.defaults.get_default("editable_price_list_rate"));
Anand Doshibd67e872014-04-11 16:51:27 +0530271
Anand Doshi33fe8672013-08-02 12:39:10 +0530272 if(df && editable_price_list_rate) {
273 df.read_only = 0;
274 }
275 },
Anand Doshibd67e872014-04-11 16:51:27 +0530276
Anand Doshif3096132013-05-21 19:35:06 +0530277 calculate_commission: function() {
Anand Doshi923d41d2013-05-28 17:23:36 +0530278 if(this.frm.fields_dict.commission_rate) {
279 if(this.frm.doc.commission_rate > 100) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530280 var msg = __(frappe.meta.get_label(this.frm.doc.doctype, "commission_rate", this.frm.doc.name)) +
281 " " + __("cannot be greater than 100");
Faris Ansariab74ca72017-05-30 12:54:42 +0530282 frappe.msgprint(msg);
Anand Doshi923d41d2013-05-28 17:23:36 +0530283 throw msg;
284 }
Anand Doshibd67e872014-04-11 16:51:27 +0530285
Nabin Hait5690be12015-02-12 16:09:11 +0530286 this.frm.doc.total_commission = flt(this.frm.doc.base_net_total * this.frm.doc.commission_rate / 100.0,
Anand Doshi923d41d2013-05-28 17:23:36 +0530287 precision("total_commission"));
288 }
Anand Doshif3096132013-05-21 19:35:06 +0530289 },
Anand Doshibd67e872014-04-11 16:51:27 +0530290
Anand Doshif3096132013-05-21 19:35:06 +0530291 calculate_contribution: function() {
Anand Doshi2168e392013-05-23 19:25:08 +0530292 var me = this;
Rushabh Mehtaaa355af2014-03-26 18:24:30 +0530293 $.each(this.frm.doc.doctype.sales_team || [], function(i, sales_person) {
Faris Ansariab74ca72017-05-30 12:54:42 +0530294 frappe.model.round_floats_in(sales_person);
295 if(sales_person.allocated_percentage) {
296 sales_person.allocated_amount = flt(
297 me.frm.doc.base_net_total * sales_person.allocated_percentage / 100.0,
298 precision("allocated_amount", sales_person));
299 }
300 });
Anand Doshif3096132013-05-21 19:35:06 +0530301 },
Anand Doshibd67e872014-04-11 16:51:27 +0530302
deepeshgarg00786152eb2018-09-25 19:08:16 +0530303 calculate_incentive: function(row) {
304 if(row.allocated_amount)
305 {
306 row.incentives = flt(
307 row.allocated_amount * row.commission_rate / 100.0,
deepeshgarg007c3772f12018-09-26 15:55:43 +0530308 precision("incentives", row));
deepeshgarg00786152eb2018-09-25 19:08:16 +0530309 }
310 },
311
Sambhaji Kolate98dbccd2015-03-10 15:04:28 +0530312 batch_no: function(doc, cdt, cdn) {
313 var me = this;
314 var item = frappe.get_doc(cdt, cdn);
Saqiba6f98d42020-07-23 18:51:26 +0530315
316 if (item.serial_no) {
317 return;
318 }
319
Shreyaa20157a2018-04-13 12:03:42 +0530320 item.serial_no = null;
321 var has_serial_no;
322 frappe.db.get_value('Item', {'item_code': item.item_code}, 'has_serial_no', (r) => {
323 has_serial_no = r && r.has_serial_no;
324 if(item.warehouse && item.item_code && item.batch_no) {
325 return this.frm.call({
326 method: "erpnext.stock.get_item_details.get_batch_qty_and_serial_no",
327 child: item,
328 args: {
329 "batch_no": item.batch_no,
Maricaf0e87f72019-11-27 15:49:41 +0530330 "stock_qty": item.stock_qty || item.qty, //if stock_qty field is not available fetch qty (in case of Packed Items table)
Shreyaa20157a2018-04-13 12:03:42 +0530331 "warehouse": item.warehouse,
332 "item_code": item.item_code,
333 "has_serial_no": has_serial_no
334 },
335 "fieldname": "actual_batch_qty"
336 });
337 }
338 })
Sambhaji Kolate98dbccd2015-03-10 15:04:28 +0530339 },
340
Anand Doshi2168e392013-05-23 19:25:08 +0530341 set_dynamic_labels: function() {
Anand Doshi61a2f682013-06-21 17:55:31 +0530342 this._super();
Neil Trini Lasradoed8cecb2015-07-07 13:59:23 +0530343 this.set_product_bundle_help(this.frm.doc);
Nabin Hait0b157552014-06-24 17:02:45 +0530344 },
345
Neil Trini Lasradoed8cecb2015-07-07 13:59:23 +0530346 set_product_bundle_help: function(doc) {
Nabin Hait0b157552014-06-24 17:02:45 +0530347 if(!cur_frm.fields_dict.packing_list) return;
Nabin Haite7d15362014-12-25 16:01:55 +0530348 if ((doc.packed_items || []).length) {
Nabin Hait0b157552014-06-24 17:02:45 +0530349 $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(true);
350
Faris Ansariab74ca72017-05-30 12:54:42 +0530351 if (in_list(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
352 var help_msg = "<div class='alert alert-warning'>" +
Neil Trini Lasradoed8cecb2015-07-07 13:59:23 +0530353 __("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.")+
Nabin Hait0b157552014-06-24 17:02:45 +0530354 "</div>";
Neil Trini Lasradoed8cecb2015-07-07 13:59:23 +0530355 frappe.meta.get_docfield(doc.doctype, 'product_bundle_help', doc.name).options = help_msg;
Nabin Hait0b157552014-06-24 17:02:45 +0530356 }
357 } else {
358 $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(false);
Faris Ansariab74ca72017-05-30 12:54:42 +0530359 if (in_list(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
Neil Trini Lasradoed8cecb2015-07-07 13:59:23 +0530360 frappe.meta.get_docfield(doc.doctype, 'product_bundle_help', doc.name).options = '';
Nabin Hait0b157552014-06-24 17:02:45 +0530361 }
362 }
Neil Trini Lasradoed8cecb2015-07-07 13:59:23 +0530363 refresh_field('product_bundle_help');
Saurabheba7aa42015-12-16 09:57:59 +0530364 },
Anand Doshi01de9452016-01-26 16:22:50 +0530365
mbauskara52472c2016-03-05 15:10:25 +0530366 margin_rate_or_amount: function(doc, cdt, cdn) {
mbauskar1e9c1642016-01-18 16:21:25 +0530367 // calculated the revised total margin and rate on margin rate changes
Faris Ansariab74ca72017-05-30 12:54:42 +0530368 var item = locals[cdt][cdn];
Rohit Waghchaure6087fe12016-04-09 14:31:09 +0530369 this.apply_pricing_rule_on_item(item)
mbauskara52472c2016-03-05 15:10:25 +0530370 this.calculate_taxes_and_totals();
mbauskar1e9c1642016-01-18 16:21:25 +0530371 cur_frm.refresh_fields();
372 },
mbauskar1e428ae2016-01-19 19:52:22 +0530373
mbauskara52472c2016-03-05 15:10:25 +0530374 margin_type: function(doc, cdt, cdn){
mbauskar1e9c1642016-01-18 16:21:25 +0530375 // calculate the revised total margin and rate on margin type changes
Faris Ansariab74ca72017-05-30 12:54:42 +0530376 var item = locals[cdt][cdn];
Nabin Haite72c98d2017-05-24 09:01:44 +0530377 if(!item.margin_type) {
378 frappe.model.set_value(cdt, cdn, "margin_rate_or_amount", 0);
379 } else {
380 this.apply_pricing_rule_on_item(item, doc,cdt, cdn)
381 this.calculate_taxes_and_totals();
382 cur_frm.refresh_fields();
383 }
Nabin Hait879e1622017-08-21 08:28:55 +0530384 },
385
386 company_address: function() {
387 var me = this;
388 if(this.frm.doc.company_address) {
389 frappe.call({
390 method: "frappe.contacts.doctype.address.address.get_address_display",
391 args: {"address_dict": this.frm.doc.company_address },
392 callback: function(r) {
393 if(r.message) {
394 me.frm.set_value("company_address_display", r.message)
395 }
396 }
397 })
398 } else {
399 this.frm.set_value("company_address_display", "");
400 }
tundebabzyacccdb32017-11-23 08:35:15 +0100401 },
402
403 conversion_factor: function(doc, cdt, cdn, dont_fetch_price_list_rate) {
404 this._super(doc, cdt, cdn, dont_fetch_price_list_rate);
tundebabzyf9b5c742018-01-25 19:21:05 +0100405 if(frappe.meta.get_docfield(cdt, "stock_qty", cdn) &&
406 in_list(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
Deepesh Gargfb29ffc2019-06-28 14:08:08 +0530407 if (doc.doctype === 'Sales Invoice' && (!doc.update_stock)) return;
408 this.set_batch_number(cdt, cdn);
409 }
tundebabzyacccdb32017-11-23 08:35:15 +0100410 },
411
412 qty: function(doc, cdt, cdn) {
Shreyaa20157a2018-04-13 12:03:42 +0530413 this._super(doc, cdt, cdn);
Deepesh Gargfb29ffc2019-06-28 14:08:08 +0530414
415 if(in_list(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
416 if (doc.doctype === 'Sales Invoice' && (!doc.update_stock)) return;
417 this.set_batch_number(cdt, cdn);
418 }
tundebabzyacccdb32017-11-23 08:35:15 +0100419 },
420
421 /* Determine appropriate batch number and set it in the form.
422 * @param {string} cdt - Document Doctype
423 * @param {string} cdn - Document name
424 */
425 set_batch_number: function(cdt, cdn) {
426 const doc = frappe.get_doc(cdt, cdn);
Saqibfaea8542020-03-26 13:18:57 +0530427 if (doc && doc.has_batch_no && doc.warehouse) {
tundebabzyacccdb32017-11-23 08:35:15 +0100428 this._set_batch_number(doc);
429 }
430 },
431
432 _set_batch_number: function(doc) {
Saqibfaea8542020-03-26 13:18:57 +0530433 let args = {'item_code': doc.item_code, 'warehouse': doc.warehouse, 'qty': flt(doc.qty) * flt(doc.conversion_factor)};
434 if (doc.has_serial_no && doc.serial_no) {
435 args['serial_no'] = doc.serial_no
436 }
marination8a30cb22020-04-23 00:18:21 +0530437
tundebabzyacccdb32017-11-23 08:35:15 +0100438 return frappe.call({
439 method: 'erpnext.stock.doctype.batch.batch.get_batch_no',
Saqibfaea8542020-03-26 13:18:57 +0530440 args: args,
tundebabzyacccdb32017-11-23 08:35:15 +0100441 callback: function(r) {
442 if(r.message) {
443 frappe.model.set_value(doc.doctype, doc.name, 'batch_no', r.message);
tundebabzy8ae53ca2017-11-30 07:07:21 +0100444 } else {
445 frappe.model.set_value(doc.doctype, doc.name, 'batch_no', r.message);
tundebabzyacccdb32017-11-23 08:35:15 +0100446 }
447 }
448 });
449 },
Charles-Henri Decultot8b223102018-06-28 10:57:58 +0200450
451 update_auto_repeat_reference: function(doc) {
452 if (doc.auto_repeat) {
453 frappe.call({
Rucha Mahabal65a627c2019-07-17 13:50:32 +0530454 method:"frappe.automation.doctype.auto_repeat.auto_repeat.update_reference",
deepeshgarg007d9a768a2018-12-29 19:33:44 +0530455 args:{
Charles-Henri Decultot8b223102018-06-28 10:57:58 +0200456 docname: doc.auto_repeat,
457 reference:doc.name
458 },
459 callback: function(r){
460 if (r.message=="success") {
461 frappe.show_alert({message:__("Auto repeat document updated"), indicator:'green'});
462 } else {
463 frappe.show_alert({message:__("An error occurred during the update process"), indicator:'red'});
464 }
465 }
466 })
467 }
468 }
Nabin Hait0b157552014-06-24 17:02:45 +0530469});
Anand Doshi43f087c2014-08-26 14:25:53 +0530470
Neil Trini Lasrado6e343e22016-03-09 17:02:59 +0530471frappe.ui.form.on(cur_frm.doctype,"project", function(frm) {
Nabin Hait10b155a2014-10-23 13:18:59 +0530472 if(in_list(["Delivery Note", "Sales Invoice"], frm.doc.doctype)) {
Rushabh Mehta532eedf2016-05-19 18:22:49 +0530473 if(frm.doc.project) {
474 frappe.call({
475 method:'erpnext.projects.doctype.project.project.get_cost_center_name' ,
476 args: { project: frm.doc.project },
477 callback: function(r, rt) {
478 if(!r.exc) {
479 $.each(frm.doc["items"] || [], function(i, row) {
480 if(r.message) {
481 frappe.model.set_value(row.doctype, row.name, "cost_center", r.message);
Faris Ansariab74ca72017-05-30 12:54:42 +0530482 frappe.msgprint(__("Cost Center For Item with Item Code '"+row.item_name+"' has been Changed to "+ r.message));
Rushabh Mehta532eedf2016-05-19 18:22:49 +0530483 }
484 })
485 }
Nabin Hait10b155a2014-10-23 13:18:59 +0530486 }
Rushabh Mehta532eedf2016-05-19 18:22:49 +0530487 })
488 }
Nabin Hait10b155a2014-10-23 13:18:59 +0530489 }
Nabin Haite45ec662018-08-01 17:44:34 +0530490})
deepeshgarg007d9a768a2018-12-29 19:33:44 +0530491
492frappe.ui.form.on(cur_frm.doctype, {
493 set_as_lost_dialog: function(frm) {
494 var dialog = new frappe.ui.Dialog({
495 title: __("Set as Lost"),
496 fields: [
Anupam Kumare447c792020-08-13 09:20:36 +0530497 {
498 "fieldtype": "Table MultiSelect",
499 "label": __("Lost Reasons"),
500 "fieldname": "lost_reason",
501 "options": frm.doctype === 'Opportunity' ? 'Opportunity Lost Reason Detail': 'Quotation Lost Reason Detail',
502 "reqd": 1
503 },
504 {
505 "fieldtype": "Text",
506 "label": __("Detailed Reason"),
507 "fieldname": "detailed_reason"
508 },
deepeshgarg007d9a768a2018-12-29 19:33:44 +0530509 ],
510 primary_action: function() {
511 var values = dialog.get_values();
512 var reasons = values["lost_reason"];
513 var detailed_reason = values["detailed_reason"];
514
515 frm.call({
516 doc: frm.doc,
517 method: 'declare_enquiry_lost',
518 args: {
519 'lost_reasons_list': reasons,
520 'detailed_reason': detailed_reason
521 },
522 callback: function(r) {
523 dialog.hide();
524 frm.reload_doc();
525 },
526 });
527 refresh_field("lost_reason");
528 },
529 primary_action_label: __('Declare Lost')
530 });
531
532 dialog.show();
533 }
534})