From 56ea6818ae221c8aa8aed0743deca3f621ac1657 Mon Sep 17 00:00:00 2001
From: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Date: Thu, 9 Jan 2020 13:53:09 +0000
Subject: [PATCH] Bug 23355: Add branch details page

This patch adds a new 'branch details' page to the POS system which
displays a summary of the cash register transactions for a branch
since each register was last cashed up. It also allows for cashing
up individual registers or cashing up all registers at a given branch
in one transaction.

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
---
 .../prog/en/includes/pos-menu.inc             |   1 +
 .../prog/en/modules/pos/registers.tt          | 149 ++++++++++++++++++
 .../prog/en/modules/tools/tools-home.tt       |   8 +
 pos/registers.pl                              |  69 ++++++++
 4 files changed, 227 insertions(+)
 create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/pos/registers.tt
 create mode 100755 pos/registers.pl

diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/pos-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/pos-menu.inc
index b30beb3422..d8cb71cfd5 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/pos-menu.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/pos-menu.inc
@@ -4,6 +4,7 @@
         <h5>Point of sale</h5>
         <ul>
             <li><a href="/cgi-bin/koha/pos/register.pl">Register details</a></li>
+            <li><a href="/cgi-bin/koha/pos/registers.pl">Branch details</a></li>
         </ul>
         [% END %]
         [% IF ( CAN_user_cash_management_manage_cash_registers || CAN_user_parameters_manage_auth_values) %]
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/pos/registers.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/pos/registers.tt
new file mode 100644
index 0000000000..b06a4f5b0f
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/pos/registers.tt
@@ -0,0 +1,149 @@
+[% USE raw %]
+[% USE Asset %]
+[% USE Koha %]
+[% USE KohaDates %]
+[% USE AuthorisedValues %]
+[% USE Price %]
+[% SET footerjs = 1 %]
+[% INCLUDE 'doc-head-open.inc' %]
+<title>Koha &rsaquo; Cashup</title>
+[% INCLUDE 'doc-head-close.inc' %]
+</head>
+
+<body id="cashup" class="pos">
+[% INCLUDE 'header.inc' %]
+[% INCLUDE 'circ-search.inc' %]
+
+<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; Point of sale</div>
+
+<div class="main container-fluid">
+    <div class="row">
+        <div class="col-sm-10 col-sm-push-2">
+            <main>
+                [% IF ( error_registers ) %]
+                <div id="error_message" class="dialog alert">
+                    You must have at least one cash register associated with this branch before you can record payments.
+                </div>
+                [% ELSE %]
+                <div id="toolbar" class="btn-toolbar">
+                    <a class="cashup_all btn btn-default" href="/cgi-bin/koha/pos/registers.pl?op=cashup"><i class="fa fa-money"></i> Cashup all</a>
+                </div>
+
+                <h1>Branch transaction details for [% library.branchname | html %]</h1>
+
+                <h2>Summary</h2>
+
+
+
+                <table id="registers" class="table_registers">
+                    <thead>
+                        <th>
+                            ID
+                        </th>
+                        <th>
+                            Name
+                        </th>
+                        <th>
+                            Description
+                        </th>
+                        <th>
+                            Last cashup
+                        </th>
+                        <th>
+                            Float
+                        </th>
+                        <th>
+                            Bankable
+                        </th>
+                        <th>
+                            Actions
+                        </th>
+                    </thead>
+                    <tbody>
+                        [% FOREACH register IN registers %]
+                        <tr>
+                            <td>
+                                [% register.id | html %]
+                            </td>
+                            <td>
+                                <a href="/cgi-bin/koha/pos/register.pl?registerid=[% register.id | uri %]">[% register.name | html %]</a>
+                            </td>
+                            <td>
+                                [% register.description | html %]
+                            </td>
+                            <td>
+                                [%- IF register.last_cashup -%]
+                                [% register.last_cashup.timestamp | $KohaDates with_hours => 1 %] ([% register.last_cashup.amount | $Price %])
+                                [%- ELSE -%]
+                                No last cashup
+                                [%- END -%]
+                            </td>
+                            <td>
+                                [% register.starting_float | $Price %]
+                            </td>
+                            <td>
+                                [% register.outstanding_accountlines.total * -1 | $Price %]
+                            </td>
+                            <td>
+                                <a class="cashup_individual btn btn-default" href="/cgi-bin/koha/pos/register.pl?registerid=[% register.id | uri %]&op=cashup"><i class="fa fa-money"></i> Record cashup</a>
+                            </td>
+                        </tr>
+                        [% END %]
+                    </tbody>
+                    <tfoot>
+                        <tr>
+                            <td colspan="5">Total bankable:</td>
+                            <td></td>
+                            <td></td>
+                        </tr>
+                    </tfoot>
+                </table>
+                [% END %]
+            </main>
+        </div>
+
+        <div class="col-sm-2 col-sm-pull-10">
+            <aside>
+                [% INCLUDE 'pos-menu.inc' %]
+            </aside>
+        </div>
+
+    </div> <!-- /.row -->
+
+[% MACRO jsinclude BLOCK %]
+    [% INCLUDE 'datatables.inc' %]
+    <script>
+        $(document).ready(function() {
+            var registers_table = $("#registers").dataTable($.extend(true, {}, dataTablesDefaults, {
+                "bFilter": false,
+                "paginationType": "full",
+                "footerCallback": function ( row, data, start, end, display ) {
+                            var api = this.api(), data;
+
+                            // Remove the formatting to get integer data for summation
+                            var intVal = function ( i ) {
+                                return typeof i === 'string' ?
+                                    i.replace(/[\$,]/g, '')*1 :
+                                    typeof i === 'number' ?
+                                        i : 0;
+                            };
+
+                            // Total over all pages
+                            total = api
+                                .column( 5 )
+                                .data()
+                                .reduce( function (a, b) {
+                                    return intVal(a) + intVal(b);
+                                }, 0 );
+
+                            // Update footer
+                            $( api.column( 5 ).footer() ).html(
+                                total
+                            );
+                        }
+            }));
+        });
+    </script>
+[% END %]
+
+[% INCLUDE 'intranet-bottom.inc' %]
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt
index 732563ce0a..9b2e257326 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt
@@ -129,6 +129,14 @@
     <dd>Access files stored on the server, like log files or reports</dd>
     [% END %]
 
