blob: 260fbe5ab9896cb488e08e04042d8ac1f8409222 [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() {
Nabin Haita3dd72a2014-05-28 12:49:20 +0530107 var me = this;
108 erpnext.utils.get_party_details(this.frm, null, null, function(){me.apply_pricing_rule()});
Anand Doshi3543f302013-05-24 19:25:01 +0530109 },
Anand Doshibd67e872014-04-11 16:51:27 +0530110
Nabin Haita279d782013-07-15 13:04:33 +0530111 customer_address: function() {
Rushabh Mehtab09d9da2014-01-02 11:47:23 +0530112 erpnext.utils.get_address_display(this.frm, "customer_address");
Nabin Haita279d782013-07-15 13:04:33 +0530113 },
Anand Doshibd67e872014-04-11 16:51:27 +0530114
Nabin Hait9d1f0772014-02-19 17:43:24 +0530115 shipping_address_name: function() {
116 erpnext.utils.get_address_display(this.frm, "shipping_address_name", "shipping_address");
117 },
Anand Doshibd67e872014-04-11 16:51:27 +0530118
Nabin Haita279d782013-07-15 13:04:33 +0530119 contact_person: function() {
Rushabh Mehtab09d9da2014-01-02 11:47:23 +0530120 erpnext.utils.get_contact_details(this.frm);
Nabin Haita279d782013-07-15 13:04:33 +0530121 },
Anand Doshibd67e872014-04-11 16:51:27 +0530122
Nabin Haita3dd72a2014-05-28 12:49:20 +0530123 sales_partner: function() {
124 this.apply_pricing_rule();
125 },
126
127 campaign: function() {
128 this.apply_pricing_rule();
129 },
130
Anand Doshif3096132013-05-21 19:35:06 +0530131 barcode: function(doc, cdt, cdn) {
132 this.item_code(doc, cdt, cdn);
Anand Doshi1dde46a2013-05-15 21:15:57 +0530133 },
Anand Doshibd67e872014-04-11 16:51:27 +0530134
Rushabh Mehta4a404e92013-08-09 18:11:35 +0530135 selling_price_list: function() {
136 this.get_price_list_currency("Selling");
Anand Doshif3096132013-05-21 19:35:06 +0530137 },
Anand Doshibd67e872014-04-11 16:51:27 +0530138
Nabin Haita7f757a2014-02-10 17:54:04 +0530139 price_list_rate: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530140 var item = frappe.get_doc(cdt, cdn);
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530141 frappe.model.round_floats_in(item, ["price_list_rate", "discount_percentage"]);
Anand Doshibd67e872014-04-11 16:51:27 +0530142
Nabin Hait7979f7e2014-02-10 18:26:49 +0530143 item.rate = flt(item.price_list_rate * (1 - item.discount_percentage / 100.0),
144 precision("rate", item));
Anand Doshibd67e872014-04-11 16:51:27 +0530145
Anand Doshif3096132013-05-21 19:35:06 +0530146 this.calculate_taxes_and_totals();
147 },
Anand Doshibd67e872014-04-11 16:51:27 +0530148
Nabin Haita7f757a2014-02-10 17:54:04 +0530149 discount_percentage: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530150 var item = frappe.get_doc(cdt, cdn);
Nabin Haita7f757a2014-02-10 17:54:04 +0530151 if(!item.price_list_rate) {
152 item.discount_percentage = 0.0;
Anand Doshi923d41d2013-05-28 17:23:36 +0530153 } else {
Nabin Haita7f757a2014-02-10 17:54:04 +0530154 this.price_list_rate(doc, cdt, cdn);
Anand Doshi923d41d2013-05-28 17:23:36 +0530155 }
Anand Doshif3096132013-05-21 19:35:06 +0530156 },
Anand Doshibd67e872014-04-11 16:51:27 +0530157
Nabin Hait7979f7e2014-02-10 18:26:49 +0530158 rate: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530159 var item = frappe.get_doc(cdt, cdn);
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530160 frappe.model.round_floats_in(item, ["rate", "price_list_rate"]);
Anand Doshibd67e872014-04-11 16:51:27 +0530161
Nabin Haita7f757a2014-02-10 17:54:04 +0530162 if(item.price_list_rate) {
Nabin Hait7979f7e2014-02-10 18:26:49 +0530163 item.discount_percentage = flt((1 - item.rate / item.price_list_rate) * 100.0,
Nabin Haita7f757a2014-02-10 17:54:04 +0530164 precision("discount_percentage", item));
Anand Doshif3096132013-05-21 19:35:06 +0530165 } else {
Nabin Haita7f757a2014-02-10 17:54:04 +0530166 item.discount_percentage = 0.0;
Anand Doshif3096132013-05-21 19:35:06 +0530167 }
Anand Doshibd67e872014-04-11 16:51:27 +0530168
Anand Doshif3096132013-05-21 19:35:06 +0530169 this.calculate_taxes_and_totals();
170 },
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530171
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530172 discount_amount: function() {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530173 this.calculate_taxes_and_totals();
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530174 },
Anand Doshibd67e872014-04-11 16:51:27 +0530175
Anand Doshif3096132013-05-21 19:35:06 +0530176 commission_rate: function() {
177 this.calculate_commission();
178 refresh_field("total_commission");
179 },
Anand Doshibd67e872014-04-11 16:51:27 +0530180
Anand Doshif3096132013-05-21 19:35:06 +0530181 total_commission: function() {
182 if(this.frm.doc.net_total) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530183 frappe.model.round_floats_in(this.frm.doc, ["net_total", "total_commission"]);
Anand Doshibd67e872014-04-11 16:51:27 +0530184
Anand Doshif3096132013-05-21 19:35:06 +0530185 if(this.frm.doc.net_total < this.frm.doc.total_commission) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530186 var msg = (__("[Error]") + " " +
187 __(frappe.meta.get_label(this.frm.doc.doctype, "total_commission",
Anand Doshibd67e872014-04-11 16:51:27 +0530188 this.frm.doc.name)) + " > " +
Pratik Vyasb52618c2014-04-14 16:25:30 +0530189 __(frappe.meta.get_label(this.frm.doc.doctype, "net_total", this.frm.doc.name)));
Anand Doshif3096132013-05-21 19:35:06 +0530190 msgprint(msg);
191 throw msg;
192 }
Anand Doshibd67e872014-04-11 16:51:27 +0530193
194 this.frm.set_value("commission_rate",
Anand Doshif3096132013-05-21 19:35:06 +0530195 flt(this.frm.doc.total_commission * 100.0 / this.frm.doc.net_total));
196 }
197 },
Anand Doshibd67e872014-04-11 16:51:27 +0530198
Anand Doshif3096132013-05-21 19:35:06 +0530199 allocated_percentage: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530200 var sales_person = frappe.get_doc(cdt, cdn);
Anand Doshibd67e872014-04-11 16:51:27 +0530201
Anand Doshif3096132013-05-21 19:35:06 +0530202 if(sales_person.allocated_percentage) {
203 sales_person.allocated_percentage = flt(sales_person.allocated_percentage,
204 precision("allocated_percentage", sales_person));
205 sales_person.allocated_amount = flt(this.frm.doc.net_total *
Anand Doshibd67e872014-04-11 16:51:27 +0530206 sales_person.allocated_percentage / 100.0,
Anand Doshif3096132013-05-21 19:35:06 +0530207 precision("allocated_amount", sales_person));
208
209 refresh_field(["allocated_percentage", "allocated_amount"], sales_person.name,
210 sales_person.parentfield);
211 }
212 },
Anand Doshibd67e872014-04-11 16:51:27 +0530213
Anand Doshifc777182013-05-27 19:29:07 +0530214 warehouse: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530215 var item = frappe.get_doc(cdt, cdn);
Anand Doshi1dc95ed2013-07-23 13:36:38 +0530216 if(item.item_code && item.warehouse) {
Anand Doshi1fac2a92013-07-29 19:30:39 +0530217 return this.frm.call({
Nabin Hait0984f222014-05-30 19:10:12 +0530218 method: "erpnext.stock.get_item_details.get_available_qty",
Anand Doshifc777182013-05-27 19:29:07 +0530219 child: item,
220 args: {
221 item_code: item.item_code,
Anand Doshi1dc95ed2013-07-23 13:36:38 +0530222 warehouse: item.warehouse,
Anand Doshifc777182013-05-27 19:29:07 +0530223 },
224 });
225 }
226 },
Anand Doshibd67e872014-04-11 16:51:27 +0530227
Anand Doshif3096132013-05-21 19:35:06 +0530228 toggle_rounded_total: function() {
229 var me = this;
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530230 if(cint(frappe.defaults.get_global_default("disable_rounded_total"))) {
Anand Doshif3096132013-05-21 19:35:06 +0530231 $.each(["rounded_total", "rounded_total_export"], function(i, fieldname) {
232 me.frm.set_df_property(fieldname, "print_hide", 1);
233 me.frm.toggle_display(fieldname, false);
234 });
235 }
236 },
Anand Doshibd67e872014-04-11 16:51:27 +0530237
Anand Doshi33fe8672013-08-02 12:39:10 +0530238 toggle_editable_price_list_rate: function() {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530239 var df = frappe.meta.get_docfield(this.tname, "price_list_rate", this.frm.doc.name);
240 var editable_price_list_rate = cint(frappe.defaults.get_default("editable_price_list_rate"));
Anand Doshibd67e872014-04-11 16:51:27 +0530241
Anand Doshi33fe8672013-08-02 12:39:10 +0530242 if(df && editable_price_list_rate) {
243 df.read_only = 0;
244 }
245 },
Anand Doshibd67e872014-04-11 16:51:27 +0530246
Anand Doshi652bc072014-04-16 15:21:46 +0530247 calculate_taxes_and_totals: function(update_paid_amount) {
Anand Doshi3543f302013-05-24 19:25:01 +0530248 this._super();
Anand Doshi652bc072014-04-16 15:21:46 +0530249 this.calculate_total_advance("Sales Invoice", "advance_adjustment_details", update_paid_amount);
Anand Doshif3096132013-05-21 19:35:06 +0530250 this.calculate_commission();
251 this.calculate_contribution();
Anand Doshi923d41d2013-05-28 17:23:36 +0530252
253 // TODO check for custom_recalc in custom scripts of server
Anand Doshibd67e872014-04-11 16:51:27 +0530254
Anand Doshi2168e392013-05-23 19:25:08 +0530255 this.frm.refresh_fields();
Anand Doshif3096132013-05-21 19:35:06 +0530256 },
Anand Doshibd67e872014-04-11 16:51:27 +0530257
Anand Doshif3096132013-05-21 19:35:06 +0530258 calculate_item_values: function() {
259 var me = this;
Anand Doshibd67e872014-04-11 16:51:27 +0530260
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530261 if (!this.discount_amount_applied) {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530262 $.each(this.frm.item_doclist, function(i, item) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530263 frappe.model.round_floats_in(item);
Nabin Hait1eb56012014-02-10 19:20:15 +0530264 item.amount = flt(item.rate * item.qty, precision("amount", item));
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530265
Nabin Haita7f757a2014-02-10 17:54:04 +0530266 me._set_in_company_currency(item, "price_list_rate", "base_price_list_rate");
Nabin Hait7979f7e2014-02-10 18:26:49 +0530267 me._set_in_company_currency(item, "rate", "base_rate");
Nabin Hait1eb56012014-02-10 19:20:15 +0530268 me._set_in_company_currency(item, "amount", "base_amount");
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530269 });
270 }
Anand Doshif3096132013-05-21 19:35:06 +0530271 },
Anand Doshibd67e872014-04-11 16:51:27 +0530272
Anand Doshif3096132013-05-21 19:35:06 +0530273 determine_exclusive_rate: function() {
274 var me = this;
275 $.each(me.frm.item_doclist, function(n, item) {
276 var item_tax_map = me._load_item_tax_rate(item.item_tax_rate);
277 var cumulated_tax_fraction = 0.0;
Anand Doshibd67e872014-04-11 16:51:27 +0530278
Anand Doshif3096132013-05-21 19:35:06 +0530279 $.each(me.frm.tax_doclist, function(i, tax) {
280 tax.tax_fraction_for_current_item = me.get_current_tax_fraction(tax, item_tax_map);
Anand Doshibd67e872014-04-11 16:51:27 +0530281
Anand Doshif3096132013-05-21 19:35:06 +0530282 if(i==0) {
Anand Doshi2168e392013-05-23 19:25:08 +0530283 tax.grand_total_fraction_for_current_item = 1 + tax.tax_fraction_for_current_item;
Anand Doshif3096132013-05-21 19:35:06 +0530284 } else {
Anand Doshibd67e872014-04-11 16:51:27 +0530285 tax.grand_total_fraction_for_current_item =
Anand Doshi2168e392013-05-23 19:25:08 +0530286 me.frm.tax_doclist[i-1].grand_total_fraction_for_current_item +
Anand Doshif3096132013-05-21 19:35:06 +0530287 tax.tax_fraction_for_current_item;
288 }
Anand Doshibd67e872014-04-11 16:51:27 +0530289
Anand Doshif3096132013-05-21 19:35:06 +0530290 cumulated_tax_fraction += tax.tax_fraction_for_current_item;
291 });
Anand Doshibd67e872014-04-11 16:51:27 +0530292
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530293 if(cumulated_tax_fraction && !me.discount_amount_applied) {
Nabin Hait1eb56012014-02-10 19:20:15 +0530294 item.base_amount = flt(
295 (item.amount * me.frm.doc.conversion_rate) / (1 + cumulated_tax_fraction),
296 precision("base_amount", item));
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530297
Nabin Hait1eb56012014-02-10 19:20:15 +0530298 item.base_rate = flt(item.base_amount / item.qty, precision("base_rate", item));
Anand Doshibd67e872014-04-11 16:51:27 +0530299
Nabin Haita7f757a2014-02-10 17:54:04 +0530300 if(item.discount_percentage == 100) {
Nabin Hait7979f7e2014-02-10 18:26:49 +0530301 item.base_price_list_rate = item.base_rate;
302 item.base_rate = 0.0;
Anand Doshif3096132013-05-21 19:35:06 +0530303 } else {
Nabin Hait7979f7e2014-02-10 18:26:49 +0530304 item.base_price_list_rate = flt(item.base_rate / (1 - item.discount_percentage / 100.0),
Nabin Haita7f757a2014-02-10 17:54:04 +0530305 precision("base_price_list_rate", item));
Anand Doshif3096132013-05-21 19:35:06 +0530306 }
307 }
308 });
309 },
Anand Doshibd67e872014-04-11 16:51:27 +0530310
Anand Doshif3096132013-05-21 19:35:06 +0530311 get_current_tax_fraction: function(tax, item_tax_map) {
312 // Get tax fraction for calculating tax exclusive amount
313 // from tax inclusive amount
314 var current_tax_fraction = 0.0;
Anand Doshibd67e872014-04-11 16:51:27 +0530315
Anand Doshif3096132013-05-21 19:35:06 +0530316 if(cint(tax.included_in_print_rate)) {
Anand Doshi2168e392013-05-23 19:25:08 +0530317 var tax_rate = this._get_tax_rate(tax, item_tax_map);
Anand Doshibd67e872014-04-11 16:51:27 +0530318
Anand Doshif3096132013-05-21 19:35:06 +0530319 if(tax.charge_type == "On Net Total") {
320 current_tax_fraction = (tax_rate / 100.0);
Anand Doshibd67e872014-04-11 16:51:27 +0530321
Anand Doshif3096132013-05-21 19:35:06 +0530322 } else if(tax.charge_type == "On Previous Row Amount") {
323 current_tax_fraction = (tax_rate / 100.0) *
Anand Doshi2168e392013-05-23 19:25:08 +0530324 this.frm.tax_doclist[cint(tax.row_id) - 1].tax_fraction_for_current_item;
Anand Doshibd67e872014-04-11 16:51:27 +0530325
Anand Doshif3096132013-05-21 19:35:06 +0530326 } else if(tax.charge_type == "On Previous Row Total") {
327 current_tax_fraction = (tax_rate / 100.0) *
Anand Doshi2168e392013-05-23 19:25:08 +0530328 this.frm.tax_doclist[cint(tax.row_id) - 1].grand_total_fraction_for_current_item;
Anand Doshif3096132013-05-21 19:35:06 +0530329 }
330 }
Anand Doshibd67e872014-04-11 16:51:27 +0530331
Anand Doshif3096132013-05-21 19:35:06 +0530332 return current_tax_fraction;
333 },
Anand Doshibd67e872014-04-11 16:51:27 +0530334
Anand Doshif3096132013-05-21 19:35:06 +0530335 calculate_net_total: function() {
336 var me = this;
Anand Doshif3096132013-05-21 19:35:06 +0530337 this.frm.doc.net_total = this.frm.doc.net_total_export = 0.0;
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530338
Anand Doshif3096132013-05-21 19:35:06 +0530339 $.each(this.frm.item_doclist, function(i, item) {
Nabin Hait1eb56012014-02-10 19:20:15 +0530340 me.frm.doc.net_total += item.base_amount;
341 me.frm.doc.net_total_export += item.amount;
Anand Doshif3096132013-05-21 19:35:06 +0530342 });
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530343
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530344 frappe.model.round_floats_in(this.frm.doc, ["net_total", "net_total_export"]);
Anand Doshif3096132013-05-21 19:35:06 +0530345 },
Anand Doshibd67e872014-04-11 16:51:27 +0530346
Anand Doshif3096132013-05-21 19:35:06 +0530347 calculate_totals: function() {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530348 var me = this;
Anand Doshif3096132013-05-21 19:35:06 +0530349 var tax_count = this.frm.tax_doclist.length;
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530350
Anand Doshif3096132013-05-21 19:35:06 +0530351 this.frm.doc.grand_total = flt(
352 tax_count ? this.frm.tax_doclist[tax_count - 1].total : this.frm.doc.net_total,
353 precision("grand_total"));
354 this.frm.doc.grand_total_export = flt(this.frm.doc.grand_total / this.frm.doc.conversion_rate,
355 precision("grand_total_export"));
Anand Doshibd67e872014-04-11 16:51:27 +0530356
Anand Doshif3096132013-05-21 19:35:06 +0530357 this.frm.doc.other_charges_total = flt(this.frm.doc.grand_total - this.frm.doc.net_total,
358 precision("other_charges_total"));
Anand Doshibd67e872014-04-11 16:51:27 +0530359 this.frm.doc.other_charges_total_export = flt(this.frm.doc.grand_total_export -
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530360 this.frm.doc.net_total_export + flt(this.frm.doc.discount_amount),
Anand Doshif3096132013-05-21 19:35:06 +0530361 precision("other_charges_total_export"));
Anand Doshibd67e872014-04-11 16:51:27 +0530362
Anand Doshif3096132013-05-21 19:35:06 +0530363 this.frm.doc.rounded_total = Math.round(this.frm.doc.grand_total);
364 this.frm.doc.rounded_total_export = Math.round(this.frm.doc.grand_total_export);
365 },
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530366
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530367 apply_discount_amount: function() {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530368 var me = this;
369 var distributed_amount = 0.0;
370
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530371 if (this.frm.doc.discount_amount) {
372 var grand_total_for_discount_amount = this.get_grand_total_for_discount_amount();
373 // calculate item amount after Discount Amount
374 if (grand_total_for_discount_amount) {
375 $.each(this.frm.item_doclist, function(i, item) {
Nabin Hait1eb56012014-02-10 19:20:15 +0530376 distributed_amount = flt(me.frm.doc.discount_amount) * item.base_amount / grand_total_for_discount_amount;
377 item.base_amount = flt(item.base_amount - distributed_amount, precision("base_amount", item));
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530378 });
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530379
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530380 this.discount_amount_applied = true;
381 this._calculate_taxes_and_totals();
382 }
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530383 }
384 },
385
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530386 get_grand_total_for_discount_amount: function() {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530387 var me = this;
388 var total_actual_tax = 0.0;
389 var actual_taxes_dict = {};
390
391 $.each(this.frm.tax_doclist, function(i, tax) {
392 if (tax.charge_type == "Actual")
393 actual_taxes_dict[tax.idx] = tax.tax_amount;
394 else if (actual_taxes_dict[tax.row_id] !== null) {
395 actual_tax_amount = flt(actual_taxes_dict[tax.row_id]) * flt(tax.rate) / 100;
396 actual_taxes_dict[tax.idx] = actual_tax_amount;
397 }
398 });
399
400 $.each(actual_taxes_dict, function(key, value) {
401 if (value)
402 total_actual_tax += value;
403 });
404
Anand Doshibd67e872014-04-11 16:51:27 +0530405 grand_total_for_discount_amount = flt(this.frm.doc.grand_total - total_actual_tax,
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530406 precision("grand_total"));
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530407 return grand_total_for_discount_amount;
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530408 },
Anand Doshibd67e872014-04-11 16:51:27 +0530409
Anand Doshi652bc072014-04-16 15:21:46 +0530410 calculate_outstanding_amount: function(update_paid_amount) {
Anand Doshibd67e872014-04-11 16:51:27 +0530411 // NOTE:
Akhilesh Darjee38e8f982013-09-05 12:59:33 +0530412 // paid_amount and write_off_amount is only for POS Invoice
Anand Doshi923d41d2013-05-28 17:23:36 +0530413 // total_advance is only for non POS Invoice
Anand Doshi29ea5d02013-07-05 17:23:14 +0530414 if(this.frm.doc.doctype == "Sales Invoice" && this.frm.doc.docstatus==0) {
Nabin Hait54106802014-03-13 17:26:41 +0530415 frappe.model.round_floats_in(this.frm.doc, ["grand_total", "total_advance", "write_off_amount",
416 "paid_amount"]);
Anand Doshibd67e872014-04-11 16:51:27 +0530417 var total_amount_to_pay = this.frm.doc.grand_total - this.frm.doc.write_off_amount
Nabin Hait54106802014-03-13 17:26:41 +0530418 - this.frm.doc.total_advance;
Nabin Hait0c9d4222014-03-25 19:35:41 +0530419 if(this.frm.doc.is_pos) {
Anand Doshi652bc072014-04-16 15:21:46 +0530420 if(!this.frm.doc.paid_amount || update_paid_amount===undefined || update_paid_amount) {
421 this.frm.doc.paid_amount = flt(total_amount_to_pay);
422 }
Nabin Hait0c9d4222014-03-25 19:35:41 +0530423 } else {
424 this.frm.doc.paid_amount = 0
425 }
Nabin Hait482ffac2014-03-13 16:32:43 +0530426
Anand Doshibd67e872014-04-11 16:51:27 +0530427 this.frm.set_value("outstanding_amount", flt(total_amount_to_pay
Nabin Hait54106802014-03-13 17:26:41 +0530428 - this.frm.doc.paid_amount, precision("outstanding_amount")));
Anand Doshifc777182013-05-27 19:29:07 +0530429 }
430 },
Anand Doshibd67e872014-04-11 16:51:27 +0530431
Anand Doshif3096132013-05-21 19:35:06 +0530432 calculate_commission: function() {
Anand Doshi923d41d2013-05-28 17:23:36 +0530433 if(this.frm.fields_dict.commission_rate) {
434 if(this.frm.doc.commission_rate > 100) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530435 var msg = __(frappe.meta.get_label(this.frm.doc.doctype, "commission_rate", this.frm.doc.name)) +
436 " " + __("cannot be greater than 100");
Anand Doshi923d41d2013-05-28 17:23:36 +0530437 msgprint(msg);
438 throw msg;
439 }
Anand Doshibd67e872014-04-11 16:51:27 +0530440
Anand Doshi923d41d2013-05-28 17:23:36 +0530441 this.frm.doc.total_commission = flt(this.frm.doc.net_total * this.frm.doc.commission_rate / 100.0,
442 precision("total_commission"));
443 }
Anand Doshif3096132013-05-21 19:35:06 +0530444 },
Anand Doshibd67e872014-04-11 16:51:27 +0530445
Anand Doshif3096132013-05-21 19:35:06 +0530446 calculate_contribution: function() {
Anand Doshi2168e392013-05-23 19:25:08 +0530447 var me = this;
Rushabh Mehtaaa355af2014-03-26 18:24:30 +0530448 $.each(this.frm.doc.doctype.sales_team || [], function(i, sales_person) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530449 frappe.model.round_floats_in(sales_person);
Anand Doshif3096132013-05-21 19:35:06 +0530450 if(sales_person.allocated_percentage) {
451 sales_person.allocated_amount = flt(
452 me.frm.doc.net_total * sales_person.allocated_percentage / 100.0,
453 precision("allocated_amount", sales_person));
454 }
455 });
456 },
Anand Doshibd67e872014-04-11 16:51:27 +0530457
Anand Doshif3096132013-05-21 19:35:06 +0530458 _cleanup: function() {
Anand Doshi3543f302013-05-24 19:25:01 +0530459 this._super();
460 this.frm.doc.in_words = this.frm.doc.in_words_export = "";
Anand Doshif3096132013-05-21 19:35:06 +0530461 },
Anand Doshi2168e392013-05-23 19:25:08 +0530462
Anand Doshicefccb92013-07-15 18:28:14 +0530463 shipping_rule: function() {
464 var me = this;
465 if(this.frm.doc.shipping_rule) {
Anand Doshi1fac2a92013-07-29 19:30:39 +0530466 return this.frm.call({
Anand Doshicefccb92013-07-15 18:28:14 +0530467 doc: this.frm.doc,
468 method: "apply_shipping_rule",
469 callback: function(r) {
470 if(!r.exc) {
471 me.calculate_taxes_and_totals();
472 }
473 }
474 })
475 }
476 },
Anand Doshibd67e872014-04-11 16:51:27 +0530477
Anand Doshi2168e392013-05-23 19:25:08 +0530478 set_dynamic_labels: function() {
Anand Doshi61a2f682013-06-21 17:55:31 +0530479 this._super();
Anand Doshi9d049242013-06-05 20:46:56 +0530480 set_sales_bom_help(this.frm.doc);
Anand Doshi2168e392013-05-23 19:25:08 +0530481 },
Anand Doshibd67e872014-04-11 16:51:27 +0530482
Anand Doshi2168e392013-05-23 19:25:08 +0530483 change_form_labels: function(company_currency) {
484 var me = this;
485 var field_label_map = {};
Anand Doshibd67e872014-04-11 16:51:27 +0530486
Anand Doshi2168e392013-05-23 19:25:08 +0530487 var setup_field_label_map = function(fields_list, currency) {
488 $.each(fields_list, function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530489 var docfield = frappe.meta.docfield_map[me.frm.doc.doctype][fname];
Anand Doshi2168e392013-05-23 19:25:08 +0530490 if(docfield) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530491 var label = __(docfield.label || "").replace(/\([^\)]*\)/g, "");
Anand Doshi2168e392013-05-23 19:25:08 +0530492 field_label_map[fname] = label.trim() + " (" + currency + ")";
493 }
494 });
495 };
Anand Doshibd67e872014-04-11 16:51:27 +0530496 setup_field_label_map(["net_total", "other_charges_total", "grand_total",
Anand Doshi2168e392013-05-23 19:25:08 +0530497 "rounded_total", "in_words",
498 "outstanding_amount", "total_advance", "paid_amount", "write_off_amount"],
499 company_currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530500
501 setup_field_label_map(["net_total_export", "other_charges_total_export", "grand_total_export",
Anand Doshi2168e392013-05-23 19:25:08 +0530502 "rounded_total_export", "in_words_export"], this.frm.doc.currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530503
504 cur_frm.set_df_property("conversion_rate", "description", "1 " + this.frm.doc.currency
Rushabh Mehtaef584552013-11-02 14:47:11 +0530505 + " = [?] " + company_currency)
Anand Doshibd67e872014-04-11 16:51:27 +0530506
Anand Doshi2168e392013-05-23 19:25:08 +0530507 if(this.frm.doc.price_list_currency && this.frm.doc.price_list_currency!=company_currency) {
Anand Doshibd67e872014-04-11 16:51:27 +0530508 cur_frm.set_df_property("plc_conversion_rate", "description", "1 " + this.frm.doc.price_list_currency
Rushabh Mehtaef584552013-11-02 14:47:11 +0530509 + " = [?] " + company_currency)
Anand Doshi2168e392013-05-23 19:25:08 +0530510 }
Anand Doshibd67e872014-04-11 16:51:27 +0530511
Anand Doshi2168e392013-05-23 19:25:08 +0530512 // toggle fields
Anand Doshibd67e872014-04-11 16:51:27 +0530513 this.frm.toggle_display(["conversion_rate", "net_total", "other_charges_total",
Anand Doshi2168e392013-05-23 19:25:08 +0530514 "grand_total", "rounded_total", "in_words"],
515 this.frm.doc.currency != company_currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530516
517 this.frm.toggle_display(["plc_conversion_rate", "price_list_currency"],
Anand Doshi2168e392013-05-23 19:25:08 +0530518 this.frm.doc.price_list_currency != company_currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530519
Anand Doshi2168e392013-05-23 19:25:08 +0530520 // set labels
521 $.each(field_label_map, function(fname, label) {
522 me.frm.fields_dict[fname].set_label(label);
523 });
524 },
Anand Doshibd67e872014-04-11 16:51:27 +0530525
Anand Doshi2168e392013-05-23 19:25:08 +0530526 change_grid_labels: function(company_currency) {
527 var me = this;
528 var field_label_map = {};
Anand Doshibd67e872014-04-11 16:51:27 +0530529
Anand Doshi2168e392013-05-23 19:25:08 +0530530 var setup_field_label_map = function(fields_list, currency, parentfield) {
531 var grid_doctype = me.frm.fields_dict[parentfield].grid.doctype;
532 $.each(fields_list, function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530533 var docfield = frappe.meta.docfield_map[grid_doctype][fname];
Anand Doshi2168e392013-05-23 19:25:08 +0530534 if(docfield) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530535 var label = __(docfield.label || "").replace(/\([^\)]*\)/g, "");
Anand Doshibd67e872014-04-11 16:51:27 +0530536 field_label_map[grid_doctype + "-" + fname] =
Anand Doshi2168e392013-05-23 19:25:08 +0530537 label.trim() + " (" + currency + ")";
538 }
539 });
540 }
Anand Doshibd67e872014-04-11 16:51:27 +0530541
Nabin Hait1eb56012014-02-10 19:20:15 +0530542 setup_field_label_map(["base_rate", "base_price_list_rate", "base_amount"],
Anand Doshi2168e392013-05-23 19:25:08 +0530543 company_currency, this.fname);
Anand Doshibd67e872014-04-11 16:51:27 +0530544
Nabin Hait1eb56012014-02-10 19:20:15 +0530545 setup_field_label_map(["rate", "price_list_rate", "amount"],
Anand Doshi2168e392013-05-23 19:25:08 +0530546 this.frm.doc.currency, this.fname);
Anand Doshibd67e872014-04-11 16:51:27 +0530547
Anand Doshi2168e392013-05-23 19:25:08 +0530548 setup_field_label_map(["tax_amount", "total"], company_currency, "other_charges");
Anand Doshibd67e872014-04-11 16:51:27 +0530549
Anand Doshi2168e392013-05-23 19:25:08 +0530550 if(this.frm.fields_dict["advance_allocation_details"]) {
551 setup_field_label_map(["advance_amount", "allocated_amount"], company_currency,
552 "advance_allocation_details");
553 }
Anand Doshibd67e872014-04-11 16:51:27 +0530554
Anand Doshi2168e392013-05-23 19:25:08 +0530555 // toggle columns
556 var item_grid = this.frm.fields_dict[this.fname].grid;
Anand Doshibd67e872014-04-11 16:51:27 +0530557 var show = (this.frm.doc.currency != company_currency) ||
558 ((cur_frm.doc.other_charges || []).filter(
Rushabh Mehtaaa355af2014-03-26 18:24:30 +0530559 function(d) { return d.included_in_print_rate===1}).length);
Anand Doshibd67e872014-04-11 16:51:27 +0530560
Nabin Hait1eb56012014-02-10 19:20:15 +0530561 $.each(["base_rate", "base_price_list_rate", "base_amount"], function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530562 if(frappe.meta.get_docfield(item_grid.doctype, fname))
Anand Doshi2168e392013-05-23 19:25:08 +0530563 item_grid.set_column_disp(fname, show);
564 });
Anand Doshibd67e872014-04-11 16:51:27 +0530565
Anand Doshi2168e392013-05-23 19:25:08 +0530566 // set labels
567 var $wrapper = $(this.frm.wrapper);
568 $.each(field_label_map, function(fname, label) {
Anand Doshi5013dcb2013-08-05 12:16:04 +0530569 fname = fname.split("-");
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530570 var df = frappe.meta.get_docfield(fname[0], fname[1], me.frm.doc.name);
Anand Doshi5013dcb2013-08-05 12:16:04 +0530571 if(df) df.label = label;
Anand Doshi2168e392013-05-23 19:25:08 +0530572 });
573 },
Anand Doshi1dde46a2013-05-15 21:15:57 +0530574});
575
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530576// Help for Sales BOM items
577var set_sales_bom_help = function(doc) {
Rushabh Mehta2eef40b2012-07-16 14:16:57 +0530578 if(!cur_frm.fields_dict.packing_list) return;
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530579 if ((doc.packing_details || []).length) {
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530580 $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(true);
Anand Doshibd67e872014-04-11 16:51:27 +0530581
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530582 if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
Bárbara Perretti4098c262013-09-27 17:05:17 -0300583 help_msg = "<div class='alert alert-warning'>" +
Pratik Vyase1eeb222014-04-15 10:50:36 +0530584 __("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 -0300585 "</div>";
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530586 frappe.meta.get_docfield(doc.doctype, 'sales_bom_help', doc.name).options = help_msg;
Anand Doshibd67e872014-04-11 16:51:27 +0530587 }
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530588 } else {
589 $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(false);
590 if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530591 frappe.meta.get_docfield(doc.doctype, 'sales_bom_help', doc.name).options = '';
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530592 }
593 }
594 refresh_field('sales_bom_help');
595}