blob: 1e9643aeb89f33a6e1a5708835087d23e4e0cce2 [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 Doshi652bc072014-04-16 15:21:46 +0530238 calculate_taxes_and_totals: function(update_paid_amount) {
Anand Doshi3543f302013-05-24 19:25:01 +0530239 this._super();
Anand Doshi652bc072014-04-16 15:21:46 +0530240 this.calculate_total_advance("Sales Invoice", "advance_adjustment_details", update_paid_amount);
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 Doshi652bc072014-04-16 15:21:46 +0530401 calculate_outstanding_amount: function(update_paid_amount) {
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) {
Anand Doshi652bc072014-04-16 15:21:46 +0530411 if(!this.frm.doc.paid_amount || update_paid_amount===undefined || update_paid_amount) {
412 this.frm.doc.paid_amount = flt(total_amount_to_pay);
413 }
Nabin Hait0c9d4222014-03-25 19:35:41 +0530414 } else {
415 this.frm.doc.paid_amount = 0
416 }
Nabin Hait482ffac2014-03-13 16:32:43 +0530417
Anand Doshibd67e872014-04-11 16:51:27 +0530418 this.frm.set_value("outstanding_amount", flt(total_amount_to_pay
Nabin Hait54106802014-03-13 17:26:41 +0530419 - this.frm.doc.paid_amount, precision("outstanding_amount")));
Anand Doshifc777182013-05-27 19:29:07 +0530420 }
421 },
Anand Doshibd67e872014-04-11 16:51:27 +0530422
Anand Doshif3096132013-05-21 19:35:06 +0530423 calculate_commission: function() {
Anand Doshi923d41d2013-05-28 17:23:36 +0530424 if(this.frm.fields_dict.commission_rate) {
425 if(this.frm.doc.commission_rate > 100) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530426 var msg = __(frappe.meta.get_label(this.frm.doc.doctype, "commission_rate", this.frm.doc.name)) +
427 " " + __("cannot be greater than 100");
Anand Doshi923d41d2013-05-28 17:23:36 +0530428 msgprint(msg);
429 throw msg;
430 }
Anand Doshibd67e872014-04-11 16:51:27 +0530431
Anand Doshi923d41d2013-05-28 17:23:36 +0530432 this.frm.doc.total_commission = flt(this.frm.doc.net_total * this.frm.doc.commission_rate / 100.0,
433 precision("total_commission"));
434 }
Anand Doshif3096132013-05-21 19:35:06 +0530435 },
Anand Doshibd67e872014-04-11 16:51:27 +0530436
Anand Doshif3096132013-05-21 19:35:06 +0530437 calculate_contribution: function() {
Anand Doshi2168e392013-05-23 19:25:08 +0530438 var me = this;
Rushabh Mehtaaa355af2014-03-26 18:24:30 +0530439 $.each(this.frm.doc.doctype.sales_team || [], function(i, sales_person) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530440 frappe.model.round_floats_in(sales_person);
Anand Doshif3096132013-05-21 19:35:06 +0530441 if(sales_person.allocated_percentage) {
442 sales_person.allocated_amount = flt(
443 me.frm.doc.net_total * sales_person.allocated_percentage / 100.0,
444 precision("allocated_amount", sales_person));
445 }
446 });
447 },
Anand Doshibd67e872014-04-11 16:51:27 +0530448
Anand Doshif3096132013-05-21 19:35:06 +0530449 _cleanup: function() {
Anand Doshi3543f302013-05-24 19:25:01 +0530450 this._super();
451 this.frm.doc.in_words = this.frm.doc.in_words_export = "";
Anand Doshif3096132013-05-21 19:35:06 +0530452 },
Anand Doshi2168e392013-05-23 19:25:08 +0530453
Anand Doshicefccb92013-07-15 18:28:14 +0530454 shipping_rule: function() {
455 var me = this;
456 if(this.frm.doc.shipping_rule) {
Anand Doshi1fac2a92013-07-29 19:30:39 +0530457 return this.frm.call({
Anand Doshicefccb92013-07-15 18:28:14 +0530458 doc: this.frm.doc,
459 method: "apply_shipping_rule",
460 callback: function(r) {
461 if(!r.exc) {
462 me.calculate_taxes_and_totals();
463 }
464 }
465 })
466 }
467 },
Anand Doshibd67e872014-04-11 16:51:27 +0530468
Anand Doshi2168e392013-05-23 19:25:08 +0530469 set_dynamic_labels: function() {
Anand Doshi61a2f682013-06-21 17:55:31 +0530470 this._super();
Anand Doshi9d049242013-06-05 20:46:56 +0530471 set_sales_bom_help(this.frm.doc);
Anand Doshi2168e392013-05-23 19:25:08 +0530472 },
Anand Doshibd67e872014-04-11 16:51:27 +0530473
Anand Doshi2168e392013-05-23 19:25:08 +0530474 change_form_labels: function(company_currency) {
475 var me = this;
476 var field_label_map = {};
Anand Doshibd67e872014-04-11 16:51:27 +0530477
Anand Doshi2168e392013-05-23 19:25:08 +0530478 var setup_field_label_map = function(fields_list, currency) {
479 $.each(fields_list, function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530480 var docfield = frappe.meta.docfield_map[me.frm.doc.doctype][fname];
Anand Doshi2168e392013-05-23 19:25:08 +0530481 if(docfield) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530482 var label = __(docfield.label || "").replace(/\([^\)]*\)/g, "");
Anand Doshi2168e392013-05-23 19:25:08 +0530483 field_label_map[fname] = label.trim() + " (" + currency + ")";
484 }
485 });
486 };
Anand Doshibd67e872014-04-11 16:51:27 +0530487 setup_field_label_map(["net_total", "other_charges_total", "grand_total",
Anand Doshi2168e392013-05-23 19:25:08 +0530488 "rounded_total", "in_words",
489 "outstanding_amount", "total_advance", "paid_amount", "write_off_amount"],
490 company_currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530491
492 setup_field_label_map(["net_total_export", "other_charges_total_export", "grand_total_export",
Anand Doshi2168e392013-05-23 19:25:08 +0530493 "rounded_total_export", "in_words_export"], this.frm.doc.currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530494
495 cur_frm.set_df_property("conversion_rate", "description", "1 " + this.frm.doc.currency
Rushabh Mehtaef584552013-11-02 14:47:11 +0530496 + " = [?] " + company_currency)
Anand Doshibd67e872014-04-11 16:51:27 +0530497
Anand Doshi2168e392013-05-23 19:25:08 +0530498 if(this.frm.doc.price_list_currency && this.frm.doc.price_list_currency!=company_currency) {
Anand Doshibd67e872014-04-11 16:51:27 +0530499 cur_frm.set_df_property("plc_conversion_rate", "description", "1 " + this.frm.doc.price_list_currency
Rushabh Mehtaef584552013-11-02 14:47:11 +0530500 + " = [?] " + company_currency)
Anand Doshi2168e392013-05-23 19:25:08 +0530501 }
Anand Doshibd67e872014-04-11 16:51:27 +0530502
Anand Doshi2168e392013-05-23 19:25:08 +0530503 // toggle fields
Anand Doshibd67e872014-04-11 16:51:27 +0530504 this.frm.toggle_display(["conversion_rate", "net_total", "other_charges_total",
Anand Doshi2168e392013-05-23 19:25:08 +0530505 "grand_total", "rounded_total", "in_words"],
506 this.frm.doc.currency != company_currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530507
508 this.frm.toggle_display(["plc_conversion_rate", "price_list_currency"],
Anand Doshi2168e392013-05-23 19:25:08 +0530509 this.frm.doc.price_list_currency != company_currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530510
Anand Doshi2168e392013-05-23 19:25:08 +0530511 // set labels
512 $.each(field_label_map, function(fname, label) {
513 me.frm.fields_dict[fname].set_label(label);
514 });
515 },
Anand Doshibd67e872014-04-11 16:51:27 +0530516
Anand Doshi2168e392013-05-23 19:25:08 +0530517 change_grid_labels: function(company_currency) {
518 var me = this;
519 var field_label_map = {};
Anand Doshibd67e872014-04-11 16:51:27 +0530520
Anand Doshi2168e392013-05-23 19:25:08 +0530521 var setup_field_label_map = function(fields_list, currency, parentfield) {
522 var grid_doctype = me.frm.fields_dict[parentfield].grid.doctype;
523 $.each(fields_list, function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530524 var docfield = frappe.meta.docfield_map[grid_doctype][fname];
Anand Doshi2168e392013-05-23 19:25:08 +0530525 if(docfield) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530526 var label = __(docfield.label || "").replace(/\([^\)]*\)/g, "");
Anand Doshibd67e872014-04-11 16:51:27 +0530527 field_label_map[grid_doctype + "-" + fname] =
Anand Doshi2168e392013-05-23 19:25:08 +0530528 label.trim() + " (" + currency + ")";
529 }
530 });
531 }
Anand Doshibd67e872014-04-11 16:51:27 +0530532
Nabin Hait1eb56012014-02-10 19:20:15 +0530533 setup_field_label_map(["base_rate", "base_price_list_rate", "base_amount"],
Anand Doshi2168e392013-05-23 19:25:08 +0530534 company_currency, this.fname);
Anand Doshibd67e872014-04-11 16:51:27 +0530535
Nabin Hait1eb56012014-02-10 19:20:15 +0530536 setup_field_label_map(["rate", "price_list_rate", "amount"],
Anand Doshi2168e392013-05-23 19:25:08 +0530537 this.frm.doc.currency, this.fname);
Anand Doshibd67e872014-04-11 16:51:27 +0530538
Anand Doshi2168e392013-05-23 19:25:08 +0530539 setup_field_label_map(["tax_amount", "total"], company_currency, "other_charges");
Anand Doshibd67e872014-04-11 16:51:27 +0530540
Anand Doshi2168e392013-05-23 19:25:08 +0530541 if(this.frm.fields_dict["advance_allocation_details"]) {
542 setup_field_label_map(["advance_amount", "allocated_amount"], company_currency,
543 "advance_allocation_details");
544 }
Anand Doshibd67e872014-04-11 16:51:27 +0530545
Anand Doshi2168e392013-05-23 19:25:08 +0530546 // toggle columns
547 var item_grid = this.frm.fields_dict[this.fname].grid;
Anand Doshibd67e872014-04-11 16:51:27 +0530548 var show = (this.frm.doc.currency != company_currency) ||
549 ((cur_frm.doc.other_charges || []).filter(
Rushabh Mehtaaa355af2014-03-26 18:24:30 +0530550 function(d) { return d.included_in_print_rate===1}).length);
Anand Doshibd67e872014-04-11 16:51:27 +0530551
Nabin Hait1eb56012014-02-10 19:20:15 +0530552 $.each(["base_rate", "base_price_list_rate", "base_amount"], function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530553 if(frappe.meta.get_docfield(item_grid.doctype, fname))
Anand Doshi2168e392013-05-23 19:25:08 +0530554 item_grid.set_column_disp(fname, show);
555 });
Anand Doshibd67e872014-04-11 16:51:27 +0530556
Anand Doshi2168e392013-05-23 19:25:08 +0530557 // set labels
558 var $wrapper = $(this.frm.wrapper);
559 $.each(field_label_map, function(fname, label) {
Anand Doshi5013dcb2013-08-05 12:16:04 +0530560 fname = fname.split("-");
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530561 var df = frappe.meta.get_docfield(fname[0], fname[1], me.frm.doc.name);
Anand Doshi5013dcb2013-08-05 12:16:04 +0530562 if(df) df.label = label;
Anand Doshi2168e392013-05-23 19:25:08 +0530563 });
564 },
Anand Doshi1dde46a2013-05-15 21:15:57 +0530565});
566
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530567// Help for Sales BOM items
568var set_sales_bom_help = function(doc) {
Rushabh Mehta2eef40b2012-07-16 14:16:57 +0530569 if(!cur_frm.fields_dict.packing_list) return;
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530570 if ((doc.packing_details || []).length) {
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530571 $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(true);
Anand Doshibd67e872014-04-11 16:51:27 +0530572
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530573 if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
Bárbara Perretti4098c262013-09-27 17:05:17 -0300574 help_msg = "<div class='alert alert-warning'>" +
Pratik Vyase1eeb222014-04-15 10:50:36 +0530575 __("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 -0300576 "</div>";
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530577 frappe.meta.get_docfield(doc.doctype, 'sales_bom_help', doc.name).options = help_msg;
Anand Doshibd67e872014-04-11 16:51:27 +0530578 }
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530579 } else {
580 $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(false);
581 if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530582 frappe.meta.get_docfield(doc.doctype, 'sales_bom_help', doc.name).options = '';
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530583 }
584 }
585 refresh_field('sales_bom_help');
586}