282 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			282 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
 | |
| // License: GNU General Public License v3. See license.txt
 | |
| 
 | |
| // js inside blog page
 | |
| 
 | |
| // shopping cart
 | |
| frappe.provide("erpnext.shopping_cart");
 | |
| var shopping_cart = erpnext.shopping_cart;
 | |
| 
 | |
| $.extend(shopping_cart, {
 | |
| 	show_error: function(title, text) {
 | |
| 		$("#cart-container").html('<div class="msg-box"><h4>' +
 | |
| 			title + '</h4><p class="text-muted">' + text + '</p></div>');
 | |
| 	},
 | |
| 
 | |
| 	bind_events: function() {
 | |
| 		shopping_cart.bind_address_picker_dialog();
 | |
| 		shopping_cart.bind_place_order();
 | |
| 		shopping_cart.bind_request_quotation();
 | |
| 		shopping_cart.bind_change_qty();
 | |
| 		shopping_cart.bind_change_notes();
 | |
| 		shopping_cart.bind_dropdown_cart_buttons();
 | |
| 		shopping_cart.bind_coupon_code();
 | |
| 	},
 | |
| 
 | |
| 	bind_address_picker_dialog: function() {
 | |
| 		const d = this.get_update_address_dialog();
 | |
| 		this.parent.find('.btn-change-address').on('click', (e) => {
 | |
| 			const type = $(e.currentTarget).parents('.address-container').attr('data-address-type');
 | |
| 			$(d.get_field('address_picker').wrapper).html(
 | |
| 				this.get_address_template(type)
 | |
| 			);
 | |
| 			d.show();
 | |
| 		});
 | |
| 	},
 | |
| 
 | |
| 	get_update_address_dialog() {
 | |
| 		let d = new frappe.ui.Dialog({
 | |
| 			title: "Select Address",
 | |
| 			fields: [{
 | |
| 				'fieldtype': 'HTML',
 | |
| 				'fieldname': 'address_picker',
 | |
| 			}],
 | |
| 			primary_action_label: __('Set Address'),
 | |
| 			primary_action: () => {
 | |
| 				const $card = d.$wrapper.find('.address-card.active');
 | |
| 				const address_type = $card.closest('[data-address-type]').attr('data-address-type');
 | |
| 				const address_name = $card.closest('[data-address-name]').attr('data-address-name');
 | |
| 				frappe.call({
 | |
| 					type: "POST",
 | |
| 					method: "erpnext.shopping_cart.cart.update_cart_address",
 | |
| 					freeze: true,
 | |
| 					args: {
 | |
| 						address_type,
 | |
| 						address_name
 | |
| 					},
 | |
| 					callback: function(r) {
 | |
| 						d.hide();
 | |
| 						if (!r.exc) {
 | |
| 							$(".cart-tax-items").html(r.message.taxes);
 | |
| 							shopping_cart.parent.find(
 | |
| 								`.address-container[data-address-type="${address_type}"]`
 | |
| 							).html(r.message.address);
 | |
| 						}
 | |
| 					}
 | |
| 				});
 | |
| 			}
 | |
| 		});
 | |
| 
 | |
| 		return d;
 | |
| 	},
 | |
| 
 | |
| 	get_address_template(type) {
 | |
| 		return {
 | |
| 			shipping: `<div class="mb-3" data-section="shipping-address">
 | |
| 				<div class="row no-gutters" data-fieldname="shipping_address_name">
 | |
| 					{% for address in shipping_addresses %}
 | |
| 						<div class="mr-3 mb-3 w-100" data-address-name="{{address.name}}" data-address-type="shipping"
 | |
| 							{% if doc.shipping_address_name == address.name %} data-active {% endif %}>
 | |
| 							{% include "templates/includes/cart/address_picker_card.html" %}
 | |
| 						</div>
 | |
| 					{% endfor %}
 | |
| 				</div>
 | |
| 			</div>`,
 | |
| 			billing: `<div class="mb-3" data-section="billing-address">
 | |
| 				<div class="row no-gutters" data-fieldname="customer_address">
 | |
| 					{% for address in billing_addresses %}
 | |
| 						<div class="mr-3 mb-3 w-100" data-address-name="{{address.name}}" data-address-type="billing"
 | |
| 							{% if doc.shipping_address_name == address.name %} data-active {% endif %}>
 | |
| 							{% include "templates/includes/cart/address_picker_card.html" %}
 | |
| 						</div>
 | |
| 					{% endfor %}
 | |
| 				</div>
 | |
| 			</div>`,
 | |
| 		}[type];
 | |
| 	},
 | |
| 
 | |
| 	bind_place_order: function() {
 | |
| 		$(".btn-place-order").on("click", function() {
 | |
| 			shopping_cart.place_order(this);
 | |
| 		});
 | |
| 	},
 | |
| 
 | |
| 	bind_request_quotation: function() {
 | |
| 		$('.btn-request-for-quotation').on('click', function() {
 | |
| 			shopping_cart.request_quotation(this);
 | |
| 		});
 | |
| 	},
 | |
| 
 | |
| 	bind_change_qty: function() {
 | |
| 		// bind update button
 | |
| 		$(".cart-items").on("change", ".cart-qty", function() {
 | |
| 			var item_code = $(this).attr("data-item-code");
 | |
| 			var newVal = $(this).val();
 | |
| 			shopping_cart.shopping_cart_update({item_code, qty: newVal});
 | |
| 		});
 | |
| 
 | |
| 		$(".cart-items").on('click', '.number-spinner button', function () {
 | |
| 			var btn = $(this),
 | |
| 				input = btn.closest('.number-spinner').find('input'),
 | |
| 				oldValue = input.val().trim(),
 | |
| 				newVal = 0;
 | |
| 
 | |
| 			if (btn.attr('data-dir') == 'up') {
 | |
| 				newVal = parseInt(oldValue) + 1;
 | |
| 			} else {
 | |
| 				if (oldValue > 1) {
 | |
| 					newVal = parseInt(oldValue) - 1;
 | |
| 				}
 | |
| 			}
 | |
| 			input.val(newVal);
 | |
| 			var item_code = input.attr("data-item-code");
 | |
| 			shopping_cart.shopping_cart_update({item_code, qty: newVal});
 | |
| 		});
 | |
| 	},
 | |
| 
 | |
| 	bind_change_notes: function() {
 | |
| 		$('.cart-items').on('change', 'textarea', function() {
 | |
| 			const $textarea = $(this);
 | |
| 			const item_code = $textarea.attr('data-item-code');
 | |
| 			const qty = $textarea.closest('tr').find('.cart-qty').val();
 | |
| 			const notes = $textarea.val();
 | |
| 			shopping_cart.shopping_cart_update({
 | |
| 				item_code,
 | |
| 				qty,
 | |
| 				additional_notes: notes
 | |
| 			});
 | |
| 		});
 | |
| 	},
 | |
| 
 | |
| 	render_tax_row: function($cart_taxes, doc, shipping_rules) {
 | |
| 		var shipping_selector;
 | |
| 		if(shipping_rules) {
 | |
| 			shipping_selector = '<select class="form-control">' + $.map(shipping_rules, function(rule) {
 | |
| 				return '<option value="' + rule[0] + '">' + rule[1] + '</option>' }).join("\n") +
 | |
| 			'</select>';
 | |
| 		}
 | |
| 
 | |
| 		var $tax_row = $(repl('<div class="row">\
 | |
| 			<div class="col-md-9 col-sm-9">\
 | |
| 				<div class="row">\
 | |
| 					<div class="col-md-9 col-md-offset-3">' +
 | |
| 					(shipping_selector || '<p>%(description)s</p>') +
 | |
| 					'</div>\
 | |
| 				</div>\
 | |
| 			</div>\
 | |
| 			<div class="col-md-3 col-sm-3 text-right">\
 | |
| 				<p' + (shipping_selector ? ' style="margin-top: 5px;"' : "") + '>%(formatted_tax_amount)s</p>\
 | |
| 			</div>\
 | |
| 		</div>', doc)).appendTo($cart_taxes);
 | |
| 
 | |
| 		if(shipping_selector) {
 | |
| 			$tax_row.find('select option').each(function(i, opt) {
 | |
| 				if($(opt).html() == doc.description) {
 | |
| 					$(opt).attr("selected", "selected");
 | |
| 				}
 | |
| 			});
 | |
| 			$tax_row.find('select').on("change", function() {
 | |
| 				shopping_cart.apply_shipping_rule($(this).val(), this);
 | |
| 			});
 | |
| 		}
 | |
| 	},
 | |
| 
 | |
| 	apply_shipping_rule: function(rule, btn) {
 | |
| 		return frappe.call({
 | |
| 			btn: btn,
 | |
| 			type: "POST",
 | |
| 			method: "erpnext.shopping_cart.cart.apply_shipping_rule",
 | |
| 			args: { shipping_rule: rule },
 | |
| 			callback: function(r) {
 | |
| 				if(!r.exc) {
 | |
| 					shopping_cart.render(r.message);
 | |
| 				}
 | |
| 			}
 | |
| 		});
 | |
| 	},
 | |
| 
 | |
| 	place_order: function(btn) {
 | |
| 		return frappe.call({
 | |
| 			type: "POST",
 | |
| 			method: "erpnext.shopping_cart.cart.place_order",
 | |
| 			btn: btn,
 | |
| 			callback: function(r) {
 | |
| 				if(r.exc) {
 | |
| 					var msg = "";
 | |
| 					if(r._server_messages) {
 | |
| 						msg = JSON.parse(r._server_messages || []).join("<br>");
 | |
| 					}
 | |
| 
 | |
| 					$("#cart-error")
 | |
| 						.empty()
 | |
| 						.html(msg || frappe._("Something went wrong!"))
 | |
| 						.toggle(true);
 | |
| 				} else {
 | |
| 					$('.cart-container table').hide();
 | |
| 					$(btn).hide();
 | |
| 					window.location.href = '/orders/' + encodeURIComponent(r.message);
 | |
| 				}
 | |
| 			}
 | |
| 		});
 | |
| 	},
 | |
| 
 | |
| 	request_quotation: function(btn) {
 | |
| 		return frappe.call({
 | |
| 			type: "POST",
 | |
| 			method: "erpnext.shopping_cart.cart.request_for_quotation",
 | |
| 			btn: btn,
 | |
| 			callback: function(r) {
 | |
| 				if(r.exc) {
 | |
| 					var msg = "";
 | |
| 					if(r._server_messages) {
 | |
| 						msg = JSON.parse(r._server_messages || []).join("<br>");
 | |
| 					}
 | |
| 
 | |
| 					$("#cart-error")
 | |
| 						.empty()
 | |
| 						.html(msg || frappe._("Something went wrong!"))
 | |
| 						.toggle(true);
 | |
| 				} else {
 | |
| 					$('.cart-container table').hide();
 | |
| 					$(btn).hide();
 | |
| 					window.location.href = '/quotations/' + encodeURIComponent(r.message);
 | |
| 				}
 | |
| 			}
 | |
| 		});
 | |
| 	},
 | |
| 
 | |
| 	bind_coupon_code: function() {
 | |
| 		$(".bt-coupon").on("click", function() {
 | |
| 			shopping_cart.apply_coupon_code(this);
 | |
| 		});
 | |
| 	},
 | |
| 
 | |
| 	apply_coupon_code: function(btn) {
 | |
| 		return frappe.call({
 | |
| 			type: "POST",
 | |
| 			method: "erpnext.shopping_cart.cart.apply_coupon_code",
 | |
| 			btn: btn,
 | |
| 			args : {
 | |
| 				applied_code : $('.txtcoupon').val(),
 | |
| 				applied_referral_sales_partner: $('.txtreferral_sales_partner').val()
 | |
| 			},
 | |
| 			callback: function(r) {
 | |
| 				if (r && r.message){
 | |
| 					location.reload();
 | |
| 				}
 | |
| 			}
 | |
| 		});
 | |
| 	}
 | |
| });
 | |
| 
 | |
| frappe.ready(function() {
 | |
| 	$(".cart-icon").hide();
 | |
| 	shopping_cart.parent = $(".cart-container");
 | |
| 	shopping_cart.bind_events();
 | |
| });
 | |
| 
 | |
| function show_terms() {
 | |
| 	var html = $(".cart-terms").html();
 | |
| 	frappe.msgprint(html);
 | |
| }
 |