From 88b5b5d00ac04c5286dfeb5c05c674e82b3f2728 Mon Sep 17 00:00:00 2001 From: Martin Renvoize Date: Fri, 7 Aug 2020 10:15:20 +0100 Subject: [PATCH] Bug 26172: Add cashup summary view modal This patch adds a cashup summary modal to the register details page. Test plan 1/ Enable Cash Registers and Point of Sale 2/ Enable some debit_types as 'Sale items' 3/ Perform a series of transactions 4/ Perform a 'Cashup' on the register 5/ Note the new '(Summary)' link next to the last cashup on the register page. 6/ Click the link and confirm the modal contains the pertinent information Signed-off-by: Sally Signed-off-by: Jonathan Druart --- Koha/Cash/Register/Action.pm | 116 ++++++++++++++++++ .../prog/en/modules/pos/register.tt | 59 ++++++++- 2 files changed, 174 insertions(+), 1 deletion(-) diff --git a/Koha/Cash/Register/Action.pm b/Koha/Cash/Register/Action.pm index f9e0aae77d..23b9f6ffb3 100644 --- a/Koha/Cash/Register/Action.pm +++ b/Koha/Cash/Register/Action.pm @@ -48,6 +48,122 @@ sub manager { return Koha::Patron->_new_from_dbic($rs); } +=head3 register + +Return the register linked to this cash register::action + +=cut + +sub register { + my ($self) = @_; + my $rs = $self->_result->register; + return unless $rs; + return Koha::Cash::Register->_new_from_dbic($rs); +} + +=head3 cashup_summary + + my $cashup_summary = $action->cashup_summary; + +Return a hashref containing a summary of transactions that make up this cashup action. + +=cut + +sub cashup_summary { + my ($self) = @_; + my $summary; + my $prior_cashup = Koha::Cash::Register::Actions->search( + { + 'code' => 'CASHUP', + 'timestamp' => { '<' => $self->timestamp }, + register_id => $self->register_id + }, + { + order_by => { '-desc' => [ 'timestamp', 'id' ] }, + rows => 1 + } + ); + + my $previous = $prior_cashup->single; + + my $conditions = + $previous + ? { + 'date' => { + '-between' => + [ $previous->_result->get_column('timestamp'), $self->timestamp ] + } + } + : { 'date' => { '<' => $self->timestamp } }; + + my $outgoing_transactions = $self->register->accountlines->search( + { %{$conditions}, credit_type_code => undef }, + { select => 'accountlines_id' } ); + my $income_transactions = $self->register->accountlines->search( + { %{$conditions}, debit_type_code => undef }, + { select => 'accountlines_id' } ); + + my $income_summary = Koha::Account::Offsets->search( + { + 'me.credit_id' => + { '-in' => $income_transactions->_resultset->as_query }, + 'me.debit_id' => { '!=' => undef } + }, + { + join => { 'debit' => 'debit_type_code' }, + group_by => [ 'debit.debit_type_code', 'debit_type_code.description' ], + 'select' => [ { sum => 'me.amount' }, 'debit.debit_type_code', 'debit_type_code.description' ], + 'as' => [ 'total', 'debit_type_code', 'debit_description' ], + } + ); + + my $outgoing_summary = Koha::Account::Offsets->search( + { + 'me.debit_id' => + { '-in' => $outgoing_transactions->_resultset->as_query }, + 'me.credit_id' => { '!=' => undef } + }, + { + join => { 'credit' => 'credit_type_code' }, + group_by => [ 'credit.credit_type_code', 'credit_type_code.description' ], + 'select' => [ { sum => 'me.amount' }, 'credit.credit_type_code', 'credit_type_code.description' ], + 'as' => [ 'total', 'credit_type_code', 'credit_description' ], + } + ); + + my @income = map { + { + total => $_->get_column('total'), + debit_type_code => $_->get_column('debit_type_code'), + debit_type => { description => $_->get_column('debit_description') } + } + } $income_summary->as_list; + my @outgoing = map { + { + total => $_->get_column('total'), + credit_type_code => $_->get_column('credit_type_code'), + credit_type => { description => $_->get_column('credit_description') } + } + } $outgoing_summary->as_list; + $summary = { + from_date => $previous ? $previous->timestamp : undef, + to_date => $self->timestamp, + income => \@income, + outgoing => \@outgoing, + total => ( $outgoing_transactions->total * -1 ) + + ( $income_transactions->total * -1 ), + bankable => ( + $outgoing_transactions->search( { payment_type => 'CASH' } ) + ->total * -1 + ) + ( + $income_transactions->search( { payment_type => 'CASH' } )->total * + -1 + ) + }; + + return $summary; +} + =head2 Internal methods =cut diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/pos/register.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/pos/register.tt index 6970d1d6cc..9003e3ffd6 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/pos/register.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/pos/register.tt @@ -59,7 +59,8 @@

Summary

    [% IF register.last_cashup %] -
  • Last cashup: [% register.last_cashup.timestamp | $KohaDates with_hours => 1 %]
  • +
  • Last cashup: [% register.last_cashup.timestamp | $KohaDates with_hours => 1 %] (Summary)
  • + [% END %]
  • Float: [% register.starting_float | $Price %]
  • Total income (cash): [% accountlines.credits_total * -1 | $Price %] ([% accountlines.credits_total(payment_type => 'CASH') * -1 | $Price %])
  • @@ -303,6 +304,62 @@ + + [% IF register.last_cashup %] + + [% END %] + [% MACRO jsinclude BLOCK %] [% INCLUDE 'datatables.inc' %] [% Asset.js("lib/jquery/plugins/rowGroup/dataTables.rowGroup.min.js") | $raw %] -- 2.39.5