blob: ce084646e151f05909a6a9f21f9820072033d6ed [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
Anand Doshi99100a42013-07-04 17:13:53 +053045
Rushabh Mehta4a404e92013-08-09 18:11:35 +053046 if(this.frm.fields_dict.selling_price_list) {
47 this.frm.set_query("selling_price_list", function() {
Nabin Haitdc15b4f2014-01-20 16:48:49 +053048 return { filters: { selling: 1 } };
Anand Doshi720a01a2013-07-26 11:32:02 +053049 });
Anand Doshi720a01a2013-07-26 11:32:02 +053050 }
Anand Doshibd67e872014-04-11 16:51:27 +053051
karthikeyan57fc60212019-07-04 22:46:16 +053052 if(this.frm.fields_dict.tc_name) {
53 this.frm.set_query("tc_name", function() {
54 return { filters: { selling: 1 } };
55 });
56 }
57
Nabin Haitdd38a262014-12-26 13:15:21 +053058 if(!this.frm.fields_dict["items"]) {
Anand Doshi99100a42013-07-04 17:13:53 +053059 return;
60 }
Anand Doshibd67e872014-04-11 16:51:27 +053061
Nabin Haitdd38a262014-12-26 13:15:21 +053062 if(this.frm.fields_dict["items"].grid.get_field('item_code')) {
63 this.frm.set_query("item_code", "items", function() {
Anand Doshi9b496142013-07-11 19:13:58 +053064 return {
Rushabh Mehtad973c162016-08-16 11:32:08 +053065 query: "erpnext.controllers.queries.item_query",
66 filters: {'is_sales_item': 1}
Anand Doshi9b496142013-07-11 19:13:58 +053067 }
Anand Doshi99100a42013-07-04 17:13:53 +053068 });
69 }
Anand Doshibd67e872014-04-11 16:51:27 +053070
Rushabh Mehta698c0402016-11-22 23:16:40 +053071 if(this.frm.fields_dict["packed_items"] &&
72 this.frm.fields_dict["packed_items"].grid.get_field('batch_no')) {
Rohit Waghchauree887e922016-11-18 12:16:22 +053073 this.frm.set_query("batch_no", "packed_items", function(doc, cdt, cdn) {
74 return me.set_query_for_batch(doc, cdt, cdn)
75 });
76 }
Deepesh Gargef0d26c2020-01-06 15:34:15 +053077
78 if(this.frm.fields_dict["items"].grid.get_field('item_code')) {
79 this.frm.set_query("item_tax_template", "items", function(doc, cdt, cdn) {
80 return me.set_query_for_item_tax_template(doc, cdt, cdn)
81 });
82 }
83
Rohit Waghchauree887e922016-11-18 12:16:22 +053084 },
85
Anand Doshic4a54fe2013-08-01 18:19:51 +053086 refresh: function() {
87 this._super();
Rushabh Mehtab92087c2017-01-13 18:53:11 +053088
Rushabh Mehta8d39fd92017-01-16 13:06:07 +053089 frappe.dynamic_link = {doc: this.frm.doc, fieldname: 'customer', doctype: 'Customer'}
Rushabh Mehtab92087c2017-01-13 18:53:11 +053090
Anand Doshibd67e872014-04-11 16:51:27 +053091 this.frm.toggle_display("customer_name",
Akhilesh Darjee5ce1b8b2013-12-09 16:29:04 +053092 (this.frm.doc.customer_name && this.frm.doc.customer_name!==this.frm.doc.customer));
Nabin Haite7d15362014-12-25 16:01:55 +053093 if(this.frm.fields_dict.packed_items) {
94 var packing_list_exists = (this.frm.doc.packed_items || []).length;
Anand Doshic4a54fe2013-08-01 18:19:51 +053095 this.frm.toggle_display("packing_list", packing_list_exists ? true : false);
96 }
Nabin Hait2029ea92015-04-16 17:55:35 +053097 this.toggle_editable_price_list_rate();
Rushabh Mehta8aded132013-07-04 12:50:52 +053098 },
Anand Doshibd67e872014-04-11 16:51:27 +053099
Anand Doshi3543f302013-05-24 19:25:01 +0530100 customer: function() {
Nabin Haita3dd72a2014-05-28 12:49:20 +0530101 var me = this;
Nabin Haite45ec662018-08-01 17:44:34 +0530102 erpnext.utils.get_party_details(this.frm, null, null, function() {
103 me.apply_price_list();
104 });
Anand Doshi3543f302013-05-24 19:25:01 +0530105 },
Anand Doshibd67e872014-04-11 16:51:27 +0530106
Nabin Haita279d782013-07-15 13:04:33 +0530107 customer_address: function() {
Rushabh Mehtab09d9da2014-01-02 11:47:23 +0530108 erpnext.utils.get_address_display(this.frm, "customer_address");
Saif Ur Rehmanfd531a62018-12-29 01:49:11 +0500109 erpnext.utils.set_taxes_from_address(this.frm, "customer_address", "customer_address", "shipping_address_name");
Nabin Haita279d782013-07-15 13:04:33 +0530110 },
Anand Doshibd67e872014-04-11 16:51:27 +0530111
Nabin Hait9d1f0772014-02-19 17:43:24 +0530112 shipping_address_name: function() {
113 erpnext.utils.get_address_display(this.frm, "shipping_address_name", "shipping_address");
Saif Ur Rehmanfd531a62018-12-29 01:49:11 +0500114 erpnext.utils.set_taxes_from_address(this.frm, "shipping_address_name", "customer_address", "shipping_address_name");
Nabin Hait9d1f0772014-02-19 17:43:24 +0530115 },
Anand Doshibd67e872014-04-11 16:51:27 +0530116
Nabin Haita3dd72a2014-05-28 12:49:20 +0530117 sales_partner: function() {
118 this.apply_pricing_rule();
119 },
120
121 campaign: function() {
122 this.apply_pricing_rule();
123 },
124
Rushabh Mehta4a404e92013-08-09 18:11:35 +0530125 selling_price_list: function() {
Anand Doshidffec8f2014-07-01 17:45:15 +0530126 this.apply_price_list();
rohitwaghchaure8e675eb2018-02-13 17:11:06 +0530127 this.set_dynamic_labels();
Anand Doshif3096132013-05-21 19:35:06 +0530128 },
Anand Doshibd67e872014-04-11 16:51:27 +0530129
Nabin Haita7f757a2014-02-10 17:54:04 +0530130 price_list_rate: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530131 var item = frappe.get_doc(cdt, cdn);
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530132 frappe.model.round_floats_in(item, ["price_list_rate", "discount_percentage"]);
Anand Doshibd67e872014-04-11 16:51:27 +0530133
mbauskara52472c2016-03-05 15:10:25 +0530134 // check if child doctype is Sales Order Item/Qutation Item and calculate the rate
Saqiba6f98d42020-07-23 18:51:26 +0530135 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 +0530136 this.apply_pricing_rule_on_item(item);
mbauskara52472c2016-03-05 15:10:25 +0530137 else
138 item.rate = flt(item.price_list_rate * (1 - item.discount_percentage / 100.0),
139 precision("rate", item));
140
Anand Doshif3096132013-05-21 19:35:06 +0530141 this.calculate_taxes_and_totals();
142 },
Anand Doshibd67e872014-04-11 16:51:27 +0530143
Nabin Haita7f757a2014-02-10 17:54:04 +0530144 discount_percentage: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530145 var item = frappe.get_doc(cdt, cdn);
Rohit Waghchaure8bfe3302019-03-18 14:34:19 +0530146 item.discount_amount = 0.0;
147 this.apply_discount_on_item(doc, cdt, cdn, 'discount_percentage');
148 },
149
150 discount_amount: function(doc, cdt, cdn) {
deepeshgarg007a9ea49c2019-07-04 15:56:34 +0530151
152 if(doc.name === cdn) {
153 return;
154 }
155
Nabin Hait593242f2019-04-05 19:35:02 +0530156 var item = frappe.get_doc(cdt, cdn);
157 item.discount_percentage = 0.0;
Rohit Waghchaure8bfe3302019-03-18 14:34:19 +0530158 this.apply_discount_on_item(doc, cdt, cdn, 'discount_amount');
159 },
160
161 apply_discount_on_item: function(doc, cdt, cdn, field) {
162 var item = frappe.get_doc(cdt, cdn);
Nabin Haita7f757a2014-02-10 17:54:04 +0530163 if(!item.price_list_rate) {
Rohit Waghchaure8bfe3302019-03-18 14:34:19 +0530164 item[field] = 0.0;
Anand Doshi923d41d2013-05-28 17:23:36 +0530165 } else {
Nabin Haita7f757a2014-02-10 17:54:04 +0530166 this.price_list_rate(doc, cdt, cdn);
Anand Doshi923d41d2013-05-28 17:23:36 +0530167 }
Saurabh5ada14b2016-02-26 18:02:55 +0530168 this.set_gross_profit(item);
Anand Doshif3096132013-05-21 19:35:06 +0530169 },
Anand Doshibd67e872014-04-11 16:51:27 +0530170
Anand Doshif3096132013-05-21 19:35:06 +0530171 commission_rate: function() {
172 this.calculate_commission();
173 refresh_field("total_commission");
174 },
Anand Doshibd67e872014-04-11 16:51:27 +0530175
Anand Doshif3096132013-05-21 19:35:06 +0530176 total_commission: function() {
Nabin Hait5690be12015-02-12 16:09:11 +0530177 if(this.frm.doc.base_net_total) {
178 frappe.model.round_floats_in(this.frm.doc, ["base_net_total", "total_commission"]);
Anand Doshibd67e872014-04-11 16:51:27 +0530179
Nabin Hait5690be12015-02-12 16:09:11 +0530180 if(this.frm.doc.base_net_total < this.frm.doc.total_commission) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530181 var msg = (__("[Error]") + " " +
182 __(frappe.meta.get_label(this.frm.doc.doctype, "total_commission",
Anand Doshibd67e872014-04-11 16:51:27 +0530183 this.frm.doc.name)) + " > " +
Nabin Hait5690be12015-02-12 16:09:11 +0530184 __(frappe.meta.get_label(this.frm.doc.doctype, "base_net_total", this.frm.doc.name)));
Faris Ansariab74ca72017-05-30 12:54:42 +0530185 frappe.msgprint(msg);
Anand Doshif3096132013-05-21 19:35:06 +0530186 throw msg;
187 }
Anand Doshibd67e872014-04-11 16:51:27 +0530188
189 this.frm.set_value("commission_rate",
Nabin Hait5690be12015-02-12 16:09:11 +0530190 flt(this.frm.doc.total_commission * 100.0 / this.frm.doc.base_net_total));
Anand Doshif3096132013-05-21 19:35:06 +0530191 }
192 },
Anand Doshibd67e872014-04-11 16:51:27 +0530193
Anand Doshif3096132013-05-21 19:35:06 +0530194 allocated_percentage: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530195 var sales_person = frappe.get_doc(cdt, cdn);
Anand Doshif3096132013-05-21 19:35:06 +0530196 if(sales_person.allocated_percentage) {
deepeshgarg00786152eb2018-09-25 19:08:16 +0530197
Anand Doshif3096132013-05-21 19:35:06 +0530198 sales_person.allocated_percentage = flt(sales_person.allocated_percentage,
199 precision("allocated_percentage", sales_person));
deepeshgarg00786152eb2018-09-25 19:08:16 +0530200
Nabin Hait5690be12015-02-12 16:09:11 +0530201 sales_person.allocated_amount = flt(this.frm.doc.base_net_total *
Anand Doshibd67e872014-04-11 16:51:27 +0530202 sales_person.allocated_percentage / 100.0,
Anand Doshif3096132013-05-21 19:35:06 +0530203 precision("allocated_amount", sales_person));
deepeshgarg00786152eb2018-09-25 19:08:16 +0530204 refresh_field(["allocated_amount"], sales_person);
Anand Doshif3096132013-05-21 19:35:06 +0530205
deepeshgarg00786152eb2018-09-25 19:08:16 +0530206 this.calculate_incentive(sales_person);
207 refresh_field(["allocated_percentage", "allocated_amount", "commission_rate","incentives"], sales_person.name,
Anand Doshif3096132013-05-21 19:35:06 +0530208 sales_person.parentfield);
deepeshgarg007d9a768a2018-12-29 19:33:44 +0530209 }
deepeshgarg00786152eb2018-09-25 19:08:16 +0530210 },
211
212 sales_person: function(doc, cdt, cdn) {
213 var row = frappe.get_doc(cdt, cdn);
214 this.calculate_incentive(row);
215 refresh_field("incentives",row.name,row.parentfield);
Anand Doshif3096132013-05-21 19:35:06 +0530216 },
Anand Doshibd67e872014-04-11 16:51:27 +0530217
Anand Doshifc777182013-05-27 19:29:07 +0530218 warehouse: function(doc, cdt, cdn) {
Sambhaji Kolate98dbccd2015-03-10 15:04:28 +0530219 var me = this;
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530220 var item = frappe.get_doc(cdt, cdn);
Saqib14cdb242020-04-16 16:21:35 +0530221
222 if (item.serial_no && item.qty === item.serial_no.split(`\n`).length) {
223 return;
224 }
225
Shreyaa20157a2018-04-13 12:03:42 +0530226 if (item.serial_no && !item.batch_no) {
227 item.serial_no = null;
Anand Doshifc777182013-05-27 19:29:07 +0530228 }
Saqib14cdb242020-04-16 16:21:35 +0530229
Shreyaa20157a2018-04-13 12:03:42 +0530230 var has_batch_no;
231 frappe.db.get_value('Item', {'item_code': item.item_code}, 'has_batch_no', (r) => {
232 has_batch_no = r && r.has_batch_no;
233 if(item.item_code && item.warehouse) {
234 return this.frm.call({
235 method: "erpnext.stock.get_item_details.get_bin_details_and_serial_nos",
236 child: item,
237 args: {
238 item_code: item.item_code,
239 warehouse: item.warehouse,
Rohit Waghchaure6daab3c2019-09-19 17:01:26 +0530240 has_batch_no: has_batch_no || 0,
Shreyaa20157a2018-04-13 12:03:42 +0530241 stock_qty: item.stock_qty,
242 serial_no: item.serial_no || "",
243 },
244 callback:function(r){
245 if (in_list(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
Deepesh Gargfb29ffc2019-06-28 14:08:08 +0530246
247 if (doc.doctype === 'Sales Invoice' && (!doc.update_stock)) return;
248
Shreyaa20157a2018-04-13 12:03:42 +0530249 me.set_batch_number(cdt, cdn);
250 me.batch_no(doc, cdt, cdn);
251 }
252 }
253 });
254 }
255 })
Anand Doshifc777182013-05-27 19:29:07 +0530256 },
Anand Doshibd67e872014-04-11 16:51:27 +0530257
Anand Doshi33fe8672013-08-02 12:39:10 +0530258 toggle_editable_price_list_rate: function() {
Nabin Haitdd38a262014-12-26 13:15:21 +0530259 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 +0530260 var editable_price_list_rate = cint(frappe.defaults.get_default("editable_price_list_rate"));
Anand Doshibd67e872014-04-11 16:51:27 +0530261
Anand Doshi33fe8672013-08-02 12:39:10 +0530262 if(df && editable_price_list_rate) {
263 df.read_only = 0;
264 }
265 },
Anand Doshibd67e872014-04-11 16:51:27 +0530266
Anand Doshif3096132013-05-21 19:35:06 +0530267 calculate_commission: function() {
Anand Doshi923d41d2013-05-28 17:23:36 +0530268 if(this.frm.fields_dict.commission_rate) {
269 if(this.frm.doc.commission_rate > 100) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530270 var msg = __(frappe.meta.get_label(this.frm.doc.doctype, "commission_rate", this.frm.doc.name)) +
271 " " + __("cannot be greater than 100");
Faris Ansariab74ca72017-05-30 12:54:42 +0530272 frappe.msgprint(msg);
Anand Doshi923d41d2013-05-28 17:23:36 +0530273 throw msg;
274 }
Anand Doshibd67e872014-04-11 16:51:27 +0530275
Nabin Hait5690be12015-02-12 16:09:11 +0530276 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 +0530277 precision("total_commission"));
278 }
Anand Doshif3096132013-05-21 19:35:06 +0530279 },
Anand Doshibd67e872014-04-11 16:51:27 +0530280
Anand Doshif3096132013-05-21 19:35:06 +0530281 calculate_contribution: function() {
Anand Doshi2168e392013-05-23 19:25:08 +0530282 var me = this;
Rushabh Mehtaaa355af2014-03-26 18:24:30 +0530283 $.each(this.frm.doc.doctype.sales_team || [], function(i, sales_person) {
Faris Ansariab74ca72017-05-30 12:54:42 +0530284 frappe.model.round_floats_in(sales_person);
285 if(sales_person.allocated_percentage) {
286 sales_person.allocated_amount = flt(
287 me.frm.doc.base_net_total * sales_person.allocated_percentage / 100.0,
288 precision("allocated_amount", sales_person));
289 }
290 });
Anand Doshif3096132013-05-21 19:35:06 +0530291 },
Anand Doshibd67e872014-04-11 16:51:27 +0530292
deepeshgarg00786152eb2018-09-25 19:08:16 +0530293 calculate_incentive: function(row) {
294 if(row.allocated_amount)
295 {
296 row.incentives = flt(
297 row.allocated_amount * row.commission_rate / 100.0,
deepeshgarg007c3772f12018-09-26 15:55:43 +0530298 precision("incentives", row));
deepeshgarg00786152eb2018-09-25 19:08:16 +0530299 }
300 },
301
Sambhaji Kolate98dbccd2015-03-10 15:04:28 +0530302 batch_no: function(doc, cdt, cdn) {
303 var me = this;
304 var item = frappe.get_doc(cdt, cdn);
Saqiba6f98d42020-07-23 18:51:26 +0530305
306 if (item.serial_no) {
307 return;
308 }
309
Shreyaa20157a2018-04-13 12:03:42 +0530310 item.serial_no = null;
311 var has_serial_no;
312 frappe.db.get_value('Item', {'item_code': item.item_code}, 'has_serial_no', (r) => {
313 has_serial_no = r && r.has_serial_no;
314 if(item.warehouse && item.item_code && item.batch_no) {
315 return this.frm.call({
316 method: "erpnext.stock.get_item_details.get_batch_qty_and_serial_no",
317 child: item,
318 args: {
319 "batch_no": item.batch_no,
Maricaf0e87f72019-11-27 15:49:41 +0530320 "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 +0530321 "warehouse": item.warehouse,
322 "item_code": item.item_code,
323 "has_serial_no": has_serial_no
324 },
325 "fieldname": "actual_batch_qty"
326 });
327 }
328 })
Sambhaji Kolate98dbccd2015-03-10 15:04:28 +0530329 },
330
Anand Doshi2168e392013-05-23 19:25:08 +0530331 set_dynamic_labels: function() {
Anand Doshi61a2f682013-06-21 17:55:31 +0530332 this._super();
Neil Trini Lasradoed8cecb2015-07-07 13:59:23 +0530333 this.set_product_bundle_help(this.frm.doc);
Nabin Hait0b157552014-06-24 17:02:45 +0530334 },
335
Neil Trini Lasradoed8cecb2015-07-07 13:59:23 +0530336 set_product_bundle_help: function(doc) {
Nabin Hait0b157552014-06-24 17:02:45 +0530337 if(!cur_frm.fields_dict.packing_list) return;
Nabin Haite7d15362014-12-25 16:01:55 +0530338 if ((doc.packed_items || []).length) {
Nabin Hait0b157552014-06-24 17:02:45 +0530339 $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(true);
340
Faris Ansariab74ca72017-05-30 12:54:42 +0530341 if (in_list(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
342 var help_msg = "<div class='alert alert-warning'>" +
Neil Trini Lasradoed8cecb2015-07-07 13:59:23 +0530343 __("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 +0530344 "</div>";
Neil Trini Lasradoed8cecb2015-07-07 13:59:23 +0530345 frappe.meta.get_docfield(doc.doctype, 'product_bundle_help', doc.name).options = help_msg;
Nabin Hait0b157552014-06-24 17:02:45 +0530346 }
347 } else {
348 $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(false);
Faris Ansariab74ca72017-05-30 12:54:42 +0530349 if (in_list(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
Neil Trini Lasradoed8cecb2015-07-07 13:59:23 +0530350 frappe.meta.get_docfield(doc.doctype, 'product_bundle_help', doc.name).options = '';
Nabin Hait0b157552014-06-24 17:02:45 +0530351 }
352 }
Neil Trini Lasradoed8cecb2015-07-07 13:59:23 +0530353 refresh_field('product_bundle_help');
Saurabheba7aa42015-12-16 09:57:59 +0530354 },
Anand Doshi01de9452016-01-26 16:22:50 +0530355
mbauskara52472c2016-03-05 15:10:25 +0530356 margin_rate_or_amount: function(doc, cdt, cdn) {
mbauskar1e9c1642016-01-18 16:21:25 +0530357 // calculated the revised total margin and rate on margin rate changes
Faris Ansariab74ca72017-05-30 12:54:42 +0530358 var item = locals[cdt][cdn];
Rohit Waghchaure6087fe12016-04-09 14:31:09 +0530359 this.apply_pricing_rule_on_item(item)
mbauskara52472c2016-03-05 15:10:25 +0530360 this.calculate_taxes_and_totals();
mbauskar1e9c1642016-01-18 16:21:25 +0530361 cur_frm.refresh_fields();
362 },
mbauskar1e428ae2016-01-19 19:52:22 +0530363
mbauskara52472c2016-03-05 15:10:25 +0530364 margin_type: function(doc, cdt, cdn){
mbauskar1e9c1642016-01-18 16:21:25 +0530365 // calculate the revised total margin and rate on margin type changes
Faris Ansariab74ca72017-05-30 12:54:42 +0530366 var item = locals[cdt][cdn];
Nabin Haite72c98d2017-05-24 09:01:44 +0530367 if(!item.margin_type) {
368 frappe.model.set_value(cdt, cdn, "margin_rate_or_amount", 0);
369 } else {
370 this.apply_pricing_rule_on_item(item, doc,cdt, cdn)
371 this.calculate_taxes_and_totals();
372 cur_frm.refresh_fields();
373 }
Nabin Hait879e1622017-08-21 08:28:55 +0530374 },
375
376 company_address: function() {
377 var me = this;
378 if(this.frm.doc.company_address) {
379 frappe.call({
380 method: "frappe.contacts.doctype.address.address.get_address_display",
381 args: {"address_dict": this.frm.doc.company_address },
382 callback: function(r) {
383 if(r.message) {
384 me.frm.set_value("company_address_display", r.message)
385 }
386 }
387 })
388 } else {
389 this.frm.set_value("company_address_display", "");
390 }
tundebabzyacccdb32017-11-23 08:35:15 +0100391 },
392
393 conversion_factor: function(doc, cdt, cdn, dont_fetch_price_list_rate) {
394 this._super(doc, cdt, cdn, dont_fetch_price_list_rate);
tundebabzyf9b5c742018-01-25 19:21:05 +0100395 if(frappe.meta.get_docfield(cdt, "stock_qty", cdn) &&
396 in_list(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
Deepesh Gargfb29ffc2019-06-28 14:08:08 +0530397 if (doc.doctype === 'Sales Invoice' && (!doc.update_stock)) return;
398 this.set_batch_number(cdt, cdn);
399 }
tundebabzyacccdb32017-11-23 08:35:15 +0100400 },
401
Deepesh Gargbd9bdc52021-01-28 12:05:57 +0530402 batch_no: function(doc, cdt, cdn) {
403 this._super(doc, cdt, cdn);
404 },
405
tundebabzyacccdb32017-11-23 08:35:15 +0100406 qty: function(doc, cdt, cdn) {
Shreyaa20157a2018-04-13 12:03:42 +0530407 this._super(doc, cdt, cdn);
Deepesh Gargfb29ffc2019-06-28 14:08:08 +0530408
409 if(in_list(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
410 if (doc.doctype === 'Sales Invoice' && (!doc.update_stock)) return;
411 this.set_batch_number(cdt, cdn);
412 }
tundebabzyacccdb32017-11-23 08:35:15 +0100413 },
414
415 /* Determine appropriate batch number and set it in the form.
416 * @param {string} cdt - Document Doctype
417 * @param {string} cdn - Document name
418 */
419 set_batch_number: function(cdt, cdn) {
420 const doc = frappe.get_doc(cdt, cdn);
Saqibfaea8542020-03-26 13:18:57 +0530421 if (doc && doc.has_batch_no && doc.warehouse) {
tundebabzyacccdb32017-11-23 08:35:15 +0100422 this._set_batch_number(doc);
423 }
424 },
425
426 _set_batch_number: function(doc) {
Saqibfaea8542020-03-26 13:18:57 +0530427 let args = {'item_code': doc.item_code, 'warehouse': doc.warehouse, 'qty': flt(doc.qty) * flt(doc.conversion_factor)};
428 if (doc.has_serial_no && doc.serial_no) {
429 args['serial_no'] = doc.serial_no
430 }
marination8a30cb22020-04-23 00:18:21 +0530431
tundebabzyacccdb32017-11-23 08:35:15 +0100432 return frappe.call({
433 method: 'erpnext.stock.doctype.batch.batch.get_batch_no',
Saqibfaea8542020-03-26 13:18:57 +0530434 args: args,
tundebabzyacccdb32017-11-23 08:35:15 +0100435 callback: function(r) {
436 if(r.message) {
437 frappe.model.set_value(doc.doctype, doc.name, 'batch_no', r.message);
tundebabzy8ae53ca2017-11-30 07:07:21 +0100438 } else {
439 frappe.model.set_value(doc.doctype, doc.name, 'batch_no', r.message);
tundebabzyacccdb32017-11-23 08:35:15 +0100440 }
441 }
442 });
443 },
Charles-Henri Decultot8b223102018-06-28 10:57:58 +0200444
445 update_auto_repeat_reference: function(doc) {
446 if (doc.auto_repeat) {
447 frappe.call({
Rucha Mahabal65a627c2019-07-17 13:50:32 +0530448 method:"frappe.automation.doctype.auto_repeat.auto_repeat.update_reference",
deepeshgarg007d9a768a2018-12-29 19:33:44 +0530449 args:{
Charles-Henri Decultot8b223102018-06-28 10:57:58 +0200450 docname: doc.auto_repeat,
451 reference:doc.name
452 },
453 callback: function(r){
454 if (r.message=="success") {
455 frappe.show_alert({message:__("Auto repeat document updated"), indicator:'green'});
456 } else {
457 frappe.show_alert({message:__("An error occurred during the update process"), indicator:'red'});
458 }
459 }
460 })
461 }
462 }
Nabin Hait0b157552014-06-24 17:02:45 +0530463});
Anand Doshi43f087c2014-08-26 14:25:53 +0530464
Neil Trini Lasrado6e343e22016-03-09 17:02:59 +0530465frappe.ui.form.on(cur_frm.doctype,"project", function(frm) {
Nabin Hait10b155a2014-10-23 13:18:59 +0530466 if(in_list(["Delivery Note", "Sales Invoice"], frm.doc.doctype)) {
Rushabh Mehta532eedf2016-05-19 18:22:49 +0530467 if(frm.doc.project) {
468 frappe.call({
469 method:'erpnext.projects.doctype.project.project.get_cost_center_name' ,
470 args: { project: frm.doc.project },
471 callback: function(r, rt) {
472 if(!r.exc) {
473 $.each(frm.doc["items"] || [], function(i, row) {
474 if(r.message) {
475 frappe.model.set_value(row.doctype, row.name, "cost_center", r.message);
Mohammad Hasnain Mohsin Rajane15b6a92020-11-25 15:36:41 +0530476 frappe.msgprint(__("Cost Center For Item with Item Code {0} has been Changed to {1}", [row.item_name, r.message]));
Rushabh Mehta532eedf2016-05-19 18:22:49 +0530477 }
478 })
479 }
Nabin Hait10b155a2014-10-23 13:18:59 +0530480 }
Rushabh Mehta532eedf2016-05-19 18:22:49 +0530481 })
482 }
Nabin Hait10b155a2014-10-23 13:18:59 +0530483 }
Nabin Haite45ec662018-08-01 17:44:34 +0530484})
deepeshgarg007d9a768a2018-12-29 19:33:44 +0530485
486frappe.ui.form.on(cur_frm.doctype, {
487 set_as_lost_dialog: function(frm) {
488 var dialog = new frappe.ui.Dialog({
489 title: __("Set as Lost"),
490 fields: [
Anupam Kumare447c792020-08-13 09:20:36 +0530491 {
492 "fieldtype": "Table MultiSelect",
493 "label": __("Lost Reasons"),
494 "fieldname": "lost_reason",
495 "options": frm.doctype === 'Opportunity' ? 'Opportunity Lost Reason Detail': 'Quotation Lost Reason Detail',
496 "reqd": 1
497 },
498 {
499 "fieldtype": "Text",
500 "label": __("Detailed Reason"),
501 "fieldname": "detailed_reason"
502 },
deepeshgarg007d9a768a2018-12-29 19:33:44 +0530503 ],
504 primary_action: function() {
505 var values = dialog.get_values();
506 var reasons = values["lost_reason"];
507 var detailed_reason = values["detailed_reason"];
508
509 frm.call({
510 doc: frm.doc,
511 method: 'declare_enquiry_lost',
512 args: {
513 'lost_reasons_list': reasons,
514 'detailed_reason': detailed_reason
515 },
516 callback: function(r) {
517 dialog.hide();
518 frm.reload_doc();
519 },
520 });
521 refresh_field("lost_reason");
522 },
523 primary_action_label: __('Declare Lost')
524 });
525
526 dialog.show();
527 }
528})