blob: 1b48a8e2bceaca6e2b7b4466098776888474de7d [file] [log] [blame]
Rushabh Mehtaad45e312013-11-20 12:59:58 +05301// Copyright (c) 2013, Web Notes 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// Preset
5// ------
6// cur_frm.cscript.tname - Details table name
7// cur_frm.cscript.fname - Details fieldname
Rushabh Mehta6de403f2013-12-13 14:10:14 +05308// cur_frm.cscript.other_fname - fieldname
Pratik Vyasc1e6e4c2011-06-08 14:37:15 +05309// cur_frm.cscript.sales_team_fname - Sales Team fieldname
10
Rushabh Mehta793ba6b2014-02-14 15:47:51 +053011frappe.provide("erpnext.selling");
12frappe.require("assets/erpnext/js/transaction.js");
Rushabh Mehtab09d9da2014-01-02 11:47:23 +053013
Rushabh Mehta6de403f2013-12-13 14:10:14 +053014{% include "public/js/controllers/accounts.js" %}
Anand Doshi1dde46a2013-05-15 21:15:57 +053015
Anand Doshi3543f302013-05-24 19:25:01 +053016erpnext.selling.SellingController = erpnext.TransactionController.extend({
Anand Doshi9b496142013-07-11 19:13:58 +053017 onload: function() {
18 this._super();
19 this.toggle_rounded_total();
20 this.setup_queries();
Anand Doshi33fe8672013-08-02 12:39:10 +053021 this.toggle_editable_price_list_rate();
Anand Doshi9b496142013-07-11 19:13:58 +053022 },
23
24 setup_queries: function() {
Anand Doshi99100a42013-07-04 17:13:53 +053025 var me = this;
26
Anand Doshif3096132013-05-21 19:35:06 +053027 this.frm.add_fetch("sales_partner", "commission_rate", "commission_rate");
Anand Doshi8f9f8a42013-06-28 19:18:33 +053028
Anand Doshid5d39ac2013-07-29 13:28:37 +053029 $.each([["customer_address", "customer_filter"],
30 ["shipping_address_name", "customer_filter"],
31 ["contact_person", "customer_filter"],
32 ["customer", "customer"],
33 ["lead", "lead"]],
34 function(i, opts) {
35 if(me.frm.fields_dict[opts[0]])
36 me.frm.set_query(opts[0], erpnext.queries[opts[1]]);
37 });
Anand Doshi99100a42013-07-04 17:13:53 +053038
Akhilesh Darjee4f721562014-01-29 16:31:38 +053039 if(this.frm.fields_dict.taxes_and_charges) {
40 this.frm.set_query("taxes_and_charges", function() {
Saurabhf52dc072013-07-10 13:07:49 +053041 return {
42 filters: [
43 ['Sales Taxes and Charges Master', 'company', '=', me.frm.doc.company],
Saurabhf52dc072013-07-10 13:07:49 +053044 ['Sales Taxes and Charges Master', 'docstatus', '!=', 2]
45 ]
46 }
Anand Doshi99100a42013-07-04 17:13:53 +053047 });
48 }
Anand Doshi99100a42013-07-04 17:13:53 +053049
Rushabh Mehta4a404e92013-08-09 18:11:35 +053050 if(this.frm.fields_dict.selling_price_list) {
51 this.frm.set_query("selling_price_list", function() {
Nabin Haitdc15b4f2014-01-20 16:48:49 +053052 return { filters: { selling: 1 } };
Anand Doshi720a01a2013-07-26 11:32:02 +053053 });
Anand Doshi720a01a2013-07-26 11:32:02 +053054 }
55
Anand Doshi99100a42013-07-04 17:13:53 +053056 if(!this.fname) {
57 return;
58 }
59
60 if(this.frm.fields_dict[this.fname].grid.get_field('item_code')) {
61 this.frm.set_query("item_code", this.fname, function() {
Anand Doshi9b496142013-07-11 19:13:58 +053062 return {
Rushabh Mehta6de403f2013-12-13 14:10:14 +053063 query: "erpnext.controllers.queries.item_query",
Anand Doshi9b496142013-07-11 19:13:58 +053064 filters: (me.frm.doc.order_type === "Maintenance" ?
65 {'is_service_item': 'Yes'}:
66 {'is_sales_item': 'Yes' })
67 }
Anand Doshi99100a42013-07-04 17:13:53 +053068 });
69 }
70
71 if(this.frm.fields_dict[this.fname].grid.get_field('batch_no')) {
72 this.frm.set_query("batch_no", this.fname, function(doc, cdt, cdn) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +053073 var item = frappe.model.get_doc(cdt, cdn);
Anand Doshi99100a42013-07-04 17:13:53 +053074 if(!item.item_code) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +053075 frappe.throw(frappe._("Please enter Item Code to get batch no"));
Anand Doshi99100a42013-07-04 17:13:53 +053076 } else {
Nabin Haitd1fd1e22013-10-18 12:29:11 +053077 filters = {
78 'item_code': item.item_code,
79 'posting_date': me.frm.doc.posting_date,
80 }
81 if(item.warehouse) filters["warehouse"] = item.warehouse
82
83 return {
Akhilesh Darjee4f721562014-01-29 16:31:38 +053084 query : "erpnext.controllers.queries.get_batch_no",
Nabin Haitd1fd1e22013-10-18 12:29:11 +053085 filters: filters
Anand Doshi99100a42013-07-04 17:13:53 +053086 }
87 }
88 });
89 }
Anand Doshied698922013-07-23 15:16:50 +053090
91 if(this.frm.fields_dict.sales_team && this.frm.fields_dict.sales_team.grid.get_field("sales_person")) {
Anand Doshid5d39ac2013-07-29 13:28:37 +053092 this.frm.set_query("sales_person", "sales_team", erpnext.queries.not_a_group_filter);
Anand Doshied698922013-07-23 15:16:50 +053093 }
Anand Doshi1dde46a2013-05-15 21:15:57 +053094 },
95
Anand Doshic4a54fe2013-08-01 18:19:51 +053096 refresh: function() {
97 this._super();
Rushabh Mehta8aded132013-07-04 12:50:52 +053098 this.frm.toggle_display("customer_name",
Akhilesh Darjee5ce1b8b2013-12-09 16:29:04 +053099 (this.frm.doc.customer_name && this.frm.doc.customer_name!==this.frm.doc.customer));
Anand Doshic4a54fe2013-08-01 18:19:51 +0530100 if(this.frm.fields_dict.packing_details) {
101 var packing_list_exists = this.frm.get_doclist({parentfield: "packing_details"}).length;
102 this.frm.toggle_display("packing_list", packing_list_exists ? true : false);
103 }
Rushabh Mehta8aded132013-07-04 12:50:52 +0530104 },
105
Anand Doshi3543f302013-05-24 19:25:01 +0530106 customer: function() {
Rushabh Mehta49dd7be2014-01-28 17:43:10 +0530107 erpnext.utils.get_party_details(this.frm);
Anand Doshi3543f302013-05-24 19:25:01 +0530108 },
109
Nabin Haita279d782013-07-15 13:04:33 +0530110 customer_address: function() {
Rushabh Mehtab09d9da2014-01-02 11:47:23 +0530111 erpnext.utils.get_address_display(this.frm, "customer_address");
Nabin Haita279d782013-07-15 13:04:33 +0530112 },
113
Nabin Hait9d1f0772014-02-19 17:43:24 +0530114 shipping_address_name: function() {
115 erpnext.utils.get_address_display(this.frm, "shipping_address_name", "shipping_address");
116 },
117
Nabin Haita279d782013-07-15 13:04:33 +0530118 contact_person: function() {
Rushabh Mehtab09d9da2014-01-02 11:47:23 +0530119 erpnext.utils.get_contact_details(this.frm);
Nabin Haita279d782013-07-15 13:04:33 +0530120 },
121
Anand Doshif3096132013-05-21 19:35:06 +0530122 barcode: function(doc, cdt, cdn) {
123 this.item_code(doc, cdt, cdn);
Anand Doshi1dde46a2013-05-15 21:15:57 +0530124 },
125
Rushabh Mehta4a404e92013-08-09 18:11:35 +0530126 selling_price_list: function() {
127 this.get_price_list_currency("Selling");
Anand Doshif3096132013-05-21 19:35:06 +0530128 },
129
Nabin Haita7f757a2014-02-10 17:54:04 +0530130 price_list_rate: function(doc, cdt, cdn) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530131 var item = frappe.model.get_doc(cdt, cdn);
132 frappe.model.round_floats_in(item, ["price_list_rate", "discount_percentage"]);
Anand Doshif3096132013-05-21 19:35:06 +0530133
Nabin Hait7979f7e2014-02-10 18:26:49 +0530134 item.rate = flt(item.price_list_rate * (1 - item.discount_percentage / 100.0),
135 precision("rate", item));
Anand Doshif3096132013-05-21 19:35:06 +0530136
137 this.calculate_taxes_and_totals();
138 },
139
Nabin Haita7f757a2014-02-10 17:54:04 +0530140 discount_percentage: function(doc, cdt, cdn) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530141 var item = frappe.model.get_doc(cdt, cdn);
Nabin Haita7f757a2014-02-10 17:54:04 +0530142 if(!item.price_list_rate) {
143 item.discount_percentage = 0.0;
Anand Doshi923d41d2013-05-28 17:23:36 +0530144 } else {
Nabin Haita7f757a2014-02-10 17:54:04 +0530145 this.price_list_rate(doc, cdt, cdn);
Anand Doshi923d41d2013-05-28 17:23:36 +0530146 }
Anand Doshif3096132013-05-21 19:35:06 +0530147 },
148
Nabin Hait7979f7e2014-02-10 18:26:49 +0530149 rate: function(doc, cdt, cdn) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530150 var item = frappe.model.get_doc(cdt, cdn);
151 frappe.model.round_floats_in(item, ["rate", "price_list_rate"]);
Anand Doshif3096132013-05-21 19:35:06 +0530152
Nabin Haita7f757a2014-02-10 17:54:04 +0530153 if(item.price_list_rate) {
Nabin Hait7979f7e2014-02-10 18:26:49 +0530154 item.discount_percentage = flt((1 - item.rate / item.price_list_rate) * 100.0,
Nabin Haita7f757a2014-02-10 17:54:04 +0530155 precision("discount_percentage", item));
Anand Doshif3096132013-05-21 19:35:06 +0530156 } else {
Nabin Haita7f757a2014-02-10 17:54:04 +0530157 item.discount_percentage = 0.0;
Anand Doshif3096132013-05-21 19:35:06 +0530158 }
159
160 this.calculate_taxes_and_totals();
161 },
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530162
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530163 discount_amount: function() {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530164 this.calculate_taxes_and_totals();
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530165 },
Anand Doshif3096132013-05-21 19:35:06 +0530166
Anand Doshif3096132013-05-21 19:35:06 +0530167 commission_rate: function() {
168 this.calculate_commission();
169 refresh_field("total_commission");
170 },
171
172 total_commission: function() {
173 if(this.frm.doc.net_total) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530174 frappe.model.round_floats_in(this.frm.doc, ["net_total", "total_commission"]);
Anand Doshif3096132013-05-21 19:35:06 +0530175
176 if(this.frm.doc.net_total < this.frm.doc.total_commission) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530177 var msg = (frappe._("[Error]") + " " +
178 frappe._(frappe.meta.get_label(this.frm.doc.doctype, "total_commission",
Anand Doshif3096132013-05-21 19:35:06 +0530179 this.frm.doc.name)) + " > " +
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530180 frappe._(frappe.meta.get_label(this.frm.doc.doctype, "net_total", this.frm.doc.name)));
Anand Doshif3096132013-05-21 19:35:06 +0530181 msgprint(msg);
182 throw msg;
183 }
184
185 this.frm.set_value("commission_rate",
186 flt(this.frm.doc.total_commission * 100.0 / this.frm.doc.net_total));
187 }
188 },
189
190 allocated_percentage: function(doc, cdt, cdn) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530191 var sales_person = frappe.model.get_doc(cdt, cdn);
Anand Doshif3096132013-05-21 19:35:06 +0530192
193 if(sales_person.allocated_percentage) {
194 sales_person.allocated_percentage = flt(sales_person.allocated_percentage,
195 precision("allocated_percentage", sales_person));
196 sales_person.allocated_amount = flt(this.frm.doc.net_total *
197 sales_person.allocated_percentage / 100.0,
198 precision("allocated_amount", sales_person));
199
200 refresh_field(["allocated_percentage", "allocated_amount"], sales_person.name,
201 sales_person.parentfield);
202 }
203 },
204
Anand Doshifc777182013-05-27 19:29:07 +0530205 warehouse: function(doc, cdt, cdn) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530206 var item = frappe.model.get_doc(cdt, cdn);
Anand Doshi1dc95ed2013-07-23 13:36:38 +0530207 if(item.item_code && item.warehouse) {
Anand Doshi1fac2a92013-07-29 19:30:39 +0530208 return this.frm.call({
Rushabh Mehta1f847992013-12-12 19:12:19 +0530209 method: "erpnext.selling.utils.get_available_qty",
Anand Doshifc777182013-05-27 19:29:07 +0530210 child: item,
211 args: {
212 item_code: item.item_code,
Anand Doshi1dc95ed2013-07-23 13:36:38 +0530213 warehouse: item.warehouse,
Anand Doshifc777182013-05-27 19:29:07 +0530214 },
215 });
216 }
217 },
218
Anand Doshif3096132013-05-21 19:35:06 +0530219 toggle_rounded_total: function() {
220 var me = this;
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530221 if(cint(frappe.defaults.get_global_default("disable_rounded_total"))) {
Anand Doshif3096132013-05-21 19:35:06 +0530222 $.each(["rounded_total", "rounded_total_export"], function(i, fieldname) {
223 me.frm.set_df_property(fieldname, "print_hide", 1);
224 me.frm.toggle_display(fieldname, false);
225 });
226 }
227 },
228
Anand Doshi33fe8672013-08-02 12:39:10 +0530229 toggle_editable_price_list_rate: function() {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530230 var df = frappe.meta.get_docfield(this.tname, "price_list_rate", this.frm.doc.name);
231 var editable_price_list_rate = cint(frappe.defaults.get_default("editable_price_list_rate"));
Anand Doshi33fe8672013-08-02 12:39:10 +0530232
233 if(df && editable_price_list_rate) {
234 df.read_only = 0;
235 }
236 },
237
Anand Doshif3096132013-05-21 19:35:06 +0530238 calculate_taxes_and_totals: function() {
Anand Doshi3543f302013-05-24 19:25:01 +0530239 this._super();
Anand Doshi923d41d2013-05-28 17:23:36 +0530240 this.calculate_total_advance("Sales Invoice", "advance_adjustment_details");
Anand Doshif3096132013-05-21 19:35:06 +0530241 this.calculate_commission();
242 this.calculate_contribution();
Anand Doshi923d41d2013-05-28 17:23:36 +0530243
244 // TODO check for custom_recalc in custom scripts of server
Anand Doshif3096132013-05-21 19:35:06 +0530245
Anand Doshi2168e392013-05-23 19:25:08 +0530246 this.frm.refresh_fields();
Anand Doshif3096132013-05-21 19:35:06 +0530247 },
248
249 calculate_item_values: function() {
250 var me = this;
Anand Doshif3096132013-05-21 19:35:06 +0530251
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530252 if (!this.discount_amount_applied) {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530253 $.each(this.frm.item_doclist, function(i, item) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530254 frappe.model.round_floats_in(item);
Nabin Hait1eb56012014-02-10 19:20:15 +0530255 item.amount = flt(item.rate * item.qty, precision("amount", item));
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530256
Nabin Haita7f757a2014-02-10 17:54:04 +0530257 me._set_in_company_currency(item, "price_list_rate", "base_price_list_rate");
Nabin Hait7979f7e2014-02-10 18:26:49 +0530258 me._set_in_company_currency(item, "rate", "base_rate");
Nabin Hait1eb56012014-02-10 19:20:15 +0530259 me._set_in_company_currency(item, "amount", "base_amount");
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530260 });
261 }
Anand Doshif3096132013-05-21 19:35:06 +0530262 },
263
Anand Doshif3096132013-05-21 19:35:06 +0530264 determine_exclusive_rate: function() {
265 var me = this;
266 $.each(me.frm.item_doclist, function(n, item) {
267 var item_tax_map = me._load_item_tax_rate(item.item_tax_rate);
268 var cumulated_tax_fraction = 0.0;
269
270 $.each(me.frm.tax_doclist, function(i, tax) {
271 tax.tax_fraction_for_current_item = me.get_current_tax_fraction(tax, item_tax_map);
272
273 if(i==0) {
Anand Doshi2168e392013-05-23 19:25:08 +0530274 tax.grand_total_fraction_for_current_item = 1 + tax.tax_fraction_for_current_item;
Anand Doshif3096132013-05-21 19:35:06 +0530275 } else {
Anand Doshi2168e392013-05-23 19:25:08 +0530276 tax.grand_total_fraction_for_current_item =
277 me.frm.tax_doclist[i-1].grand_total_fraction_for_current_item +
Anand Doshif3096132013-05-21 19:35:06 +0530278 tax.tax_fraction_for_current_item;
279 }
280
281 cumulated_tax_fraction += tax.tax_fraction_for_current_item;
282 });
283
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530284 if(cumulated_tax_fraction && !me.discount_amount_applied) {
Nabin Hait1eb56012014-02-10 19:20:15 +0530285 item.base_amount = flt(
286 (item.amount * me.frm.doc.conversion_rate) / (1 + cumulated_tax_fraction),
287 precision("base_amount", item));
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530288
Nabin Hait1eb56012014-02-10 19:20:15 +0530289 item.base_rate = flt(item.base_amount / item.qty, precision("base_rate", item));
Anand Doshif3096132013-05-21 19:35:06 +0530290
Nabin Haita7f757a2014-02-10 17:54:04 +0530291 if(item.discount_percentage == 100) {
Nabin Hait7979f7e2014-02-10 18:26:49 +0530292 item.base_price_list_rate = item.base_rate;
293 item.base_rate = 0.0;
Anand Doshif3096132013-05-21 19:35:06 +0530294 } else {
Nabin Hait7979f7e2014-02-10 18:26:49 +0530295 item.base_price_list_rate = flt(item.base_rate / (1 - item.discount_percentage / 100.0),
Nabin Haita7f757a2014-02-10 17:54:04 +0530296 precision("base_price_list_rate", item));
Anand Doshif3096132013-05-21 19:35:06 +0530297 }
298 }
299 });
300 },
301
302 get_current_tax_fraction: function(tax, item_tax_map) {
303 // Get tax fraction for calculating tax exclusive amount
304 // from tax inclusive amount
305 var current_tax_fraction = 0.0;
306
307 if(cint(tax.included_in_print_rate)) {
Anand Doshi2168e392013-05-23 19:25:08 +0530308 var tax_rate = this._get_tax_rate(tax, item_tax_map);
Anand Doshif3096132013-05-21 19:35:06 +0530309
310 if(tax.charge_type == "On Net Total") {
311 current_tax_fraction = (tax_rate / 100.0);
312
313 } else if(tax.charge_type == "On Previous Row Amount") {
314 current_tax_fraction = (tax_rate / 100.0) *
Anand Doshi2168e392013-05-23 19:25:08 +0530315 this.frm.tax_doclist[cint(tax.row_id) - 1].tax_fraction_for_current_item;
Anand Doshif3096132013-05-21 19:35:06 +0530316
317 } else if(tax.charge_type == "On Previous Row Total") {
318 current_tax_fraction = (tax_rate / 100.0) *
Anand Doshi2168e392013-05-23 19:25:08 +0530319 this.frm.tax_doclist[cint(tax.row_id) - 1].grand_total_fraction_for_current_item;
Anand Doshif3096132013-05-21 19:35:06 +0530320 }
321 }
322
323 return current_tax_fraction;
324 },
325
326 calculate_net_total: function() {
327 var me = this;
Anand Doshif3096132013-05-21 19:35:06 +0530328 this.frm.doc.net_total = this.frm.doc.net_total_export = 0.0;
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530329
Anand Doshif3096132013-05-21 19:35:06 +0530330 $.each(this.frm.item_doclist, function(i, item) {
Nabin Hait1eb56012014-02-10 19:20:15 +0530331 me.frm.doc.net_total += item.base_amount;
332 me.frm.doc.net_total_export += item.amount;
Anand Doshif3096132013-05-21 19:35:06 +0530333 });
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530334
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530335 frappe.model.round_floats_in(this.frm.doc, ["net_total", "net_total_export"]);
Anand Doshif3096132013-05-21 19:35:06 +0530336 },
337
Anand Doshif3096132013-05-21 19:35:06 +0530338 calculate_totals: function() {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530339 var me = this;
Anand Doshif3096132013-05-21 19:35:06 +0530340 var tax_count = this.frm.tax_doclist.length;
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530341
Anand Doshif3096132013-05-21 19:35:06 +0530342 this.frm.doc.grand_total = flt(
343 tax_count ? this.frm.tax_doclist[tax_count - 1].total : this.frm.doc.net_total,
344 precision("grand_total"));
345 this.frm.doc.grand_total_export = flt(this.frm.doc.grand_total / this.frm.doc.conversion_rate,
346 precision("grand_total_export"));
347
348 this.frm.doc.other_charges_total = flt(this.frm.doc.grand_total - this.frm.doc.net_total,
349 precision("other_charges_total"));
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530350 this.frm.doc.other_charges_total_export = flt(this.frm.doc.grand_total_export -
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530351 this.frm.doc.net_total_export + flt(this.frm.doc.discount_amount),
Anand Doshif3096132013-05-21 19:35:06 +0530352 precision("other_charges_total_export"));
353
354 this.frm.doc.rounded_total = Math.round(this.frm.doc.grand_total);
355 this.frm.doc.rounded_total_export = Math.round(this.frm.doc.grand_total_export);
356 },
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530357
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530358 apply_discount_amount: function() {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530359 var me = this;
360 var distributed_amount = 0.0;
361
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530362 if (this.frm.doc.discount_amount) {
363 var grand_total_for_discount_amount = this.get_grand_total_for_discount_amount();
364 // calculate item amount after Discount Amount
365 if (grand_total_for_discount_amount) {
366 $.each(this.frm.item_doclist, function(i, item) {
Nabin Hait1eb56012014-02-10 19:20:15 +0530367 distributed_amount = flt(me.frm.doc.discount_amount) * item.base_amount / grand_total_for_discount_amount;
368 item.base_amount = flt(item.base_amount - distributed_amount, precision("base_amount", item));
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530369 });
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530370
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530371 this.discount_amount_applied = true;
372 this._calculate_taxes_and_totals();
373 }
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530374 }
375 },
376
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530377 get_grand_total_for_discount_amount: function() {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530378 var me = this;
379 var total_actual_tax = 0.0;
380 var actual_taxes_dict = {};
381
382 $.each(this.frm.tax_doclist, function(i, tax) {
383 if (tax.charge_type == "Actual")
384 actual_taxes_dict[tax.idx] = tax.tax_amount;
385 else if (actual_taxes_dict[tax.row_id] !== null) {
386 actual_tax_amount = flt(actual_taxes_dict[tax.row_id]) * flt(tax.rate) / 100;
387 actual_taxes_dict[tax.idx] = actual_tax_amount;
388 }
389 });
390
391 $.each(actual_taxes_dict, function(key, value) {
392 if (value)
393 total_actual_tax += value;
394 });
395
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530396 grand_total_for_discount_amount = flt(this.frm.doc.grand_total - total_actual_tax,
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530397 precision("grand_total"));
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530398 return grand_total_for_discount_amount;
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530399 },
Anand Doshif3096132013-05-21 19:35:06 +0530400
Anand Doshifc777182013-05-27 19:29:07 +0530401 calculate_outstanding_amount: function() {
Anand Doshi923d41d2013-05-28 17:23:36 +0530402 // NOTE:
Akhilesh Darjee38e8f982013-09-05 12:59:33 +0530403 // paid_amount and write_off_amount is only for POS Invoice
Anand Doshi923d41d2013-05-28 17:23:36 +0530404 // total_advance is only for non POS Invoice
Anand Doshi29ea5d02013-07-05 17:23:14 +0530405 if(this.frm.doc.doctype == "Sales Invoice" && this.frm.doc.docstatus==0) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530406 frappe.model.round_floats_in(this.frm.doc, ["grand_total", "total_advance", "write_off_amount",
Anand Doshifc777182013-05-27 19:29:07 +0530407 "paid_amount"]);
Akhilesh Darjee38e8f982013-09-05 12:59:33 +0530408 var total_amount_to_pay = this.frm.doc.grand_total - this.frm.doc.write_off_amount - this.frm.doc.total_advance;
409 this.frm.doc.paid_amount = this.frm.doc.is_pos? flt(total_amount_to_pay): 0.0;
410
411 this.frm.doc.outstanding_amount = flt(total_amount_to_pay - this.frm.doc.paid_amount,
412 precision("outstanding_amount"));
Anand Doshifc777182013-05-27 19:29:07 +0530413 }
414 },
415
Anand Doshif3096132013-05-21 19:35:06 +0530416 calculate_commission: function() {
Anand Doshi923d41d2013-05-28 17:23:36 +0530417 if(this.frm.fields_dict.commission_rate) {
418 if(this.frm.doc.commission_rate > 100) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530419 var msg = frappe._(frappe.meta.get_label(this.frm.doc.doctype, "commission_rate", this.frm.doc.name)) +
420 " " + frappe._("cannot be greater than 100");
Anand Doshi923d41d2013-05-28 17:23:36 +0530421 msgprint(msg);
422 throw msg;
423 }
Anand Doshif3096132013-05-21 19:35:06 +0530424
Anand Doshi923d41d2013-05-28 17:23:36 +0530425 this.frm.doc.total_commission = flt(this.frm.doc.net_total * this.frm.doc.commission_rate / 100.0,
426 precision("total_commission"));
427 }
Anand Doshif3096132013-05-21 19:35:06 +0530428 },
429
430 calculate_contribution: function() {
Anand Doshi2168e392013-05-23 19:25:08 +0530431 var me = this;
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530432 $.each(frappe.model.get_doclist(this.frm.doc.doctype, this.frm.doc.name,
Anand Doshif3096132013-05-21 19:35:06 +0530433 {parentfield: "sales_team"}), function(i, sales_person) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530434 frappe.model.round_floats_in(sales_person);
Anand Doshif3096132013-05-21 19:35:06 +0530435 if(sales_person.allocated_percentage) {
436 sales_person.allocated_amount = flt(
437 me.frm.doc.net_total * sales_person.allocated_percentage / 100.0,
438 precision("allocated_amount", sales_person));
439 }
440 });
441 },
442
443 _cleanup: function() {
Anand Doshi3543f302013-05-24 19:25:01 +0530444 this._super();
445 this.frm.doc.in_words = this.frm.doc.in_words_export = "";
Anand Doshif3096132013-05-21 19:35:06 +0530446 },
Anand Doshi2168e392013-05-23 19:25:08 +0530447
Anand Doshicefccb92013-07-15 18:28:14 +0530448 shipping_rule: function() {
449 var me = this;
450 if(this.frm.doc.shipping_rule) {
Anand Doshi1fac2a92013-07-29 19:30:39 +0530451 return this.frm.call({
Anand Doshicefccb92013-07-15 18:28:14 +0530452 doc: this.frm.doc,
453 method: "apply_shipping_rule",
454 callback: function(r) {
455 if(!r.exc) {
456 me.calculate_taxes_and_totals();
457 }
458 }
459 })
460 }
461 },
462
Anand Doshi2168e392013-05-23 19:25:08 +0530463 set_dynamic_labels: function() {
Anand Doshi61a2f682013-06-21 17:55:31 +0530464 this._super();
Anand Doshi9d049242013-06-05 20:46:56 +0530465 set_sales_bom_help(this.frm.doc);
Anand Doshi2168e392013-05-23 19:25:08 +0530466 },
467
468 change_form_labels: function(company_currency) {
469 var me = this;
470 var field_label_map = {};
471
472 var setup_field_label_map = function(fields_list, currency) {
473 $.each(fields_list, function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530474 var docfield = frappe.meta.docfield_map[me.frm.doc.doctype][fname];
Anand Doshi2168e392013-05-23 19:25:08 +0530475 if(docfield) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530476 var label = frappe._(docfield.label || "").replace(/\([^\)]*\)/g, "");
Anand Doshi2168e392013-05-23 19:25:08 +0530477 field_label_map[fname] = label.trim() + " (" + currency + ")";
478 }
479 });
480 };
Anand Doshi2168e392013-05-23 19:25:08 +0530481 setup_field_label_map(["net_total", "other_charges_total", "grand_total",
482 "rounded_total", "in_words",
483 "outstanding_amount", "total_advance", "paid_amount", "write_off_amount"],
484 company_currency);
485
486 setup_field_label_map(["net_total_export", "other_charges_total_export", "grand_total_export",
487 "rounded_total_export", "in_words_export"], this.frm.doc.currency);
488
Rushabh Mehtaef584552013-11-02 14:47:11 +0530489 cur_frm.set_df_property("conversion_rate", "description", "1 " + this.frm.doc.currency
490 + " = [?] " + company_currency)
Anand Doshi2168e392013-05-23 19:25:08 +0530491
492 if(this.frm.doc.price_list_currency && this.frm.doc.price_list_currency!=company_currency) {
Rushabh Mehtaef584552013-11-02 14:47:11 +0530493 cur_frm.set_df_property("plc_conversion_rate", "description", "1 " + this.frm.doc.price_list_currency
494 + " = [?] " + company_currency)
Anand Doshi2168e392013-05-23 19:25:08 +0530495 }
496
497 // toggle fields
498 this.frm.toggle_display(["conversion_rate", "net_total", "other_charges_total",
499 "grand_total", "rounded_total", "in_words"],
500 this.frm.doc.currency != company_currency);
501
Rushabh Mehtaa063b4d2013-11-06 11:29:47 +0530502 this.frm.toggle_display(["plc_conversion_rate", "price_list_currency"],
Anand Doshi2168e392013-05-23 19:25:08 +0530503 this.frm.doc.price_list_currency != company_currency);
504
505 // set labels
506 $.each(field_label_map, function(fname, label) {
507 me.frm.fields_dict[fname].set_label(label);
508 });
509 },
510
511 change_grid_labels: function(company_currency) {
512 var me = this;
513 var field_label_map = {};
514
515 var setup_field_label_map = function(fields_list, currency, parentfield) {
516 var grid_doctype = me.frm.fields_dict[parentfield].grid.doctype;
517 $.each(fields_list, function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530518 var docfield = frappe.meta.docfield_map[grid_doctype][fname];
Anand Doshi2168e392013-05-23 19:25:08 +0530519 if(docfield) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530520 var label = frappe._(docfield.label || "").replace(/\([^\)]*\)/g, "");
Anand Doshi2168e392013-05-23 19:25:08 +0530521 field_label_map[grid_doctype + "-" + fname] =
522 label.trim() + " (" + currency + ")";
523 }
524 });
525 }
526
Nabin Hait1eb56012014-02-10 19:20:15 +0530527 setup_field_label_map(["base_rate", "base_price_list_rate", "base_amount"],
Anand Doshi2168e392013-05-23 19:25:08 +0530528 company_currency, this.fname);
529
Nabin Hait1eb56012014-02-10 19:20:15 +0530530 setup_field_label_map(["rate", "price_list_rate", "amount"],
Anand Doshi2168e392013-05-23 19:25:08 +0530531 this.frm.doc.currency, this.fname);
532
533 setup_field_label_map(["tax_amount", "total"], company_currency, "other_charges");
534
535 if(this.frm.fields_dict["advance_allocation_details"]) {
536 setup_field_label_map(["advance_amount", "allocated_amount"], company_currency,
537 "advance_allocation_details");
538 }
539
540 // toggle columns
541 var item_grid = this.frm.fields_dict[this.fname].grid;
Anand Doshiedfba962013-08-05 11:56:54 +0530542 var show = (this.frm.doc.currency != company_currency) ||
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530543 (frappe.model.get_doclist(cur_frm.doctype, cur_frm.docname,
Anand Doshiedfba962013-08-05 11:56:54 +0530544 {parentfield: "other_charges", included_in_print_rate: 1}).length);
545
Nabin Hait1eb56012014-02-10 19:20:15 +0530546 $.each(["base_rate", "base_price_list_rate", "base_amount"], function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530547 if(frappe.meta.get_docfield(item_grid.doctype, fname))
Anand Doshi2168e392013-05-23 19:25:08 +0530548 item_grid.set_column_disp(fname, show);
549 });
550
551 // set labels
552 var $wrapper = $(this.frm.wrapper);
553 $.each(field_label_map, function(fname, label) {
Anand Doshi5013dcb2013-08-05 12:16:04 +0530554 fname = fname.split("-");
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530555 var df = frappe.meta.get_docfield(fname[0], fname[1], me.frm.doc.name);
Anand Doshi5013dcb2013-08-05 12:16:04 +0530556 if(df) df.label = label;
Anand Doshi2168e392013-05-23 19:25:08 +0530557 });
558 },
Anand Doshi1dde46a2013-05-15 21:15:57 +0530559});
560
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530561// Help for Sales BOM items
562var set_sales_bom_help = function(doc) {
Rushabh Mehta2eef40b2012-07-16 14:16:57 +0530563 if(!cur_frm.fields_dict.packing_list) return;
Nabin Haitd1fd1e22013-10-18 12:29:11 +0530564 if (getchildren('Packed Item', doc.name, 'packing_details').length) {
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530565 $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(true);
566
567 if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
Bárbara Perretti4098c262013-09-27 17:05:17 -0300568 help_msg = "<div class='alert alert-warning'>" +
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530569 frappe._("For 'Sales BOM' items, warehouse, serial no and batch no \
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530570 will be considered from the 'Packing List' table. \
571 If warehouse and batch no are same for all packing items for any 'Sales BOM' item, \
Bárbara Perretti4098c262013-09-27 17:05:17 -0300572 those values can be entered in the main item table, values will be copied to 'Packing List' table.")+
573 "</div>";
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530574 frappe.meta.get_docfield(doc.doctype, 'sales_bom_help', doc.name).options = help_msg;
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530575 }
576 } else {
577 $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(false);
578 if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530579 frappe.meta.get_docfield(doc.doctype, 'sales_bom_help', doc.name).options = '';
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530580 }
581 }
582 refresh_field('sales_bom_help');
583}