president/public/js/store.js

817 lines
22 KiB
JavaScript
Executable File

var cx_uuid = '';
var original_title;
$(document).ready(function() {
console.log('ready');
storeInitializer();
});
function storeInitializer() {
$('#right_ribbon').show();
$('#bottom_ribbon').show();
var search = localStorage.getItem('store_search');
$('#store_search').val(search);
cx_uuid = localStorage.getItem('cx_uuid');
if (cx_uuid) {
customerGrabber(cx_uuid);
}
$('.store_item_type').each(function(i,v) {
var type = $(v).attr('type');
var status = localStorage.getItem('sit_' + type);
$(v).attr('status', status);
});
storeItemTypeGrabber();
var category = localStorage.getItem('store_category')
if (category != '') {
storeCategoryOpener(category);
}
if (search) {
storeSearch();
}
original_title = $('title').text();
}
$(document).on('click', '.store_item_type', function() {
var sit = $(this);
var type = $(this).attr('type');
var status = $(this).attr('status');
storeItemTypeGrabber();
if (status == 'on') {
status = 'off';
}
else {
status = 'on';
}
sit.attr('status', status);
localStorage.setItem('sit_' + type, status);
var opened = 'no';
$('.store_category').each(function(i,v) {
if ($(v).attr('status') == 'open') {
opened = 'yes';
}
});
if (opened == 'yes') {
storeCategoryOpener($('.store_category[status=open]').attr('category'));
}
else {
storeSearch();
}
});
function storeCategoryOpener(category) {
$.ajax({
url: '/store/category_grabber',
type: 'GET',
data: { category: category, types: storeItemTypeGrabber() },
success: function(response) {
// console.log(response);
$('#items_view').html(response.content);
$('.store_subcategories[category="' + category + '"]').html(response.subcategories).show();
$('.store_category[category="' + category + '"]').attr('status', 'open');
}
});
}
$(document).on('click', '.store_category', function() {
var cat = $(this);
var category = cat.attr('category');
var status = cat.attr('status');
$('.store_subcategory').attr('status', 'closed');
$('.store_category').attr('status', 'closed');
if (status == 'closed') {
cat.attr('status','open');
localStorage.setItem('store_category', category);
storeCategoryOpener(category)
}
else {
cat.attr('status', 'closed');
localStorage.removeItem('store_category');
$('.store_subcategories[category="' + category + '"]').html('').hide();
}
});
function storeItemTypeGrabber() {
var types = [];
$('.store_item_type').each(function(i,v) {
if ($(v).attr('status') == 'on') {
types.push($(v).attr('type'));
}
});
return JSON.stringify(types);
}
$(document).on('click', '.store_subcategory', function() {
var sub = $(this);
var category = sub.attr('category');
var subcategory = sub.attr('subcategory');
var status = sub.attr('status');
var count = sub.attr('count');
$('.store_subcategory').attr('status', 'closed');
$('.store_category').attr('status', 'closed');
console.log(status);
if (status == 'closed') {
$.ajax({
url: '/store/category_grabber',
type: 'GET',
data: { category: category, subcategory: subcategory, count: count, types: storeItemTypeGrabber() },
success: function(response) {
$('#items_view').html(response.content);
// $('.store_subcategories[category="' + category + '"]').html(response.subcategories).show();
sub.attr('status', 'open');
$('.store_subcategories[category="' + category + '"][subcategory="' + subcategory +'"]').html(response.subcategories).show();
}
});
}
else {
sub.attr('status', 'closed');
}
});
var storeSearchInterval;
$(document).on('keyup click', '#store_search', function() {
storeSearch();
});
function storeSearch() {
if ($('#store_search').is(':visible')) {
var search = $('#store_search').val();
var timestamp = Date.now();
clearTimeout(storeSearchInterval);
storeSearchInterval = setTimeout(function() {
if (search.length >= 2) {
localStorage.setItem('store_search', search);
$.ajax({
url: '/store/search',
type: 'POST',
data: { search: search, timestamp: timestamp, types: storeItemTypeGrabber() },
success: function(response) {
console.log(response);
$('#items_view').html(response.content);
}
});
}
else {
$('#items_view').html('');
localStorage.removeItem('store_search');
}
},500);
}
}
$(document).on('click', '.store_item', function() {
var s = $(this);
quote = { info: {}, model: [], options: {} };
var item = s.attr('item');
storeItem(item,quote);
});
function storeItem(item,quote) {
var manufacturer = $('#item_manufacturer_select').val();
$.ajax({
url: '/store/item',
type: 'GET',
data: { item: item, manufacturer: manufacturer },
success: function(response) {
console.log(response);
$('#item_view').html(response.template);
$('#item_view').show();
$('#item_manufacturer_select').val(manufacturer);
$('#specs').html(response.settings.specs);
$('#specs_toggle').show();
if (cx_uuid != '') {
$('.save_quote').attr('cx', cx_uuid).show();
}
if (quote.item) {
populateQuote(quote);
}
else {
saveQuote();
}
if (response.settings) {
$('#item_view').css({ 'background-color': response.settings.colour });
}
else {
setTimeout(function() {
$('#item_view').hide();
},2000);
}
}
});
}
$(document).on('change', '#item_manufacturer_select', function() {
var item = $(this).closest('.item').attr('item');
storeItem(item,saveQuote());
});
$(document).on('mousewheel touchmove', '#item_view', function(e) {
var sq = $(this).find('.save_quote');
var cq = $(this).find('.cancel_button');
//clearTimeout(itScroll);
itScroll = setTimeout(function() {
var newY = $('#item_view').scrollTop();
$('#price_information').css({'bottom': 20 - newY });
sq.css({'top': newY });
cq.css({'top': newY });
},100);
});
function populateQuote(quote) {
console.log(quote);
$('.item_model').attr('select', 'off');
$('.item_option').attr('select', 'off');
$('.item').find('.store_movement').val(quote['movement']);
var model = $('.item_model[uuid="' + quote.model.uuid + '"');
model.attr('select', 'on');
model.attr('price', numeral(quote.model.price).value());
model.attr('discount', numeral(quote.model.discount).value());
model.find('.quantity').val(quote.model.quantity);
model.find('.unit').val(quote.model.unit);
$('.price_display[uuid="' + model.uuid + '"]').text(numeral(model.price).format('$0.00'));
$.each(quote.options, function(i,v) {
$.each(v, function(o,option) {
var optional = $('.item_option[uuid="' + option.uuid + '"]');
optional.attr('select','on');
optional.attr('price', option.price);
optional.attr('discount', option.discount);
$('.price_display[uuid="' + option.uuid + '"]').text(numeral(option.price).format('$0.00'));
optional.find('.quantity').val(option.quantity || 1);
optional.find('.unit').val(option.unit || 1);
});
});
saveQuote();
}
$(document).on('change', '.store_movement', function() {
var value = $(this).val();
$('.store_movement').val(value);
settingSetter({ 'app': 'store', 'setting': 'store_movement', 'value': value });
});
$(document).on('click', '#specs_toggle', function() {
if ($('#specs_balloon').is(':visible')) {
$('#specs_balloon').hide();
}
else {
$('#specs_balloon').show();
}
});
$(document).on('click', '.item_image_thumb', function() {
var t = $(this);
var st = $('.item').parent().scrollTop();
if (t.attr('type') == 'image') {
if ($('#store_main_image').attr('src') == t.attr('pre_src')) {
$('.item').parent().scrollTop(st - $('#store_main_image').height());
$('#store_main_image').attr('src','').hide();
}
else {
var ps = $('#store_main_image').attr('src');
$('#store_main_image').attr('src', t.attr('pre_src')).show();
$('#store_main_video').hide();
if (ps == '') {
$('.item').parent().scrollTop(st - $('#store_main_image').height());
}
}
}
else if (t.attr('type') == 'video') {
if ($('#store_main_video').attr('src') == t.attr('pre_src')) {
$('.item').parent().scrollTop(st - $('#store_main_video').height());
$('#store_main_video').attr('src','').hide();
}
else {
var ps = $('#store_main_video').attr('src');
$('#store_main_video').attr('src', t.attr('pre_src')).show();
$('#store_main_image').hide();
if (ps == '') {
$('.item').parent().scrollTop(st - $('#store_main_video').height());
}
}
}
});
$(document).on('click', '.cancel_button', function() {
$('#item_view').hide();
$('#specs_toggle, #specs_balloon').hide();
});
$(document).on('click', '.save_quote', function() {
var i = $(this).closest('.item');
storeWriter();
});
var quote = { info: {}, model: [], options: {} };
function saveQuote() {
var timestamp = Date.now();
quote['item'] = $('#item').attr('item');
quote['uuid'] = $('#item').attr('uuid') || 'new';
quote['id'] = $('.item').attr('quote_id');
quote['movement'] = $('.item').find('.store_movement').val();
quote['timestamp'] = timestamp;
$('.item_model[select="on"]').each(function(i,v) {
var model = $(v);
var uuid = model.attr('uuid');
var price = model.attr('price');
var cost = model.attr('cost');
var discount = model.attr('discount');
var name = model.attr('name');
var quantity = model.find('.quantity').val();
var unit = model.find('.unit').val();
var tax = price * me_tax - price;
quote['model'] = { timestamp: timestamp, uuid: uuid, name: name, price: price, quantity: quantity, unit: unit, discount: discount, cost: cost, tax: tax, tax_rate: me_tax };
});
$('.item_option[select="on"]').each(function(i,v) {
var option = $(v);
var uuid = $(v).attr('uuid');
var category = $(v).attr('option_category');
if (quote['options'][category] == undefined) {
quote['options'][category] = [];
}
$.each(quote['options'][category], function(n,va) {
if (va.uuid == uuid) {
quote['options'][category].splice(n,1);
}
else {
}
});
var uuid = option.attr('uuid');
var price = option.attr('price');
var cost = option.attr('cost');
var discount = option.attr('discount');
console.log(discount);
var name = option.attr('name');
var category = option.attr('option_category');
var quantity = option.find('.quantity').val();
var unit = option.find('.unit').val();
var tax = price * me_tax - price;
var seen_it = 0;
var data = { uuid: uuid, category: category, cost: cost, price: price, quantity: quantity, unit: unit, discount: discount, name: name, timestamp: timestamp, tax: tax, tax_rate: me_tax };
quote['options'][category].push(data);
});
quote['numbers'] = doTheMath();
return quote;
}
$(document).on('click', '.delete_quote', function() {
var a = $(this);
var timestamp = Date.now();
var uuid = a.attr('uuid');
var server_time = a.closest('.quote').attr('server_time');
var cx_uuid = a.attr('cx_uuid');
var type = a.attr('doc_type');
var armed = a.attr('armed');
if (armed == 'yes') {
$.ajax({
url: '/store/quote/delete',
type: 'POST',
data: { server_time: server_time, timestamp: timestamp, uuid: uuid, cx_uuid: cx_uuid, type: type },
success: function(response) {
customerList(cx_uuid,type);
}
});
}
else {
a.attr('armed', 'yes');
var bgcolor = a.css('background-color');
a.css({'background-color': 'red' });
setTimeout(function() {
a.css({'background-color': bgcolor });
a.attr('armed', 'no');
},2000);
}
});
$(document).on('click', '.pi', function() {
var pi = $(this);
if (pi.is('input')) {
return;
}
$('.pi').each(function(i,v) {
if ($(v).is('input')) {
$(v).hide();
}
else {
$(v).show();
}
});
var edit = $('#' + pi.attr('id') + '_edit');
edit.val(numeral(pi.text()).value());
edit.show();
edit.focus();
pi.hide();
});
$(document).on('change', '.pi', function() {
var pi = $(this);
if (!pi.is('input')) {
return;
}
pi.hide();
var id = pi.attr('id');
markupCalculator(id);
id = id.replace('_edit','');
console.log(id);
$('#' + id).show();
});
$(document).on('click', '.quote_move', function() {
var timestamp = Date.now();
var uuid = $(this).attr('uuid');
var cx_uuid = $(this).attr('cx_uuid');
var action = $(this).attr('action');
var type = $(this).attr('type');
$.ajax({
url: '/store/quote/move',
type: 'POST',
data: { timestamp: timestamp, uuid: uuid, cx_uuid: cx_uuid, action: action, type: type },
success: function(response) {
customerList(cx_uuid,type);
}
});
});
$(document).on('click', '.print', function() {
var timestamp = Date.now();
var type = $(this).attr('type');
var cx_uuid = $(this).attr('cx_uuid');
var uuid = $(this).attr('uuid');
$.ajax({
url: '/store/print',
type: 'GET',
data: {
timestamp: timestamp,
type: type,
uuid: uuid,
cx_uuid: cx_uuid
},
success: function(response) {
console.log(response);
$('#printer_view').html(response).show();
$('#everything').hide();
if ($('#printer_title').length > 0) {
$('title').text($('#printer_title').text());
}
}
});
});
$(document).on('click', '#printer_view', function() {
$('#everything').show();
$('#printer_view').hide();
$('title').text(original_title);
});
function storeWriter() {
var store = localStorage.getItem('store') || '{ "items": {}, "total_price": 0 }';
store = JSON.parse(store);
console.log(store);
var timestamp = Date.now();
var total_price = 0;
var q = saveQuote();
var quote = JSON.stringify(q);
$.ajax({
url: '/store/quote/save',
type: 'POST',
data: { quote: quote, movement: q['movement'], timestamp: timestamp, item: q.item, uuid: q.uuid, cx: cx_uuid },
success: function(response) {
if (!response.error) {
$('.item').attr('quote_uuid', response['quote']['uuid']);
$('.item').attr('quote_id', response['quote']['id']);
}
}
});
localStorage.setItem('store', JSON.stringify(store));
$('#total_price').text(total_price);
}
$(document).on('click', '.quote_title', function() {
var uuid = $(this).attr('uuid');
$.ajax({
url: '/store/quote/load',
type: 'GET',
data: { uuid: uuid },
success: function(response) {
console.log(response);
storeItem(response.item,response);
$('#main_viewer').html('').hide().attr('type', '');
}
});
});
$(document).on('click', '.item_model', function(e) {
if ($(e.target).is('.unit, .quantity')) {
return;
}
var model = $(this);
var timestamp = Date.now();
var selected = model.attr('select');
var uuid = model.attr('uuid');
var price = model.attr('price');
var cost = model.attr('cost');
var name = model.attr('name');
$('.item_model').attr('select', 'off');
quote['model'] = { timestamp: timestamp, uuid: uuid, price: price, cost: cost, name: name };
if (selected == 'on') {
}
else {
model.attr('select', 'on');
}
saveQuote();
});
$(document).on('click', '.item_option', function(e) {
if ($(e.target).is('.unit, .quantity')) {
return;
}
var option = $(this);
var timestamp = Date.now();
var category = option.attr('option_category');
var selected = option.attr('select');
var option_category = $('.item_option_category[option_category="' + category + '"]');
var grouping = option_category.attr('grouping') || 1;
if (quote['options'][category] == undefined) {
quote['options'][category] = [];
}
var selected_options = quote['options'][category];
if (selected == 'on') {
option.attr('select', 'off');
$.each(selected_options, function(i,v) {
console.log(v);
if (v != undefined && option.attr('uuid') == v.uuid) {
quote['options'][category].splice(i,i + 1);
}
});
}
else {
option.attr('select', 'on');
var uuid = option.attr('uuid');
var price = option.attr('price');
var cost = option.attr('cost');
var name = option.attr('name');
var category = option.attr('option_category');
var tax = (price * me_tax) - price;
quote['options'][category].push({ uuid: uuid, category: category, cost: cost, price: price, name: name, timestamp: timestamp, tax: tax, tax_rate: me_tax });
}
$('.item_option[option_category="' + category + '"]').attr('select', 'off');
selected_options.splice(0, selected_options.length - grouping);
$.each(selected_options, function(i,v) {
$('.item_option[uuid="' + v.uuid + '"]').attr('select', 'on');
});
saveQuote();
});
$(document).on('change', '.quantity, .unit', function() {
saveQuote();
});
$(document).on('click', '.quantity, .unit', function(e) {
e.preventDefault();
});
function doTheMath() {
var total_price = 0;
var total_cost = 0;
var total_discount = 0;
var price = numeral($('.item').attr('price')).value();
var model_price = numeral($('.item_model[select="on"]').attr('original_price')).value();
var model_cost = numeral($('.item_model[select="on"]').attr('cost')).value();
var model_discount = numeral($('.item_model[select="on"]').attr('discount')).value();
var option_price = 0;
var option_cost = 0;
var option_discount = 0;
var option_quantity = 1;
$('.item_option[select="on"]').each(function(i,v) {
option_quantity = numeral($(v).find('.quantity').val() || 1).value();
option_price += numeral($(v).attr('original_price')).value() * option_quantity;
option_cost += numeral($(v).attr('cost')).value() * option_quantity;
option_discount += numeral($(v).attr('discount')).value() * option_quantity;
option_quantity = 1;
});
total_discount = Math.abs(model_discount + option_discount) * -1;
total_price = model_price + option_price + total_discount;
total_cost = model_cost + option_cost;
var markup = (total_price / total_cost - 1);
if (markup == Infinity) {
markup = 1;
}
console.log(markup);
var r = {
subtotal: total_price,
cost: total_cost,
markup: markup,
discount: total_discount,
tax: (me_tax * total_price) - total_price,
total: me_tax * total_price,
tax_rate: me_tax,
};
$('.display_price').text(numeral(r.subtotal).format('$0.00'));
$('.display_cost').text(numeral(r.cost).format('$0.00'));
$('.display_markup').text(numeral(r.markup).format('0.00%'));
$('.display_discount').text(numeral(r.discount).format('$0.00'));
$('.display_tax').text(numeral(r.tax).format('$0.00'));
$('.display_total').text(numeral(r.total).format('$0.00'));
return r;
}
function markupCalculator(id) {
var angle = $('#' + id);
var formatted_id = id.replace('_edit','');
var type = angle.attr('angle');
var value = angle.val();
console.log(type + ' is the angle');
var quote = saveQuote();
console.log(quote);
if (type == 'markup') {
$('#' + formatted_id).text(numeral(value).format('0.00%'));
}
else {
$('#' + formatted_id).text(numeral(value).format('$0.00'));
}
var r = {
};
if (type == 'total') {
r.total = numeral(value).value();
r.subtotal = r.total / me_tax;
r.tax = ( r.subtotal * me_tax ) - r.subtotal;
$('.display_price').text(numeral(r.subtotal).format('$0.00'));
$('.display_tax').text(numeral(r.tax).format('$0.00'));
}
else if (type == 'price') {
r.subtotal = numeral(value).value();
r.total = r.subtotal * me_tax;
var tax = ( r.subtotal * me_tax ) - r.subtotal;
$('.display_total').text(numeral(r.total).format('$0.00'));
$('.display_tax').text(numeral(r.tax).format('$0.00'));
}
else if (type == 'cost') {
}
else if (type == 'markup') {
}
else if (type == 'discount') {
}
var ratio = quote.numbers.subtotal / r.subtotal;
var discount = 0;
$('.item_model,.item_option').each(function(i,v) {
if ($(v).attr('select') == 'on') {
var percentage = (numeral($(v).attr('price')).value() + numeral($(v).attr('discount')).value()) / quote['numbers']['subtotal'];
console.log(percentage);
var original_price = numeral($(v).attr('original_price')).value();
var discounted = numeral($(v).attr('original_discount')).value();
console.log(numeral($(v).attr('price')).value());
var new_price = r.subtotal * percentage;
discounted = (new_price - original_price);
discount += (new_price - original_price);
console.log(new_price + ' ' + discounted);
$(v).attr('discount', discounted);
$(v).attr('price', new_price);
var uuid = $(v).attr('uuid');
var opd = $('.original_price_display[uuid="' + uuid + '"]');
var pd = $('.price_display[uuid="' + uuid + '"]');
pd.text(numeral(new_price).format('$0.00'));
if (discounted != 0) {
opd.show();
pd.css({ 'color': 'red' });
}
else {
opd.hide();
pd.css({ 'color': 'black' });
}
}
});
}
$(document).on('keyup click change', '#customer_search', function() {
var search = $(this).val();
var movement = $('.store_movement').val();
$.ajax({
url: '/manager/store/customer_search',
type: 'GET',
data: { search: search, movement: movement },
success: function(response) {
if (response.count > 0) {
$('#customer_search_results').html(response.results).show();;
}
else {
$('#customer_search_results').html('').hide();
}
}
});
});
$(document).on('click', '.cx_result', function() {
var cx = $(this).attr('cx');
$('#customer_search_results').hide();
$('#customer_cancel').show();
customerGrabber(cx);
});
function customerGrabber(cx) {
$.ajax({
url: '/manager/store/customer_load',
type: 'GET',
data: { cx: cx },
success: function(response) {
$('#customer').html(response.content);
$('#customer_search').val(response.formatted_name);
console.log(response);
cx_uuid = response.settings.uuid;
$('.save_quote').attr('cx', cx_uuid).show();
$('#customer_cancel').show();
localStorage.setItem('cx_uuid', cx_uuid);
$('#customer_search_results').hide();
if ($('#main_viewer').is(':visible')) {
var list = $('#main_viewer').attr('type');
customerList(cx_uuid,list);
}
$('#customer_search').hide();
$('.customer_name').text(response.formatted_name).attr('onclick', 'appointmentGrabber(\'' + response.settings.app + '\')');
}
});
}
$(document).on('click', '.customer_list', function() {
var list = $(this).attr('type');
if ($('#main_viewer').attr('type') == list) {
$('#main_viewer').html('').hide().attr('type','');
}
else {
customerList(cx_uuid,list);
}
});
function customerList(cx,list) {
$.ajax({
url: '/manager/store/customer_list',
type: 'GET',
data: { cx: cx, list: list },
success: function(response) {
console.log(response);
$('#main_viewer').html(response.content).show().css({ 'background-color': response.settings.colour });
$('#main_viewer').attr('type', list);
}
});
}
$(document).on('click', '.main_viewer_cancel_button', function() {
$('#main_viewer').html('').hide().attr('type', '');
});
$(document).on('click', '#customer_cancel', function() {
cx_uuid = '';
$('#cx').remove();
$('.save_quote').hide();
$('#customer_search').val('');
$('#customer_cancel').hide();
$('#customer_search').show();
$('.customer_name').hide().text('');
$('#main_viewer').html('').hide().attr('type','');
localStorage.removeItem('cx_uuid');
});
$(document).on('keydown', function(e) {
if (topWindow() == 'store') {
/*
if (e.keyCode == 37) {
galleryImageControl('prev');
}
if (e.keyCode == 39) {
galleryImageControl('next')
}
*/
}
});