Browse Source

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 <sally.healey@cheshiresharedservices.gov.uk>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
20.11.x
Martin Renvoize 1 year ago
committed by Jonathan Druart
parent
commit
88b5b5d00a
  1. 116
      Koha/Cash/Register/Action.pm
  2. 59
      koha-tmpl/intranet-tmpl/prog/en/modules/pos/register.tt

116
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

59
koha-tmpl/intranet-tmpl/prog/en/modules/pos/register.tt

@ -59,7 +59,8 @@
<h2>Summary</h2>
<ul>
[% IF register.last_cashup %]
<li>Last cashup: [% register.last_cashup.timestamp | $KohaDates with_hours => 1 %]</li>
<li>Last cashup: [% register.last_cashup.timestamp | $KohaDates with_hours => 1 %] (<a data-toggle="modal" href="#cashupSummaryModal" class="button">Summary</a>)</li>
[% END %]
<li>Float: [% register.starting_float | $Price %]</li>
<li>Total income (cash): [% accountlines.credits_total * -1 | $Price %] ([% accountlines.credits_total(payment_type => 'CASH') * -1 | $Price %])</li>
@ -303,6 +304,62 @@
</form> <!-- /#refund_form -->
</div> <!-- /#issueRefundModal -->
<!-- Cashup summary modal -->
[% IF register.last_cashup %]
<div class="modal" id="cashupSummaryModal" tabindex="-1" role="dialog" aria-labelledby="cashupSummaryLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="closebtn" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="cashupSummaryLabel">Cashup summary</h4>
</div>
<div class="modal-body">
<ul>
<li>Cash register: [% register.description | html %]</li>
<li>Period: [% register.last_cashup.cashup_summary.from_date | $KohaDates with_hours => 1 %] to [% register.last_cashup.cashup_summary.to_date | $KohaDates with_hours => 1 %]</li>
</ul>
<table>
<thead>
<tr>
<th>Type</th>
<th>Total</th>
</tr>
</thead>
<tbody>
[%- FOREACH out IN register.last_cashup.cashup_summary.outgoing -%]
<tr>
<td>[%- PROCESS account_type_description account=out -%]</td>
<td>[% out.total * -1 | $Price %]</td>
</tr>
[%- END -%]
[%- FOREACH in IN register.last_cashup.cashup_summary.income -%]
<tr>
<td>[%- PROCESS account_type_description account=in -%]</td>
<td>[% in.total * -1 | $Price %]</td>
</tr>
[%- END -%]
</tbody>
<tfoot>
<tr>
<td>Total</td>
<td>[% register.last_cashup.cashup_summary.total | $Price %]</td>
</tr>
<tr>
<td>Bankable</td>
<td>[% register.last_cashup.cashup_summary.bankable | $Price %]</td>
</tr>
</tfoot>
</table>
</div> <!-- /.modal-body -->
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div> <!-- /.modal-footer -->
</div> <!-- /.modal-content -->
</div> <!-- /.modal-dialog -->
</div> <!-- /#cashupSummaryModal -->
[% END %]
[% MACRO jsinclude BLOCK %]
[% INCLUDE 'datatables.inc' %]
[% Asset.js("lib/jquery/plugins/rowGroup/dataTables.rowGroup.min.js") | $raw %]

Loading…
Cancel
Save