blob: a5460fcd270e387cb94743298916ecc3e7e57a27 [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
Rushabh Mehtae10cf022014-09-12 13:09:41 +053016cur_frm.email_field = "contact_email";
17
Anand Doshi3543f302013-05-24 19:25:01 +053018erpnext.selling.SellingController = erpnext.TransactionController.extend({
Anand Doshi9b496142013-07-11 19:13:58 +053019 onload: function() {
20 this._super();
Anand Doshi9b496142013-07-11 19:13:58 +053021 this.setup_queries();
Anand Doshi33fe8672013-08-02 12:39:10 +053022 this.toggle_editable_price_list_rate();
Anand Doshi9b496142013-07-11 19:13:58 +053023 },
Anand Doshibd67e872014-04-11 16:51:27 +053024
Rushabh Mehtab6843f22014-06-04 13:10:41 +053025 onload_post_render: function() {
Rushabh Mehta880b3ef2014-06-06 11:45:11 +053026 cur_frm.get_field(this.fname).grid.set_multiple_add("item_code", "qty");
Rushabh Mehtab6843f22014-06-04 13:10:41 +053027 },
28
Anand Doshi9b496142013-07-11 19:13:58 +053029 setup_queries: function() {
Anand Doshi99100a42013-07-04 17:13:53 +053030 var me = this;
Anand Doshibd67e872014-04-11 16:51:27 +053031
Anand Doshif3096132013-05-21 19:35:06 +053032 this.frm.add_fetch("sales_partner", "commission_rate", "commission_rate");
Anand Doshibd67e872014-04-11 16:51:27 +053033
34 $.each([["customer_address", "customer_filter"],
Anand Doshid5d39ac2013-07-29 13:28:37 +053035 ["shipping_address_name", "customer_filter"],
Anand Doshibd67e872014-04-11 16:51:27 +053036 ["contact_person", "customer_filter"],
37 ["customer", "customer"],
38 ["lead", "lead"]],
Anand Doshid5d39ac2013-07-29 13:28:37 +053039 function(i, opts) {
Anand Doshibd67e872014-04-11 16:51:27 +053040 if(me.frm.fields_dict[opts[0]])
Anand Doshid5d39ac2013-07-29 13:28:37 +053041 me.frm.set_query(opts[0], erpnext.queries[opts[1]]);
42 });
Anand Doshibd67e872014-04-11 16:51:27 +053043
Akhilesh Darjee4f721562014-01-29 16:31:38 +053044 if(this.frm.fields_dict.taxes_and_charges) {
45 this.frm.set_query("taxes_and_charges", function() {
Saurabhf52dc072013-07-10 13:07:49 +053046 return {
47 filters: [
48 ['Sales Taxes and Charges Master', 'company', '=', me.frm.doc.company],
Saurabhf52dc072013-07-10 13:07:49 +053049 ['Sales Taxes and Charges Master', 'docstatus', '!=', 2]
50 ]
51 }
Anand Doshi99100a42013-07-04 17:13:53 +053052 });
53 }
Anand Doshi99100a42013-07-04 17:13:53 +053054
Rushabh Mehta4a404e92013-08-09 18:11:35 +053055 if(this.frm.fields_dict.selling_price_list) {
56 this.frm.set_query("selling_price_list", function() {
Nabin Haitdc15b4f2014-01-20 16:48:49 +053057 return { filters: { selling: 1 } };
Anand Doshi720a01a2013-07-26 11:32:02 +053058 });
Anand Doshi720a01a2013-07-26 11:32:02 +053059 }
Anand Doshibd67e872014-04-11 16:51:27 +053060
Anand Doshi99100a42013-07-04 17:13:53 +053061 if(!this.fname) {
62 return;
63 }
Anand Doshibd67e872014-04-11 16:51:27 +053064
Anand Doshi99100a42013-07-04 17:13:53 +053065 if(this.frm.fields_dict[this.fname].grid.get_field('item_code')) {
66 this.frm.set_query("item_code", this.fname, function() {
Anand Doshi9b496142013-07-11 19:13:58 +053067 return {
Rushabh Mehta6de403f2013-12-13 14:10:14 +053068 query: "erpnext.controllers.queries.item_query",
Anand Doshi9b496142013-07-11 19:13:58 +053069 filters: (me.frm.doc.order_type === "Maintenance" ?
70 {'is_service_item': 'Yes'}:
71 {'is_sales_item': 'Yes' })
72 }
Anand Doshi99100a42013-07-04 17:13:53 +053073 });
74 }
Anand Doshibd67e872014-04-11 16:51:27 +053075
Anand Doshi99100a42013-07-04 17:13:53 +053076 if(this.frm.fields_dict[this.fname].grid.get_field('batch_no')) {
77 this.frm.set_query("batch_no", this.fname, function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +053078 var item = frappe.get_doc(cdt, cdn);
Anand Doshi99100a42013-07-04 17:13:53 +053079 if(!item.item_code) {
Pratik Vyasb52618c2014-04-14 16:25:30 +053080 frappe.throw(__("Please enter Item Code to get batch no"));
Anand Doshi99100a42013-07-04 17:13:53 +053081 } else {
Nabin Haitd1fd1e22013-10-18 12:29:11 +053082 filters = {
83 'item_code': item.item_code,
84 'posting_date': me.frm.doc.posting_date,
85 }
86 if(item.warehouse) filters["warehouse"] = item.warehouse
Anand Doshibd67e872014-04-11 16:51:27 +053087
Nabin Haitd1fd1e22013-10-18 12:29:11 +053088 return {
Akhilesh Darjee4f721562014-01-29 16:31:38 +053089 query : "erpnext.controllers.queries.get_batch_no",
Nabin Haitd1fd1e22013-10-18 12:29:11 +053090 filters: filters
Anand Doshi99100a42013-07-04 17:13:53 +053091 }
92 }
93 });
94 }
Anand Doshibd67e872014-04-11 16:51:27 +053095
Anand Doshied698922013-07-23 15:16:50 +053096 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 +053097 this.frm.set_query("sales_person", "sales_team", erpnext.queries.not_a_group_filter);
Anand Doshied698922013-07-23 15:16:50 +053098 }
Anand Doshi1dde46a2013-05-15 21:15:57 +053099 },
Anand Doshibd67e872014-04-11 16:51:27 +0530100
Anand Doshic4a54fe2013-08-01 18:19:51 +0530101 refresh: function() {
102 this._super();
Anand Doshibd67e872014-04-11 16:51:27 +0530103 this.frm.toggle_display("customer_name",
Akhilesh Darjee5ce1b8b2013-12-09 16:29:04 +0530104 (this.frm.doc.customer_name && this.frm.doc.customer_name!==this.frm.doc.customer));
Anand Doshic4a54fe2013-08-01 18:19:51 +0530105 if(this.frm.fields_dict.packing_details) {
Rushabh Mehtaaa355af2014-03-26 18:24:30 +0530106 var packing_list_exists = (this.frm.doc.packing_details || []).length;
Anand Doshic4a54fe2013-08-01 18:19:51 +0530107 this.frm.toggle_display("packing_list", packing_list_exists ? true : false);
108 }
Rushabh Mehta8aded132013-07-04 12:50:52 +0530109 },
Anand Doshibd67e872014-04-11 16:51:27 +0530110
Anand Doshi3543f302013-05-24 19:25:01 +0530111 customer: function() {
Nabin Haita3dd72a2014-05-28 12:49:20 +0530112 var me = this;
113 erpnext.utils.get_party_details(this.frm, null, null, function(){me.apply_pricing_rule()});
Anand Doshi3543f302013-05-24 19:25:01 +0530114 },
Anand Doshibd67e872014-04-11 16:51:27 +0530115
Nabin Haita279d782013-07-15 13:04:33 +0530116 customer_address: function() {
Rushabh Mehtab09d9da2014-01-02 11:47:23 +0530117 erpnext.utils.get_address_display(this.frm, "customer_address");
Nabin Haita279d782013-07-15 13:04:33 +0530118 },
Anand Doshibd67e872014-04-11 16:51:27 +0530119
Nabin Hait9d1f0772014-02-19 17:43:24 +0530120 shipping_address_name: function() {
121 erpnext.utils.get_address_display(this.frm, "shipping_address_name", "shipping_address");
122 },
Anand Doshibd67e872014-04-11 16:51:27 +0530123
Nabin Haita279d782013-07-15 13:04:33 +0530124 contact_person: function() {
Rushabh Mehtab09d9da2014-01-02 11:47:23 +0530125 erpnext.utils.get_contact_details(this.frm);
Nabin Haita279d782013-07-15 13:04:33 +0530126 },
Anand Doshibd67e872014-04-11 16:51:27 +0530127
Nabin Haita3dd72a2014-05-28 12:49:20 +0530128 sales_partner: function() {
129 this.apply_pricing_rule();
130 },
131
132 campaign: function() {
133 this.apply_pricing_rule();
134 },
135
Anand Doshif3096132013-05-21 19:35:06 +0530136 barcode: function(doc, cdt, cdn) {
137 this.item_code(doc, cdt, cdn);
Anand Doshi1dde46a2013-05-15 21:15:57 +0530138 },
Anand Doshibd67e872014-04-11 16:51:27 +0530139
Rushabh Mehta4a404e92013-08-09 18:11:35 +0530140 selling_price_list: function() {
Anand Doshidffec8f2014-07-01 17:45:15 +0530141 this.apply_price_list();
Anand Doshif3096132013-05-21 19:35:06 +0530142 },
Anand Doshibd67e872014-04-11 16:51:27 +0530143
Nabin Haita7f757a2014-02-10 17:54:04 +0530144 price_list_rate: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530145 var item = frappe.get_doc(cdt, cdn);
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530146 frappe.model.round_floats_in(item, ["price_list_rate", "discount_percentage"]);
Anand Doshibd67e872014-04-11 16:51:27 +0530147
Nabin Hait7979f7e2014-02-10 18:26:49 +0530148 item.rate = flt(item.price_list_rate * (1 - item.discount_percentage / 100.0),
149 precision("rate", item));
Anand Doshibd67e872014-04-11 16:51:27 +0530150
Anand Doshif3096132013-05-21 19:35:06 +0530151 this.calculate_taxes_and_totals();
152 },
Anand Doshibd67e872014-04-11 16:51:27 +0530153
Nabin Haita7f757a2014-02-10 17:54:04 +0530154 discount_percentage: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530155 var item = frappe.get_doc(cdt, cdn);
Nabin Haita7f757a2014-02-10 17:54:04 +0530156 if(!item.price_list_rate) {
157 item.discount_percentage = 0.0;
Anand Doshi923d41d2013-05-28 17:23:36 +0530158 } else {
Nabin Haita7f757a2014-02-10 17:54:04 +0530159 this.price_list_rate(doc, cdt, cdn);
Anand Doshi923d41d2013-05-28 17:23:36 +0530160 }
Anand Doshif3096132013-05-21 19:35:06 +0530161 },
Anand Doshibd67e872014-04-11 16:51:27 +0530162
Nabin Hait7979f7e2014-02-10 18:26:49 +0530163 rate: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530164 var item = frappe.get_doc(cdt, cdn);
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530165 frappe.model.round_floats_in(item, ["rate", "price_list_rate"]);
Anand Doshibd67e872014-04-11 16:51:27 +0530166
Nabin Haita7f757a2014-02-10 17:54:04 +0530167 if(item.price_list_rate) {
Nabin Hait7979f7e2014-02-10 18:26:49 +0530168 item.discount_percentage = flt((1 - item.rate / item.price_list_rate) * 100.0,
Nabin Haita7f757a2014-02-10 17:54:04 +0530169 precision("discount_percentage", item));
Anand Doshif3096132013-05-21 19:35:06 +0530170 } else {
Nabin Haita7f757a2014-02-10 17:54:04 +0530171 item.discount_percentage = 0.0;
Anand Doshif3096132013-05-21 19:35:06 +0530172 }
Anand Doshibd67e872014-04-11 16:51:27 +0530173
Anand Doshif3096132013-05-21 19:35:06 +0530174 this.calculate_taxes_and_totals();
175 },
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530176
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530177 discount_amount: function() {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530178 this.calculate_taxes_and_totals();
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530179 },
Anand Doshibd67e872014-04-11 16:51:27 +0530180
Anand Doshif3096132013-05-21 19:35:06 +0530181 commission_rate: function() {
182 this.calculate_commission();
183 refresh_field("total_commission");
184 },
Anand Doshibd67e872014-04-11 16:51:27 +0530185
Anand Doshif3096132013-05-21 19:35:06 +0530186 total_commission: function() {
187 if(this.frm.doc.net_total) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530188 frappe.model.round_floats_in(this.frm.doc, ["net_total", "total_commission"]);
Anand Doshibd67e872014-04-11 16:51:27 +0530189
Anand Doshif3096132013-05-21 19:35:06 +0530190 if(this.frm.doc.net_total < this.frm.doc.total_commission) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530191 var msg = (__("[Error]") + " " +
192 __(frappe.meta.get_label(this.frm.doc.doctype, "total_commission",
Anand Doshibd67e872014-04-11 16:51:27 +0530193 this.frm.doc.name)) + " > " +
Pratik Vyasb52618c2014-04-14 16:25:30 +0530194 __(frappe.meta.get_label(this.frm.doc.doctype, "net_total", this.frm.doc.name)));
Anand Doshif3096132013-05-21 19:35:06 +0530195 msgprint(msg);
196 throw msg;
197 }
Anand Doshibd67e872014-04-11 16:51:27 +0530198
199 this.frm.set_value("commission_rate",
Anand Doshif3096132013-05-21 19:35:06 +0530200 flt(this.frm.doc.total_commission * 100.0 / this.frm.doc.net_total));
201 }
202 },
Anand Doshibd67e872014-04-11 16:51:27 +0530203
Anand Doshif3096132013-05-21 19:35:06 +0530204 allocated_percentage: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530205 var sales_person = frappe.get_doc(cdt, cdn);
Anand Doshibd67e872014-04-11 16:51:27 +0530206
Anand Doshif3096132013-05-21 19:35:06 +0530207 if(sales_person.allocated_percentage) {
208 sales_person.allocated_percentage = flt(sales_person.allocated_percentage,
209 precision("allocated_percentage", sales_person));
210 sales_person.allocated_amount = flt(this.frm.doc.net_total *
Anand Doshibd67e872014-04-11 16:51:27 +0530211 sales_person.allocated_percentage / 100.0,
Anand Doshif3096132013-05-21 19:35:06 +0530212 precision("allocated_amount", sales_person));
213
214 refresh_field(["allocated_percentage", "allocated_amount"], sales_person.name,
215 sales_person.parentfield);
216 }
217 },
Anand Doshibd67e872014-04-11 16:51:27 +0530218
Anand Doshifc777182013-05-27 19:29:07 +0530219 warehouse: function(doc, cdt, cdn) {
Rushabh Mehta66d52b52014-03-27 14:17:33 +0530220 var item = frappe.get_doc(cdt, cdn);
Anand Doshi1dc95ed2013-07-23 13:36:38 +0530221 if(item.item_code && item.warehouse) {
Anand Doshi1fac2a92013-07-29 19:30:39 +0530222 return this.frm.call({
Nabin Hait0984f222014-05-30 19:10:12 +0530223 method: "erpnext.stock.get_item_details.get_available_qty",
Anand Doshifc777182013-05-27 19:29:07 +0530224 child: item,
225 args: {
226 item_code: item.item_code,
Anand Doshi1dc95ed2013-07-23 13:36:38 +0530227 warehouse: item.warehouse,
Anand Doshifc777182013-05-27 19:29:07 +0530228 },
229 });
230 }
231 },
Anand Doshibd67e872014-04-11 16:51:27 +0530232
Anand Doshi33fe8672013-08-02 12:39:10 +0530233 toggle_editable_price_list_rate: function() {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530234 var df = frappe.meta.get_docfield(this.tname, "price_list_rate", this.frm.doc.name);
235 var editable_price_list_rate = cint(frappe.defaults.get_default("editable_price_list_rate"));
Anand Doshibd67e872014-04-11 16:51:27 +0530236
Anand Doshi33fe8672013-08-02 12:39:10 +0530237 if(df && editable_price_list_rate) {
238 df.read_only = 0;
239 }
240 },
Anand Doshibd67e872014-04-11 16:51:27 +0530241
Anand Doshi652bc072014-04-16 15:21:46 +0530242 calculate_taxes_and_totals: function(update_paid_amount) {
Anand Doshi3543f302013-05-24 19:25:01 +0530243 this._super();
Anand Doshi652bc072014-04-16 15:21:46 +0530244 this.calculate_total_advance("Sales Invoice", "advance_adjustment_details", update_paid_amount);
Anand Doshif3096132013-05-21 19:35:06 +0530245 this.calculate_commission();
246 this.calculate_contribution();
Anand Doshi923d41d2013-05-28 17:23:36 +0530247
248 // TODO check for custom_recalc in custom scripts of server
Anand Doshibd67e872014-04-11 16:51:27 +0530249
Anand Doshi2168e392013-05-23 19:25:08 +0530250 this.frm.refresh_fields();
Anand Doshif3096132013-05-21 19:35:06 +0530251 },
Anand Doshibd67e872014-04-11 16:51:27 +0530252
Anand Doshif3096132013-05-21 19:35:06 +0530253 calculate_item_values: function() {
254 var me = this;
Anand Doshibd67e872014-04-11 16:51:27 +0530255
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530256 if (!this.discount_amount_applied) {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530257 $.each(this.frm.item_doclist, function(i, item) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530258 frappe.model.round_floats_in(item);
Nabin Hait1eb56012014-02-10 19:20:15 +0530259 item.amount = flt(item.rate * item.qty, precision("amount", item));
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530260
Nabin Haita7f757a2014-02-10 17:54:04 +0530261 me._set_in_company_currency(item, "price_list_rate", "base_price_list_rate");
Nabin Hait7979f7e2014-02-10 18:26:49 +0530262 me._set_in_company_currency(item, "rate", "base_rate");
Nabin Hait1eb56012014-02-10 19:20:15 +0530263 me._set_in_company_currency(item, "amount", "base_amount");
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530264 });
265 }
Anand Doshif3096132013-05-21 19:35:06 +0530266 },
Anand Doshibd67e872014-04-11 16:51:27 +0530267
Anand Doshif3096132013-05-21 19:35:06 +0530268 determine_exclusive_rate: function() {
269 var me = this;
270 $.each(me.frm.item_doclist, function(n, item) {
271 var item_tax_map = me._load_item_tax_rate(item.item_tax_rate);
272 var cumulated_tax_fraction = 0.0;
Anand Doshibd67e872014-04-11 16:51:27 +0530273
Anand Doshif3096132013-05-21 19:35:06 +0530274 $.each(me.frm.tax_doclist, function(i, tax) {
275 tax.tax_fraction_for_current_item = me.get_current_tax_fraction(tax, item_tax_map);
Anand Doshibd67e872014-04-11 16:51:27 +0530276
Anand Doshif3096132013-05-21 19:35:06 +0530277 if(i==0) {
Anand Doshi2168e392013-05-23 19:25:08 +0530278 tax.grand_total_fraction_for_current_item = 1 + tax.tax_fraction_for_current_item;
Anand Doshif3096132013-05-21 19:35:06 +0530279 } else {
Anand Doshibd67e872014-04-11 16:51:27 +0530280 tax.grand_total_fraction_for_current_item =
Anand Doshi2168e392013-05-23 19:25:08 +0530281 me.frm.tax_doclist[i-1].grand_total_fraction_for_current_item +
Anand Doshif3096132013-05-21 19:35:06 +0530282 tax.tax_fraction_for_current_item;
283 }
Anand Doshibd67e872014-04-11 16:51:27 +0530284
Anand Doshif3096132013-05-21 19:35:06 +0530285 cumulated_tax_fraction += tax.tax_fraction_for_current_item;
286 });
Anand Doshibd67e872014-04-11 16:51:27 +0530287
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530288 if(cumulated_tax_fraction && !me.discount_amount_applied) {
Nabin Hait1eb56012014-02-10 19:20:15 +0530289 item.base_amount = flt(
290 (item.amount * me.frm.doc.conversion_rate) / (1 + cumulated_tax_fraction),
291 precision("base_amount", item));
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530292
Nabin Hait1eb56012014-02-10 19:20:15 +0530293 item.base_rate = flt(item.base_amount / item.qty, precision("base_rate", item));
Anand Doshibd67e872014-04-11 16:51:27 +0530294
Nabin Haita7f757a2014-02-10 17:54:04 +0530295 if(item.discount_percentage == 100) {
Nabin Hait7979f7e2014-02-10 18:26:49 +0530296 item.base_price_list_rate = item.base_rate;
297 item.base_rate = 0.0;
Anand Doshif3096132013-05-21 19:35:06 +0530298 } else {
Nabin Hait7979f7e2014-02-10 18:26:49 +0530299 item.base_price_list_rate = flt(item.base_rate / (1 - item.discount_percentage / 100.0),
Nabin Haita7f757a2014-02-10 17:54:04 +0530300 precision("base_price_list_rate", item));
Anand Doshif3096132013-05-21 19:35:06 +0530301 }
302 }
303 });
304 },
Anand Doshibd67e872014-04-11 16:51:27 +0530305
Anand Doshif3096132013-05-21 19:35:06 +0530306 get_current_tax_fraction: function(tax, item_tax_map) {
307 // Get tax fraction for calculating tax exclusive amount
308 // from tax inclusive amount
309 var current_tax_fraction = 0.0;
Anand Doshibd67e872014-04-11 16:51:27 +0530310
Anand Doshif3096132013-05-21 19:35:06 +0530311 if(cint(tax.included_in_print_rate)) {
Anand Doshi2168e392013-05-23 19:25:08 +0530312 var tax_rate = this._get_tax_rate(tax, item_tax_map);
Anand Doshibd67e872014-04-11 16:51:27 +0530313
Anand Doshif3096132013-05-21 19:35:06 +0530314 if(tax.charge_type == "On Net Total") {
315 current_tax_fraction = (tax_rate / 100.0);
Anand Doshibd67e872014-04-11 16:51:27 +0530316
Anand Doshif3096132013-05-21 19:35:06 +0530317 } else if(tax.charge_type == "On Previous Row Amount") {
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].tax_fraction_for_current_item;
Anand Doshibd67e872014-04-11 16:51:27 +0530320
Anand Doshif3096132013-05-21 19:35:06 +0530321 } else if(tax.charge_type == "On Previous Row Total") {
322 current_tax_fraction = (tax_rate / 100.0) *
Anand Doshi2168e392013-05-23 19:25:08 +0530323 this.frm.tax_doclist[cint(tax.row_id) - 1].grand_total_fraction_for_current_item;
Anand Doshif3096132013-05-21 19:35:06 +0530324 }
325 }
Anand Doshibd67e872014-04-11 16:51:27 +0530326
Anand Doshif3096132013-05-21 19:35:06 +0530327 return current_tax_fraction;
328 },
Anand Doshibd67e872014-04-11 16:51:27 +0530329
Anand Doshif3096132013-05-21 19:35:06 +0530330 calculate_net_total: function() {
331 var me = this;
Anand Doshif3096132013-05-21 19:35:06 +0530332 this.frm.doc.net_total = this.frm.doc.net_total_export = 0.0;
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530333
Anand Doshif3096132013-05-21 19:35:06 +0530334 $.each(this.frm.item_doclist, function(i, item) {
Nabin Hait1eb56012014-02-10 19:20:15 +0530335 me.frm.doc.net_total += item.base_amount;
336 me.frm.doc.net_total_export += item.amount;
Anand Doshif3096132013-05-21 19:35:06 +0530337 });
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530338
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530339 frappe.model.round_floats_in(this.frm.doc, ["net_total", "net_total_export"]);
Anand Doshif3096132013-05-21 19:35:06 +0530340 },
Anand Doshibd67e872014-04-11 16:51:27 +0530341
Anand Doshif3096132013-05-21 19:35:06 +0530342 calculate_totals: function() {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530343 var me = this;
Anand Doshif3096132013-05-21 19:35:06 +0530344 var tax_count = this.frm.tax_doclist.length;
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530345
Anand Doshif3096132013-05-21 19:35:06 +0530346 this.frm.doc.grand_total = flt(
347 tax_count ? this.frm.tax_doclist[tax_count - 1].total : this.frm.doc.net_total,
348 precision("grand_total"));
349 this.frm.doc.grand_total_export = flt(this.frm.doc.grand_total / this.frm.doc.conversion_rate,
350 precision("grand_total_export"));
Anand Doshibd67e872014-04-11 16:51:27 +0530351
Anand Doshif3096132013-05-21 19:35:06 +0530352 this.frm.doc.other_charges_total = flt(this.frm.doc.grand_total - this.frm.doc.net_total,
353 precision("other_charges_total"));
Anand Doshibd67e872014-04-11 16:51:27 +0530354 this.frm.doc.other_charges_total_export = flt(this.frm.doc.grand_total_export -
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530355 this.frm.doc.net_total_export + flt(this.frm.doc.discount_amount),
Anand Doshif3096132013-05-21 19:35:06 +0530356 precision("other_charges_total_export"));
Anand Doshibd67e872014-04-11 16:51:27 +0530357
Anand Doshif3096132013-05-21 19:35:06 +0530358 this.frm.doc.rounded_total = Math.round(this.frm.doc.grand_total);
359 this.frm.doc.rounded_total_export = Math.round(this.frm.doc.grand_total_export);
360 },
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530361
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530362 apply_discount_amount: function() {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530363 var me = this;
364 var distributed_amount = 0.0;
365
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530366 if (this.frm.doc.discount_amount) {
367 var grand_total_for_discount_amount = this.get_grand_total_for_discount_amount();
368 // calculate item amount after Discount Amount
369 if (grand_total_for_discount_amount) {
370 $.each(this.frm.item_doclist, function(i, item) {
Nabin Hait1eb56012014-02-10 19:20:15 +0530371 distributed_amount = flt(me.frm.doc.discount_amount) * item.base_amount / grand_total_for_discount_amount;
372 item.base_amount = flt(item.base_amount - distributed_amount, precision("base_amount", item));
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530373 });
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530374
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530375 this.discount_amount_applied = true;
376 this._calculate_taxes_and_totals();
377 }
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530378 }
379 },
380
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530381 get_grand_total_for_discount_amount: function() {
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530382 var me = this;
383 var total_actual_tax = 0.0;
384 var actual_taxes_dict = {};
385
386 $.each(this.frm.tax_doclist, function(i, tax) {
387 if (tax.charge_type == "Actual")
388 actual_taxes_dict[tax.idx] = tax.tax_amount;
389 else if (actual_taxes_dict[tax.row_id] !== null) {
390 actual_tax_amount = flt(actual_taxes_dict[tax.row_id]) * flt(tax.rate) / 100;
391 actual_taxes_dict[tax.idx] = actual_tax_amount;
392 }
393 });
394
395 $.each(actual_taxes_dict, function(key, value) {
396 if (value)
397 total_actual_tax += value;
398 });
399
Anand Doshibd67e872014-04-11 16:51:27 +0530400 grand_total_for_discount_amount = flt(this.frm.doc.grand_total - total_actual_tax,
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530401 precision("grand_total"));
Akhilesh Darjee57738a02014-01-03 18:15:07 +0530402 return grand_total_for_discount_amount;
Akhilesh Darjeed203aea2013-12-27 17:49:57 +0530403 },
Anand Doshibd67e872014-04-11 16:51:27 +0530404
Anand Doshi652bc072014-04-16 15:21:46 +0530405 calculate_outstanding_amount: function(update_paid_amount) {
Anand Doshibd67e872014-04-11 16:51:27 +0530406 // NOTE:
Akhilesh Darjee38e8f982013-09-05 12:59:33 +0530407 // paid_amount and write_off_amount is only for POS Invoice
Anand Doshi923d41d2013-05-28 17:23:36 +0530408 // total_advance is only for non POS Invoice
Anand Doshi29ea5d02013-07-05 17:23:14 +0530409 if(this.frm.doc.doctype == "Sales Invoice" && this.frm.doc.docstatus==0) {
Nabin Hait54106802014-03-13 17:26:41 +0530410 frappe.model.round_floats_in(this.frm.doc, ["grand_total", "total_advance", "write_off_amount",
411 "paid_amount"]);
Anand Doshibd67e872014-04-11 16:51:27 +0530412 var total_amount_to_pay = this.frm.doc.grand_total - this.frm.doc.write_off_amount
Nabin Hait54106802014-03-13 17:26:41 +0530413 - this.frm.doc.total_advance;
Nabin Hait0c9d4222014-03-25 19:35:41 +0530414 if(this.frm.doc.is_pos) {
Anand Doshi652bc072014-04-16 15:21:46 +0530415 if(!this.frm.doc.paid_amount || update_paid_amount===undefined || update_paid_amount) {
416 this.frm.doc.paid_amount = flt(total_amount_to_pay);
417 }
Nabin Hait0c9d4222014-03-25 19:35:41 +0530418 } else {
419 this.frm.doc.paid_amount = 0
420 }
Nabin Hait482ffac2014-03-13 16:32:43 +0530421
Anand Doshibd67e872014-04-11 16:51:27 +0530422 this.frm.set_value("outstanding_amount", flt(total_amount_to_pay
Nabin Hait54106802014-03-13 17:26:41 +0530423 - this.frm.doc.paid_amount, precision("outstanding_amount")));
Anand Doshifc777182013-05-27 19:29:07 +0530424 }
425 },
Anand Doshibd67e872014-04-11 16:51:27 +0530426
Anand Doshif3096132013-05-21 19:35:06 +0530427 calculate_commission: function() {
Anand Doshi923d41d2013-05-28 17:23:36 +0530428 if(this.frm.fields_dict.commission_rate) {
429 if(this.frm.doc.commission_rate > 100) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530430 var msg = __(frappe.meta.get_label(this.frm.doc.doctype, "commission_rate", this.frm.doc.name)) +
431 " " + __("cannot be greater than 100");
Anand Doshi923d41d2013-05-28 17:23:36 +0530432 msgprint(msg);
433 throw msg;
434 }
Anand Doshibd67e872014-04-11 16:51:27 +0530435
Anand Doshi923d41d2013-05-28 17:23:36 +0530436 this.frm.doc.total_commission = flt(this.frm.doc.net_total * this.frm.doc.commission_rate / 100.0,
437 precision("total_commission"));
438 }
Anand Doshif3096132013-05-21 19:35:06 +0530439 },
Anand Doshibd67e872014-04-11 16:51:27 +0530440
Anand Doshif3096132013-05-21 19:35:06 +0530441 calculate_contribution: function() {
Anand Doshi2168e392013-05-23 19:25:08 +0530442 var me = this;
Rushabh Mehtaaa355af2014-03-26 18:24:30 +0530443 $.each(this.frm.doc.doctype.sales_team || [], function(i, sales_person) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530444 frappe.model.round_floats_in(sales_person);
Anand Doshif3096132013-05-21 19:35:06 +0530445 if(sales_person.allocated_percentage) {
446 sales_person.allocated_amount = flt(
447 me.frm.doc.net_total * sales_person.allocated_percentage / 100.0,
448 precision("allocated_amount", sales_person));
449 }
450 });
451 },
Anand Doshibd67e872014-04-11 16:51:27 +0530452
Anand Doshif3096132013-05-21 19:35:06 +0530453 _cleanup: function() {
Anand Doshi3543f302013-05-24 19:25:01 +0530454 this._super();
455 this.frm.doc.in_words = this.frm.doc.in_words_export = "";
Anand Doshif3096132013-05-21 19:35:06 +0530456 },
Anand Doshi2168e392013-05-23 19:25:08 +0530457
Anand Doshicefccb92013-07-15 18:28:14 +0530458 shipping_rule: function() {
459 var me = this;
460 if(this.frm.doc.shipping_rule) {
Anand Doshi1fac2a92013-07-29 19:30:39 +0530461 return this.frm.call({
Anand Doshicefccb92013-07-15 18:28:14 +0530462 doc: this.frm.doc,
463 method: "apply_shipping_rule",
464 callback: function(r) {
465 if(!r.exc) {
466 me.calculate_taxes_and_totals();
467 }
468 }
469 })
470 }
471 },
Anand Doshibd67e872014-04-11 16:51:27 +0530472
Anand Doshi2168e392013-05-23 19:25:08 +0530473 set_dynamic_labels: function() {
Anand Doshi61a2f682013-06-21 17:55:31 +0530474 this._super();
Nabin Hait0b157552014-06-24 17:02:45 +0530475 this.set_sales_bom_help(this.frm.doc);
476 },
477
478 set_sales_bom_help: function(doc) {
479 if(!cur_frm.fields_dict.packing_list) return;
480 if ((doc.packing_details || []).length) {
481 $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(true);
482
483 if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
484 help_msg = "<div class='alert alert-warning'>" +
Nabin Hait60c48fe2014-06-24 17:34:52 +0530485 __("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.")+
Nabin Hait0b157552014-06-24 17:02:45 +0530486 "</div>";
487 frappe.meta.get_docfield(doc.doctype, 'sales_bom_help', doc.name).options = help_msg;
488 }
489 } else {
490 $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(false);
491 if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
492 frappe.meta.get_docfield(doc.doctype, 'sales_bom_help', doc.name).options = '';
493 }
494 }
495 refresh_field('sales_bom_help');
Anand Doshi2168e392013-05-23 19:25:08 +0530496 },
Anand Doshibd67e872014-04-11 16:51:27 +0530497
Anand Doshi2168e392013-05-23 19:25:08 +0530498 change_form_labels: function(company_currency) {
499 var me = this;
500 var field_label_map = {};
Anand Doshibd67e872014-04-11 16:51:27 +0530501
Anand Doshi2168e392013-05-23 19:25:08 +0530502 var setup_field_label_map = function(fields_list, currency) {
503 $.each(fields_list, function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530504 var docfield = frappe.meta.docfield_map[me.frm.doc.doctype][fname];
Anand Doshi2168e392013-05-23 19:25:08 +0530505 if(docfield) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530506 var label = __(docfield.label || "").replace(/\([^\)]*\)/g, "");
Anand Doshi2168e392013-05-23 19:25:08 +0530507 field_label_map[fname] = label.trim() + " (" + currency + ")";
508 }
509 });
510 };
Anand Doshibd67e872014-04-11 16:51:27 +0530511 setup_field_label_map(["net_total", "other_charges_total", "grand_total",
Anand Doshi2168e392013-05-23 19:25:08 +0530512 "rounded_total", "in_words",
513 "outstanding_amount", "total_advance", "paid_amount", "write_off_amount"],
514 company_currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530515
516 setup_field_label_map(["net_total_export", "other_charges_total_export", "grand_total_export",
Anand Doshi2168e392013-05-23 19:25:08 +0530517 "rounded_total_export", "in_words_export"], this.frm.doc.currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530518
519 cur_frm.set_df_property("conversion_rate", "description", "1 " + this.frm.doc.currency
Rushabh Mehtaef584552013-11-02 14:47:11 +0530520 + " = [?] " + company_currency)
Anand Doshibd67e872014-04-11 16:51:27 +0530521
Anand Doshi2168e392013-05-23 19:25:08 +0530522 if(this.frm.doc.price_list_currency && this.frm.doc.price_list_currency!=company_currency) {
Anand Doshibd67e872014-04-11 16:51:27 +0530523 cur_frm.set_df_property("plc_conversion_rate", "description", "1 " + this.frm.doc.price_list_currency
Rushabh Mehtaef584552013-11-02 14:47:11 +0530524 + " = [?] " + company_currency)
Anand Doshi2168e392013-05-23 19:25:08 +0530525 }
Anand Doshibd67e872014-04-11 16:51:27 +0530526
Anand Doshi2168e392013-05-23 19:25:08 +0530527 // toggle fields
Anand Doshibd67e872014-04-11 16:51:27 +0530528 this.frm.toggle_display(["conversion_rate", "net_total", "other_charges_total",
Anand Doshi2168e392013-05-23 19:25:08 +0530529 "grand_total", "rounded_total", "in_words"],
530 this.frm.doc.currency != company_currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530531
532 this.frm.toggle_display(["plc_conversion_rate", "price_list_currency"],
Anand Doshi2168e392013-05-23 19:25:08 +0530533 this.frm.doc.price_list_currency != company_currency);
Anand Doshibd67e872014-04-11 16:51:27 +0530534
Anand Doshi2168e392013-05-23 19:25:08 +0530535 // set labels
536 $.each(field_label_map, function(fname, label) {
537 me.frm.fields_dict[fname].set_label(label);
538 });
539 },
Anand Doshibd67e872014-04-11 16:51:27 +0530540
Anand Doshi2168e392013-05-23 19:25:08 +0530541 change_grid_labels: function(company_currency) {
542 var me = this;
543 var field_label_map = {};
Anand Doshibd67e872014-04-11 16:51:27 +0530544
Anand Doshi2168e392013-05-23 19:25:08 +0530545 var setup_field_label_map = function(fields_list, currency, parentfield) {
546 var grid_doctype = me.frm.fields_dict[parentfield].grid.doctype;
547 $.each(fields_list, function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530548 var docfield = frappe.meta.docfield_map[grid_doctype][fname];
Anand Doshi2168e392013-05-23 19:25:08 +0530549 if(docfield) {
Pratik Vyasb52618c2014-04-14 16:25:30 +0530550 var label = __(docfield.label || "").replace(/\([^\)]*\)/g, "");
Anand Doshibd67e872014-04-11 16:51:27 +0530551 field_label_map[grid_doctype + "-" + fname] =
Anand Doshi2168e392013-05-23 19:25:08 +0530552 label.trim() + " (" + currency + ")";
553 }
554 });
555 }
Anand Doshibd67e872014-04-11 16:51:27 +0530556
Nabin Hait1eb56012014-02-10 19:20:15 +0530557 setup_field_label_map(["base_rate", "base_price_list_rate", "base_amount"],
Anand Doshi2168e392013-05-23 19:25:08 +0530558 company_currency, this.fname);
Anand Doshibd67e872014-04-11 16:51:27 +0530559
Nabin Hait1eb56012014-02-10 19:20:15 +0530560 setup_field_label_map(["rate", "price_list_rate", "amount"],
Anand Doshi2168e392013-05-23 19:25:08 +0530561 this.frm.doc.currency, this.fname);
Anand Doshibd67e872014-04-11 16:51:27 +0530562
Anand Doshi2168e392013-05-23 19:25:08 +0530563 setup_field_label_map(["tax_amount", "total"], company_currency, "other_charges");
Anand Doshibd67e872014-04-11 16:51:27 +0530564
Anand Doshi2168e392013-05-23 19:25:08 +0530565 if(this.frm.fields_dict["advance_allocation_details"]) {
566 setup_field_label_map(["advance_amount", "allocated_amount"], company_currency,
567 "advance_allocation_details");
568 }
Anand Doshibd67e872014-04-11 16:51:27 +0530569
Anand Doshi2168e392013-05-23 19:25:08 +0530570 // toggle columns
571 var item_grid = this.frm.fields_dict[this.fname].grid;
Anand Doshibd67e872014-04-11 16:51:27 +0530572 var show = (this.frm.doc.currency != company_currency) ||
573 ((cur_frm.doc.other_charges || []).filter(
Rushabh Mehtaaa355af2014-03-26 18:24:30 +0530574 function(d) { return d.included_in_print_rate===1}).length);
Anand Doshibd67e872014-04-11 16:51:27 +0530575
Nabin Hait1eb56012014-02-10 19:20:15 +0530576 $.each(["base_rate", "base_price_list_rate", "base_amount"], function(i, fname) {
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530577 if(frappe.meta.get_docfield(item_grid.doctype, fname))
Anand Doshi2168e392013-05-23 19:25:08 +0530578 item_grid.set_column_disp(fname, show);
579 });
Anand Doshibd67e872014-04-11 16:51:27 +0530580
Anand Doshi2168e392013-05-23 19:25:08 +0530581 // set labels
582 var $wrapper = $(this.frm.wrapper);
583 $.each(field_label_map, function(fname, label) {
Anand Doshi5013dcb2013-08-05 12:16:04 +0530584 fname = fname.split("-");
Rushabh Mehta793ba6b2014-02-14 15:47:51 +0530585 var df = frappe.meta.get_docfield(fname[0], fname[1], me.frm.doc.name);
Anand Doshi5013dcb2013-08-05 12:16:04 +0530586 if(df) df.label = label;
Anand Doshi2168e392013-05-23 19:25:08 +0530587 });
Nabin Haitcfc6bb12012-07-11 13:14:52 +0530588 }
Nabin Hait0b157552014-06-24 17:02:45 +0530589});
Anand Doshi43f087c2014-08-26 14:25:53 +0530590
591frappe.ui.form.on(cur_frm.doctype,"project_name", function(frm) {
592 frappe.call({
Anand Doshi43f087c2014-08-26 14:25:53 +0530593 method:'erpnext.projects.doctype.project.project.get_cost_center_name' ,
Neil Trini Lasradod6d71e82014-08-27 18:48:57 +0530594 args: { project_name: frm.doc.project_name },
Anand Doshi43f087c2014-08-26 14:25:53 +0530595 callback: function(r, rt) {
Rushabh Mehtae10cf022014-09-12 13:09:41 +0530596 if(!r.exc) {
Neil Trini Lasradod6d71e82014-08-27 18:48:57 +0530597 $.each(frm.doc[cur_frm.cscript.fname] || [], function(i, row) {
Anand Doshi43f087c2014-08-26 14:25:53 +0530598 frappe.model.set_value(row.doctype, row.name, "cost_center", r.message);
Neil Trini Lasradod6d71e82014-08-27 18:48:57 +0530599 msgprint(__("Cost Center For Item with Item Code '"+row.item_name+"' has been Changed to "+ r.message));
Anand Doshi43f087c2014-08-26 14:25:53 +0530600 })
601 }
602 }
603 })
604})