blob: 1cc643eb4083758ea9830cea8cd7f9d6de39ca6b [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
Rushabh Mehtab6843f22014-06-04 13:10:41 +053024 onload_post_render: function() {
25 cur_frm.get_field(this.fname).grid.set_multiple_add("item_code");
26 },
27
Anand Doshi9b496142013-07-11 19:13:58 +053028 setup_queries: function() {
Anand Doshi99100a42013-07-04 17:13:53 +053029 var me = this;
Anand Doshibd67e872014-04-11 16:51:27 +053030
Anand Doshif3096132013-05-21 19:35:06 +053031 this.frm.add_fetch("sales_partner", "commission_rate", "commission_rate");
Anand Doshibd67e872014-04-11 16:51:27 +053032
33 $.each([["customer_address", "customer_filter"],
Anand Doshid5d39ac2013-07-29 13:28:37 +053034 ["shipping_address_name", "customer_filter"],
Anand Doshibd67e872014-04-11 16:51:27 +053035 ["contact_person", "customer_filter"],
36 ["customer", "customer"],
37 ["lead", "lead"]],
Anand Doshid5d39ac2013-07-29 13:28:37 +053038 function(i, opts) {
Anand Doshibd67e872014-04-11 16:51:27 +053039 if(me.frm.fields_dict[opts[0]])
Anand Doshid5d39ac2013-07-29 13:28:37 +053040 me.frm.set_query(opts[0], erpnext.queries[opts[1]]);
41 });
Anand Doshibd67e872014-04-11 16:51:27 +053042
Akhilesh Darjee4f721562014-01-29 16:31:38 +053043 if(this.frm.fields_dict.taxes_and_charges) {
44 this.frm.set_query("taxes_and_charges", function() {
Saurabhf52dc072013-07-10 13:07:49 +053045 return {
46 filters: [
47 ['Sales Taxes and Charges Master', 'company', '=', me.frm.doc.company],
Saurabhf52dc072013-07-10 13:07:49 +053048 ['Sales Taxes and Charges Master', 'docstatus', '!=', 2]
49 ]
50 }
Anand Doshi99100a42013-07-04 17:13:53 +053051 });
52 }
Anand Doshi99100a42013-07-04 17:13:53 +053053
Rushabh Mehta4a404e92013-08-09 18:11:35 +053054 if(this.frm.fields_dict.selling_price_list) {
55 this.frm.set_query("selling_price_list", function() {
Nabin Haitdc15b4f2014-01-20 16:48:49 +053056 return { filters: { selling: 1 } };
Anand Doshi720a01a2013-07-26 11:32:02 +053057 });
Anand Doshi720a01a2013-07-26 11:32:02 +053058 }
Anand Doshibd67e872014-04-11 16:51:27 +053059
Anand Doshi99100a42013-07-04 17:13:53 +053060 if(!this.fname) {
61 return;
62 }
Anand Doshibd67e872014-04-11 16:51:27 +053063
Anand Doshi99100a42013-07-04 17:13:53 +053064 if(this.frm.fields_dict[this.fname].grid.get_field('item_code')) {
65 this.frm.set_query("item_code", this.fname, function() {
Anand Doshi9b496142013-07-11 19:13:58 +053066 return {
Rushabh Mehta6de403f2013-12-13 14:10:14 +053067 query: "erpnext.controllers.queries.item_query",
Anand Doshi9b496142013-07-11 19:13:58 +053068 filters: (me.frm.doc.order_type === "Maintenance" ?
69 {'is_service_item': 'Yes'}:
70 {'is_sales_item': 'Yes' })
71 }
Anand Doshi99100a42013-07-04 17:13:53 +053072 });
73 }
Anand Doshibd67e872014-04-11 16:51:27 +053074
Anand Doshi99100a42013-07-04 17:13:53 +053075 if(this.frm.fields_dict[this.fname].grid.get_field('batch_no')) {
76 this.frm.set_query("batch_no", this.fname, function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +053077 var item = frappe.get_doc(cdt, cdn);
Anand Doshi99100a42013-07-04 17:13:53 +053078 if(!item.item_code) {
Pratik Vyasb52618c2014-04-14 16:25:30 +053079 frappe.throw(__("Please enter Item Code to get batch no"));
Anand Doshi99100a42013-07-04 17:13:53 +053080 } else {
Nabin Haitd1fd1e22013-10-18 12:29:11 +053081 filters = {
82 'item_code': item.item_code,
83 'posting_date': me.frm.doc.posting_date,
84 }
85 if(item.warehouse) filters["warehouse"] = item.warehouse
Anand Doshibd67e872014-04-11 16:51:27 +053086
Nabin Haitd1fd1e22013-10-18 12:29:11 +053087 return {
Akhilesh Darjee4f721562014-01-29 16:31:38 +053088 query : "erpnext.controllers.queries.get_batch_no",
Nabin Haitd1fd1e22013-10-18 12:29:11 +053089 filters: filters
Anand Doshi99100a42013-07-04 17:13:53 +053090 }
91 }
92 });
93 }
Anand Doshibd67e872014-04-11 16:51:27 +053094
Anand Doshied698922013-07-23 15:16:50 +053095 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 +053096 this.frm.set_query("sales_person", "sales_team", erpnext.queries.not_a_group_filter);
Anand Doshied698922013-07-23 15:16:50 +053097 }
Anand Doshi1dde46a2013-05-15 21:15:57 +053098 },
Anand Doshibd67e872014-04-11 16:51:27 +053099
Anand Doshic4a54fe2013-08-01 18:19:51 +0530100 refresh: function() {
101 this._super();
Anand Doshibd67e872014-04-11 16:51:27 +0530102 this.frm.toggle_display("customer_name",
Akhilesh Darjee5ce1b8b2013-12-09 16:29:04 +0530103 (this.frm.doc.customer_name && this.frm.doc.customer_name!==this.frm.doc.customer));
Anand Doshic4a54fe2013-08-01 18:19:51 +0530104 if(this.frm.fields_dict.packing_details) {
Rushabh Mehtaaa355af2014-03-26 18:24:30 +0530105 var packing_list_exists = (this.frm.doc.packing_details || []).length;
Anand Doshic4a54fe2013-08-01 18:19:51 +0530106 this.frm.toggle_display("packing_list", packing_list_exists ? true : false);
107 }
Rushabh Mehta8aded132013-07-04 12:50:52 +0530108 },
Anand Doshibd67e872014-04-11 16:51:27 +0530109
Anand Doshi3543f302013-05-24 19:25:01 +0530110 customer: function() {
Nabin Haita3dd72a2014-05-28 12:49:20 +0530111 var me = this;
112 erpnext.utils.get_party_details(this.frm, null, null, function(){me.apply_pricing_rule()});
Anand Doshi3543f302013-05-24 19:25:01 +0530113 },
Anand Doshibd67e872014-04-11 16:51:27 +0530114
Nabin Haita279d782013-07-15 13:04:33 +0530115 customer_address: function() {
Rushabh Mehtab09d9da2014-01-02 11:47:23 +0530116 erpnext.utils.get_address_display(this.frm, "customer_address");
Nabin Haita279d782013-07-15 13:04:33 +0530117 },
Anand Doshibd67e872014-04-11 16:51:27 +0530118
Nabin Hait9d1f0772014-02-19 17:43:24 +0530119 shipping_address_name: function() {
120 erpnext.utils.get_address_display(this.frm, "shipping_address_name", "shipping_address");
121 },
Anand Doshibd67e872014-04-11 16:51:27 +0530122
Nabin Haita279d782013-07-15 13:04:33 +0530123 contact_person: function() {
Rushabh Mehtab09d9da2014-01-02 11:47:23 +0530124 erpnext.utils.get_contact_details(this.frm);
Nabin Haita279d782013-07-15 13:04:33 +0530125 },
Anand Doshibd67e872014-04-11 16:51:27 +0530126
Nabin Haita3dd72a2014-05-28 12:49:20 +0530127 sales_partner: function() {
128 this.apply_pricing_rule();
129 },
130
131 campaign: function() {
132 this.apply_pricing_rule();
133 },
134
Anand Doshif3096132013-05-21 19:35:06 +0530135 barcode: function(doc, cdt, cdn) {
136 this.item_code(doc, cdt, cdn);
Anand Doshi1dde46a2013-05-15 21:15:57 +0530137 },
Anand Doshibd67e872014-04-11 16:51:27 +0530138
Rushabh Mehta4a404e92013-08-09 18:11:35 +0530139 selling_price_list: function() {
140 this.get_price_list_currency("Selling");
Anand Doshif3096132013-05-21 19:35:06 +0530141 },
Anand Doshibd67e872014-04-11 16:51:27 +0530142
Nabin Haita7f757a2014-02-10 17:54:04 +0530143 price_list_rate: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530144 var item = frappe.get_doc(cdt, cdn);
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530145 frappe.model.round_floats_in(item, ["price_list_rate", "discount_percentage"]);
Anand Doshibd67e872014-04-11 16:51:27 +0530146
Nabin Hait7979f7e2014-02-10 18:26:49 +0530147 item.rate = flt(item.price_list_rate * (1 - item.discount_percentage / 100.0),
148 precision("rate", item));
Anand Doshibd67e872014-04-11 16:51:27 +0530149
Anand Doshif3096132013-05-21 19:35:06 +0530150 this.calculate_taxes_and_totals();
151 },
Anand Doshibd67e872014-04-11 16:51:27 +0530152
Nabin Haita7f757a2014-02-10 17:54:04 +0530153 discount_percentage: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530154 var item = frappe.get_doc(cdt, cdn);
Nabin Haita7f757a2014-02-10 17:54:04 +0530155 if(!item.price_list_rate) {
156 item.discount_percentage = 0.0;
Anand Doshi923d41d2013-05-28 17:23:36 +0530157 } else {
Nabin Haita7f757a2014-02-10 17:54:04 +0530158 this.price_list_rate(doc, cdt, cdn);
Anand Doshi923d41d2013-05-28 17:23:36 +0530159 }
Anand Doshif3096132013-05-21 19:35:06 +0530160 },
Anand Doshibd67e872014-04-11 16:51:27 +0530161
Nabin Hait7979f7e2014-02-10 18:26:49 +0530162 rate: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530163 var item = frappe.get_doc(cdt, cdn);
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530164 frappe.model.round_floats_in(item, ["rate", "price_list_rate"]);
Anand Doshibd67e872014-04-11 16:51:27 +0530165
Nabin Haita7f757a2014-02-10 17:54:04 +0530166 if(item.price_list_rate) {
Nabin Hait7979f7e2014-02-10 18:26:49 +0530167 item.discount_percentage = flt((1 - item.rate / item.price_list_rate) * 100.0,
Nabin Haita7f757a2014-02-10 17:54:04 +0530168 precision("discount_percentage", item));
Anand Doshif3096132013-05-21 19:35:06 +0530169 } else {
Nabin Haita7f757a2014-02-10 17:54:04 +0530170 item.discount_percentage = 0.0;
Anand Doshif3096132013-05-21 19:35:06 +0530171 }
Anand Doshibd67e872014-04-11 16:51:27 +0530172
Anand Doshif3096132013-05-21 19:35:06 +0530173 this.calculate_taxes_and_totals();
174 },
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530175
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530176 discount_amount: function() {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530177 this.calculate_taxes_and_totals();
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530178 },
Anand Doshibd67e872014-04-11 16:51:27 +0530179
Anand Doshif3096132013-05-21 19:35:06 +0530180 commission_rate: function() {
181 this.calculate_commission();
182 refresh_field("total_commission");
183 },
Anand Doshibd67e872014-04-11 16:51:27 +0530184
Anand Doshif3096132013-05-21 19:35:06 +0530185 total_commission: function() {
186 if(this.frm.doc.net_total) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530187 frappe.model.round_floats_in(this.frm.doc, ["net_total", "total_commission"]);
Anand Doshibd67e872014-04-11 16:51:27 +0530188
Anand Doshif3096132013-05-21 19:35:06 +0530189 if(this.frm.doc.net_total < this.frm.doc.total_commission) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530190 var msg = (__("[Error]") + " " +
191 __(frappe.meta.get_label(this.frm.doc.doctype, "total_commission",
Anand Doshibd67e872014-04-11 16:51:27 +0530192 this.frm.doc.name)) + " > " +
Pratik Vyasb52618c2014-04-14 16:25:30 +0530193 __(frappe.meta.get_label(this.frm.doc.doctype, "net_total", this.frm.doc.name)));
Anand Doshif3096132013-05-21 19:35:06 +0530194 msgprint(msg);
195 throw msg;
196 }
Anand Doshibd67e872014-04-11 16:51:27 +0530197
198 this.frm.set_value("commission_rate",
Anand Doshif3096132013-05-21 19:35:06 +0530199 flt(this.frm.doc.total_commission * 100.0 / this.frm.doc.net_total));
200 }
201 },
Anand Doshibd67e872014-04-11 16:51:27 +0530202
Anand Doshif3096132013-05-21 19:35:06 +0530203 allocated_percentage: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530204 var sales_person = frappe.get_doc(cdt, cdn);
Anand Doshibd67e872014-04-11 16:51:27 +0530205
Anand Doshif3096132013-05-21 19:35:06 +0530206 if(sales_person.allocated_percentage) {
207 sales_person.allocated_percentage = flt(sales_person.allocated_percentage,
208 precision("allocated_percentage", sales_person));
209 sales_person.allocated_amount = flt(this.frm.doc.net_total *
Anand Doshibd67e872014-04-11 16:51:27 +0530210 sales_person.allocated_percentage / 100.0,
Anand Doshif3096132013-05-21 19:35:06 +0530211 precision("allocated_amount", sales_person));
212
213 refresh_field(["allocated_percentage", "allocated_amount"], sales_person.name,
214 sales_person.parentfield);
215 }
216 },
Anand Doshibd67e872014-04-11 16:51:27 +0530217
Anand Doshifc777182013-05-27 19:29:07 +0530218 warehouse: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530219 var item = frappe.get_doc(cdt, cdn);
Anand Doshi1dc95ed2013-07-23 13:36:38 +0530220 if(item.item_code && item.warehouse) {
Anand Doshi1fac2a92013-07-29 19:30:39 +0530221 return this.frm.call({
Nabin Hait0984f222014-05-30 19:10:12 +0530222 method: "erpnext.stock.get_item_details.get_available_qty",
Anand Doshifc777182013-05-27 19:29:07 +0530223 child: item,
224 args: {
225 item_code: item.item_code,
Anand Doshi1dc95ed2013-07-23 13:36:38 +0530226 warehouse: item.warehouse,
Anand Doshifc777182013-05-27 19:29:07 +0530227 },
228 });
229 }
230 },
Anand Doshibd67e872014-04-11 16:51:27 +0530231
Anand Doshif3096132013-05-21 19:35:06 +0530232 toggle_rounded_total: function() {
233 var me = this;
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530234 if(cint(frappe.defaults.get_global_default("disable_rounded_total"))) {
Anand Doshif3096132013-05-21 19:35:06 +0530235 $.each(["rounded_total", "rounded_total_export"], function(i, fieldname) {
236 me.frm.set_df_property(fieldname, "print_hide", 1);
237 me.frm.toggle_display(fieldname, false);
238 });
239 }
240 },
Anand Doshibd67e872014-04-11 16:51:27 +0530241
Anand Doshi33fe8672013-08-02 12:39:10 +0530242 toggle_editable_price_list_rate: function() {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530243 var df = frappe.meta.get_docfield(this.tname, "price_list_rate", this.frm.doc.name);
244 var editable_price_list_rate = cint(frappe.defaults.get_default("editable_price_list_rate"));
Anand Doshibd67e872014-04-11 16:51:27 +0530245
Anand Doshi33fe8672013-08-02 12:39:10 +0530246 if(df && editable_price_list_rate) {
247 df.read_only = 0;
248 }
249 },
Anand Doshibd67e872014-04-11 16:51:27 +0530250
Anand Doshi652bc072014-04-16 15:21:46 +0530251 calculate_taxes_and_totals: function(update_paid_amount) {
Anand Doshi3543f302013-05-24 19:25:01 +0530252 this._super();
Anand Doshi652bc072014-04-16 15:21:46 +0530253 this.calculate_total_advance("Sales Invoice", "advance_adjustment_details", update_paid_amount);
Anand Doshif3096132013-05-21 19:35:06 +0530254 this.calculate_commission();
255 this.calculate_contribution();
Anand Doshi923d41d2013-05-28 17:23:36 +0530256
257 // TODO check for custom_recalc in custom scripts of server
Anand Doshibd67e872014-04-11 16:51:27 +0530258
Anand Doshi2168e392013-05-23 19:25:08 +0530259 this.frm.refresh_fields();
Anand Doshif3096132013-05-21 19:35:06 +0530260 },
Anand Doshibd67e872014-04-11 16:51:27 +0530261
Anand Doshif3096132013-05-21 19:35:06 +0530262 calculate_item_values: function() {
263 var me = this;
Anand Doshibd67e872014-04-11 16:51:27 +0530264
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530265 if (!this.discount_amount_applied) {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530266 $.each(this.frm.item_doclist, function(i, item) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530267 frappe.model.round_floats_in(item);
Nabin Hait1eb56012014-02-10 19:20:15 +0530268 item.amount = flt(item.rate * item.qty, precision("amount", item));
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530269
Nabin Haita7f757a2014-02-10 17:54:04 +0530270 me._set_in_company_currency(item, "price_list_rate", "base_price_list_rate");
Nabin Hait7979f7e2014-02-10 18:26:49 +0530271 me._set_in_company_currency(item, "rate", "base_rate");
Nabin Hait1eb56012014-02-10 19:20:15 +0530272 me._set_in_company_currency(item, "amount", "base_amount");
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530273 });
274 }
Anand Doshif3096132013-05-21 19:35:06 +0530275 },
Anand Doshibd67e872014-04-11 16:51:27 +0530276
Anand Doshif3096132013-05-21 19:35:06 +0530277 determine_exclusive_rate: function() {
278 var me = this;
279 $.each(me.frm.item_doclist, function(n, item) {
280 var item_tax_map = me._load_item_tax_rate(item.item_tax_rate);
281 var cumulated_tax_fraction = 0.0;
Anand Doshibd67e872014-04-11 16:51:27 +0530282
Anand Doshif3096132013-05-21 19:35:06 +0530283 $.each(me.frm.tax_doclist, function(i, tax) {
284 tax.tax_fraction_for_current_item = me.get_current_tax_fraction(tax, item_tax_map);
Anand Doshibd67e872014-04-11 16:51:27 +0530285
Anand Doshif3096132013-05-21 19:35:06 +0530286 if(i==0) {
Anand Doshi2168e392013-05-23 19:25:08 +0530287 tax.grand_total_fraction_for_current_item = 1 + tax.tax_fraction_for_current_item;
Anand Doshif3096132013-05-21 19:35:06 +0530288 } else {
Anand Doshibd67e872014-04-11 16:51:27 +0530289 tax.grand_total_fraction_for_current_item =
Anand Doshi2168e392013-05-23 19:25:08 +0530290 me.frm.tax_doclist[i-1].grand_total_fraction_for_current_item +
Anand Doshif3096132013-05-21 19:35:06 +0530291 tax.tax_fraction_for_current_item;
292 }
Anand Doshibd67e872014-04-11 16:51:27 +0530293
Anand Doshif3096132013-05-21 19:35:06 +0530294 cumulated_tax_fraction += tax.tax_fraction_for_current_item;
295 });
Anand Doshibd67e872014-04-11 16:51:27 +0530296
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530297 if(cumulated_tax_fraction && !me.discount_amount_applied) {
Nabin Hait1eb56012014-02-10 19:20:15 +0530298 item.base_amount = flt(
299 (item.amount * me.frm.doc.conversion_rate) / (1 + cumulated_tax_fraction),
300 precision("base_amount", item));
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530301
Nabin Hait1eb56012014-02-10 19:20:15 +0530302 item.base_rate = flt(item.base_amount / item.qty, precision("base_rate", item));
Anand Doshibd67e872014-04-11 16:51:27 +0530303
Nabin Haita7f757a2014-02-10 17:54:04 +0530304 if(item.discount_percentage == 100) {
Nabin Hait7979f7e2014-02-10 18:26:49 +0530305 item.base_price_list_rate = item.base_rate;
306 item.base_rate = 0.0;
Anand Doshif3096132013-05-21 19:35:06 +0530307 } else {
Nabin Hait7979f7e2014-02-10 18:26:49 +0530308 item.base_price_list_rate = flt(item.base_rate / (1 - item.discount_percentage / 100.0),
Nabin Haita7f757a2014-02-10 17:54:04 +0530309 precision("base_price_list_rate", item));
Anand Doshif3096132013-05-21 19:35:06 +0530310 }
311 }
312 });
313 },
Anand Doshibd67e872014-04-11 16:51:27 +0530314
Anand Doshif3096132013-05-21 19:35:06 +0530315 get_current_tax_fraction: function(tax, item_tax_map) {
316 // Get tax fraction for calculating tax exclusive amount
317 // from tax inclusive amount
318 var current_tax_fraction = 0.0;
Anand Doshibd67e872014-04-11 16:51:27 +0530319
Anand Doshif3096132013-05-21 19:35:06 +0530320 if(cint(tax.included_in_print_rate)) {
Anand Doshi2168e392013-05-23 19:25:08 +0530321 var tax_rate = this._get_tax_rate(tax, item_tax_map);
Anand Doshibd67e872014-04-11 16:51:27 +0530322
Anand Doshif3096132013-05-21 19:35:06 +0530323 if(tax.charge_type == "On Net Total") {
324 current_tax_fraction = (tax_rate / 100.0);
Anand Doshibd67e872014-04-11 16:51:27 +0530325
Anand Doshif3096132013-05-21 19:35:06 +0530326 } else if(tax.charge_type == "On Previous Row Amount") {
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].tax_fraction_for_current_item;
Anand Doshibd67e872014-04-11 16:51:27 +0530329
Anand Doshif3096132013-05-21 19:35:06 +0530330 } else if(tax.charge_type == "On Previous Row Total") {
331 current_tax_fraction = (tax_rate / 100.0) *
Anand Doshi2168e392013-05-23 19:25:08 +0530332 this.frm.tax_doclist[cint(tax.row_id) - 1].grand_total_fraction_for_current_item;
Anand Doshif3096132013-05-21 19:35:06 +0530333 }
334 }
Anand Doshibd67e872014-04-11 16:51:27 +0530335
Anand Doshif3096132013-05-21 19:35:06 +0530336 return current_tax_fraction;
337 },
Anand Doshibd67e872014-04-11 16:51:27 +0530338
Anand Doshif3096132013-05-21 19:35:06 +0530339 calculate_net_total: function() {
340 var me = this;
Anand Doshif3096132013-05-21 19:35:06 +0530341 this.frm.doc.net_total = this.frm.doc.net_total_export = 0.0;
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530342
Anand Doshif3096132013-05-21 19:35:06 +0530343 $.each(this.frm.item_doclist, function(i, item) {
Nabin Hait1eb56012014-02-10 19:20:15 +0530344 me.frm.doc.net_total += item.base_amount;
345 me.frm.doc.net_total_export += item.amount;
Anand Doshif3096132013-05-21 19:35:06 +0530346 });
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530347
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530348 frappe.model.round_floats_in(this.frm.doc, ["net_total", "net_total_export"]);
Anand Doshif3096132013-05-21 19:35:06 +0530349 },
Anand Doshibd67e872014-04-11 16:51:27 +0530350
Anand Doshif3096132013-05-21 19:35:06 +0530351 calculate_totals: function() {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530352 var me = this;
Anand Doshif3096132013-05-21 19:35:06 +0530353 var tax_count = this.frm.tax_doclist.length;
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530354
Anand Doshif3096132013-05-21 19:35:06 +0530355 this.frm.doc.grand_total = flt(
356 tax_count ? this.frm.tax_doclist[tax_count - 1].total : this.frm.doc.net_total,
357 precision("grand_total"));
358 this.frm.doc.grand_total_export = flt(this.frm.doc.grand_total / this.frm.doc.conversion_rate,
359 precision("grand_total_export"));
Anand Doshibd67e872014-04-11 16:51:27 +0530360
Anand Doshif3096132013-05-21 19:35:06 +0530361 this.frm.doc.other_charges_total = flt(this.frm.doc.grand_total - this.frm.doc.net_total,
362 precision("other_charges_total"));
Anand Doshibd67e872014-04-11 16:51:27 +0530363 this.frm.doc.other_charges_total_export = flt(this.frm.doc.grand_total_export -
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530364 this.frm.doc.net_total_export + flt(this.frm.doc.discount_amount),
Anand Doshif3096132013-05-21 19:35:06 +0530365 precision("other_charges_total_export"));
Anand Doshibd67e872014-04-11 16:51:27 +0530366
Anand Doshif3096132013-05-21 19:35:06 +0530367 this.frm.doc.rounded_total = Math.round(this.frm.doc.grand_total);
368 this.frm.doc.rounded_total_export = Math.round(this.frm.doc.grand_total_export);
369 },
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530370
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530371 apply_discount_amount: function() {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530372 var me = this;
373 var distributed_amount = 0.0;
374
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530375 if (this.frm.doc.discount_amount) {
376 var grand_total_for_discount_amount = this.get_grand_total_for_discount_amount();
377 // calculate item amount after Discount Amount
378 if (grand_total_for_discount_amount) {
379 $.each(this.frm.item_doclist, function(i, item) {
Nabin Hait1eb56012014-02-10 19:20:15 +0530380 distributed_amount = flt(me.frm.doc.discount_amount) * item.base_amount / grand_total_for_discount_amount;
381 item.base_amount = flt(item.base_amount - distributed_amount, precision("base_amount", item));
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530382 });
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530383
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530384 this.discount_amount_applied = true;
385 this._calculate_taxes_and_totals();
386 }
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530387 }
388 },
389
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530390 get_grand_total_for_discount_amount: function() {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530391 var me = this;
392 var total_actual_tax = 0.0;
393 var actual_taxes_dict = {};
394
395 $.each(this.frm.tax_doclist, function(i, tax) {
396 if (tax.charge_type == "Actual")
397 actual_taxes_dict[tax.idx] = tax.tax_amount;
398 else if (actual_taxes_dict[tax.row_id] !== null) {
399 actual_tax_amount = flt(actual_taxes_dict[tax.row_id]) * flt(tax.rate) / 100;
400 actual_taxes_dict[tax.idx] = actual_tax_amount;
401 }
402 });
403
404 $.each(actual_taxes_dict, function(key, value) {
405 if (value)
406 total_actual_tax += value;
407 });
408
Anand Doshibd67e872014-04-11 16:51:27 +0530409 grand_total_for_discount_amount = flt(this.frm.doc.grand_total - total_actual_tax,
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530410 precision("grand_total"));
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530411 return grand_total_for_discount_amount;
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530412 },
Anand Doshibd67e872014-04-11 16:51:27 +0530413
Anand Doshi652bc072014-04-16 15:21:46 +0530414 calculate_outstanding_amount: function(update_paid_amount) {
Anand Doshibd67e872014-04-11 16:51:27 +0530415 // NOTE:
Akhilesh Darjee38e8f982013-09-05 12:59:33 +0530416 // paid_amount and write_off_amount is only for POS Invoice
Anand Doshi923d41d2013-05-28 17:23:36 +0530417 // total_advance is only for non POS Invoice
Anand Doshi29ea5d02013-07-05 17:23:14 +0530418 if(this.frm.doc.doctype == "Sales Invoice" && this.frm.doc.docstatus==0) {
Nabin Hait54106802014-03-13 17:26:41 +0530419 frappe.model.round_floats_in(this.frm.doc, ["grand_total", "total_advance", "write_off_amount",
420 "paid_amount"]);
Anand Doshibd67e872014-04-11 16:51:27 +0530421 var total_amount_to_pay = this.frm.doc.grand_total - this.frm.doc.write_off_amount
Nabin Hait54106802014-03-13 17:26:41 +0530422 - this.frm.doc.total_advance;
Nabin Hait0c9d4222014-03-25 19:35:41 +0530423 if(this.frm.doc.is_pos) {
Anand Doshi652bc072014-04-16 15:21:46 +0530424 if(!this.frm.doc.paid_amount || update_paid_amount===undefined || update_paid_amount) {
425 this.frm.doc.paid_amount = flt(total_amount_to_pay);
426 }
Nabin Hait0c9d4222014-03-25 19:35:41 +0530427 } else {
428 this.frm.doc.paid_amount = 0
429 }
Nabin Hait482ffac2014-03-13 16:32:43 +0530430
Anand Doshibd67e872014-04-11 16:51:27 +0530431 this.frm.set_value("outstanding_amount", flt(total_amount_to_pay
Nabin Hait54106802014-03-13 17:26:41 +0530432 - this.frm.doc.paid_amount, precision("outstanding_amount")));
Anand Doshifc777182013-05-27 19:29:07 +0530433 }
434 },
Anand Doshibd67e872014-04-11 16:51:27 +0530435
Anand Doshif3096132013-05-21 19:35:06 +0530436 calculate_commission: function() {
Anand Doshi923d41d2013-05-28 17:23:36 +0530437 if(this.frm.fields_dict.commission_rate) {
438 if(this.frm.doc.commission_rate > 100) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530439 var msg = __(frappe.meta.get_label(this.frm.doc.doctype, "commission_rate", this.frm.doc.name)) +
440 " " + __("cannot be greater than 100");
Anand Doshi923d41d2013-05-28 17:23:36 +0530441 msgprint(msg);
442 throw msg;
443 }
Anand Doshibd67e872014-04-11 16:51:27 +0530444
Anand Doshi923d41d2013-05-28 17:23:36 +0530445 this.frm.doc.total_commission = flt(this.frm.doc.net_total * this.frm.doc.commission_rate / 100.0,
446 precision("total_commission"));
447 }
Anand Doshif3096132013-05-21 19:35:06 +0530448 },
Anand Doshibd67e872014-04-11 16:51:27 +0530449
Anand Doshif3096132013-05-21 19:35:06 +0530450 calculate_contribution: function() {
Anand Doshi2168e392013-05-23 19:25:08 +0530451 var me = this;
Rushabh Mehtaaa355af2014-03-26 18:24:30 +0530452 $.each(this.frm.doc.doctype.sales_team || [], function(i, sales_person) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530453 frappe.model.round_floats_in(sales_person);
Anand Doshif3096132013-05-21 19:35:06 +0530454 if(sales_person.allocated_percentage) {
455 sales_person.allocated_amount = flt(
456 me.frm.doc.net_total * sales_person.allocated_percentage / 100.0,
457 precision("allocated_amount", sales_person));
458 }
459 });
460 },
Anand Doshibd67e872014-04-11 16:51:27 +0530461
Anand Doshif3096132013-05-21 19:35:06 +0530462 _cleanup: function() {
Anand Doshi3543f302013-05-24 19:25:01 +0530463 this._super();
464 this.frm.doc.in_words = this.frm.doc.in_words_export = "";
Anand Doshif3096132013-05-21 19:35:06 +0530465 },
Anand Doshi2168e392013-05-23 19:25:08 +0530466
Anand Doshicefccb92013-07-15 18:28:14 +0530467 shipping_rule: function() {
468 var me = this;
469 if(this.frm.doc.shipping_rule) {
Anand Doshi1fac2a92013-07-29 19:30:39 +0530470 return this.frm.call({
Anand Doshicefccb92013-07-15 18:28:14 +0530471 doc: this.frm.doc,
472 method: "apply_shipping_rule",
473 callback: function(r) {
474 if(!r.exc) {
475 me.calculate_taxes_and_totals();
476 }
477 }
478 })
479 }
480 },
Anand Doshibd67e872014-04-11 16:51:27 +0530481
Anand Doshi2168e392013-05-23 19:25:08 +0530482 set_dynamic_labels: function() {
Anand Doshi61a2f682013-06-21 17:55:31 +0530483 this._super();
Anand Doshi9d049242013-06-05 20:46:56 +0530484 set_sales_bom_help(this.frm.doc);
Anand Doshi2168e392013-05-23 19:25:08 +0530485 },
Anand Doshibd67e872014-04-11 16:51:27 +0530486
Anand Doshi2168e392013-05-23 19:25:08 +0530487 change_form_labels: function(company_currency) {
488 var me = this;
489 var field_label_map = {};
Anand Doshibd67e872014-04-11 16:51:27 +0530490
Anand Doshi2168e392013-05-23 19:25:08 +0530491 var setup_field_label_map = function(fields_list, currency) {
492 $.each(fields_list, function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530493 var docfield = frappe.meta.docfield_map[me.frm.doc.doctype][fname];
Anand Doshi2168e392013-05-23 19:25:08 +0530494 if(docfield) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530495 var label = __(docfield.label || "").replace(/\([^\)]*\)/g, "");
Anand Doshi2168e392013-05-23 19:25:08 +0530496 field_label_map[fname] = label.trim() + " (" + currency + ")";
497 }
498 });
499 };
Anand Doshibd67e872014-04-11 16:51:27 +0530500 setup_field_label_map(["net_total", "other_charges_total", "grand_total",
Anand Doshi2168e392013-05-23 19:25:08 +0530501 "rounded_total", "in_words",
502 "outstanding_amount", "total_advance", "paid_amount", "write_off_amount"],
503 company_currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530504
505 setup_field_label_map(["net_total_export", "other_charges_total_export", "grand_total_export",
Anand Doshi2168e392013-05-23 19:25:08 +0530506 "rounded_total_export", "in_words_export"], this.frm.doc.currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530507
508 cur_frm.set_df_property("conversion_rate", "description", "1 " + this.frm.doc.currency
Rushabh Mehtaef584552013-11-02 14:47:11 +0530509 + " = [?] " + company_currency)
Anand Doshibd67e872014-04-11 16:51:27 +0530510
Anand Doshi2168e392013-05-23 19:25:08 +0530511 if(this.frm.doc.price_list_currency && this.frm.doc.price_list_currency!=company_currency) {
Anand Doshibd67e872014-04-11 16:51:27 +0530512 cur_frm.set_df_property("plc_conversion_rate", "description", "1 " + this.frm.doc.price_list_currency
Rushabh Mehtaef584552013-11-02 14:47:11 +0530513 + " = [?] " + company_currency)
Anand Doshi2168e392013-05-23 19:25:08 +0530514 }
Anand Doshibd67e872014-04-11 16:51:27 +0530515
Anand Doshi2168e392013-05-23 19:25:08 +0530516 // toggle fields
Anand Doshibd67e872014-04-11 16:51:27 +0530517 this.frm.toggle_display(["conversion_rate", "net_total", "other_charges_total",
Anand Doshi2168e392013-05-23 19:25:08 +0530518 "grand_total", "rounded_total", "in_words"],
519 this.frm.doc.currency != company_currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530520
521 this.frm.toggle_display(["plc_conversion_rate", "price_list_currency"],
Anand Doshi2168e392013-05-23 19:25:08 +0530522 this.frm.doc.price_list_currency != company_currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530523
Anand Doshi2168e392013-05-23 19:25:08 +0530524 // set labels
525 $.each(field_label_map, function(fname, label) {
526 me.frm.fields_dict[fname].set_label(label);
527 });
528 },
Anand Doshibd67e872014-04-11 16:51:27 +0530529
Anand Doshi2168e392013-05-23 19:25:08 +0530530 change_grid_labels: function(company_currency) {
531 var me = this;
532 var field_label_map = {};
Anand Doshibd67e872014-04-11 16:51:27 +0530533
Anand Doshi2168e392013-05-23 19:25:08 +0530534 var setup_field_label_map = function(fields_list, currency, parentfield) {
535 var grid_doctype = me.frm.fields_dict[parentfield].grid.doctype;
536 $.each(fields_list, function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530537 var docfield = frappe.meta.docfield_map[grid_doctype][fname];
Anand Doshi2168e392013-05-23 19:25:08 +0530538 if(docfield) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530539 var label = __(docfield.label || "").replace(/\([^\)]*\)/g, "");
Anand Doshibd67e872014-04-11 16:51:27 +0530540 field_label_map[grid_doctype + "-" + fname] =
Anand Doshi2168e392013-05-23 19:25:08 +0530541 label.trim() + " (" + currency + ")";
542 }
543 });
544 }
Anand Doshibd67e872014-04-11 16:51:27 +0530545
Nabin Hait1eb56012014-02-10 19:20:15 +0530546 setup_field_label_map(["base_rate", "base_price_list_rate", "base_amount"],
Anand Doshi2168e392013-05-23 19:25:08 +0530547 company_currency, this.fname);
Anand Doshibd67e872014-04-11 16:51:27 +0530548
Nabin Hait1eb56012014-02-10 19:20:15 +0530549 setup_field_label_map(["rate", "price_list_rate", "amount"],
Anand Doshi2168e392013-05-23 19:25:08 +0530550 this.frm.doc.currency, this.fname);
Anand Doshibd67e872014-04-11 16:51:27 +0530551
Anand Doshi2168e392013-05-23 19:25:08 +0530552 setup_field_label_map(["tax_amount", "total"], company_currency, "other_charges");
Anand Doshibd67e872014-04-11 16:51:27 +0530553
Anand Doshi2168e392013-05-23 19:25:08 +0530554 if(this.frm.fields_dict["advance_allocation_details"]) {
555 setup_field_label_map(["advance_amount", "allocated_amount"], company_currency,
556 "advance_allocation_details");
557 }
Anand Doshibd67e872014-04-11 16:51:27 +0530558
Anand Doshi2168e392013-05-23 19:25:08 +0530559 // toggle columns
560 var item_grid = this.frm.fields_dict[this.fname].grid;
Anand Doshibd67e872014-04-11 16:51:27 +0530561 var show = (this.frm.doc.currency != company_currency) ||
562 ((cur_frm.doc.other_charges || []).filter(
Rushabh Mehtaaa355af2014-03-26 18:24:30 +0530563 function(d) { return d.included_in_print_rate===1}).length);
Anand Doshibd67e872014-04-11 16:51:27 +0530564
Nabin Hait1eb56012014-02-10 19:20:15 +0530565 $.each(["base_rate", "base_price_list_rate", "base_amount"], function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530566 if(frappe.meta.get_docfield(item_grid.doctype, fname))
Anand Doshi2168e392013-05-23 19:25:08 +0530567 item_grid.set_column_disp(fname, show);
568 });
Anand Doshibd67e872014-04-11 16:51:27 +0530569
Anand Doshi2168e392013-05-23 19:25:08 +0530570 // set labels
571 var $wrapper = $(this.frm.wrapper);
572 $.each(field_label_map, function(fname, label) {
Anand Doshi5013dcb2013-08-05 12:16:04 +0530573 fname = fname.split("-");
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530574 var df = frappe.meta.get_docfield(fname[0], fname[1], me.frm.doc.name);
Anand Doshi5013dcb2013-08-05 12:16:04 +0530575 if(df) df.label = label;
Anand Doshi2168e392013-05-23 19:25:08 +0530576 });
577 },
Anand Doshi1dde46a2013-05-15 21:15:57 +0530578});
579
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530580// Help for Sales BOM items
581var set_sales_bom_help = function(doc) {
Rushabh Mehta2eef40b2012-07-16 14:16:57 +0530582 if(!cur_frm.fields_dict.packing_list) return;
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530583 if ((doc.packing_details || []).length) {
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530584 $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(true);
Anand Doshibd67e872014-04-11 16:51:27 +0530585
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530586 if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
Bárbara Perretti4098c262013-09-27 17:05:17 -0300587 help_msg = "<div class='alert alert-warning'>" +
Pratik Vyase1eeb222014-04-15 10:50:36 +0530588 __("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 -0300589 "</div>";
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530590 frappe.meta.get_docfield(doc.doctype, 'sales_bom_help', doc.name).options = help_msg;
Anand Doshibd67e872014-04-11 16:51:27 +0530591 }
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530592 } else {
593 $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(false);
594 if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530595 frappe.meta.get_docfield(doc.doctype, 'sales_bom_help', doc.name).options = '';
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530596 }
597 }
598 refresh_field('sales_bom_help');
599}