+    [% IF ( Koha.Preference('UseCashRegisters') && CAN_user_cash_management_manage_cash_registers ) %]
+        [% IF ( CAN_user_cash_management_manage_cash_registers ) %]
+        <dt><a href="/cgi-bin/koha/pos/registers.pl">Cashup registers</a></dt>
+        <dd>Perfrom cashup actions on cash registers</dd>
+        [% END %]
+    [% END %]
+
+
 </dl>
 </div>
 
diff --git a/pos/registers.pl b/pos/registers.pl
new file mode 100755
index 0000000000..bf74f9f7af
--- /dev/null
+++ b/pos/registers.pl
@@ -0,0 +1,69 @@
+#!/usr/bin/perl
+#
+# c 2015 PTFS-Europe Ltd
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+# Suite 330, Boston, MA  02111-1307 USA
+#
+
+use Modern::Perl;
+use CGI;
+use C4::Auth;
+use C4::Output;
+use C4::Context;
+
+use Koha::Cash::Registers;
+use Koha::Database;
+
+my $q = CGI->new();
+
+my ( $template, $loggedinuser, $cookie, $user_flags ) = get_template_and_user(
+    {
+        template_name   => 'pos/registers.tt',
+        query           => $q,
+        type            => 'intranet',
+        authnotrequired => 0,
+    }
+);
+my $logged_in_user = Koha::Patrons->find($loggedinuser) or die "Not logged in";
+
+my $library = Koha::Libraries->find( C4::Context->userenv->{'branch'} );
+$template->param( library => $library );
+
+my $registers = Koha::Cash::Registers->search(
+    { branch   => $library->id, archived => 0 },
+    { order_by => { '-asc' => 'name' } }
+);
+
+if ( !$registers->count ) {
+    $template->param( error_registers => 1 );
+}
+else {
+    $template->param( registers => $registers );
+}
+
+my $op = $q->param('op') // '';
+if ( $op eq 'cashup' ) {
+    for my $register ( $registers->as_list ) {
+        $register->add_cashup(
+            {
+                user_id => $logged_in_user->id,
+                amount  => $register->outstanding_accountlines->total
+            }
+        );
+    }
+}
+
+output_html_with_http_headers( $q, $cookie, $template->output );
-- 
2.20.1