blob: a89aaef266f54f3d0c74f05c5267cc1c30f3a017 [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 },
Anand Doshibd67e872014-04-11 16:51:27 +053023
Anand Doshi9b496142013-07-11 19:13:58 +053024 setup_queries: function() {
Anand Doshi99100a42013-07-04 17:13:53 +053025 var me = this;
Anand Doshibd67e872014-04-11 16:51:27 +053026
Anand Doshif3096132013-05-21 19:35:06 +053027 this.frm.add_fetch("sales_partner", "commission_rate", "commission_rate");
Anand Doshibd67e872014-04-11 16:51:27 +053028
29 $.each([["customer_address", "customer_filter"],
Anand Doshid5d39ac2013-07-29 13:28:37 +053030 ["shipping_address_name", "customer_filter"],
Anand Doshibd67e872014-04-11 16:51:27 +053031 ["contact_person", "customer_filter"],
32 ["customer", "customer"],
33 ["lead", "lead"]],
Anand Doshid5d39ac2013-07-29 13:28:37 +053034 function(i, opts) {
Anand Doshibd67e872014-04-11 16:51:27 +053035 if(me.frm.fields_dict[opts[0]])
Anand Doshid5d39ac2013-07-29 13:28:37 +053036 me.frm.set_query(opts[0], erpnext.queries[opts[1]]);
37 });
Anand Doshibd67e872014-04-11 16:51:27 +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 }
Anand Doshibd67e872014-04-11 16:51:27 +053055
Anand Doshi99100a42013-07-04 17:13:53 +053056 if(!this.fname) {
57 return;
58 }
Anand Doshibd67e872014-04-11 16:51:27 +053059
Anand Doshi99100a42013-07-04 17:13:53 +053060 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 }
Anand Doshibd67e872014-04-11 16:51:27 +053070
Anand Doshi99100a42013-07-04 17:13:53 +053071 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 Mehta66d52b52014-03-27 14:17:33 +053073 var item = frappe.get_doc(cdt, cdn);
Anand Doshi99100a42013-07-04 17:13:53 +053074 if(!item.item_code) {
Pratik Vyasb52618c2014-04-14 16:25:30 +053075 frappe.throw(__("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
Anand Doshibd67e872014-04-11 16:51:27 +053082
Nabin Haitd1fd1e22013-10-18 12:29:11 +053083 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 Doshibd67e872014-04-11 16:51:27 +053090
Anand Doshied698922013-07-23 15:16:50 +053091 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 },
Anand Doshibd67e872014-04-11 16:51:27 +053095
Anand Doshic4a54fe2013-08-01 18:19:51 +053096 refresh: function() {
97 this._super();
Anand Doshibd67e872014-04-11 16:51:27 +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) {
Rushabh Mehtaaa355af2014-03-26 18:24:30 +0530101 var packing_list_exists = (this.frm.doc.packing_details || []).length;
Anand Doshic4a54fe2013-08-01 18:19:51 +0530102 this.frm.toggle_display("packing_list", packing_list_exists ? true : false);
103 }
Rushabh Mehta8aded132013-07-04 12:50:52 +0530104 },
Anand Doshibd67e872014-04-11 16:51:27 +0530105
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 },
Anand Doshibd67e872014-04-11 16:51:27 +0530109
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 },
Anand Doshibd67e872014-04-11 16:51:27 +0530113
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 },
Anand Doshibd67e872014-04-11 16:51:27 +0530117
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 },
Anand Doshibd67e872014-04-11 16:51:27 +0530121
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 },
Anand Doshibd67e872014-04-11 16:51:27 +0530125
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 },
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
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 Doshibd67e872014-04-11 16:51:27 +0530136
Anand Doshif3096132013-05-21 19:35:06 +0530137 this.calculate_taxes_and_totals();
138 },
Anand Doshibd67e872014-04-11 16:51:27 +0530139
Nabin Haita7f757a2014-02-10 17:54:04 +0530140 discount_percentage: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530141 var item = frappe.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 },
Anand Doshibd67e872014-04-11 16:51:27 +0530148
Nabin Hait7979f7e2014-02-10 18:26:49 +0530149 rate: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530150 var item = frappe.get_doc(cdt, cdn);
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530151 frappe.model.round_floats_in(item, ["rate", "price_list_rate"]);
Anand Doshibd67e872014-04-11 16:51:27 +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 }
Anand Doshibd67e872014-04-11 16:51:27 +0530159
Anand Doshif3096132013-05-21 19:35:06 +0530160 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 Doshibd67e872014-04-11 16:51:27 +0530166
Anand Doshif3096132013-05-21 19:35:06 +0530167 commission_rate: function() {
168 this.calculate_commission();
169 refresh_field("total_commission");
170 },
Anand Doshibd67e872014-04-11 16:51:27 +0530171
Anand Doshif3096132013-05-21 19:35:06 +0530172 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 Doshibd67e872014-04-11 16:51:27 +0530175
Anand Doshif3096132013-05-21 19:35:06 +0530176 if(this.frm.doc.net_total < this.frm.doc.total_commission) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530177 var msg = (__("[Error]") + " " +
178 __(frappe.meta.get_label(this.frm.doc.doctype, "total_commission",
Anand Doshibd67e872014-04-11 16:51:27 +0530179 this.frm.doc.name)) + " > " +
Pratik Vyasb52618c2014-04-14 16:25:30 +0530180 __(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 }
Anand Doshibd67e872014-04-11 16:51:27 +0530184
185 this.frm.set_value("commission_rate",
Anand Doshif3096132013-05-21 19:35:06 +0530186 flt(this.frm.doc.total_commission * 100.0 / this.frm.doc.net_total));
187 }
188 },
Anand Doshibd67e872014-04-11 16:51:27 +0530189
Anand Doshif3096132013-05-21 19:35:06 +0530190 allocated_percentage: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530191 var sales_person = frappe.get_doc(cdt, cdn);
Anand Doshibd67e872014-04-11 16:51:27 +0530192
Anand Doshif3096132013-05-21 19:35:06 +0530193 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 *
Anand Doshibd67e872014-04-11 16:51:27 +0530197 sales_person.allocated_percentage / 100.0,
Anand Doshif3096132013-05-21 19:35:06 +0530198 precision("allocated_amount", sales_person));
199
200 refresh_field(["allocated_percentage", "allocated_amount"], sales_person.name,
201 sales_person.parentfield);
202 }
203 },
Anand Doshibd67e872014-04-11 16:51:27 +0530204
Anand Doshifc777182013-05-27 19:29:07 +0530205 warehouse: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530206 var item = frappe.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 },
Anand Doshibd67e872014-04-11 16:51:27 +0530218
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 },
Anand Doshibd67e872014-04-11 16:51:27 +0530228
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 Doshibd67e872014-04-11 16:51:27 +0530232
Anand Doshi33fe8672013-08-02 12:39:10 +0530233 if(df && editable_price_list_rate) {
234 df.read_only = 0;
235 }
236 },
Anand Doshibd67e872014-04-11 16:51:27 +0530237
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 Doshibd67e872014-04-11 16:51:27 +0530245
Anand Doshi2168e392013-05-23 19:25:08 +0530246 this.frm.refresh_fields();
Anand Doshif3096132013-05-21 19:35:06 +0530247 },
Anand Doshibd67e872014-04-11 16:51:27 +0530248
Anand Doshif3096132013-05-21 19:35:06 +0530249 calculate_item_values: function() {
250 var me = this;
Anand Doshibd67e872014-04-11 16:51:27 +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 },
Anand Doshibd67e872014-04-11 16:51:27 +0530263
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;
Anand Doshibd67e872014-04-11 16:51:27 +0530269
Anand Doshif3096132013-05-21 19:35:06 +0530270 $.each(me.frm.tax_doclist, function(i, tax) {
271 tax.tax_fraction_for_current_item = me.get_current_tax_fraction(tax, item_tax_map);
Anand Doshibd67e872014-04-11 16:51:27 +0530272
Anand Doshif3096132013-05-21 19:35:06 +0530273 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 Doshibd67e872014-04-11 16:51:27 +0530276 tax.grand_total_fraction_for_current_item =
Anand Doshi2168e392013-05-23 19:25:08 +0530277 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 }
Anand Doshibd67e872014-04-11 16:51:27 +0530280
Anand Doshif3096132013-05-21 19:35:06 +0530281 cumulated_tax_fraction += tax.tax_fraction_for_current_item;
282 });
Anand Doshibd67e872014-04-11 16:51:27 +0530283
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 Doshibd67e872014-04-11 16:51:27 +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 },
Anand Doshibd67e872014-04-11 16:51:27 +0530301
Anand Doshif3096132013-05-21 19:35:06 +0530302 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;
Anand Doshibd67e872014-04-11 16:51:27 +0530306
Anand Doshif3096132013-05-21 19:35:06 +0530307 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 Doshibd67e872014-04-11 16:51:27 +0530309
Anand Doshif3096132013-05-21 19:35:06 +0530310 if(tax.charge_type == "On Net Total") {
311 current_tax_fraction = (tax_rate / 100.0);
Anand Doshibd67e872014-04-11 16:51:27 +0530312
Anand Doshif3096132013-05-21 19:35:06 +0530313 } 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 Doshibd67e872014-04-11 16:51:27 +0530316
Anand Doshif3096132013-05-21 19:35:06 +0530317 } 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 }
Anand Doshibd67e872014-04-11 16:51:27 +0530322
Anand Doshif3096132013-05-21 19:35:06 +0530323 return current_tax_fraction;
324 },
Anand Doshibd67e872014-04-11 16:51:27 +0530325
Anand Doshif3096132013-05-21 19:35:06 +0530326 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 },
Anand Doshibd67e872014-04-11 16:51:27 +0530337
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"));
Anand Doshibd67e872014-04-11 16:51:27 +0530347
Anand Doshif3096132013-05-21 19:35:06 +0530348 this.frm.doc.other_charges_total = flt(this.frm.doc.grand_total - this.frm.doc.net_total,
349 precision("other_charges_total"));
Anand Doshibd67e872014-04-11 16:51:27 +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"));
Anand Doshibd67e872014-04-11 16:51:27 +0530353
Anand Doshif3096132013-05-21 19:35:06 +0530354 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
Anand Doshibd67e872014-04-11 16:51:27 +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 Doshibd67e872014-04-11 16:51:27 +0530400
Anand Doshifc777182013-05-27 19:29:07 +0530401 calculate_outstanding_amount: function() {
Anand Doshibd67e872014-04-11 16:51:27 +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) {
Nabin Hait54106802014-03-13 17:26:41 +0530406 frappe.model.round_floats_in(this.frm.doc, ["grand_total", "total_advance", "write_off_amount",
407 "paid_amount"]);
Anand Doshibd67e872014-04-11 16:51:27 +0530408 var total_amount_to_pay = this.frm.doc.grand_total - this.frm.doc.write_off_amount
Nabin Hait54106802014-03-13 17:26:41 +0530409 - this.frm.doc.total_advance;
Nabin Hait0c9d4222014-03-25 19:35:41 +0530410 if(this.frm.doc.is_pos) {
411 if(!this.frm.doc.paid_amount) this.frm.doc.paid_amount = flt(total_amount_to_pay);
412 } else {
413 this.frm.doc.paid_amount = 0
414 }
Nabin Hait482ffac2014-03-13 16:32:43 +0530415
Anand Doshibd67e872014-04-11 16:51:27 +0530416 this.frm.set_value("outstanding_amount", flt(total_amount_to_pay
Nabin Hait54106802014-03-13 17:26:41 +0530417 - this.frm.doc.paid_amount, precision("outstanding_amount")));
Anand Doshifc777182013-05-27 19:29:07 +0530418 }
419 },
Anand Doshibd67e872014-04-11 16:51:27 +0530420
Anand Doshif3096132013-05-21 19:35:06 +0530421 calculate_commission: function() {
Anand Doshi923d41d2013-05-28 17:23:36 +0530422 if(this.frm.fields_dict.commission_rate) {
423 if(this.frm.doc.commission_rate > 100) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530424 var msg = __(frappe.meta.get_label(this.frm.doc.doctype, "commission_rate", this.frm.doc.name)) +
425 " " + __("cannot be greater than 100");
Anand Doshi923d41d2013-05-28 17:23:36 +0530426 msgprint(msg);
427 throw msg;
428 }
Anand Doshibd67e872014-04-11 16:51:27 +0530429
Anand Doshi923d41d2013-05-28 17:23:36 +0530430 this.frm.doc.total_commission = flt(this.frm.doc.net_total * this.frm.doc.commission_rate / 100.0,
431 precision("total_commission"));
432 }
Anand Doshif3096132013-05-21 19:35:06 +0530433 },
Anand Doshibd67e872014-04-11 16:51:27 +0530434
Anand Doshif3096132013-05-21 19:35:06 +0530435 calculate_contribution: function() {
Anand Doshi2168e392013-05-23 19:25:08 +0530436 var me = this;
Rushabh Mehtaaa355af2014-03-26 18:24:30 +0530437 $.each(this.frm.doc.doctype.sales_team || [], function(i, sales_person) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530438 frappe.model.round_floats_in(sales_person);
Anand Doshif3096132013-05-21 19:35:06 +0530439 if(sales_person.allocated_percentage) {
440 sales_person.allocated_amount = flt(
441 me.frm.doc.net_total * sales_person.allocated_percentage / 100.0,
442 precision("allocated_amount", sales_person));
443 }
444 });
445 },
Anand Doshibd67e872014-04-11 16:51:27 +0530446
Anand Doshif3096132013-05-21 19:35:06 +0530447 _cleanup: function() {
Anand Doshi3543f302013-05-24 19:25:01 +0530448 this._super();
449 this.frm.doc.in_words = this.frm.doc.in_words_export = "";
Anand Doshif3096132013-05-21 19:35:06 +0530450 },
Anand Doshi2168e392013-05-23 19:25:08 +0530451
Anand Doshicefccb92013-07-15 18:28:14 +0530452 shipping_rule: function() {
453 var me = this;
454 if(this.frm.doc.shipping_rule) {
Anand Doshi1fac2a92013-07-29 19:30:39 +0530455 return this.frm.call({
Anand Doshicefccb92013-07-15 18:28:14 +0530456 doc: this.frm.doc,
457 method: "apply_shipping_rule",
458 callback: function(r) {
459 if(!r.exc) {
460 me.calculate_taxes_and_totals();
461 }
462 }
463 })
464 }
465 },
Anand Doshibd67e872014-04-11 16:51:27 +0530466
Anand Doshi2168e392013-05-23 19:25:08 +0530467 set_dynamic_labels: function() {
Anand Doshi61a2f682013-06-21 17:55:31 +0530468 this._super();
Anand Doshi9d049242013-06-05 20:46:56 +0530469 set_sales_bom_help(this.frm.doc);
Anand Doshi2168e392013-05-23 19:25:08 +0530470 },
Anand Doshibd67e872014-04-11 16:51:27 +0530471
Anand Doshi2168e392013-05-23 19:25:08 +0530472 change_form_labels: function(company_currency) {
473 var me = this;
474 var field_label_map = {};
Anand Doshibd67e872014-04-11 16:51:27 +0530475
Anand Doshi2168e392013-05-23 19:25:08 +0530476 var setup_field_label_map = function(fields_list, currency) {
477 $.each(fields_list, function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530478 var docfield = frappe.meta.docfield_map[me.frm.doc.doctype][fname];
Anand Doshi2168e392013-05-23 19:25:08 +0530479 if(docfield) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530480 var label = __(docfield.label || "").replace(/\([^\)]*\)/g, "");
Anand Doshi2168e392013-05-23 19:25:08 +0530481 field_label_map[fname] = label.trim() + " (" + currency + ")";
482 }
483 });
484 };
Anand Doshibd67e872014-04-11 16:51:27 +0530485 setup_field_label_map(["net_total", "other_charges_total", "grand_total",
Anand Doshi2168e392013-05-23 19:25:08 +0530486 "rounded_total", "in_words",
487 "outstanding_amount", "total_advance", "paid_amount", "write_off_amount"],
488 company_currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530489
490 setup_field_label_map(["net_total_export", "other_charges_total_export", "grand_total_export",
Anand Doshi2168e392013-05-23 19:25:08 +0530491 "rounded_total_export", "in_words_export"], this.frm.doc.currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530492
493 cur_frm.set_df_property("conversion_rate", "description", "1 " + this.frm.doc.currency
Rushabh Mehtaef584552013-11-02 14:47:11 +0530494 + " = [?] " + company_currency)
Anand Doshibd67e872014-04-11 16:51:27 +0530495
Anand Doshi2168e392013-05-23 19:25:08 +0530496 if(this.frm.doc.price_list_currency && this.frm.doc.price_list_currency!=company_currency) {
Anand Doshibd67e872014-04-11 16:51:27 +0530497 cur_frm.set_df_property("plc_conversion_rate", "description", "1 " + this.frm.doc.price_list_currency
Rushabh Mehtaef584552013-11-02 14:47:11 +0530498 + " = [?] " + company_currency)
Anand Doshi2168e392013-05-23 19:25:08 +0530499 }
Anand Doshibd67e872014-04-11 16:51:27 +0530500
Anand Doshi2168e392013-05-23 19:25:08 +0530501 // toggle fields
Anand Doshibd67e872014-04-11 16:51:27 +0530502 this.frm.toggle_display(["conversion_rate", "net_total", "other_charges_total",
Anand Doshi2168e392013-05-23 19:25:08 +0530503 "grand_total", "rounded_total", "in_words"],
504 this.frm.doc.currency != company_currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530505
506 this.frm.toggle_display(["plc_conversion_rate", "price_list_currency"],
Anand Doshi2168e392013-05-23 19:25:08 +0530507 this.frm.doc.price_list_currency != company_currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530508
Anand Doshi2168e392013-05-23 19:25:08 +0530509 // set labels
510 $.each(field_label_map, function(fname, label) {
511 me.frm.fields_dict[fname].set_label(label);
512 });
513 },
Anand Doshibd67e872014-04-11 16:51:27 +0530514
Anand Doshi2168e392013-05-23 19:25:08 +0530515 change_grid_labels: function(company_currency) {
516 var me = this;
517 var field_label_map = {};
Anand Doshibd67e872014-04-11 16:51:27 +0530518
Anand Doshi2168e392013-05-23 19:25:08 +0530519 var setup_field_label_map = function(fields_list, currency, parentfield) {
520 var grid_doctype = me.frm.fields_dict[parentfield].grid.doctype;
521 $.each(fields_list, function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530522 var docfield = frappe.meta.docfield_map[grid_doctype][fname];
Anand Doshi2168e392013-05-23 19:25:08 +0530523 if(docfield) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530524 var label = __(docfield.label || "").replace(/\([^\)]*\)/g, "");
Anand Doshibd67e872014-04-11 16:51:27 +0530525 field_label_map[grid_doctype + "-" + fname] =
Anand Doshi2168e392013-05-23 19:25:08 +0530526 label.trim() + " (" + currency + ")";
527 }
528 });
529 }
Anand Doshibd67e872014-04-11 16:51:27 +0530530
Nabin Hait1eb56012014-02-10 19:20:15 +0530531 setup_field_label_map(["base_rate", "base_price_list_rate", "base_amount"],
Anand Doshi2168e392013-05-23 19:25:08 +0530532 company_currency, this.fname);
Anand Doshibd67e872014-04-11 16:51:27 +0530533
Nabin Hait1eb56012014-02-10 19:20:15 +0530534 setup_field_label_map(["rate", "price_list_rate", "amount"],
Anand Doshi2168e392013-05-23 19:25:08 +0530535 this.frm.doc.currency, this.fname);
Anand Doshibd67e872014-04-11 16:51:27 +0530536
Anand Doshi2168e392013-05-23 19:25:08 +0530537 setup_field_label_map(["tax_amount", "total"], company_currency, "other_charges");
Anand Doshibd67e872014-04-11 16:51:27 +0530538
Anand Doshi2168e392013-05-23 19:25:08 +0530539 if(this.frm.fields_dict["advance_allocation_details"]) {
540 setup_field_label_map(["advance_amount", "allocated_amount"], company_currency,
541 "advance_allocation_details");
542 }
Anand Doshibd67e872014-04-11 16:51:27 +0530543
Anand Doshi2168e392013-05-23 19:25:08 +0530544 // toggle columns
545 var item_grid = this.frm.fields_dict[this.fname].grid;
Anand Doshibd67e872014-04-11 16:51:27 +0530546 var show = (this.frm.doc.currency != company_currency) ||
547 ((cur_frm.doc.other_charges || []).filter(
Rushabh Mehtaaa355af2014-03-26 18:24:30 +0530548 function(d) { return d.included_in_print_rate===1}).length);
Anand Doshibd67e872014-04-11 16:51:27 +0530549
Nabin Hait1eb56012014-02-10 19:20:15 +0530550 $.each(["base_rate", "base_price_list_rate", "base_amount"], function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530551 if(frappe.meta.get_docfield(item_grid.doctype, fname))
Anand Doshi2168e392013-05-23 19:25:08 +0530552 item_grid.set_column_disp(fname, show);
553 });
Anand Doshibd67e872014-04-11 16:51:27 +0530554
Anand Doshi2168e392013-05-23 19:25:08 +0530555 // set labels
556 var $wrapper = $(this.frm.wrapper);
557 $.each(field_label_map, function(fname, label) {
Anand Doshi5013dcb2013-08-05 12:16:04 +0530558 fname = fname.split("-");
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530559 var df = frappe.meta.get_docfield(fname[0], fname[1], me.frm.doc.name);
Anand Doshi5013dcb2013-08-05 12:16:04 +0530560 if(df) df.label = label;
Anand Doshi2168e392013-05-23 19:25:08 +0530561 });
562 },
Anand Doshi1dde46a2013-05-15 21:15:57 +0530563});
564
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530565// Help for Sales BOM items
566var set_sales_bom_help = function(doc) {
Rushabh Mehta2eef40b2012-07-16 14:16:57 +0530567 if(!cur_frm.fields_dict.packing_list) return;
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530568 if ((doc.packing_details || []).length) {
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530569 $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(true);
Anand Doshibd67e872014-04-11 16:51:27 +0530570
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530571 if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
Bárbara Perretti4098c262013-09-27 17:05:17 -0300572 help_msg = "<div class='alert alert-warning'>" +
Pratik Vyase1eeb222014-04-15 10:50:36 +0530573 __("For 'Sales BOM' 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 'Sales BOM' item, those values can be entered in the main item table, values will be copied to 'Packing List' table.")+
Bárbara Perretti4098c262013-09-27 17:05:17 -0300574 "</div>";
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530575 frappe.meta.get_docfield(doc.doctype, 'sales_bom_help', doc.name).options = help_msg;
Anand Doshibd67e872014-04-11 16:51:27 +0530576 }
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530577 } else {
578 $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(false);
579 if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530580 frappe.meta.get_docfield(doc.doctype, 'sales_bom_help', doc.name).options = '';
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530581 }
582 }
583 refresh_field('sales_bom_help');
584}