blob: c91bb046a52f14d90351ef4ddedf290379aa884e [file] [log] [blame]
Rohit Waghchaure6087fe12016-04-09 14:31:09 +05301// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
2// License: GNU General Public License v3. See license.txt
3
Faris Ansari1fe891b2021-04-23 08:04:00 +05304erpnext.payments = class payments extends erpnext.stock.StockController {
5 make_payment() {
Rohit Waghchaure6087fe12016-04-09 14:31:09 +05306 var me = this;
7
8 this.dialog = new frappe.ui.Dialog({
Ankush Menatec74a5e2024-03-10 19:45:40 +05309 title: "Payment",
Rohit Waghchaure6087fe12016-04-09 14:31:09 +053010 });
Faris Ansari1fe891b2021-04-23 08:04:00 +053011
Rohit Waghchaure6087fe12016-04-09 14:31:09 +053012 this.dialog.show();
13 this.$body = this.dialog.body;
Rohit Waghchaure6087fe12016-04-09 14:31:09 +053014 this.set_payment_primary_action();
15 this.make_keyboard();
Deepesh Garge2f83ff2021-05-16 17:46:07 +053016 this.select_text();
Faris Ansari1fe891b2021-04-23 08:04:00 +053017 }
Rohit Waghchaurebaef2622016-08-05 15:41:36 +053018
Deepesh Gargb07f7d12021-05-20 17:08:57 +053019 select_text() {
Ankush Menatec74a5e2024-03-10 19:45:40 +053020 $(this.$body)
21 .find(".form-control")
22 .click(function () {
23 $(this).select();
24 });
Faris Ansari1fe891b2021-04-23 08:04:00 +053025 }
Rohit Waghchaure6087fe12016-04-09 14:31:09 +053026
Ankushfd848472021-06-16 11:14:40 +053027 set_payment_primary_action() {
Rohit Waghchaure6087fe12016-04-09 14:31:09 +053028 var me = this;
Faris Ansari1fe891b2021-04-23 08:04:00 +053029
Ankush Menatec74a5e2024-03-10 19:45:40 +053030 this.dialog.set_primary_action(__("Submit"), function () {
Cesard8b19272018-01-29 15:39:52 +010031 // Allow no ZERO payment
Helkyd3264c132017-11-22 16:06:22 +010032 $.each(me.frm.doc.payments, function (index, data) {
33 if (data.amount != 0) {
34 me.dialog.hide();
35 me.submit_invoice();
36 return;
37 }
Cesard8b19272018-01-29 15:39:52 +010038 });
Ankush Menatec74a5e2024-03-10 19:45:40 +053039 });
Faris Ansari1fe891b2021-04-23 08:04:00 +053040 }
Rohit Waghchaure6087fe12016-04-09 14:31:09 +053041
Ankush Menatec74a5e2024-03-10 19:45:40 +053042 make_keyboard() {
Rohit Waghchaure6087fe12016-04-09 14:31:09 +053043 var me = this;
44 $(this.$body).empty();
Ankush Menatec74a5e2024-03-10 19:45:40 +053045 $(this.$body).html(frappe.render_template("pos_payment", this.frm.doc));
Rohit Waghchaure6087fe12016-04-09 14:31:09 +053046 this.show_payment_details();
Ankush Menatec74a5e2024-03-10 19:45:40 +053047 this.bind_keyboard_event();
48 this.clear_amount();
Faris Ansari1fe891b2021-04-23 08:04:00 +053049 }
Rohit Waghchaure6087fe12016-04-09 14:31:09 +053050
Ankush Menatec74a5e2024-03-10 19:45:40 +053051 make_multimode_payment() {
Rohit Waghchaure6087fe12016-04-09 14:31:09 +053052 var me = this;
53
Deepesh Garge2f83ff2021-05-16 17:46:07 +053054 if (this.frm.doc.change_amount > 0) {
55 me.payment_val = me.doc.outstanding_amount;
Rohit Waghchaure6087fe12016-04-09 14:31:09 +053056 }
57
Ankush Menatec74a5e2024-03-10 19:45:40 +053058 this.payments = frappe.model.add_child(this.frm.doc, "Multi Mode Payment", "payments");
Rohit Waghchaure6087fe12016-04-09 14:31:09 +053059 this.payments.mode_of_payment = this.dialog.fields_dict.mode_of_payment.get_value();
60 this.payments.amount = flt(this.payment_val);
Faris Ansari1fe891b2021-04-23 08:04:00 +053061 }
Rohit Waghchaure6087fe12016-04-09 14:31:09 +053062
Ankush Menatec74a5e2024-03-10 19:45:40 +053063 show_payment_details() {
Rohit Waghchaure6087fe12016-04-09 14:31:09 +053064 var me = this;
Ankush Menatec74a5e2024-03-10 19:45:40 +053065 var multimode_payments = $(this.$body).find(".multimode-payments").empty();
Deepesh Gargb07f7d12021-05-20 17:08:57 +053066 if (this.frm.doc.payments.length) {
Ankush Menatec74a5e2024-03-10 19:45:40 +053067 $.each(this.frm.doc.payments, function (index, data) {
68 $(
69 frappe.render_template("payment_details", {
70 mode_of_payment: data.mode_of_payment,
71 amount: data.amount,
72 idx: data.idx,
73 currency: me.frm.doc.currency,
74 type: data.type,
75 })
76 ).appendTo(multimode_payments);
Rohit Waghchaurea88dec82016-07-30 16:49:48 +053077
Ankush Menatec74a5e2024-03-10 19:45:40 +053078 if (data.type == "Cash" && data.amount == me.frm.doc.paid_amount) {
Rohit Waghchaurea88dec82016-07-30 16:49:48 +053079 me.idx = data.idx;
Ankush Menatec74a5e2024-03-10 19:45:40 +053080 me.selected_mode = $(me.$body).find(repl("input[idx='%(idx)s']", { idx: me.idx }));
Rohit Waghchaurea88dec82016-07-30 16:49:48 +053081 me.highlight_selected_row();
82 me.bind_amount_change_event();
83 }
Ankush Menatec74a5e2024-03-10 19:45:40 +053084 });
85 } else {
86 $("<p>No payment mode selected in pos profile</p>").appendTo(multimode_payments);
Rohit Waghchaure6087fe12016-04-09 14:31:09 +053087 }
Faris Ansari1fe891b2021-04-23 08:04:00 +053088 }
Rohit Waghchaure9fe40d52016-06-13 21:37:10 +053089
Ankush Menatec74a5e2024-03-10 19:45:40 +053090 set_outstanding_amount() {
91 this.selected_mode = $(this.$body).find(repl("input[idx='%(idx)s']", { idx: this.idx }));
Deepesh Garg36d47f92021-05-21 11:16:26 +053092 this.highlight_selected_row();
93 this.payment_val = 0.0;
Deepesh Gargb07f7d12021-05-20 17:08:57 +053094 if (this.frm.doc.outstanding_amount > 0 && flt(this.selected_mode.val()) == 0.0) {
Rohit Waghchaure88514a22016-07-19 20:04:44 +053095 //When user first time click on row
Ankush Menatec74a5e2024-03-10 19:45:40 +053096 this.payment_val = flt(
97 this.frm.doc.outstanding_amount / this.frm.doc.conversion_rate,
98 precision("outstanding_amount")
99 );
Rohit Waghchaure609e2b42016-08-31 02:04:37 +0530100 this.selected_mode.val(format_currency(this.payment_val, this.frm.doc.currency));
Deepesh Gargb07f7d12021-05-20 17:08:57 +0530101 this.update_payment_amount();
102 } else if (flt(this.selected_mode.val()) > 0) {
Rohit Waghchaure9fe40d52016-06-13 21:37:10 +0530103 //If user click on existing row which has value
104 this.payment_val = flt(this.selected_mode.val());
105 }
Ankush Menatec74a5e2024-03-10 19:45:40 +0530106 this.selected_mode.select();
Rohit Waghchaure9fe40d52016-06-13 21:37:10 +0530107 this.bind_amount_change_event();
Faris Ansari1fe891b2021-04-23 08:04:00 +0530108 }
109
Ankush Menatec74a5e2024-03-10 19:45:40 +0530110 bind_keyboard_event() {
Rohit Waghchaure6087fe12016-04-09 14:31:09 +0530111 var me = this;
Ankush Menatec74a5e2024-03-10 19:45:40 +0530112 this.payment_val = "";
Rohit Waghchaurebaef2622016-08-05 15:41:36 +0530113 this.bind_form_control_event();
114 this.bind_numeric_keys_event();
Faris Ansari1fe891b2021-04-23 08:04:00 +0530115 }
Rohit Waghchaure9fe40d52016-06-13 21:37:10 +0530116
Ankushfd848472021-06-16 11:14:40 +0530117 bind_form_control_event() {
Rohit Waghchaure6087fe12016-04-09 14:31:09 +0530118 var me = this;
Ankush Menatec74a5e2024-03-10 19:45:40 +0530119 $(this.$body)
120 .find(".pos-payment-row")
121 .click(function () {
122 me.idx = $(this).attr("idx");
123 me.set_outstanding_amount();
124 });
Faris Ansari1fe891b2021-04-23 08:04:00 +0530125
Ankush Menatec74a5e2024-03-10 19:45:40 +0530126 $(this.$body)
127 .find(".form-control")
128 .click(function () {
129 me.idx = $(this).attr("idx");
130 me.set_outstanding_amount();
131 me.update_paid_amount(true);
132 });
Faris Ansari1fe891b2021-04-23 08:04:00 +0530133
Ankush Menatec74a5e2024-03-10 19:45:40 +0530134 $(this.$body)
135 .find(".write_off_amount")
136 .change(function () {
137 me.write_off_amount(flt($(this).val()), precision("write_off_amount"));
138 });
Faris Ansari1fe891b2021-04-23 08:04:00 +0530139
Ankush Menatec74a5e2024-03-10 19:45:40 +0530140 $(this.$body)
141 .find(".change_amount")
142 .change(function () {
143 me.change_amount(flt($(this).val()), precision("change_amount"));
144 });
Ankushfd848472021-06-16 11:14:40 +0530145 }
Rohit Waghchaure9fe40d52016-06-13 21:37:10 +0530146
Deepesh Gargb07f7d12021-05-20 17:08:57 +0530147 highlight_selected_row() {
Ankush Menatec74a5e2024-03-10 19:45:40 +0530148 var selected_row = $(this.$body).find(repl(".pos-payment-row[idx='%(idx)s']", { idx: this.idx }));
149 $(this.$body).find(".pos-payment-row").removeClass("selected-payment-mode");
150 selected_row.addClass("selected-payment-mode");
151 $(this.$body).find(".amount").attr("disabled", true);
152 this.selected_mode.attr("disabled", false);
Ankushfd848472021-06-16 11:14:40 +0530153 }
Faris Ansari1fe891b2021-04-23 08:04:00 +0530154
Ankushfd848472021-06-16 11:14:40 +0530155 bind_numeric_keys_event() {
Rohit Waghchaure6087fe12016-04-09 14:31:09 +0530156 var me = this;
Ankush Menatec74a5e2024-03-10 19:45:40 +0530157 $(this.$body)
158 .find(".pos-keyboard-key")
159 .click(function () {
160 me.payment_val += $(this).text();
161 me.selected_mode.val(format_currency(me.payment_val, me.frm.doc.currency));
162 me.idx = me.selected_mode.attr("idx");
163 me.update_paid_amount();
164 });
Faris Ansari1fe891b2021-04-23 08:04:00 +0530165
Ankush Menatec74a5e2024-03-10 19:45:40 +0530166 $(this.$body)
167 .find(".delete-btn")
168 .click(function () {
169 me.payment_val = cstr(flt(me.selected_mode.val())).slice(0, -1);
170 me.selected_mode.val(format_currency(me.payment_val, me.frm.doc.currency));
171 me.idx = me.selected_mode.attr("idx");
172 me.update_paid_amount();
173 });
Faris Ansari1fe891b2021-04-23 08:04:00 +0530174 }
175
Deepesh Gargb07f7d12021-05-20 17:08:57 +0530176 bind_amount_change_event() {
Rohit Waghchaure6087fe12016-04-09 14:31:09 +0530177 var me = this;
Ankush Menatec74a5e2024-03-10 19:45:40 +0530178 this.selected_mode.change(function () {
179 me.payment_val = flt($(this).val()) || 0.0;
Deepesh Garge2f83ff2021-05-16 17:46:07 +0530180 me.selected_mode.val(format_currency(me.payment_val, me.frm.doc.currency));
181 me.idx = me.selected_mode.attr("idx");
182 me.update_payment_amount();
183 });
Faris Ansari1fe891b2021-04-23 08:04:00 +0530184 }
Rohit Waghchaure9fe40d52016-06-13 21:37:10 +0530185
Faris Ansari1fe891b2021-04-23 08:04:00 +0530186 clear_amount() {
Rohit Waghchaure9fe40d52016-06-13 21:37:10 +0530187 var me = this;
Ankush Menatec74a5e2024-03-10 19:45:40 +0530188 $(this.$body)
189 .find(".clr")
190 .click(function (e) {
191 e.stopPropagation();
192 me.idx = $(this).attr("idx");
193 me.selected_mode = $(me.$body).find(repl("input[idx='%(idx)s']", { idx: me.idx }));
194 me.payment_val = 0.0;
195 me.selected_mode.val(0.0);
196 me.highlight_selected_row();
197 me.update_payment_amount();
198 });
Faris Ansari1fe891b2021-04-23 08:04:00 +0530199 }
Rohit Waghchaure9fe40d52016-06-13 21:37:10 +0530200
Faris Ansari1fe891b2021-04-23 08:04:00 +0530201 write_off_amount(write_off_amount) {
Rohit Waghchaure713e2b72016-08-19 15:11:36 +0530202 this.frm.doc.write_off_amount = flt(write_off_amount, precision("write_off_amount"));
Ankush Menatec74a5e2024-03-10 19:45:40 +0530203 this.frm.doc.base_write_off_amount = flt(
204 this.frm.doc.write_off_amount * this.frm.doc.conversion_rate,
205 precision("base_write_off_amount")
206 );
Deepesh Garge2f83ff2021-05-16 17:46:07 +0530207 this.calculate_outstanding_amount(false);
208 this.show_amounts();
Faris Ansari1fe891b2021-04-23 08:04:00 +0530209 }
Rohit Waghchaurebaef2622016-08-05 15:41:36 +0530210
Faris Ansari1fe891b2021-04-23 08:04:00 +0530211 change_amount(change_amount) {
Rohit Waghchaurebaef2622016-08-05 15:41:36 +0530212 var me = this;
213
Rohit Waghchaure713e2b72016-08-19 15:11:36 +0530214 this.frm.doc.change_amount = flt(change_amount, precision("change_amount"));
Deepesh Garge2f83ff2021-05-16 17:46:07 +0530215 this.calculate_write_off_amount();
216 this.show_amounts();
Ankushfd848472021-06-16 11:14:40 +0530217 }
Rohit Waghchaurebaef2622016-08-05 15:41:36 +0530218
Faris Ansari1fe891b2021-04-23 08:04:00 +0530219 update_paid_amount(update_write_off) {
Rohit Waghchaurebaef2622016-08-05 15:41:36 +0530220 var me = this;
barredterrad2387512024-03-19 12:03:36 +0100221 if (["change_amount", "write_off_amount"].includes(this.idx)) {
Faris Ansariab74ca72017-05-30 12:54:42 +0530222 var value = me.selected_mode.val();
Ankush Menatec74a5e2024-03-10 19:45:40 +0530223 if (me.idx == "change_amount") {
Deepesh Garge2f83ff2021-05-16 17:46:07 +0530224 me.change_amount(value);
Deepesh Gargb07f7d12021-05-20 17:08:57 +0530225 } else {
Ankush Menatec74a5e2024-03-10 19:45:40 +0530226 if (flt(value) == 0 && update_write_off && me.frm.doc.outstanding_amount > 0) {
227 value = flt(
228 me.frm.doc.outstanding_amount / me.frm.doc.conversion_rate,
229 precision(me.idx)
230 );
Rohit Waghchaurebaef2622016-08-05 15:41:36 +0530231 }
Deepesh Garge2f83ff2021-05-16 17:46:07 +0530232 me.write_off_amount(value);
Rohit Waghchaurebaef2622016-08-05 15:41:36 +0530233 }
Deepesh Garge2f83ff2021-05-16 17:46:07 +0530234 } else {
235 this.update_payment_amount();
Rohit Waghchaurebaef2622016-08-05 15:41:36 +0530236 }
Faris Ansari1fe891b2021-04-23 08:04:00 +0530237 }
Rohit Waghchaurebaef2622016-08-05 15:41:36 +0530238
Ankush Menatec74a5e2024-03-10 19:45:40 +0530239 update_payment_amount() {
Rohit Waghchaurebaef2622016-08-05 15:41:36 +0530240 var me = this;
241
Ankush Menatec74a5e2024-03-10 19:45:40 +0530242 $.each(this.frm.doc.payments, function (index, data) {
Deepesh Gargb07f7d12021-05-20 17:08:57 +0530243 if (cint(me.idx) == cint(data.idx)) {
Deepesh Garge2f83ff2021-05-16 17:46:07 +0530244 data.amount = flt(me.selected_mode.val(), 2);
Rohit Waghchaure6087fe12016-04-09 14:31:09 +0530245 }
Ankush Menatec74a5e2024-03-10 19:45:40 +0530246 });
Rohit Waghchaurebaef2622016-08-05 15:41:36 +0530247
Rohit Waghchaure61b4a432016-07-20 11:21:51 +0530248 this.calculate_outstanding_amount(false);
Rohit Waghchaure6087fe12016-04-09 14:31:09 +0530249 this.show_amounts();
Faris Ansari1fe891b2021-04-23 08:04:00 +0530250 }
Rohit Waghchaurebaef2622016-08-05 15:41:36 +0530251
Ankush Menatec74a5e2024-03-10 19:45:40 +0530252 show_amounts() {
Rohit Waghchaure6087fe12016-04-09 14:31:09 +0530253 var me = this;
Ankush Menatec74a5e2024-03-10 19:45:40 +0530254 $(this.$body)
255 .find(".write_off_amount")
256 .val(format_currency(this.frm.doc.write_off_amount, this.frm.doc.currency));
257 $(this.$body)
258 .find(".paid_amount")
259 .text(format_currency(this.frm.doc.paid_amount, this.frm.doc.currency));
260 $(this.$body)
261 .find(".change_amount")
262 .val(format_currency(this.frm.doc.change_amount, this.frm.doc.currency));
263 $(this.$body)
264 .find(".outstanding_amount")
265 .text(
266 format_currency(
267 this.frm.doc.outstanding_amount,
268 frappe.get_doc(":Company", this.frm.doc.company).default_currency
269 )
270 );
Rohit Waghchaure6087fe12016-04-09 14:31:09 +0530271 this.update_invoice();
272 }
Ankush Menatec74a5e2024-03-10 19:45:40 +0530273};