blob: 69357ee6ef9ae3f5fce1cf6277e2f29b8f7c5a3e [file] [log] [blame]
Anand Doshi885e0742015-03-03 14:55:30 +05301// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
Rushabh Mehta3daa49a2014-10-21 16:16:30 +05302// License: GNU General Public License v3. See license.txt
3
4// js inside blog page
5
6// shopping cart
marination1bb135b2021-08-26 19:14:10 +05307frappe.provide("erpnext.e_commerce.shopping_cart");
8var shopping_cart = erpnext.e_commerce.shopping_cart;
Rushabh Mehta3daa49a2014-10-21 16:16:30 +05309
10$.extend(shopping_cart, {
11 show_error: function(title, text) {
Rushabh Mehtafc3d8712015-07-10 10:11:07 +053012 $("#cart-container").html('<div class="msg-box"><h4>' +
13 title + '</h4><p class="text-muted">' + text + '</p></div>');
Rushabh Mehta3daa49a2014-10-21 16:16:30 +053014 },
15
16 bind_events: function() {
prssannab00eb1b2021-01-20 17:52:54 +053017 shopping_cart.bind_address_picker_dialog();
Rushabh Mehta8ffd4832015-09-17 16:28:30 +053018 shopping_cart.bind_place_order();
Faris Ansari5f8b3582019-03-19 11:48:32 +053019 shopping_cart.bind_request_quotation();
Rushabh Mehta8ffd4832015-09-17 16:28:30 +053020 shopping_cart.bind_change_qty();
marination53bb7a92021-05-27 18:53:11 +053021 shopping_cart.bind_remove_cart_item();
Faris Ansari5f8b3582019-03-19 11:48:32 +053022 shopping_cart.bind_change_notes();
ashish-greycube74dc3c92019-08-12 13:39:25 +053023 shopping_cart.bind_coupon_code();
Rushabh Mehta3daa49a2014-10-21 16:16:30 +053024 },
Faris Ansariab74ca72017-05-30 12:54:42 +053025
prssannab00eb1b2021-01-20 17:52:54 +053026 bind_address_picker_dialog: function() {
27 const d = this.get_update_address_dialog();
28 this.parent.find('.btn-change-address').on('click', (e) => {
29 const type = $(e.currentTarget).parents('.address-container').attr('data-address-type');
30 $(d.get_field('address_picker').wrapper).html(
31 this.get_address_template(type)
32 );
33 d.show();
Rushabh Mehta3d766862015-09-16 18:52:52 +053034 });
Rushabh Mehta3d766862015-09-16 18:52:52 +053035 },
36
prssannab00eb1b2021-01-20 17:52:54 +053037 get_update_address_dialog() {
prssannaa3585e42021-02-01 19:50:27 +053038 let d = new frappe.ui.Dialog({
prssannab00eb1b2021-01-20 17:52:54 +053039 title: "Select Address",
40 fields: [{
41 'fieldtype': 'HTML',
42 'fieldname': 'address_picker',
43 }],
44 primary_action_label: __('Set Address'),
45 primary_action: () => {
46 const $card = d.$wrapper.find('.address-card.active');
47 const address_type = $card.closest('[data-address-type]').attr('data-address-type');
48 const address_name = $card.closest('[data-address-name]').attr('data-address-name');
49 frappe.call({
50 type: "POST",
marination22f41a12021-02-25 13:56:38 +053051 method: "erpnext.e_commerce.shopping_cart.cart.update_cart_address",
prssannab00eb1b2021-01-20 17:52:54 +053052 freeze: true,
53 args: {
54 address_type,
55 address_name
56 },
57 callback: function(r) {
58 d.hide();
prssannaa3585e42021-02-01 19:50:27 +053059 if (!r.exc) {
Marica4096b142021-09-15 14:00:14 +053060 $(".cart-tax-items").html(r.message.total);
prssannab00eb1b2021-01-20 17:52:54 +053061 shopping_cart.parent.find(
62 `.address-container[data-address-type="${address_type}"]`
63 ).html(r.message.address);
64 }
65 }
66 });
67 }
68 });
prssannaa3585e42021-02-01 19:50:27 +053069
70 return d;
prssannab00eb1b2021-01-20 17:52:54 +053071 },
72
73 get_address_template(type) {
74 return {
75 shipping: `<div class="mb-3" data-section="shipping-address">
76 <div class="row no-gutters" data-fieldname="shipping_address_name">
77 {% for address in shipping_addresses %}
78 <div class="mr-3 mb-3 w-100" data-address-name="{{address.name}}" data-address-type="shipping"
79 {% if doc.shipping_address_name == address.name %} data-active {% endif %}>
80 {% include "templates/includes/cart/address_picker_card.html" %}
81 </div>
82 {% endfor %}
83 </div>
84 </div>`,
85 billing: `<div class="mb-3" data-section="billing-address">
86 <div class="row no-gutters" data-fieldname="customer_address">
87 {% for address in billing_addresses %}
88 <div class="mr-3 mb-3 w-100" data-address-name="{{address.name}}" data-address-type="billing"
89 {% if doc.shipping_address_name == address.name %} data-active {% endif %}>
90 {% include "templates/includes/cart/address_picker_card.html" %}
91 </div>
92 {% endfor %}
93 </div>
94 </div>`,
95 }[type];
96 },
97
Rushabh Mehta8ffd4832015-09-17 16:28:30 +053098 bind_place_order: function() {
99 $(".btn-place-order").on("click", function() {
100 shopping_cart.place_order(this);
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530101 });
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530102 },
103
Faris Ansari5f8b3582019-03-19 11:48:32 +0530104 bind_request_quotation: function() {
105 $('.btn-request-for-quotation').on('click', function() {
106 shopping_cart.request_quotation(this);
107 });
108 },
109
Rushabh Mehta8ffd4832015-09-17 16:28:30 +0530110 bind_change_qty: function() {
111 // bind update button
112 $(".cart-items").on("change", ".cart-qty", function() {
113 var item_code = $(this).attr("data-item-code");
Kanchan Chauhana756e3f2016-06-22 15:51:42 +0530114 var newVal = $(this).val();
Faris Ansari5f8b3582019-03-19 11:48:32 +0530115 shopping_cart.shopping_cart_update({item_code, qty: newVal});
Kanchan Chauhan239b3512016-05-02 11:43:44 +0530116 });
Faris Ansariab74ca72017-05-30 12:54:42 +0530117
118 $(".cart-items").on('click', '.number-spinner button', function () {
Kanchan Chauhanc8d47da2016-06-22 15:46:38 +0530119 var btn = $(this),
Kanchan Chauhana756e3f2016-06-22 15:51:42 +0530120 input = btn.closest('.number-spinner').find('input'),
121 oldValue = input.val().trim(),
Kanchan Chauhanc8d47da2016-06-22 15:46:38 +0530122 newVal = 0;
Faris Ansariab74ca72017-05-30 12:54:42 +0530123
Kanchan Chauhanc8d47da2016-06-22 15:46:38 +0530124 if (btn.attr('data-dir') == 'up') {
Kanchan Chauhanc8d47da2016-06-22 15:46:38 +0530125 newVal = parseInt(oldValue) + 1;
126 } else {
127 if (oldValue > 1) {
128 newVal = parseInt(oldValue) - 1;
129 }
130 }
Kanchan Chauhana756e3f2016-06-22 15:51:42 +0530131 input.val(newVal);
marination423d7512021-05-19 21:17:47 +0530132
133 let notes = input.closest("td").siblings().find(".notes").text().trim();
Faris Ansariab74ca72017-05-30 12:54:42 +0530134 var item_code = input.attr("data-item-code");
marination423d7512021-05-19 21:17:47 +0530135 shopping_cart.shopping_cart_update({
136 item_code,
137 qty: newVal,
138 additional_notes: notes
139 });
Faris Ansari5f8b3582019-03-19 11:48:32 +0530140 });
141 },
142
143 bind_change_notes: function() {
144 $('.cart-items').on('change', 'textarea', function() {
145 const $textarea = $(this);
146 const item_code = $textarea.attr('data-item-code');
147 const qty = $textarea.closest('tr').find('.cart-qty').val();
148 const notes = $textarea.val();
149 shopping_cart.shopping_cart_update({
150 item_code,
151 qty,
152 additional_notes: notes
153 });
Kanchan Chauhanc8d47da2016-06-22 15:46:38 +0530154 });
Kanchan Chauhan239b3512016-05-02 11:43:44 +0530155 },
Faris Ansariab74ca72017-05-30 12:54:42 +0530156
marination53bb7a92021-05-27 18:53:11 +0530157 bind_remove_cart_item: function() {
158 $(".cart-items").on("click", ".remove-cart-item", (e) => {
159 const $remove_cart_item_btn = $(e.currentTarget);
160 var item_code = $remove_cart_item_btn.data("item-code");
161
162 shopping_cart.shopping_cart_update({
163 item_code: item_code,
164 qty: 0
165 });
marinationb0d7e322021-06-01 12:44:49 +0530166 });
marination53bb7a92021-05-27 18:53:11 +0530167 },
168
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530169 render_tax_row: function($cart_taxes, doc, shipping_rules) {
170 var shipping_selector;
171 if(shipping_rules) {
172 shipping_selector = '<select class="form-control">' + $.map(shipping_rules, function(rule) {
Faris Ansariab74ca72017-05-30 12:54:42 +0530173 return '<option value="' + rule[0] + '">' + rule[1] + '</option>' }).join("\n") +
174 '</select>';
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530175 }
176
177 var $tax_row = $(repl('<div class="row">\
178 <div class="col-md-9 col-sm-9">\
179 <div class="row">\
180 <div class="col-md-9 col-md-offset-3">' +
181 (shipping_selector || '<p>%(description)s</p>') +
182 '</div>\
183 </div>\
184 </div>\
185 <div class="col-md-3 col-sm-3 text-right">\
186 <p' + (shipping_selector ? ' style="margin-top: 5px;"' : "") + '>%(formatted_tax_amount)s</p>\
187 </div>\
188 </div>', doc)).appendTo($cart_taxes);
189
190 if(shipping_selector) {
191 $tax_row.find('select option').each(function(i, opt) {
192 if($(opt).html() == doc.description) {
193 $(opt).attr("selected", "selected");
194 }
195 });
196 $tax_row.find('select').on("change", function() {
197 shopping_cart.apply_shipping_rule($(this).val(), this);
198 });
199 }
200 },
201
202 apply_shipping_rule: function(rule, btn) {
203 return frappe.call({
204 btn: btn,
205 type: "POST",
marination22f41a12021-02-25 13:56:38 +0530206 method: "erpnext.e_commerce.shopping_cart.cart.apply_shipping_rule",
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530207 args: { shipping_rule: rule },
208 callback: function(r) {
209 if(!r.exc) {
210 shopping_cart.render(r.message);
211 }
212 }
213 });
214 },
215
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530216 place_order: function(btn) {
Marica4096b142021-09-15 14:00:14 +0530217 shopping_cart.freeze();
218
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530219 return frappe.call({
220 type: "POST",
marination22f41a12021-02-25 13:56:38 +0530221 method: "erpnext.e_commerce.shopping_cart.cart.place_order",
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530222 btn: btn,
223 callback: function(r) {
224 if(r.exc) {
Marica4096b142021-09-15 14:00:14 +0530225 shopping_cart.unfreeze();
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530226 var msg = "";
227 if(r._server_messages) {
228 msg = JSON.parse(r._server_messages || []).join("<br>");
229 }
230
231 $("#cart-error")
232 .empty()
233 .html(msg || frappe._("Something went wrong!"))
234 .toggle(true);
235 } else {
Faris Ansari358329d2019-05-01 14:56:50 +0530236 $(btn).hide();
Faris Ansari5f1eebe2019-05-01 14:32:15 +0530237 window.location.href = '/orders/' + encodeURIComponent(r.message);
Faris Ansari5f8b3582019-03-19 11:48:32 +0530238 }
239 }
240 });
241 },
242
243 request_quotation: function(btn) {
Marica4096b142021-09-15 14:00:14 +0530244 shopping_cart.freeze();
245
Faris Ansari5f8b3582019-03-19 11:48:32 +0530246 return frappe.call({
247 type: "POST",
marination22f41a12021-02-25 13:56:38 +0530248 method: "erpnext.e_commerce.shopping_cart.cart.request_for_quotation",
Faris Ansari5f8b3582019-03-19 11:48:32 +0530249 btn: btn,
250 callback: function(r) {
251 if(r.exc) {
Marica4096b142021-09-15 14:00:14 +0530252 shopping_cart.unfreeze();
Faris Ansari5f8b3582019-03-19 11:48:32 +0530253 var msg = "";
254 if(r._server_messages) {
255 msg = JSON.parse(r._server_messages || []).join("<br>");
256 }
257
258 $("#cart-error")
259 .empty()
260 .html(msg || frappe._("Something went wrong!"))
261 .toggle(true);
262 } else {
Faris Ansari358329d2019-05-01 14:56:50 +0530263 $(btn).hide();
Faris Ansari5f1eebe2019-05-01 14:32:15 +0530264 window.location.href = '/quotations/' + encodeURIComponent(r.message);
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530265 }
266 }
267 });
ashish-greycube74dc3c92019-08-12 13:39:25 +0530268 },
269
270 bind_coupon_code: function() {
271 $(".bt-coupon").on("click", function() {
272 shopping_cart.apply_coupon_code(this);
273 });
274 },
275
276 apply_coupon_code: function(btn) {
277 return frappe.call({
278 type: "POST",
marination22f41a12021-02-25 13:56:38 +0530279 method: "erpnext.e_commerce.shopping_cart.cart.apply_coupon_code",
ashish-greycube74dc3c92019-08-12 13:39:25 +0530280 btn: btn,
281 args : {
282 applied_code : $('.txtcoupon').val(),
283 applied_referral_sales_partner: $('.txtreferral_sales_partner').val()
284 },
285 callback: function(r) {
286 if (r && r.message){
287 location.reload();
288 }
289 }
290 });
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530291 }
292});
293
Kanchan Chauhana756e3f2016-06-22 15:51:42 +0530294frappe.ready(function() {
marinationf47db262022-02-03 12:54:59 +0530295 if (window.location.pathname === "/cart") {
296 $(".cart-icon").hide();
297 }
prssannab00eb1b2021-01-20 17:52:54 +0530298 shopping_cart.parent = $(".cart-container");
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530299 shopping_cart.bind_events();
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530300});
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +0530301
302function show_terms() {
Faris Ansariab74ca72017-05-30 12:54:42 +0530303 var html = $(".cart-terms").html();
304 frappe.msgprint(html);
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +0530305}