From b4968ee892ffb257952d7216f2c878cd5d79862e Mon Sep 17 00:00:00 2001 From: Casper Boone Date: Sat, 30 Jun 2018 14:24:11 +0200 Subject: [PATCH 1/2] Fix indentation --- src/renderer/components/BarSessionHome.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/BarSessionHome.vue b/src/renderer/components/BarSessionHome.vue index b5c92b2..4dd66c7 100644 --- a/src/renderer/components/BarSessionHome.vue +++ b/src/renderer/components/BarSessionHome.vue @@ -35,7 +35,7 @@
-
From 7a97b15c89071f858d87f0361059f0ba35c6cd89 Mon Sep 17 00:00:00 2001 From: Casper Boone Date: Mon, 8 Jul 2019 17:44:29 +0200 Subject: [PATCH 2/2] Add changes for v3 --- package-lock.json | 96 ++++++++- package.json | 5 + src/renderer/BarSession.js | 90 ++++---- src/renderer/BarSessionFile.js | 28 +-- src/renderer/BarSessionType.js | 32 ++- src/renderer/Bill.js | 10 - src/renderer/CashDrawerContents.js | 40 ++++ src/renderer/CashState.js | 16 -- src/renderer/SafeContents.js | 63 ++++++ src/renderer/Unicenta.js | 59 ++++++ src/renderer/assets/logo.png | Bin 61878 -> 0 bytes src/renderer/assets/styles/main.css | 26 ++- src/renderer/components/BarSession.vue | 120 ----------- .../components/BarSessionCashDrawerTicket.vue | 37 ++++ .../BarSessionCashSpecificationTicket.vue | 68 ------ src/renderer/components/BarSessionHome.vue | 197 ++++++++++-------- .../components/BarSessionOverview.vue | 133 ------------ src/renderer/components/BarSessionPrinter.vue | 30 --- src/renderer/components/BarSessionTicket.vue | 151 +++++++++----- src/renderer/components/CashStateForm.vue | 73 ------- src/renderer/components/HelpNote.vue | 6 + src/renderer/components/MoneyInput.vue | 2 +- src/renderer/components/SystemButtons.vue | 42 ---- src/renderer/components/TopBar.vue | 2 +- src/renderer/components/Totals.vue | 99 --------- src/renderer/components/steps/CashForm.vue | 80 +++++++ src/renderer/components/steps/Close.vue | 22 ++ src/renderer/components/steps/Review.vue | 122 +++++++++++ .../components/steps/SessionDetails.vue | 55 +++++ src/renderer/components/steps/StartPos.vue | 31 +++ src/renderer/components/steps/Totals.vue | 121 +++++++++++ src/renderer/main.js | 32 ++- src/renderer/router/index.js | 10 - tailwind.js | 1 + 34 files changed, 1054 insertions(+), 845 deletions(-) delete mode 100644 src/renderer/Bill.js create mode 100644 src/renderer/CashDrawerContents.js delete mode 100644 src/renderer/CashState.js create mode 100644 src/renderer/SafeContents.js create mode 100644 src/renderer/Unicenta.js delete mode 100644 src/renderer/assets/logo.png delete mode 100644 src/renderer/components/BarSession.vue create mode 100644 src/renderer/components/BarSessionCashDrawerTicket.vue delete mode 100644 src/renderer/components/BarSessionCashSpecificationTicket.vue delete mode 100644 src/renderer/components/BarSessionOverview.vue delete mode 100644 src/renderer/components/BarSessionPrinter.vue delete mode 100644 src/renderer/components/CashStateForm.vue create mode 100644 src/renderer/components/HelpNote.vue delete mode 100644 src/renderer/components/SystemButtons.vue delete mode 100644 src/renderer/components/Totals.vue create mode 100644 src/renderer/components/steps/CashForm.vue create mode 100644 src/renderer/components/steps/Close.vue create mode 100644 src/renderer/components/steps/Review.vue create mode 100644 src/renderer/components/steps/SessionDetails.vue create mode 100644 src/renderer/components/steps/StartPos.vue create mode 100644 src/renderer/components/steps/Totals.vue diff --git a/package-lock.json b/package-lock.json index 2b0f556..6a3d54f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,6 +38,11 @@ "integrity": "sha1-PaDM6dbsY3OWS4TzXbfPw996tRQ=", "dev": true }, + "accounting": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/accounting/-/accounting-0.4.1.tgz", + "integrity": "sha1-h91BA+/39EYPHhhvXGd+1s9WaIM=" + }, "accounting-js": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/accounting-js/-/accounting-js-1.1.1.tgz", @@ -1639,6 +1644,11 @@ "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" }, + "bignumber.js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", + "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==" + }, "binary": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", @@ -2755,8 +2765,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { "version": "2.2.2", @@ -6966,8 +6975,7 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", @@ -7442,8 +7450,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isbinaryfile": { "version": "3.0.2", @@ -8479,6 +8486,46 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "mysql": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.16.0.tgz", + "integrity": "sha512-dPbN2LHonQp7D5ja5DJXNbCLe/HRdu+f3v61aguzNRQIrmZLOeRoymBYyeThrR6ug+FqzDL95Gc9maqZUJS+Gw==", + "requires": { + "bignumber.js": "4.1.0", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, "nan": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz", @@ -11246,8 +11293,7 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "progress": { "version": "2.0.0", @@ -12697,6 +12743,11 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, + "sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" + }, "sshpk": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", @@ -13803,8 +13854,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utila": { "version": "0.4.0", @@ -13875,11 +13925,24 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-2.5.16.tgz", "integrity": "sha512-/ffmsiVuPC8PsWcFkZngdpas19ABm5mh2wA7iDqcltyCTwlgZjHGeJYOXkBMo422iPwIcviOtrTCUpSfXmToLQ==" }, + "vue-currency-filter": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vue-currency-filter/-/vue-currency-filter-3.2.0.tgz", + "integrity": "sha512-/2e+sreniqWO9UAvnh/WgcJn22r3LEYth/zC6h9f54j6a5KaC0iSeXK0L7sgaPqHviN00+PESqcGDDfnlQaVQg==", + "requires": { + "accounting": "0.4.1" + } + }, "vue-electron": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/vue-electron/-/vue-electron-1.0.6.tgz", "integrity": "sha1-55jgMYC4kzU53v4x+S5TuSQrlAY=" }, + "vue-form-wizard": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/vue-form-wizard/-/vue-form-wizard-0.8.4.tgz", + "integrity": "sha512-/Zk1+B7bz7qHFJ16mwu021lpPXWf/9Tlr2mTNG3J7M0Hdy3rgA802lWsbKYySns0B0qtsD8BYGjQ2Wyxgg+4uw==" + }, "vue-hot-reload-api": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz", @@ -14062,6 +14125,14 @@ } } }, + "vue-moment": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vue-moment/-/vue-moment-4.0.0.tgz", + "integrity": "sha512-lNkEPuA3i3A4q4TDSwOXoRF4Y2vHHdaTOSvpPyGgxoFQP8n4sUh6jU5aJj3FIMlXo5UaHLPIz5hvvpvYx9Wj0w==", + "requires": { + "moment": "2.21.0" + } + }, "vue-numeric": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/vue-numeric/-/vue-numeric-2.3.0.tgz", @@ -14126,6 +14197,11 @@ "resolved": "https://registry.npmjs.org/vuejs-datepicker/-/vuejs-datepicker-0.9.29.tgz", "integrity": "sha512-9zHkUrDudf1Ej+Mkd/BtjE23R+SXU665REK30iOWmreDPXMJk8vqdhVRRHNyPYfCFaEUaDGOgZl0G83xTdwhFw==" }, + "vuelidate": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/vuelidate/-/vuelidate-0.7.4.tgz", + "integrity": "sha512-QHZWYOL325Zo+2K7VBNEJTZ496Kd8Z31p85aQJFldKudUUGBmgw4zu4ghl4CyqPwjRCmqZ9lDdx4FSdMnu4fGg==" + }, "vuex": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/vuex/-/vuex-2.5.0.tgz", diff --git a/package.json b/package.json index a111afa..ff2510b 100644 --- a/package.json +++ b/package.json @@ -26,17 +26,22 @@ "autoprefixer": "^8.1.0", "cssnano": "^3.10.0", "moment": "^2.21.0", + "mysql": "^2.16.0", "postcss-cssnext": "^3.1.0", "postcss-import": "^11.1.0", "postcss-loader": "^2.1.1", "sugarss": "^1.0.1", "vue": "^2.3.3", + "vue-currency-filter": "^3.2.0", "vue-electron": "^1.0.6", + "vue-form-wizard": "^0.8.4", + "vue-moment": "^4.0.0", "vue-numeric": "^2.3.0", "vue-paginate": "^3.5.1", "vue-router": "^2.5.3", "vue2-filters": "^0.3.0", "vuejs-datepicker": "^0.9.29", + "vuelidate": "^0.7.4", "vuex": "^2.3.1" }, "devDependencies": { diff --git a/src/renderer/BarSession.js b/src/renderer/BarSession.js index 93feb78..adc68b1 100644 --- a/src/renderer/BarSession.js +++ b/src/renderer/BarSession.js @@ -1,71 +1,57 @@ -import CashState from './CashState' +import BarSessionType from './BarSessionType' +import CashDrawerContents from './CashDrawerContents' +import SafeContents from './SafeContents' import BarSessionFile from './BarSessionFile' export default class BarSession { - constructor (type, date, file = BarSessionFile.fromTypeAndDate(type, date)) { - this.initialCashState = new CashState() - this.finalCashState = new CashState() - this._effluentCashState = new CashState(false) + constructor () { + this.date = new Date() + this.type = BarSessionType.getDefaultForDate(this.date) + this.originalAuthorName = '' + this.closingAuthorName = '' - this.theoreticalCashRegisterStaffTotal = 0 - this.theoreticalCashRegisterTotal = 0 + this.cashAtStart = new CashDrawerContents() + this.cashAtEnd = new CashDrawerContents() + this.cashToSafe = new SafeContents(this.cashAtEnd) // Serialization note: SafeContents has extra fields - this.theoreticalPinTotal = 0 + this.posDataRetrieved = false + this.posCashTotal = 0.0 + this.posPinTotal = 0.0 + this.posFreeTotal = 0.0 - this.pinTerminalTotal = 0 + this.actualPinTotal = 0.0 - this.type = type - this.date = date - - this.file = file - } - - theoreticalCashRegisterRevenue () { - return this.theoreticalCashRegisterTotal - this.theoreticalCashRegisterStaffTotal - } - - cashDifferenceTotal () { - return this.finalCashState.total() - this.initialCashState.total() - } - - revenueTotal () { - return this.cashDifferenceTotal() + this.pinTerminalTotal + this.file = undefined } - effluentTotal () { - return this.effluentCashState().total() + saveToDisk () { + if (!this.file) { + this.file = BarSessionFile.fromTypeAndDate(this.type, this.date) + } + this.file.store(this) } - changeSafeTotal () { - return this.finalCashState.total() - this.effluentTotal() - } + static fromFile (file, contents) { + const barSession = new BarSession() - effluentCashState () { - let state = new CashState(false) + barSession.date = new Date(contents.date) + barSession.type = BarSessionType.getById(contents.type.id) + barSession.originalAuthorName = contents.originalAuthorName + barSession.closingAuthorName = contents.closingAuthorName - state.author = this.finalCashState.author + barSession.cashAtStart = CashDrawerContents.fromFile(contents.cashAtStart) + barSession.cashAtEnd = CashDrawerContents.fromFile(contents.cashAtEnd) + barSession.cashToSafe = SafeContents.fromFile(barSession.cashAtEnd, contents.cashToSafe) - // Always put all 50 and 100 euro bills in the grey safe - state.bills[0].count = this.finalCashState.bills[0].count - state.bills[1].count = this.finalCashState.bills[1].count + barSession.posDataRetrieved = contents.posDataRetrieved + barSession.posCashTotal = contents.posCashTotal + barSession.posPinTotal = contents.posPinTotal + barSession.posFreeTotal = contents.posFreeTotal - const totalCash = this.finalCashState.total() - this.finalCashState.emergencyCash + barSession.actualPinTotal = contents.actualPinTotal - // Starting with the 20 euro bills, put more in the grey safe until the remainder - // is close to 200 - let nextBill = 2 - while (totalCash - state.total() > 220 && nextBill < state.bills.length) { - state.bills[nextBill].count = Math.min( - this.finalCashState.bills[nextBill].count, - Math.floor((totalCash - state.total() - 200) / state.bills[nextBill].amount) - ) - nextBill++ - } + barSession.file = file - return state - } - - store () { - this.file.store(this) + return barSession } } diff --git a/src/renderer/BarSessionFile.js b/src/renderer/BarSessionFile.js index 404510d..ba24de8 100644 --- a/src/renderer/BarSessionFile.js +++ b/src/renderer/BarSessionFile.js @@ -3,11 +3,10 @@ import fs from 'fs' import path from 'path' import uniqueFilename from 'unique-filename' import BarSession from './BarSession' -import Bill from './Bill' import BarSessionType from './BarSessionType' const userDataPath = path.join(remote.app.getPath('userData')) -const prefix = 'session' +const prefix = 'sessionv2' export default class BarSessionFile { constructor (filePath) { @@ -36,30 +35,7 @@ export default class BarSessionFile { const fileContents = fs.readFileSync(this.filePath, 'utf8') const rawObject = JSON.parse(fileContents) - const date = new Date(rawObject.date) - const type = BarSessionType.getById(rawObject.type.id) - - const barSession = new BarSession(type, date, this) - - barSession.initialCashState.bills = rawObject.initialCashState.bills.map(bill => new Bill(bill.amount, bill.count)) - barSession.initialCashState.author = rawObject.initialCashState.author - barSession.initialCashState.emergencyCash = rawObject.initialCashState.emergencyCash - - barSession.finalCashState.bills = rawObject.finalCashState.bills.map(bill => new Bill(bill.amount, bill.count)) - barSession.finalCashState.author = rawObject.finalCashState.author - barSession.finalCashState.emergencyCash = rawObject.finalCashState.emergencyCash - - barSession._effluentCashState.bills = rawObject._effluentCashState.bills.map(bill => new Bill(bill.amount, bill.count)) - barSession._effluentCashState.author = rawObject._effluentCashState.author - barSession._effluentCashState.emergencyCash = rawObject._effluentCashState.emergencyCash - - barSession.theoreticalCashRegisterStaffTotal = rawObject.theoreticalCashRegisterStaffTotal - barSession.theoreticalCashRegisterTotal = rawObject.theoreticalCashRegisterTotal - barSession.theoreticalPinTotal = rawObject.theoreticalPinTotal - - barSession.pinTerminalTotal = rawObject.pinTerminalTotal - - return barSession + return BarSession.fromFile(this, rawObject) } parseType () { diff --git a/src/renderer/BarSessionType.js b/src/renderer/BarSessionType.js index 341abd2..510e56a 100644 --- a/src/renderer/BarSessionType.js +++ b/src/renderer/BarSessionType.js @@ -1,16 +1,36 @@ -const types = ['EatingOUT', 'Fillum', 'Outsite', 'Vrijdagbar', 'Potterie', 'Overig'] - -export default class BarSessionType { +class BarSessionType { static all () { - return types.map((name, id) => new BarSessionType(id, name)) + return types + } + + static getDefaultForDate (date) { + const type = types.find(type => type.dayOfTheWeek === date.getDay()) + + if (type === undefined) { + return types.find(type => type.dayOfTheWeek === -1) + } + + return type } static getById (id) { - return new BarSessionType(id, types[id]) + return types.find(type => type.id === id) } - constructor (id, name) { + constructor (id, name, dayOfTheWeek = -1) { this.id = id this.name = name + this.dayOfTheWeek = dayOfTheWeek } } + +const types = [ + new BarSessionType(0, 'EatingOUT', 2), + new BarSessionType(1, 'Fillum', 3), + new BarSessionType(2, 'Outsite', 4), + new BarSessionType(3, 'Vrijdagbar', 5), + new BarSessionType(4, 'SHE', 6), + new BarSessionType(5, 'Other') +] + +export default BarSessionType diff --git a/src/renderer/Bill.js b/src/renderer/Bill.js deleted file mode 100644 index 4fd4d29..0000000 --- a/src/renderer/Bill.js +++ /dev/null @@ -1,10 +0,0 @@ -export default class Bill { - constructor (amount, count = 0) { - this.amount = amount - this.count = count - } - - total () { - return this.amount * this.count - } -} diff --git a/src/renderer/CashDrawerContents.js b/src/renderer/CashDrawerContents.js new file mode 100644 index 0000000..ee8c9c2 --- /dev/null +++ b/src/renderer/CashDrawerContents.js @@ -0,0 +1,40 @@ +const billValues = [100, 50, 20, 10, 5, 2, 1, 0.50, 0.20, 0.10, 0.05] + +class Bill { + constructor (amount, count = 0) { + this.amount = amount + this.count = count + } + + total () { + return this.amount * this.count + } +} + +export default class CashDrawerContents { + constructor () { + this.bills = billValues.map(value => new Bill(value)) + this.emergencyCash = 0 + } + + total (includeEmergencyCash = true) { + return this.bills.reduce((sum, current) => sum + current.total(), 0) + (includeEmergencyCash ? this.emergencyCash : 0) + } + + supportsPredictions () { + return false + } + + supportsEmergencyCash () { + return true + } + + static fromFile (json) { + const cashDrawerContents = new CashDrawerContents() + + json.bills.forEach(bill => { cashDrawerContents.bills.find(b => b.amount === bill.amount).count = bill.count }) + this.emergencyCash = json.emergencyCash + + return cashDrawerContents + } +} diff --git a/src/renderer/CashState.js b/src/renderer/CashState.js deleted file mode 100644 index 6be2726..0000000 --- a/src/renderer/CashState.js +++ /dev/null @@ -1,16 +0,0 @@ -import Bill from './Bill' - -const billValues = [100, 50, 20, 10, 5, 2, 1, 0.50, 0.20, 0.10, 0.05] - -export default class CashState { - constructor (editable = true) { - this.bills = billValues.map(value => new Bill(value)) - this.emergencyCash = 0 - this.author = '' - this.editable = editable - } - - total () { - return this.bills.reduce((sum, current) => sum + current.total(), 0) + this.emergencyCash - } -} diff --git a/src/renderer/SafeContents.js b/src/renderer/SafeContents.js new file mode 100644 index 0000000..07e7a79 --- /dev/null +++ b/src/renderer/SafeContents.js @@ -0,0 +1,63 @@ +import CashDrawerContents from './CashDrawerContents' + +const targetAmountCashDrawerContents = 200 + +export default class SafeContents extends CashDrawerContents { + constructor (cashAtEnd) { + super() // needed ? + + this.cashAtEnd = cashAtEnd + this.predicted = false + } + + supportsPredictions () { + return true + } + + supportsEmergencyCash () { + return false + } + + predict (force = false) { + if (this.predicted && !force) return + this.predicted = true + + // Reset all counts of safe bills + this.bills.forEach(b => { b.count = 0 }) + + // Copy array + const endBills = this.cashAtEnd.bills.slice().reverse() + + // Always put 100/50 euro bills in the safe + this.bills.find(b => b.amount === 100).count = endBills.pop().count + this.bills.find(b => b.amount === 50).count = endBills.pop().count + + // Pop bills until there is less than 220 euros in the cash drawer + while (this.remainingCashInDrawer() > targetAmountCashDrawerContents && endBills.length) { + const endBill = endBills.pop() + + const cashAmountThatNeedsToBeRemoved = this.remainingCashInDrawer() - targetAmountCashDrawerContents + + if (cashAmountThatNeedsToBeRemoved < endBill.total()) { + this.bills.find(b => b.amount === endBill.amount).count = Math.floor(cashAmountThatNeedsToBeRemoved / endBill.amount) + } else { + this.bills.find(b => b.amount === endBill.amount).count = endBill.count + } + } + } + + // Add note to UI that this does not include emergency cash + remainingCashInDrawer (includeEmergencyCash = false) { + return this.cashAtEnd.total(includeEmergencyCash) - this.total(false) + } + + static fromFile (cashAtEnd, json) { + const safeContents = new SafeContents(cashAtEnd) + + json.bills.forEach(bill => { safeContents.bills.find(b => b.amount === bill.amount).count = bill.count }) + safeContents.emergencyCash = json.emergencyCash + safeContents.predicted = json.predicted + + return safeContents + } +} diff --git a/src/renderer/Unicenta.js b/src/renderer/Unicenta.js new file mode 100644 index 0000000..d51d321 --- /dev/null +++ b/src/renderer/Unicenta.js @@ -0,0 +1,59 @@ +import mysql from 'mysql' + +export default class Unicenta { + connectAndExecute (action) { + const connection = mysql.createConnection({ + host: '127.0.0.1', + user: 'root', + password: 'admin', + database: 'unicentaopos' + }) + + connection.connect() + const result = action(connection) + connection.end() + + return result + } + + requestRawData (query) { + return this.connectAndExecute(connection => { + return new Promise((resolve, reject) => { + connection.query(query, function (error, results, fields) { + if (error) throw error + resolve(results) + }) + }) + }) + } + + requestTotals () { + return this.requestRawData(` + SELECT closedcash.datestart as start_date, closedcash.dateend as end_date, payments.payment as type, + SUM(payments.TOTAL) AS amount + FROM (SELECT * FROM closedcash WHERE dateend IS NOT NULL ORDER BY dateend DESC LIMIT 1) as closedcash, payments, receipts + WHERE closedcash.money = receipts.money AND payments.receipt = receipts.id + GROUP BY closedcash.host, closedcash.hostsequence, closedcash.money, closedcash.datestart, closedcash.dateend, payments.payment + ORDER BY closedcash.host, closedcash.hostsequence + `).then(results => { + if (results.length === 0) return undefined + + return { + startDate: results[0]['start_date'], + endDate: results[0]['end_date'], + + cashTotal: this.findTotal(results, 'cash'), + pinTotal: this.findTotal(results, 'magcard'), + freeTotal: this.findTotal(results, 'free') + } + }) + } + + findTotal (results, type) { + const result = results.find(result => result.type === type) + + if (result === undefined) return 0.0 + + return result['amount'] + } +} diff --git a/src/renderer/assets/logo.png b/src/renderer/assets/logo.png deleted file mode 100644 index 63736e2cf27f14ab37514a7983b10954081834e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61878 zcmZ5o1z42Z(_e#I}3Y6zApMyXkluC;C9z!4$Xb9wVHz_gr z=AyS9_z5AiQ`B{YK%m$0e@?li${@j)mk{@L5KnAP5zcT26NsF#?Q@eWO4e{QlgB1- zV^{m{CXx`yn!M6IISrTo#UVL|fxq@dpWTV7en#rPsib&@s=@lsvfw`Tc#h?JU8K@KsQPur8Ou0qqnvxYub#xW5q zp-oLq6h74JnaqJV!oMm^jNUq$*Obb`lv7Tait*TJT*S-%=QFxdeI9uV31hLjWVYag zg^y3M6*}!qU2DZYvd!2tK_Q58ZgJJA7rp4vh#DL?hf_Db1|M}7Ba#> zpJUF&(~Iw_c+&gCCmniUw&?l`b}SJQ28^D8GbC@XXAZV?pF-W)(klhjgPiaKCqU{2c*pb{_NwT=Gxe46_-VFX&S zmuNPsif6k{n0msb$$83?v12Nu++O3#u1bo{yXzD_Sbq5W!S+JA8{B@2{WO zXOSiW=F^&mu80p3oSTEzV7p<4%PiLaEdfbh0fMMy`9ZU+hR9OehJyqR!$b5HSO_C# zZvkbC)-xrWyX8>TEPYc!0)YV8iP{0;XPW`29UG&clX4;BU1Njb@m4Mp-edz#)4V6< z@5%NOnO9fw7`>U8p{(kZFI|4;P{2&b&^9=2ACuU~S=oMYzSMQf>co^vH87jSR?sL!( z-n#6xW6Y{x7}eqC9XtE0P&-e`shKby0!u3*$LTrUnY5P2){+}l&Z%)brK5Bi^O)R% z*)Y;M@lu4rvf5;5NRCF(U7Mm`u!qk@QH%~1z3WG>i=3KJo%`F;ivxe(A|(u;&9r?7 zG5=hY?R!O$QDK0p^4_KhbJxJTpYWjzCqzz;1TND38C@CAVJH�B`((=)>$XlbBTM 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 PwLnnceaq1`faSeA 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 - - -
-
{{ barSession.type.name }} - {{ moment(barSession.date).format('DD-MM-YYYY') }}
- Laatst opgeslagen: {{ lastSavedDate ? moment(lastSavedDate).fromNow() : 'nooit' }} -
-
- - - -
-
- -
-
-
- - -
- -
- -
- - - -
-
-
- - - diff --git a/src/renderer/components/BarSessionCashDrawerTicket.vue b/src/renderer/components/BarSessionCashDrawerTicket.vue new file mode 100644 index 0000000..323dad4 --- /dev/null +++ b/src/renderer/components/BarSessionCashDrawerTicket.vue @@ -0,0 +1,37 @@ + + + diff --git a/src/renderer/components/BarSessionCashSpecificationTicket.vue b/src/renderer/components/BarSessionCashSpecificationTicket.vue deleted file mode 100644 index 5e5a15d..0000000 --- a/src/renderer/components/BarSessionCashSpecificationTicket.vue +++ /dev/null @@ -1,68 +0,0 @@ - - - diff --git a/src/renderer/components/BarSessionHome.vue b/src/renderer/components/BarSessionHome.vue index 4dd66c7..d53a48d 100644 --- a/src/renderer/components/BarSessionHome.vue +++ b/src/renderer/components/BarSessionHome.vue @@ -1,119 +1,134 @@ \ No newline at end of file diff --git a/src/renderer/components/BarSessionOverview.vue b/src/renderer/components/BarSessionOverview.vue deleted file mode 100644 index 3b8b2d6..0000000 --- a/src/renderer/components/BarSessionOverview.vue +++ /dev/null @@ -1,133 +0,0 @@ - - - - - diff --git a/src/renderer/components/BarSessionPrinter.vue b/src/renderer/components/BarSessionPrinter.vue deleted file mode 100644 index 3b10d2c..0000000 --- a/src/renderer/components/BarSessionPrinter.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - diff --git a/src/renderer/components/BarSessionTicket.vue b/src/renderer/components/BarSessionTicket.vue index 5f5cb5a..6a766fc 100644 --- a/src/renderer/components/BarSessionTicket.vue +++ b/src/renderer/components/BarSessionTicket.vue @@ -1,62 +1,117 @@ diff --git a/src/renderer/components/CashStateForm.vue b/src/renderer/components/CashStateForm.vue deleted file mode 100644 index 19f6e23..0000000 --- a/src/renderer/components/CashStateForm.vue +++ /dev/null @@ -1,73 +0,0 @@ - - - - - diff --git a/src/renderer/components/HelpNote.vue b/src/renderer/components/HelpNote.vue new file mode 100644 index 0000000..9e2f146 --- /dev/null +++ b/src/renderer/components/HelpNote.vue @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/src/renderer/components/MoneyInput.vue b/src/renderer/components/MoneyInput.vue index 22d38aa..e00a500 100644 --- a/src/renderer/components/MoneyInput.vue +++ b/src/renderer/components/MoneyInput.vue @@ -1,5 +1,5 @@ diff --git a/src/renderer/components/TopBar.vue b/src/renderer/components/TopBar.vue index 96c9cb8..7da0dc4 100644 --- a/src/renderer/components/TopBar.vue +++ b/src/renderer/components/TopBar.vue @@ -4,7 +4,7 @@
-

Barstaat

+

Cash Register Balance

diff --git a/src/renderer/components/Totals.vue b/src/renderer/components/Totals.vue deleted file mode 100644 index 6ddfb49..0000000 --- a/src/renderer/components/Totals.vue +++ /dev/null @@ -1,99 +0,0 @@ - - - - - diff --git a/src/renderer/components/steps/CashForm.vue b/src/renderer/components/steps/CashForm.vue new file mode 100644 index 0000000..cd22141 --- /dev/null +++ b/src/renderer/components/steps/CashForm.vue @@ -0,0 +1,80 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/components/steps/Close.vue b/src/renderer/components/steps/Close.vue new file mode 100644 index 0000000..be597fc --- /dev/null +++ b/src/renderer/components/steps/Close.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/renderer/components/steps/Review.vue b/src/renderer/components/steps/Review.vue new file mode 100644 index 0000000..d4fdb9f --- /dev/null +++ b/src/renderer/components/steps/Review.vue @@ -0,0 +1,122 @@ + + + diff --git a/src/renderer/components/steps/SessionDetails.vue b/src/renderer/components/steps/SessionDetails.vue new file mode 100644 index 0000000..5d926da --- /dev/null +++ b/src/renderer/components/steps/SessionDetails.vue @@ -0,0 +1,55 @@ + + + diff --git a/src/renderer/components/steps/StartPos.vue b/src/renderer/components/steps/StartPos.vue new file mode 100644 index 0000000..c7b35d9 --- /dev/null +++ b/src/renderer/components/steps/StartPos.vue @@ -0,0 +1,31 @@ + + + diff --git a/src/renderer/components/steps/Totals.vue b/src/renderer/components/steps/Totals.vue new file mode 100644 index 0000000..ef1c78b --- /dev/null +++ b/src/renderer/components/steps/Totals.vue @@ -0,0 +1,121 @@ + + + diff --git a/src/renderer/main.js b/src/renderer/main.js index 68796d7..4825aaa 100644 --- a/src/renderer/main.js +++ b/src/renderer/main.js @@ -4,19 +4,37 @@ import App from './App' import router from './router' import store from './store' -import Vue2Filters from 'vue2-filters' -import VueNumeric from 'vue-numeric' -import VuePaginate from 'vue-paginate' -import moment from 'moment' +// import Vue2Filters from 'vue2-filters' +// import VueNumeric from 'vue-numeric' +// import VuePaginate from 'vue-paginate' +import VueCurrencyFilter from 'vue-currency-filter' +import Vuelidate from 'vuelidate' +import VueMoment from 'vue-moment' +import moment from 'moment' // unused? import { remote } from 'electron' +import HelpNote from './components/HelpNote' + if (!process.env.IS_WEB) Vue.use(require('vue-electron')) Vue.config.productionTip = false -Vue.use(Vue2Filters) -Vue.use(VueNumeric) -Vue.use(VuePaginate) +// Vue.use(Vue2Filters) +// Vue.use(VueNumeric) +// Vue.use(VuePaginate) +Vue.use(Vuelidate) +Vue.use(VueMoment) + +Vue.use(VueCurrencyFilter, { + symbol: '€', + thousandsSeparator: '.', + fractionCount: 2, + fractionSeparator: ',', + symbolPosition: 'front', + symbolSpacing: true +}) + +Vue.component('help-note', HelpNote) /* eslint-disable no-new */ new Vue({ diff --git a/src/renderer/router/index.js b/src/renderer/router/index.js index 161da6e..61c5865 100644 --- a/src/renderer/router/index.js +++ b/src/renderer/router/index.js @@ -10,16 +10,6 @@ export default new Router({ name: 'landing-page', component: require('@/components/BarSessionHome').default }, - { - path: '/overview', - name: 'overview', - component: require('@/components/BarSessionOverview').default - }, - { - path: '/barsession', - name: 'BarSession', - component: require('@/components/BarSession').default - }, { path: '*', redirect: '/' diff --git a/tailwind.js b/tailwind.js index 9d7baac..76ea32d 100644 --- a/tailwind.js +++ b/tailwind.js @@ -305,6 +305,7 @@ module.exports = { 'tight': 1.25, 'normal': 1.5, 'loose': 2, + '24': 6 },