add hidden account support add delete/payout buttons to carts add backend product sales with pdf export add frontend product sales with pdf export add frontend ticket sales with pdf export
587 lines
15 KiB
JavaScript
587 lines
15 KiB
JavaScript
function ProductSell(o){
|
|
|
|
/**reference for the instance*/
|
|
var app = this;
|
|
/**currently loaded product*/
|
|
this.product = null;
|
|
|
|
this.defaults = {
|
|
/**id of filter text*/
|
|
selector_filter_text: '#filter_text',
|
|
/**selector for customer cart container*/
|
|
selector_customer_cart: '.customer-cart',
|
|
selector_user_cart: '.user-cart',
|
|
selector_btn_pay_customer_cart: '#btn_pay_customer_cart',
|
|
selector_btn_pay_user_cart: '#btn_pay_user_cart',
|
|
/**mark list paid url*/
|
|
url_pay_customer_card: '-',
|
|
url_pay_user_cart: '',
|
|
/** ajax url for lookup service*/
|
|
lookup_product_url: '',
|
|
find_product_url: '',
|
|
/**the id of form*/
|
|
selector_form: '#product_form',
|
|
/**form contains error text*/
|
|
form_invalid: 'Az ürlap hibákat tartalmaz',
|
|
message_paid: 'Tételek fizetve',
|
|
/**list of sold items by current user*/
|
|
user_cart: [],
|
|
discounts: [],
|
|
customer_cart: [],
|
|
id_account: null,
|
|
products : [],
|
|
url_delete_transaction : '',
|
|
url_pay_transaction : '',
|
|
|
|
};
|
|
|
|
init();
|
|
|
|
function init(){
|
|
$.extend(app.defaults, o );
|
|
app.keyDate = null;
|
|
app.keySeq = '';
|
|
app.enterPressed = 0;
|
|
|
|
addSellBehaiours();
|
|
|
|
setFocus();
|
|
|
|
addListenerBehaviours();
|
|
|
|
createCarts();
|
|
|
|
addPayoutButtons();
|
|
|
|
productChanged();
|
|
// addDocumentKeypressedListener();
|
|
|
|
initAutocomplete();
|
|
disalbeMousewheelSpinOnNumberInput();
|
|
}
|
|
|
|
function disalbeMousewheelSpinOnNumberInput(){
|
|
$(':input[type=number]').on('mousewheel', function(e){
|
|
e.preventDefault();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* payout out user or customer cart
|
|
* */
|
|
function addPayoutButtons(){
|
|
addBehaviourPayoutUserCart();
|
|
addBehaviourPayoutCustomerCart();
|
|
}
|
|
/**
|
|
* display user and customer cart on page load
|
|
* */
|
|
function createCarts(){
|
|
createUserCartTable();
|
|
createCustomerCartTable();
|
|
}
|
|
|
|
/**
|
|
* add change and enter pressed listeners
|
|
* */
|
|
function addListenerBehaviours(){
|
|
addEnterPressedBehaviours();
|
|
addBehaviorCountChangedListener();
|
|
addBehaviourDisocuntChanged();
|
|
}
|
|
|
|
/**
|
|
* sell a product. there are three type of sell:
|
|
* - sell inmadietly
|
|
* - sell and put it to user cart
|
|
* - sell and put it to customer cart
|
|
* */
|
|
function addSellBehaiours(){
|
|
addBehaviourBtnSell();
|
|
addBehaviourBtnSellAndAppendToBill();
|
|
addBehaviourBtnAddToCustomerCart();
|
|
|
|
addBehaviorAjaxSubmit();
|
|
}
|
|
|
|
|
|
function addBehaviourDisocuntChanged(){
|
|
$("#productsaleform-id_discount").change(refreshCalculatedValues);
|
|
}
|
|
|
|
function addDocumentKeypressedListener(){
|
|
$( document ).keypress(function( event ) {
|
|
|
|
var tag = event.target.tagName.toLowerCase();
|
|
if ( tag != 'input' && tag != 'textarea') {
|
|
|
|
resetSequenceIfToMuchTimePassedOrEnterWasPressed(event);
|
|
|
|
if ( event.which == 13 ) {
|
|
app.enterPressed = 1;
|
|
$( document ).trigger( "wordtyped", [ { originalEvent: event, 'word': app.seq } ] );
|
|
}else {
|
|
appendCharToSeq(event);
|
|
}
|
|
}
|
|
});
|
|
|
|
$( document ).on( "wordtyped", function( event, data ) {
|
|
var word;
|
|
word = data.word;
|
|
if ( word.length > 0){
|
|
if ( word.length >= 6 && word.length <= 9 ){
|
|
//lookupuser
|
|
}else{
|
|
$("#filter_text").val(data.word);
|
|
_lookupProduct(data.word);
|
|
}
|
|
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function resetSequenceIfToMuchTimePassedOrEnterWasPressed(){
|
|
var prevDate, timePassed;
|
|
prevDate= app.keyDate;
|
|
app.keyDate = new Date().getTime();
|
|
timePassed = app.keyDate - prevDate;
|
|
if ( app.enterPressed > 0 || timePassed > 2000 ){
|
|
app.seq = '';
|
|
app.enterPressed = 0;
|
|
}
|
|
}
|
|
|
|
function appendCharToSeq(event){
|
|
var code,s;
|
|
code = event.which;
|
|
if ( code ){
|
|
s = String.fromCharCode(code);
|
|
app.seq += s;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add traversing between input elements on enter key pressed
|
|
* */
|
|
function addEnterPressedBehaviours(){
|
|
addBehaviorEnterPressedListener();
|
|
addBehaviorCountEnterPressedListener();
|
|
addBehaviorCurrencyEnterPressedListener();
|
|
addBehaviorAccountEnterPressedListener();
|
|
addBehaviorDiscountEnterPressedListener();
|
|
}
|
|
|
|
/**
|
|
* set the focus for text input #filter_text
|
|
* */
|
|
function setFocus(){
|
|
$("#filter_text").focus();
|
|
|
|
}
|
|
|
|
/**listen for enter key pressed on #filter_text*/
|
|
function addBehaviorEnterPressedListener(){
|
|
$( app.defaults.selector_filter_text ).keypress(function( event ) {
|
|
if ( event.which == 13 ) {
|
|
event.preventDefault();
|
|
$('#product_search').val('');
|
|
$(this).val( fixBarcode($(this).val()));
|
|
lookupProduct();
|
|
}
|
|
});
|
|
}
|
|
|
|
function fixBarcode(s){
|
|
var result;
|
|
result = s;
|
|
result = result.replace(/ö/g, "0");
|
|
return result;
|
|
}
|
|
|
|
/**listen for enter key pressed on #productsaleform-count*/
|
|
function addBehaviorCountEnterPressedListener(){
|
|
$( '#productsaleform-count' ).keypress(function( event ) {
|
|
if ( event.which == 13 ) {
|
|
event.preventDefault();
|
|
event.stopImmediatePropagation();
|
|
submitSellAndAppend();
|
|
}
|
|
});
|
|
}
|
|
/**listen for enter key pressed on #productsaleform-id_currency*/
|
|
function addBehaviorCurrencyEnterPressedListener(){
|
|
$( '#productsaleform-id_currency' ).keypress(function( event ) {
|
|
if ( event.which == 13 ) {
|
|
event.preventDefault();
|
|
event.stopImmediatePropagation();
|
|
$('#productsaleform-id_account').focus();
|
|
}
|
|
});
|
|
}
|
|
/**listen for enter key pressed on #productsaleform-id_account*/
|
|
function addBehaviorAccountEnterPressedListener(){
|
|
$( '#productsaleform-id_account' ).keypress(function( event ) {
|
|
if ( event.which == 13 ) {
|
|
event.preventDefault();
|
|
event.stopImmediatePropagation();
|
|
$('#productsaleform-id_discount').focus();
|
|
}
|
|
});
|
|
}
|
|
/**listen for enter key pressed on #productsaleform-id_discount*/
|
|
function addBehaviorDiscountEnterPressedListener(){
|
|
$( '#productsaleform-id_discount' ).keypress(function( event ) {
|
|
if ( event.which == 13 ) {
|
|
event.preventDefault();
|
|
event.stopImmediatePropagation();
|
|
$('#productsaleform-comment').focus();
|
|
}
|
|
});
|
|
}
|
|
/**listen for event "change" #productsaleform-count*/
|
|
function addBehaviorCountChangedListener(){
|
|
$( '#productsaleform-count' ).change(function( event ) {
|
|
refreshCalculatedValues();
|
|
|
|
});
|
|
}
|
|
|
|
/**load a product from server by exact barcode or product number*/
|
|
function lookupProduct(){
|
|
_lookupProduct($( app.defaults.selector_filter_text ).val());
|
|
}
|
|
|
|
function _lookupProduct(s){
|
|
var data, url;
|
|
|
|
url = app.defaults.lookup_product_url;
|
|
data = {
|
|
'query' : s,
|
|
};
|
|
|
|
$.ajax({
|
|
dataType: "json",
|
|
url: url,
|
|
data: data,
|
|
success: onLookupProductReady
|
|
});
|
|
}
|
|
|
|
function _findProduct(id){
|
|
var data, url;
|
|
|
|
url = app.defaults.find_product_url;
|
|
data = {
|
|
'id' : id,
|
|
};
|
|
|
|
$.ajax({
|
|
dataType: "json",
|
|
url: url,
|
|
data: data,
|
|
success: onLookupProductReady
|
|
});
|
|
}
|
|
|
|
/**succes event handler after lookup product event*/
|
|
function onLookupProductReady( data ){
|
|
app.product = data.product;
|
|
productChanged();
|
|
}
|
|
|
|
/**handles product change.*/
|
|
function productChanged( ){
|
|
clearForm();
|
|
if ( app.product != null){
|
|
applyProduct( app.product);
|
|
refreshCalculatedValues();
|
|
$("#productsaleform-count").focus().select();
|
|
}
|
|
}
|
|
|
|
function clearForm(){
|
|
var table;
|
|
table = $('.table-product');
|
|
table.find('.product-name').html('-');
|
|
table.find('.product-price').html('-');
|
|
table.find('.product-number').html('-');
|
|
table.find('.product-barcode').html('-');
|
|
table.find('.product-stock').html('-');
|
|
table.find('.product-price').html('-');
|
|
table.find('.product-sale-price').html('-');
|
|
$('#productsaleform-id_product').val('');
|
|
$('#productsaleform-id_account').val( app.defaults.id_account ? app.defaults.id_account : '');
|
|
$("#productsaleform-count").val(1);
|
|
//
|
|
}
|
|
|
|
function applyProduct(product){
|
|
var table;
|
|
table = $('.table-product');
|
|
table.find('.product-name').html(product.name);
|
|
table.find('.product-sale-price').html(product.sale_price);
|
|
table.find('.product-number').html(product.product_number);
|
|
table.find('.product-barcode').html(product.barcode);
|
|
table.find('.product-stock').html(product.stock);
|
|
$('#productsaleform-id_product').val(product.id_product);
|
|
if ( app.defaults.id_account == null)
|
|
$('#productsaleform-id_account').val(product.id_account);
|
|
|
|
}
|
|
|
|
function refreshCalculatedValues(){
|
|
var count,price,id_discount,discount;
|
|
var table;
|
|
table = $('.table-product');
|
|
count = $("#productsaleform-count").val();
|
|
id_discount = $("#productsaleform-id_discount").val();
|
|
app.discount = findDiscount( id_discount );
|
|
count = +count;
|
|
if ( isNaN(count)){
|
|
count = 0;
|
|
}
|
|
price = count * app.product.sale_price;
|
|
|
|
|
|
discount = calcDiscount(price, app.discount);
|
|
price = deductDiscount(price,discount);
|
|
price = normalizePrice(price);
|
|
|
|
table.find('.product-count').html(count);
|
|
table.find('.product-price').html(price);
|
|
}
|
|
|
|
function addBehaviourBtnSell(){
|
|
$('#btn_sell').on('click',submitSell);
|
|
}
|
|
|
|
function addBehaviourBtnSellAndAppendToBill(){
|
|
$('#btn_sell_append').on('click',submitSellAndAppend);
|
|
}
|
|
|
|
function addBehaviourBtnAddToCustomerCart(){
|
|
$('#btn_add_to_customer_cart').on('click',submitAddToCustomerCart);
|
|
}
|
|
|
|
function submitSell(){
|
|
$('#productsaleform-cart').val('');
|
|
$('#product_form').submit();
|
|
}
|
|
function submitSellAndAppend(){
|
|
$('#productsaleform-cart').val('user');
|
|
$('#product_form').submit();
|
|
}
|
|
|
|
|
|
function submitAddToCustomerCart(){
|
|
$('#productsaleform-cart').val('customer');
|
|
$('#product_form').submit();
|
|
}
|
|
|
|
function addBehaviorAjaxSubmit(){
|
|
|
|
$('body').on('afterValidate', '#product_form', function () {
|
|
var form = $(this);
|
|
// return false if form still have some validation errors
|
|
if ( form.find('.has-error').length ) {
|
|
$.notify(app.defaults.form_invalid, { 'type' : 'warning' });
|
|
}
|
|
|
|
});
|
|
|
|
|
|
$('body').on('beforeSubmit', '#product_form', function () {
|
|
var form = $(this);
|
|
// return false if form still have some validation errors
|
|
if (form.find('.has-error').length) {
|
|
$.notify(app.defaults.form_invalid, { 'type' : 'success' });
|
|
return false;
|
|
}
|
|
|
|
// submit form
|
|
$.ajax({
|
|
url: form.attr('action'),
|
|
type: 'post',
|
|
data: form.serialize(),
|
|
success: function (response) {
|
|
if ( response.code == 'success'){
|
|
$.notify(response.message, { 'type' : 'success' });
|
|
clearForm();
|
|
refreshCalculatedValues();
|
|
$("#filter_text").val('');
|
|
$("#product_search").val('');
|
|
setFocus();
|
|
app.defaults.user_cart = response.transfers;
|
|
app.defaults.customer_cart = response.customer_cart;
|
|
refreshUserCart();
|
|
refreshCustomerCart();
|
|
}else if ( response.code == 'invalid'){
|
|
if ( response.errors ){
|
|
$.each(response.errors, function (key, value){
|
|
var message;
|
|
message = $.map(value, function(obj){ return obj }).join(' ');
|
|
$.notify(message, { 'type' : 'danger' });
|
|
}
|
|
);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
return false;
|
|
});
|
|
|
|
}
|
|
|
|
|
|
function refreshUserCart(){
|
|
$(app.defaults.selector_user_cart).transferList( 'option', 'transfers' , app.defaults.user_cart );
|
|
}
|
|
function refreshCustomerCart(){
|
|
$(app.defaults.selector_customer_cart ).transferList( 'option', 'transfers' , app.defaults.customer_cart );
|
|
}
|
|
|
|
function addBehaviourPayoutUserCart( ){
|
|
$( app.defaults.selector_btn_pay_user_cart ).on('click',function(){
|
|
|
|
$.ajax({
|
|
url: app.defaults.url_pay_user_cart,
|
|
type: 'post',
|
|
data: {},
|
|
success: function (response) {
|
|
if ( response.code == 'success'){
|
|
app.defaults.user_cart = response.transfers;
|
|
refreshUserCart();
|
|
$.notify(app.defaults.message_paid, { 'type' : 'success' });
|
|
}
|
|
}
|
|
}
|
|
);
|
|
});
|
|
}
|
|
function addBehaviourPayoutCustomerCart( ){
|
|
$( app.defaults.selector_btn_pay_customer_cart ).on('click',function(){
|
|
alert('ok');
|
|
$.ajax({
|
|
url: app.defaults.url_pay_customer_card,
|
|
type: 'post',
|
|
data: {},
|
|
success: function (response) {
|
|
if ( response.code == 'success'){
|
|
app.defaults.customer_cart = response.customer_cart;
|
|
refreshCustomerCart();
|
|
}
|
|
$.notify(response.message, { 'type' : response.code });
|
|
},
|
|
error: function(){
|
|
alert('Hiba történt');
|
|
}
|
|
}
|
|
);
|
|
});
|
|
}
|
|
|
|
function createUserCartTable(){
|
|
$(app.defaults.selector_user_cart).transferList({
|
|
'transfers' : app.defaults.user_cart,
|
|
'url_delete' : app.defaults.url_delete_transaction,
|
|
'url_pay' : app.defaults.url_pay_transaction,
|
|
});
|
|
}
|
|
function createCustomerCartTable(){
|
|
$(app.defaults.selector_customer_cart).transferList({
|
|
'transfers' : app.defaults.customer_cart,
|
|
'url_delete' : app.defaults.url_delete_transaction,
|
|
'url_pay' : app.defaults.url_pay_transaction,
|
|
});
|
|
}
|
|
|
|
function findDiscount(id_discount){
|
|
var discount;
|
|
discount = null;
|
|
$.each( app.defaults.discounts , function(i,e){
|
|
if ( e.id_discount == id_discount ){
|
|
discount = e;
|
|
}
|
|
|
|
});
|
|
return discount;
|
|
}
|
|
|
|
function calcDiscount(price,discount){
|
|
var result, discountMoney;
|
|
result = 0;
|
|
|
|
if ( discount ){
|
|
result = price * ( discount.value / 100 );
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
function deductDiscount( price , discount ){
|
|
var result;
|
|
result = price - discount;
|
|
return result;
|
|
}
|
|
|
|
function normalizePrice( price ){
|
|
var result;
|
|
// result = hufRound(price);
|
|
return result;
|
|
}
|
|
|
|
function hufRound(x)
|
|
{
|
|
if (x > 0) {
|
|
return (x % 5) >= 2.5 ? parseInt(x / 5) * 5 + 5 : parseInt(x / 5) * 5;
|
|
} else {
|
|
return ((Math.abs(x) % 5) >= 2.5 ? parseInt(Math.abs(x) / 5) * 5 + 5 : parseInt(Math.abs(x) / 5) * 5)*-1;
|
|
}
|
|
}
|
|
|
|
|
|
function initAutocomplete(){
|
|
// var colors = ["red", "blue", "green", "yellow", "brown", "black"];
|
|
// $('#product_search').typeahead( {source: colors } );
|
|
|
|
var $input = $('#product_search');
|
|
$input.typeahead({source: app.defaults.products,
|
|
autoSelect: true,
|
|
items: 20,
|
|
minLength: 3,
|
|
// displayText: function (item){
|
|
// return item.
|
|
// }
|
|
|
|
});
|
|
$input.change(function() {
|
|
var current = $input.typeahead("getActive");
|
|
$("#filter_text").val('');
|
|
if (current) {
|
|
// Some item from your model is active!
|
|
if (current.name == $input.val()) {
|
|
// This means the exact match is found. Use toLowerCase() if you want case insensitive match.
|
|
console.info(current);
|
|
_findProduct(current.id_product);
|
|
} else {
|
|
// This means it is only a partial match, you can either add a new item
|
|
// or take the active if you don't want new items
|
|
console.info('partial');
|
|
app.product = null;
|
|
productChanged();
|
|
}
|
|
} else {
|
|
// Nothing is active so it is a new value (or maybe empty value)
|
|
console.info('incactive');
|
|
app.product = null;
|
|
productChanged();
|
|
}
|
|
});
|
|
}
|
|
|
|
}
|