Bug 26172: (follow-up) Summary by payment_type
[koha.git] / Koha / Cash / Register / Action.pm
1 package Koha::Cash::Register::Action;
2
3 # This file is part of Koha.
4 #
5 # Koha is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # Koha is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with Koha; if not, see <http://www.gnu.org/licenses>.
17
18 use Modern::Perl;
19
20 use Carp;
21
22 use Koha::Database;
23
24 use base qw(Koha::Object);
25
26 =encoding utf8
27
28 =head1 NAME
29
30 Koha::Cash::Register::Action - Koha cashregister::action Object class
31
32 =head1 API
33
34 =head2 Class methods
35
36 =cut
37
38 =head3 manager
39
40 Return the manager linked to this cash register::action
41
42 =cut
43
44 sub manager {
45     my ($self) = @_;
46     my $rs = $self->_result->manager;
47     return unless $rs;
48     return Koha::Patron->_new_from_dbic($rs);
49 }
50
51 =head3 register
52
53 Return the register linked to this cash register::action
54
55 =cut
56
57 sub register {
58     my ($self) = @_;
59     my $rs = $self->_result->register;
60     return unless $rs;
61     return Koha::Cash::Register->_new_from_dbic($rs);
62 }
63
64 =head3 cashup_summary
65
66   my $cashup_summary = $action->cashup_summary;
67
68 Return a hashref containing a summary of transactions that make up this cashup action.
69
70 =cut
71
72 sub cashup_summary {
73     my ($self) = @_;
74     my $summary;
75     my $prior_cashup = Koha::Cash::Register::Actions->search(
76         {
77             'code'      => 'CASHUP',
78             'timestamp' => { '<' => $self->timestamp },
79             register_id => $self->register_id
80         },
81         {
82             order_by => { '-desc' => [ 'timestamp', 'id' ] },
83             rows     => 1
84         }
85     );
86
87     my $previous = $prior_cashup->single;
88
89     my $conditions =
90       $previous
91       ? {
92         'date' => {
93             '-between' =>
94               [ $previous->_result->get_column('timestamp'), $self->timestamp ]
95         }
96       }
97       : { 'date' => { '<' => $self->timestamp } };
98
99     my $outgoing_transactions = $self->register->accountlines->search(
100         { %{$conditions}, credit_type_code => undef },
101     );
102     my $income_transactions = $self->register->accountlines->search(
103         { %{$conditions}, debit_type_code => undef },
104     );
105
106     my $income_summary = Koha::Account::Offsets->search(
107         {
108             'me.credit_id' =>
109               { '-in' => $income_transactions->_resultset->get_column('accountlines_id')->as_query },
110             'me.debit_id' => { '!=' => undef }
111         },
112         {
113             join     => { 'debit' => 'debit_type_code' },
114             group_by => [ 'debit.debit_type_code', 'debit_type_code.description' ],
115             'select' => [ { sum => 'me.amount' }, 'debit.debit_type_code', 'debit_type_code.description' ],
116             'as'     => [ 'total', 'debit_type_code', 'debit_description' ],
117         }
118     );
119
120     my $outgoing_summary = Koha::Account::Offsets->search(
121         {
122             'me.debit_id' =>
123               { '-in' => $outgoing_transactions->_resultset->get_column('accountlines_id')->as_query },
124             'me.credit_id' => { '!=' => undef }
125         },
126         {
127             join     => { 'credit' => 'credit_type_code' },
128             group_by => [ 'credit.credit_type_code', 'credit_type_code.description' ],
129             'select' => [ { sum => 'me.amount' }, 'credit.credit_type_code', 'credit_type_code.description' ],
130             'as'     => [ 'total', 'credit_type_code', 'credit_description' ],
131         }
132     );
133
134     my @income = map {
135         {
136             total           => $_->get_column('total'),
137             debit_type_code => $_->get_column('debit_type_code'),
138             debit_type      => { description => $_->get_column('debit_description') }
139         }
140     } $income_summary->as_list;
141     my @outgoing = map {
142         {
143             total            => $_->get_column('total'),
144             credit_type_code => $_->get_column('credit_type_code'),
145             credit_type      => { description => $_->get_column('credit_description') }
146         }
147     } $outgoing_summary->as_list;
148
149     $summary = {
150         from_date             => $previous ? $previous->timestamp : undef,
151         to_date               => $self->timestamp,
152         income                => \@income,
153         outgoing              => \@outgoing,
154         income_transactions   => $income_transactions,
155         outgoing_transactions => $outgoing_transactions,
156     };
157
158     return $summary;
159 }
160
161 =head2 Internal methods
162
163 =cut
164
165 =head3 _type
166
167 =cut
168
169 sub _type {
170     return 'CashRegisterAction';
171 }
172
173 1;
174
175 =head1 AUTHORS
176
177 Martin Renvoize <martin.renvoize@ptfs-europe.com>
178
179 =cut