'use strict';
angular.module('pos')
.controller('CheckoutCtrl', function ($scope, $routeParams, $http, $timeout, $interval) {
var webservice = 'api/?a=pos';
$scope.postParams = {
'project_id': "5",
'pos_id': 0,
'cashier': window.localStorage.getItem("cashier"),
'token': window.localStorage.getItem("token"),
'active': 1,
'disabled': 0
};
var postParams = $scope.postParams;
$scope.posList = _.range(0, 9);
$scope.filterInvoices = function (flag) {
if (flag == -1) {
return _.filter($scope.invoices, function (e) { return e.checkout != 0; });
}
return _.filter($scope.invoices, function (e) { return e.checkout == flag; });
};
$scope.lineTemplate = function () {
if ($scope.currentInvoice.last_line_number === undefined) {
$scope.currentInvoice.last_line_number = parseInt($scope.currentInvoice.details[0].line_number, 10);
}
$scope.currentInvoice.last_line_number += 1;
return {
'line_number': $scope.currentInvoice.last_line_number,
'item': "",
'seller_id': "",
'item_id': "",
'price': 0
};
};
$scope.invoiceTemplate = function () {
return {
'invoice_number': "",
'project_id': $scope.postParams.project_id,
'pos_id': $scope.postParams.pos_id,
'invoice_date': moment(),
'cashier': $scope.postParams.cashier,
'last_line_number': 1,
'line_count': 0,
'valid': false,
'total': 0.0,
'paid': 0.0,
'checkout': 0,
'printed': 0,
'details': [
{
'line_number': 1,
'item': "",
'seller_id': "",
'item_id': "",
'price': 0.0
}
]
};
};
var successSound = new Audio("sounds/success.wav");
var errorSound = new Audio("sounds/error.wav");
$scope.warning = 0;
$scope.warningInfo = [
"",
"Dieses Etikett wurde bereits gescannt",
"Etiketten-Nummer ungültig",
"Preis ungültig"
];
$scope.currentLine = 0;
$scope.currentLineType = '.item';
$scope.currentInvoice = $scope.invoiceTemplate();
$scope.showCurrentInvoice = false;
$scope.offlineInvoices = JSON.parse(window.localStorage.getItem("offlineInvoices"));
$scope.invoices = [];
$scope.soldItems = [];
$scope.total = function (pos) {
return _.reduce($scope.filterInvoices(pos), function (sum, i) { return sum + parseFloat(i.total); }, 0);
};
$scope.invoiceLineCount = function () {
return $scope.currentInvoice.details.length;
};
$scope.invoiceTotal = function () {
return _.reduce($scope.currentInvoice.details, function (sum, d) { return sum + parseFloat(d.price); }, 0);
};
$scope.addItem = function () {
$scope.currentInvoice.details.unshift($scope.lineTemplate());
};
$scope.removeItem = function (item) {
$scope.currentInvoice.details = _.without($scope.currentInvoice.details, item);
};
$scope.currentChange = function () {
if ($scope.currentInvoice.paid === 0.0
|| $scope.currentInvoice.paid == ""
|| $scope.currentInvoice.paid == Number.NaN) {
return 0.0;
}
$scope.currentInvoice.total = $scope.invoiceTotal();
return $scope.currentInvoice.paid - $scope.currentInvoice.total;
};
$scope.getInvoiceByNumber = function (invoiceNumber) {
return _.find($scope.invoices, function (e) { return e.invoice_number === invoiceNumber; });
};
$scope.editInvoice = function (invoiceNumber) {
$scope.currentInvoice = $scope.getInvoiceByNumber(invoiceNumber);
$scope.selectItem(0);
};
$scope.jumpEvent = function (event) {
var key = String.fromCharCode(event.which);
switch (key) {
case '*':
$scope.selectPrice($scope.currentLine+1);
return false;
case '/':
$('#paid').select();
$scope.validate();
return false;
case '+':
$scope.selectItem(0);
return false;
}
return true;
};
$("body").on('keypress', $scope.jumpEvent);
$scope.lineNumberComparator = function (v1, v2) {
return (parseInt(v1, 10) < parseInt(v2, 10)) ? -1 : 1;
};
$scope.keyPressModal = function (e) {
if (e.which === 13) {
e.preventDefault();
$(".modal").modal("hide");
$scope.selectItem();
}
return true;
};
$scope.showWarning = function (num) {
$scope.warning = num;
$('#warningModal').modal('show');
errorSound.play();
};
$scope.selectItem = function (index, itemType) {
if (index !== undefined) {
$scope.currentLine = index;
}
if (itemType !== undefined) {
$scope.currentLineType = itemType;
} else {
$scope.currentLineType = '.item';
}
$timeout(function () {
$($scope.currentLineType)[$scope.currentLine].select();
}, 300, true);
};
$scope.selectPrice = function (index) {
$scope.selectItem(index, '.price');
};
$scope.currentSoldItems = function (index) {
var list = _.pluck($scope.currentInvoice.details, 'item');
var needle = list[index];
list[index] = "";
for (var i = 0; i < list.length; i++) {
if (list[i] === needle) {
return i;
}
}
return index;
};
$scope.keyPressItem = function (e, i) {
if (e.which === 13) {
e.preventDefault();
var currentItem = $scope.currentInvoice.details[i];
if ($scope.currentLine !== i && currentItem.item === "") {
return true;
}
if (!currentItem.item.match(/^\d{3}-\d{3}$/gi)) {
$scope.showWarning(2);
} else if ($scope.currentInvoice.invoice_number == 0 && _.contains($scope.soldItems, currentItem.item)) {
$scope.showWarning(1);
} else if ($scope.currentSoldItems(i) !== i) {
errorSound.play();
$scope.selectPrice($scope.currentSoldItems(i));
currentItem.item = "";
return false;
} else {
successSound.play();
$scope.selectPrice(i);
return true;
}
$scope.selectItem(i);
return false;
}
var key = String.fromCharCode(e.which);
if (key == '/') {
e.preventDefault();
}
return true;
};
$scope.keyPressPrice = function (e, i) {
if (e.which === 13) {
var currentPrice = $scope.currentInvoice.details[i].price;
if (!currentPrice.toString().match(/^\d+(\.\d\d?)?$/gi) || currentPrice <= 0) {
errorSound.play();
e.preventDefault();
$scope.selectPrice(i);
return false;
}
if ($scope.currentInvoice.details[0].item !== "") {
$scope.addItem();
}
successSound.play();
$scope.selectItem(0);
return false;
}
var key = String.fromCharCode(e.which);
if (key == '/') {
e.preventDefault();
}
return true;
};
$scope.keyPressPaid = function (e) {
$scope.validate();
if (e.which === 13) {
$scope.checkOut();
}
};
$scope.validate = function () {
var i = 0, item;
for (i = $scope.currentInvoice.details.length - 1; i >= 0; i--) {
if ($scope.currentInvoice.details[i].price == 0 && $scope.currentInvoice.details[i].item === "") {
$scope.removeItem($scope.currentInvoice.details[i]);
break;
}
item = $scope.currentInvoice.details[i];
if (!item.price.toString().match(/^\d+(\.\d\d?)?$/gi) || item.price <= 0) {
$scope.selectPrice(i);
errorSound.play();
$scope.currentInvoice.valid = false;
return false;
}
if (item.item === "" || !item.item.match(/^\d{3}-\d{3}$/gi)
|| ($scope.currentInvoice.invoice_number == 0 && _.contains($scope.soldItems, item.item))) {
$scope.selectItem(i);
errorSound.play();
$scope.currentInvoice.valid = false;
return false;
}
item.seller_id = item.item.substring(0, 3);
item.item_id = item.item.substring(4, 7);
}
if ($scope.currentInvoice.details.length === 0) {
$scope.addItem();
$scope.selectItem(0);
errorSound.play();
$scope.currentInvoice.valid = false;
return false;
}
$scope.currentInvoice.cashier = $scope.postParams.cashier;
$scope.currentInvoice.line_count = $scope.currentInvoice.details.length;
$scope.currentInvoice.invoice_date = moment();
$scope.currentInvoice.valid = true;
return true;
};
$scope.checkOut = function () {
if (isNaN($scope.currentInvoice.paid) || $scope.currentInvoice.paid == '' || $scope.currentInvoice.paid == 0) {
$scope.currentInvoice.paid = $scope.currentInvoice.total;
}
$scope.saveInvoice($scope.currentInvoice);
window.localStorage.setItem("cashier", $scope.postParams.cashier);
$scope.currentInvoice = $scope.invoiceTemplate();
$scope.selectItem(0);
};
if ($scope.offlineInvoices === null) {
$scope.offlineInvoices = [];
}
if ($scope.postParams.token === null) {
$scope.postParams.token = 0;
}
$scope.setActive = function () {
$scope.postParams.active = 1;
$scope.refreshStatus();
};
$scope.setInactive = function () {
$scope.postParams.active = 0;
$scope.refreshStatus();
};
$scope.closePos = function () {
$scope.postParams.disabled = 1;
$scope.refreshStatus();
};
$scope.refreshStatus = function () {
$http.post(webservice + '_token', postParams).then(function (response) {
$scope.postParams.token = response.data.token;
window.localStorage.setItem("token", $scope.postParams.token);
$scope.postParams.active = response.data.active;
$scope.postParams.disabled = response.data.disabled;
});
};
$scope.saveInvoice = function (invoice) {
$http.post(webservice + '_invoices', { 'params': $scope.postParams, 'invoice': invoice })
.then(function (response) {
if (response.data.invoice_number !== undefined) {
$scope.offlineInvoices = _.without($scope.offlineInvoices, invoice);
$scope.invoices[$scope.invoices.length] = response.data;
} else if (!_.contains($scope.offlineInvoices, invoice)) {
$scope.offlineInvoices.push(invoice);
}
window.localStorage.setItem("offlineInvoices", JSON.stringify($scope.offlineInvoices));
});
};
$scope.loadInvoice = function (invoiceNumber) {
$http.post(webservice + '_invoices', { 'params': $scope.postParams, 'invoice_number': invoiceNumber })
.then(function (response) {
if (response.data.invoice_number !== undefined) {
$scope.currentInvoice = response.data;
$scope.showCurrentInvoice = true;
$scope.selectItem(0);
}
});
};
$scope.printInvoice = function (invoiceNumber) {
$http.post(webservice + '_print', { 'params': $scope.postParams, 'invoice_number': invoiceNumber })
.then(function (response) {
if (response.data.invoice_number !== undefined) {
var invoice = $scope.getInvoiceByNumber(invoiceNumber);
invoice.printed = 1;
// $scope.currentInvoice = null;
}
});
};
$scope.setCheckout = function (state) {
$scope.currentInvoice.checkout = state;
};
$scope.performCheckout = function (invoice) {
$http.post(webservice + '_checkout', { 'params': $scope.postParams, 'invoice': invoice })
.then(function (response) {
if (response.data.invoice_number === undefined) {
// undo
invoice.checkout = 0;
}
$scope.refresh();
});
};
$scope.refresh = function () {
for (var i = 0; i < $scope.offlineInvoices.length; i++) {
$timeout($scope.saveInvoice($scope.offlineInvoices[i]), 3000 * i);
}
$http.post(webservice + '_infos', $scope.postParams)
.then(function (response) {
//$scope.soldItems = response.data.items;
$scope.invoices = response.data.invoices;
});
};
$interval($scope.refresh, 60 * 1000);
$scope.refreshStatus();
$scope.refresh();
});