| Current Path : /home/users/unlimited/www/eshop.codeskitter.site/assets/admin/custom/ |
| Current File : /home/users/unlimited/www/eshop.codeskitter.site/assets/admin/custom/pos.js |
"use strict";
/* POS - Point of Sale system starts */
if (document.readyState == 'loading') {
document.addEventListener('DOMContentLoaded', ready);
} else {
ready();
}
function ready() {
display_cart();
var addToCartButtons = document.getElementsByClassName('shop-item-button');
for (var i = 0; i < addToCartButtons.length; i++) {
var button = addToCartButtons[i];
button.addEventListener('click', add_to_cart);
}
}
function purchaseClicked() {
var cartItems = document.getElementsByClassName('cart-items')[0];
while (cartItems.hasChildNodes()) {
cartItems.removeChild(cartItems.firstChild);
}
update_cart_total();
update_final_cart_total();
}
$(document).on("click", ".remove-cart-item", function (e) {
e.preventDefault();
if (e.delegateTarget.activeElement.classList.value.includes("remove-cart-item")) {
iziToast.error({
message: ['Product removed from cart'],
});
var variant_id = $(this).data("variant_id");
$(this).parent().parent().remove();
var cart = localStorage.getItem("cart");
cart = (localStorage.getItem("cart") !== null) ? JSON.parse(cart) : null;
if (cart) {
var new_cart = cart.filter(function (item) { return item.variant_id != variant_id });
localStorage.setItem("cart", JSON.stringify(new_cart));
display_cart();
}
}
});
$(document).on("click", ".cart-quantity-input", function (e) {
var operation = $(this).data("operation");
var variant_id = $(this).siblings().val();
var input = (operation == "plus") ? $(this).siblings()[1] : $(this).siblings()[2];
var qty = $(this).parent().siblings('.item-quantity').find('.cart-quantity-input').val();
var qty = parseInt(input.value, 10);
var data = input.value = (operation == "minus") ? qty - 1 : qty + 1;
update_quantity(data, variant_id);
});
$(document).on("change", ".cart-quantity-input-new", function (e) {
var variant_id = $(this).siblings().val();
var quantity = $(this).val();
var data = quantity;
update_quantity(data, variant_id);
});
function update_quantity(data, variant_id) {
if (isNaN(data) || data <= 0) {
data = 1;
}
var cart = localStorage.getItem("cart");
cart = (localStorage.getItem("cart") !== null) ? JSON.parse(cart) : null;
if (cart) {
var i = cart.map(i => i.variant_id).indexOf(variant_id);
cart[i].quantity = data;
localStorage.setItem("cart", JSON.stringify(cart));
display_cart();
}
}
function SafeParseFloat(val) {
if (isNaN(val)) {
if ((val = val.match(/([0-9\.,]+\d)/g))) {
val = val[0].replace(/[^\d\.]+/g, '');
}
}
return parseFloat(val);
}
function add_to_cart(e) {
var cartRow = document.createElement('div');
cartRow.classList.add('cart-row');
var button = e.target;
var shopItem = button.parentElement.parentElement;
var variant_dropdown = shopItem.children[0].children[2];
var display_price = variant_dropdown.value;
var product_id = shopItem.getElementsByClassName('shop-item-id')[0].innerText;
var variant_id = variant_dropdown.options[variant_dropdown.selectedIndex].dataset.variant_id;
var seller_id = shopItem.getElementsByClassName('shop-item-partner-id')[0].innerText
var variant_values = variant_dropdown.options[variant_dropdown.selectedIndex].dataset.variant_values;
var special_price = variant_dropdown.options[variant_dropdown.selectedIndex].dataset.special_price;
var price = variant_dropdown.options[variant_dropdown.selectedIndex].dataset.price;
var title = shopItem.getElementsByClassName('shop-item-title')[0].innerText;
var image = shopItem.getElementsByClassName('item-image')[0].src;
/* create JSON array object */
var cart_item = { "product_id": product_id.trim(), "seller_id": seller_id.trim(), "variant_id": variant_id, "title": title, "variant": variant_values, "image": image, "display_price": display_price.trim(), "quantity": 1, "special_price": special_price, "price": price };
var cart = localStorage.getItem("cart");
cart = (localStorage.getItem("cart") !== null) ? JSON.parse(cart) : null;
if (cart !== null && cart !== undefined) {
if (cart.find((item) => item.variant_id === variant_id)) {
alert("This item is already present in your cart");
return;
} else {
iziToast.success({
message: ['Product added to cart'],
});
}
cart.push(cart_item);
} else {
cart = [cart_item];
}
localStorage.setItem("cart", JSON.stringify(cart));
display_cart();
}
function wordLimit(string, length = 22, dots = "...") {
return string.length > length ? string.slice(0, length - dots.length) + dots : string;
}
function display_cart() {
var cart = localStorage.getItem("cart");
cart = (localStorage.getItem("cart") !== null) ? JSON.parse(cart) : null;
var currency = $(".cart-total-price").attr('data-currency');
var cartRowContents = "";
if (cart !== null && cart.length > 0) {
cart.forEach((item) => {
cartRowContents += `
<div class="container">
<div class="row">
<div class="col-md-4">
<div class="cart-image">
<img class="mr-4" src="${item.image}">
</div>
<p class="cart-item-title ">${wordLimit(item.title)}</p>
</div>
<div class="col-md-3">
<span class="cart-price">${currency + parseFloat(item.display_price).toLocaleString()}</span>
</div>
<div class="col-md-3">
<div class="input-group-prepend">
<input type="hidden" class="product-variant" name="variant_ids[]" type="number" value=${item.variant_id}>
<button type="button" class="cart-quantity-input btn btn-xs btn-secondary" data-operation="plus">+</button>
<input class="cart-quantity-input-new form-control text-center p-0" name="quantity[]"value="${item.quantity}">
<button type="button" class="cart-quantity-input btn btn-xs btn-secondary" data-operation="minus">-</button>
</div>
</div>
<div class="col-md-2 text-center">
<button class="btn btn-xs btn-danger remove-cart-item" data-variant_id=${item.variant_id}><i class="fas fa-trash"></i></button>
</div>
</div>
</div>`
})
} else {
cartRowContents = `
<div class="container">
<div class="row">
<div class="col mt-4 d-flex justify-content-center text-primary h5">No items in cart</div>
</div>
</div>`;
}
$(".cart-items").html(cartRowContents);
update_cart_total();
update_final_cart_total();
}
function get_cart_total() {
var cart = localStorage.getItem("cart");
var cart = (cart !== null && cart !== undefined) ? JSON.parse(cart) : null;
var cart_total = 0;
if (cart !== null && cart !== undefined) {
cart_total = cart.reduce((cart_total, item) =>
cart_total + (parseFloat(item.display_price) * parseFloat(item.quantity)), 0);
}
var currency = $('#cart-total-price').attr('data-currency');
var total = { "currency": currency, "cart_total": cart_total, "cart_total_formated": parseFloat(cart_total).toLocaleString() }
return total;
}
function update_cart_total() {
var total = get_cart_total();
$('#cart-total-price').html(total.currency + "" + total.cart_total_formated);
return;
}
//final total
function get_final_cart_total() {
var cart = localStorage.getItem("cart");
var cart = (cart !== null && cart !== undefined) ? JSON.parse(cart) : null;
var cart_total = 0;
if (cart !== null && cart !== undefined) {
cart_total = cart.reduce((cart_total, item) =>
cart_total + (parseFloat(item.display_price) * parseFloat(item.quantity)), 0);
}
var currency = $('#cart-total-price').attr('data-currency');
var total = {
"currency": currency,
"total": cart_total,
"cart_total_formated": parseFloat(cart_total).toLocaleString()
}
return total;
}
$(document).on("change", ".delivery_charge_service", function (e) {
e.preventDefault();
update_final_cart_total();
return;
});
$(document).on("change", ".discount_service", function (e) {
update_final_cart_total();
return;
});
function update_final_cart_total() {
var cart = get_cart_total();
var sub_total = cart.cart_total;
var delivery_charges = $(".delivery_charge_service").val();
var discount = $("#discount_service").val();
var final_total = sub_total;
var currency = $('#cart-total-price').attr('data-currency');
// Check if discount is greater than subtotal
if (parseFloat(discount) > parseFloat(sub_total)) {
alert("Discount cannot be greater than the subtotal.");
return; // Stop further calculations
}
if (delivery_charges != 0 && delivery_charges != null) {
final_total = parseFloat(final_total) + parseFloat(delivery_charges);
}
if (discount != 0 && discount != null) {
final_total = parseFloat(final_total) - parseFloat(discount);
}
var res = {
"currency": currency,
"total": final_total,
"cart_total": parseFloat(final_total).toLocaleString()
}
$('#final_total').html(final_total.currency + "" + final_total.cart_total_formated);
$('#final_total').html(res.currency + "" + res.cart_total);
return;
}
$(".final_total").on("click", function () {
final_total();
update_final_cart_total();
});
$(".final_total").on("change", function () {
final_total();
update_final_cart_total();
});
// get products
function get_products(category_id = '', limit = 2, offset = 0, search_parameter = '') {
$.ajax({
type: 'GET',
url: `${base_url}seller/point_of_sale/get_products?category_id=${category_id}&limit=${limit}&offset=${offset}&search=${search_parameter}`,
dataType: 'json',
beforeSend: function () {
$("#get_products").html(`<div class="text-center" style='min-height:450px;' ><h4>Please wait.. . loading products..</h4></div>`);
},
success: function (data) {
if (data.error == false) {
$("#total_products").val(data.products.total);
$('#get_products').empty();
display_products(data.products);
var total = $("#total_products").val();
var current_page = $("#current_page").val();
var limit = $("#limit").val();
var search_parameter = $("#search_products").val();
paginate(total, current_page, limit, search_parameter);
} else {
$('#get_products').html(data.message);
$('#get_products').empty();
}
}
});
}
// display products
function display_products(products) {
var display_products = '';
var i;
var j;
var products = products.product;
if (products !== null && products.length > 0) {
for (i = 0; i < products.length; i++) {
display_products +=
'<div class="text-center col-lg-4 p-3">' +
'<div class="shop-item m-2">' +
'<div class="d-flex flex-column">' +
'<span class="d-none shop-item-id">' +
' <b>' + products[i].id + '</b>' +
' </span>' +
'<span class="shop-item-title ">' +
' <a class="title-link" href=' + base_url + 'seller/product/view_product?edit_id=' + products[i].id + ' target="_BLANK"><h6 class="text text-dark title_wrap text-bold" title="' + products[i].name + '">' + products[i].name + '</h6><div class="title-overlay"></div></a>' +
' </span>' +
'<div class="shop-item-image d-flex justify-content-center align-item-center">' +
' <img class="item-image" src="' + products[i].image + '">' +
'</div>' +
'</div>' +
'<span class="d-none shop-item-partner-id">' + products[i].seller_id + '</span>' +
'<select class="form-control mt-4 product-variants variant_value" id="change">';
var total_price = document.getElementById('cart-total-price');
var currency = "";
if ($('#cart-total-price').length) {
currency = total_price.getAttribute('data-currency');
}
var variants = products[i]['variants'];
for (j = 0; j < variants.length; j++) {
var variant_values = (variants[j]['variant_values']) ? variants[j]['variant_values'] + ' - ' : "";
var variant_price = variants[j]['special_price'] > 0 ? variants[j]['special_price'] : variants[j]['price'];
display_products += '<option data-variant_values="' + variants[j]['variant_values'] + '" data-price="' + variants[j]['price'] + '" data-special_price="' + variants[j]['special_price'] + '" data-variant_id="' + variants[j]['id'] + '" value="' + variant_price + " " + '" class="shop-item-price" > ' + variant_values + currency + " " + parseFloat(variant_price).toLocaleString() + '</option > ';
}
display_products += '</select></div>' +
' <div class ="shop-item-details justify-content-center">' +
' <button class ="btn btn-xs btn-info shop-item-button p-1" onclick="add_to_cart(event)" type ="button">Add to Cart</button>' +
' </div>' +
' </div>' +
'</div >' +
'</div > ';
}
$('#get_products').append(display_products)
} else {
$("#get_products").html(`<div class="text-center" style='min-height:450px;' ><h4> No products available in this category...</h4></div>`);
}
}
var session_user_id = $('#session_user_id').val()
var cart = localStorage.getItem('cart')
cart = (cart != null || cart == '') ? JSON.parse(cart) : ''
if (cart != '') {
if (cart.find(item => item.seller_id != session_user_id)) {
localStorage.removeItem('cart')
display_cart()
}
}
$(document).ready(function () {
var category_id = $('#product_categories').val();
var limit = $('#limit').val();
var offset = $('#offset').val();
get_products(category_id, limit, offset);
});
// category wise product change
$('#product_categories').on("change", function () {
var category_id = $('#product_categories').val();
var limit = $('#limit').val();
$('#current_page').val("0");
get_products(category_id, limit, 0);
});
$(document).ready(function () {
$("#product_categories").on("change", function () {
$("#get_products").empty();
});
});
// transaction id input
$(document).ready(function () {
$('.transaction_id').hide();
$('.payment_method_name').hide();
});
/* payment method selected event */
$(".payment_method").on('click', function () {
var payment_method = $(this).val();
var exclude_txn_id = ["COD"];
var include_payment_method_name = ["other"];
if (exclude_txn_id.includes(payment_method)) {
$(".transaction_id").hide();
} else {
$(".transaction_id").show();
}
if (include_payment_method_name.includes(payment_method)) {
$('.payment_method_name').show();
} else {
$('.payment_method_name').hide();
}
});
// select 2 js select user
$(".select_user").select2({
ajax: {
url: base_url + 'seller/point_of_sale/get_users',
type: "GET",
dataType: 'json',
delay: 250,
data: function (params) {
return {
search: params.term, // search term
};
},
processResults: function (response) {
return {
results: response
};
},
cache: true
},
minimumInputLength: 1,
theme: 'bootstrap4',
placeholder: 'Search for user',
});
// clear selected values in select2
$("#clear_user_search").on('click', function () { $(".select_user").empty(); });
// Register in pos
$(document).on('submit', '#register_form', function (e) {
e.preventDefault();
var name = $('#name').val();
var mobile = $('#mobile').val();
var formData = new FormData(this);
formData.append(csrfName, csrfHash);
$.ajax({
type: 'POST',
url: $(this).attr('action'),
dataType: 'json',
data: formData,
processData: false,
contentType: false,
beforeSend: function () {
$('#save-register-result-btn').html('Please Wait..');
$('#save-register-result-btn').attr('disabled', true);
},
success: function (result) {
csrfName = result['csrfName'];
csrfHash = result['csrfHash'];
if (result.error == false) {
iziToast.success({
message: result.message,
});
$('#register_form')[0].reset();
} else {
iziToast.error({
message: result.message,
});
}
$('#save-register-result-btn').html('Register').attr('disabled', false);
}
});
});
var pos_user_id = 0;
$('#select_user_id').on('change', function () {
pos_user_id = ($('#select_user_id').val());
});
$('#pos_form').on('submit', function (e) {
e.preventDefault();
if (confirm('Are you sure? Want to check out?')) {
var cart = localStorage.getItem("cart");
if (cart == null || !cart) {
var message = "Please add items to cart";
show_message("Oops!", message, "error");
return;
}
var delivery_charges = $('.delivery_charge_service').val();
if (!delivery_charges) {
delivery_charges = '';
}
var discount = parseFloat($('.discount_service').val()) || 0; // Ensure discount is a number
var cart_total = get_cart_total().cart_total; // Assuming get_cart_total() returns the cart total
if (discount > cart_total) {
show_message("Oops!", "Discount cannot be greater than the subtotal", "error");
return;
}
var payment_method = $('.payment_method:checked').val();
var self_pickup = ($('.self_pickup:checked').length > 0) ? $('.self_pickup:checked').val() : 0;
if (!payment_method) {
var message = "Please choose a payment method";
show_message("Oops!", message, "error");
return;
}
var txn_id = $('#transaction_id').val();
if (!txn_id && payment_method != 'COD') {
var message = "Please enter transaction ID";
show_message("Oops!", message, "error");
return;
}
var payment_method_name = $('#payment_method_name').val();
if (!payment_method_name) {
payment_method_name = '';
}
const request_body = {
[csrfName]: csrfHash,
data: cart,
payment_method: payment_method,
self_pickup: self_pickup,
user_id: pos_user_id,
txn_id: txn_id,
delivery_charges: delivery_charges,
discount: discount,
payment_method_name: payment_method_name
}
$.ajax({
type: 'POST',
url: $(this).attr('action'),
data: request_body,
dataType: 'json',
success: function (result) {
csrfName = result['csrfName'];
csrfHash = result['csrfHash'];
if (result.error == true) {
iziToast.error({
message: '<span>' + result.message + '</span>',
});
} else {
iziToast.success({
message: '<span style="text-transform:capitalize">' + result.message + '</span>',
});
delete_cart_items();
setTimeout(function () { location.reload(); }, 600);
}
}
});
}
});
// Clear Cart
$(document).on("click", ".btn-clear_cart", function (e) {
e.preventDefault();
delete_cart_items();
});
function delete_cart_items() {
localStorage.removeItem("cart");
display_cart();
}
function show_message(prefix = "Great!", message, type = 'success') {
Swal.fire(prefix, message, type);
}
function paginate(total, current_page, limit) {
var number_of_pages = Math.ceil(total / limit);
var pagination = `<div class="row p-2">
<div class="col-12">
<div class="d-flex justify-content-center">
<ul class="pagination mb-0">`;
// Previous button
pagination += `<li class="page-item ${current_page === 0 ? 'disabled' : ''}">
<a class="page-link" href="javascript:void(0)" onclick="prev_page()">Previous</a>
</li>`;
// Page numbers
var startPage = Math.max(current_page - 1, 0);
var endPage = Math.min(current_page + 1, number_of_pages - 1);
if (startPage > 0) {
pagination += `<li class="page-item"><a class="page-link" href="javascript:void(0)" onclick="go_to_page(${limit}, 0)">1</a></li>`;
if (startPage > 1) {
pagination += `<li class="page-item disabled"><span class="page-link">...</span></li>`;
}
}
for (var i = startPage; i <= endPage; i++) {
var active = (current_page === i) ? "active" : "";
pagination += `<li class="page-item ${active}">
<a class="page-link" href="javascript:void(0)" onclick="go_to_page(${limit}, ${i})">${i + 1}</a>
</li>`;
}
if (endPage < number_of_pages - 1) {
if (endPage < number_of_pages - 2) {
pagination += `<li class="page-item disabled"><span class="page-link">...</span></li>`;
}
pagination += `<li class="page-item"><a class="page-link" href="javascript:void(0)" onclick="go_to_page(${limit}, ${number_of_pages - 1})">${number_of_pages}</a></li>`;
}
// Next button
pagination += `<li class="page-item ${current_page === number_of_pages - 1 ? 'disabled' : ''}">
<a class="page-link" href="javascript:void(0)" onclick="next_page()">Next</a>
</li>`;
pagination += `</ul>
</div>
</div>
</div>`;
$(".pagination-container").html(pagination);
}
function go_to_page(limit, page_number) {
var total = $("#total_products").val();
var category_id = $("#product_categories").val();
var offset = page_number * limit;
get_products(category_id, limit, offset);
paginate(total, page_number, limit);
$("#limit").val(limit);
$("#offset").val(offset);
$("#current_page").val(page_number);
}
function prev_page() {
var current_page = $("#current_page").val();
var total = $("#total_products").val();
var limit = $("#limit").val();
var prev_page = parseFloat(current_page) - 1;
if (prev_page >= 0) {
go_to_page(limit, prev_page);
}
}
function next_page() {
var current_page = $("#current_page").val();
var total = $("#total_products").val();
var limit = $("#limit").val();
var number_of_pages = total / limit;
var next_page = parseFloat(current_page) + 1;
if (next_page < number_of_pages) {
go_to_page(limit, next_page);
}
}
// search products
$('#search_products').on('keyup', function (e) {
e.preventDefault();
var search = $(this).val();
get_products('', 25, 0, search)
});
/* POS - Point of Sale system ends */