blob: 4de8ff788c2ab5fd3d15ade5bda901718b7560cc [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
Faris Ansariab74ca72017-05-30 12:54:42 +05307frappe.provide("erpnext.shopping_cart");
8var shopping_cart = erpnext.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();
Faris Ansari5f8b3582019-03-19 11:48:32 +053021 shopping_cart.bind_change_notes();
Kanchan Chauhana756e3f2016-06-22 15:51:42 +053022 shopping_cart.bind_dropdown_cart_buttons();
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) {
prssannab00eb1b2021-01-20 17:52:54 +053060 $(".cart-tax-items").html(r.message.taxes);
61 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);
Faris Ansariab74ca72017-05-30 12:54:42 +0530132 var item_code = input.attr("data-item-code");
Faris Ansari5f8b3582019-03-19 11:48:32 +0530133 shopping_cart.shopping_cart_update({item_code, qty: newVal});
134 });
135 },
136
137 bind_change_notes: function() {
138 $('.cart-items').on('change', 'textarea', function() {
139 const $textarea = $(this);
140 const item_code = $textarea.attr('data-item-code');
141 const qty = $textarea.closest('tr').find('.cart-qty').val();
142 const notes = $textarea.val();
143 shopping_cart.shopping_cart_update({
144 item_code,
145 qty,
146 additional_notes: notes
147 });
Kanchan Chauhanc8d47da2016-06-22 15:46:38 +0530148 });
Kanchan Chauhan239b3512016-05-02 11:43:44 +0530149 },
Faris Ansariab74ca72017-05-30 12:54:42 +0530150
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530151 render_tax_row: function($cart_taxes, doc, shipping_rules) {
152 var shipping_selector;
153 if(shipping_rules) {
154 shipping_selector = '<select class="form-control">' + $.map(shipping_rules, function(rule) {
Faris Ansariab74ca72017-05-30 12:54:42 +0530155 return '<option value="' + rule[0] + '">' + rule[1] + '</option>' }).join("\n") +
156 '</select>';
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530157 }
158
159 var $tax_row = $(repl('<div class="row">\
160 <div class="col-md-9 col-sm-9">\
161 <div class="row">\
162 <div class="col-md-9 col-md-offset-3">' +
163 (shipping_selector || '<p>%(description)s</p>') +
164 '</div>\
165 </div>\
166 </div>\
167 <div class="col-md-3 col-sm-3 text-right">\
168 <p' + (shipping_selector ? ' style="margin-top: 5px;"' : "") + '>%(formatted_tax_amount)s</p>\
169 </div>\
170 </div>', doc)).appendTo($cart_taxes);
171
172 if(shipping_selector) {
173 $tax_row.find('select option').each(function(i, opt) {
174 if($(opt).html() == doc.description) {
175 $(opt).attr("selected", "selected");
176 }
177 });
178 $tax_row.find('select').on("change", function() {
179 shopping_cart.apply_shipping_rule($(this).val(), this);
180 });
181 }
182 },
183
184 apply_shipping_rule: function(rule, btn) {
185 return frappe.call({
186 btn: btn,
187 type: "POST",
marination22f41a12021-02-25 13:56:38 +0530188 method: "erpnext.e_commerce.shopping_cart.cart.apply_shipping_rule",
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530189 args: { shipping_rule: rule },
190 callback: function(r) {
191 if(!r.exc) {
192 shopping_cart.render(r.message);
193 }
194 }
195 });
196 },
197
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530198 place_order: function(btn) {
199 return frappe.call({
200 type: "POST",
marination22f41a12021-02-25 13:56:38 +0530201 method: "erpnext.e_commerce.shopping_cart.cart.place_order",
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530202 btn: btn,
203 callback: function(r) {
204 if(r.exc) {
205 var msg = "";
206 if(r._server_messages) {
207 msg = JSON.parse(r._server_messages || []).join("<br>");
208 }
209
210 $("#cart-error")
211 .empty()
212 .html(msg || frappe._("Something went wrong!"))
213 .toggle(true);
214 } else {
Faris Ansari358329d2019-05-01 14:56:50 +0530215 $('.cart-container table').hide();
216 $(btn).hide();
Faris Ansari5f1eebe2019-05-01 14:32:15 +0530217 window.location.href = '/orders/' + encodeURIComponent(r.message);
Faris Ansari5f8b3582019-03-19 11:48:32 +0530218 }
219 }
220 });
221 },
222
223 request_quotation: function(btn) {
224 return frappe.call({
225 type: "POST",
marination22f41a12021-02-25 13:56:38 +0530226 method: "erpnext.e_commerce.shopping_cart.cart.request_for_quotation",
Faris Ansari5f8b3582019-03-19 11:48:32 +0530227 btn: btn,
228 callback: function(r) {
229 if(r.exc) {
230 var msg = "";
231 if(r._server_messages) {
232 msg = JSON.parse(r._server_messages || []).join("<br>");
233 }
234
235 $("#cart-error")
236 .empty()
237 .html(msg || frappe._("Something went wrong!"))
238 .toggle(true);
239 } else {
Faris Ansari358329d2019-05-01 14:56:50 +0530240 $('.cart-container table').hide();
241 $(btn).hide();
Faris Ansari5f1eebe2019-05-01 14:32:15 +0530242 window.location.href = '/quotations/' + encodeURIComponent(r.message);
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530243 }
244 }
245 });
ashish-greycube74dc3c92019-08-12 13:39:25 +0530246 },
247
248 bind_coupon_code: function() {
249 $(".bt-coupon").on("click", function() {
250 shopping_cart.apply_coupon_code(this);
251 });
252 },
253
254 apply_coupon_code: function(btn) {
255 return frappe.call({
256 type: "POST",
marination22f41a12021-02-25 13:56:38 +0530257 method: "erpnext.e_commerce.shopping_cart.cart.apply_coupon_code",
ashish-greycube74dc3c92019-08-12 13:39:25 +0530258 btn: btn,
259 args : {
260 applied_code : $('.txtcoupon').val(),
261 applied_referral_sales_partner: $('.txtreferral_sales_partner').val()
262 },
263 callback: function(r) {
264 if (r && r.message){
265 location.reload();
266 }
267 }
268 });
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530269 }
270});
271
Kanchan Chauhana756e3f2016-06-22 15:51:42 +0530272frappe.ready(function() {
Saurabh69f99752016-01-06 16:41:50 +0530273 $(".cart-icon").hide();
prssannab00eb1b2021-01-20 17:52:54 +0530274 shopping_cart.parent = $(".cart-container");
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530275 shopping_cart.bind_events();
Rushabh Mehta3daa49a2014-10-21 16:16:30 +0530276});
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +0530277
278function show_terms() {
Faris Ansariab74ca72017-05-30 12:54:42 +0530279 var html = $(".cart-terms").html();
280 frappe.msgprint(html);
Kanchan Chauhanb3fe6a42016-03-16 18:01:22 +0530281}