From 172e611a453d3bd61a3f69eed78d48b7efbba878 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Wed, 30 May 2018 18:39:48 -0600 Subject: [PATCH] Add cash drawer/register balance tracking (close #1) --- action.php | 81 ++++++++++++++ database.mwb | Bin 15219 -> 15220 bytes lang/en_us.php | 18 +++- lang/messages.php | 16 +++ lib/chooseregister.php | 36 +++++++ pages.php | 15 ++- pages/pos.php | 225 +++++++++++++++++++++------------------ pages/registers.php | 117 ++++++++++++++++++++ static/js/pos_finish.js | 2 +- static/js/pos_payment.js | 1 + static/js/registers.js | 34 ++++++ 11 files changed, 437 insertions(+), 108 deletions(-) create mode 100644 lib/chooseregister.php create mode 100644 pages/registers.php create mode 100644 static/js/registers.js diff --git a/action.php b/action.php index 8f67de9..3ca4748 100644 --- a/action.php +++ b/action.php @@ -52,6 +52,7 @@ switch ($VARS['action']) { $totalcharge = 0.00; $totalpaid = 0.00; + $change = 0.0; foreach ($items as $i) { $totalcharge += $i['each'] * $i['qty']; if (!$binstack->has('items', ['itemid' => $i['id']])) { @@ -128,6 +129,17 @@ switch ($VARS['action']) { ]); } + if ($totalcharge < $totalpaid) { + $change = $totalpaid - $totalcharge; + $database->insert('payments', [ + 'amount' => $change * -1.0, + 'data' => '', + 'type' => 1, + 'txid' => $txid, + 'certid' => null + ]); + } + exit(json_encode(["status" => "OK", "txid" => $txid])); break; @@ -175,6 +187,9 @@ switch ($VARS['action']) { 'txid' => $txid ]); foreach ($payments as $p) { + if ($p['amount'] < 0) { + continue; + } $paymenthtml .= "\n"; $paymenthtml .= '
'; $paymenthtml .= '
' . lang($p['text'], false) . '
'; @@ -364,6 +379,72 @@ END; } returnToSender("customer_saved"); + case "set_register": + $regid = $VARS['register']; + if (!$database->has('registers', ['registerid' => $regid])) { + returnToSender("invalid_parameters"); + } + if (!$database->has('cash_drawer', ['AND' => ['registerid' => $regid, 'close' => null]])) { + returnToSender("cash_not_open"); + } + $cashid = $database->get('cash_drawer', 'cashid', ['AND' => ['registerid' => $regid, 'close' => null]]); + $_SESSION['register'] = (int) $regid; + returnToSender("register_set"); + break; + case "opencash": + $regid = $VARS['register']; + $start = $VARS['startamount']; + if (!$database->has('registers', ['registerid' => $regid])) { + returnToSender("invalid_parameters"); + } + if ($database->has('cash_drawer', ['AND' => ['registerid' => $regid, 'close' => null]])) { + returnToSender("cash_already_open"); + } + if (!is_numeric($start) || (float) $start < 0) { + $start = 0.0; + } + $database->insert('cash_drawer', [ + 'registerid' => $regid, + 'open' => date('Y-m-d H:i:s'), + 'close' => null, + 'start_amount' => $start, + 'end_amount' => null + ]); + returnToSender("cash_opened"); + break; + case "closecash": + $regid = $VARS['register']; + if (!$database->has('registers', ['registerid' => $regid])) { + returnToSender("invalid_parameters"); + } + if (!$database->has('cash_drawer', ['AND' => ['registerid' => $regid, 'close' => null]])) { + returnToSender("cash_not_open"); + } + + $cash = $database->get('cash_drawer', ['cashid', 'start_amount'], ['AND' => ['registerid' => $regid, 'close' => null]]); + + $balance = (float) $cash['start_amount']; + $rows = $database->select("payments", [ + "[>]transactions" => ['txid' => 'txid'] + ], 'amount', [ + 'AND' => [ + 'transactions.cashid' => $cash['cashid'], + 'payments.type' => 1 + ] + ]); + foreach ($rows as $row) { + $balance += $row; + } + + $database->update('cash_drawer', [ + 'close' => date('Y-m-d H:i:s'), + 'end_amount' => $balance + ], [ + 'cashid' => $cash['cashid'] + ]); + + returnToSender("cash_closed"); + break; case "session_keepalive": header("Content-Type: application/json"); exit(json_encode(["status" => "OK"])); diff --git a/database.mwb b/database.mwb index cbdacbdd43e92f8efe2d624e499b55b2388a95d6..0dad56fca905455f1271b3154831995877db1af2 100644 GIT binary patch delta 13490 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 BN)7-3 delta 13481 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 "Delete", "cancel" => "Cancel", "price" => "Price", - "finish" => "Finish" + "finish" => "Finish", + "registers" => "Registers", + "add register" => "Add Register", + "balance" => "Balance", + "opened" => "Opened", + "closed" => "Closed", + "never" => "Never", + "last opened" => "Last Opened", + "still open" => "Still Open", + "open" => "Open", + "no cash" => "No cash", + "choose register" => "Choose a cash register", + "cash not open" => "Cash not open. Go to Registers to open it.", + "cash opened" => "Cash opened.", + "cash closed" => "Cash closed.", + "register set" => "Register set.", + "change register" => "Change register", ]); \ No newline at end of file diff --git a/lang/messages.php b/lang/messages.php index 7b55a46..cddac19 100644 --- a/lang/messages.php +++ b/lang/messages.php @@ -25,4 +25,20 @@ define("MESSAGES", [ "string" => "invalid customer id", "type" => "danger" ], + "cash_not_open" => [ + "string" => "cash not open", + "type" => "danger" + ], + "cash_already_open" => [ + "string" => "cash already open", + "type" => "danger" + ], + "register_set" => [ + "string" => "register set", + "type" => "success" + ], + "cash_opened" => [ + "string" => "cash opened", + "type" => "success" + ], ]); diff --git a/lib/chooseregister.php b/lib/chooseregister.php new file mode 100644 index 0000000..6767b7c --- /dev/null +++ b/lib/chooseregister.php @@ -0,0 +1,36 @@ + + +
+
+
+

+ +

+
+
+
+ select("registers", ['registers.registerid (id)', 'registername (name)']); + foreach ($registers as $r) { + ?> + + +
+
+ + + +
+
+
\ No newline at end of file diff --git a/pages.php b/pages.php index 1446141..1e3e95e 100644 --- a/pages.php +++ b/pages.php @@ -14,7 +14,7 @@ define("PAGES", [ "pos" => [ "title" => "point of sale", "navbar" => true, - "icon" => "far fa-money-bill-alt", + "icon" => "fas fa-store-alt", "styles" => [ "static/css/pos.css", ], @@ -55,6 +55,19 @@ define("PAGES", [ "static/js/editcustomer.js" ] ], + "registers" => [ + "title" => "registers", + "navbar" => true, + "icon" => "far fa-money-bill-alt", + "styles" => [ + "static/css/datatables.min.css", + "static/css/tables.css" + ], + "scripts" => [ + "static/js/datatables.min.js", + "static/js/registers.js" + ], + ], "404" => [ "title" => "404 error" ] diff --git a/pages/pos.php b/pages/pos.php index f845693..47a9632 100644 --- a/pages/pos.php +++ b/pages/pos.php @@ -4,130 +4,145 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -?> - +$register = [ + "name" => lang("no cash", false), + "id" => "" +]; -