Bug 27196: Don't explode if item that is waiting if checked in by SIP
[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 Koha::Cash::Register->_new_from_dbic($rs);
61 }
62
63 =head3 cashup_summary
64
65   my $cashup_summary = $action->cashup_summary;
66
67 Return a hashref containing a summary of transactions that make up this cashup action.
68
69 =cut
70
71 sub cashup_summary {
72     my ($self) = @_;
73     my $summary;
74     my $prior_cashup = Koha::Cash::Register::Actions->search(
75         {
76             'code'      => 'CASHUP',
77             'timestamp' => { '<' => $self->timestamp },
78             register_id => $self->register_id
79         },
80         {
81             order_by => { '-desc' => [ 'timestamp', 'id' ] },
82             rows     => 1
83         }
84     )->single;
85
86     my $conditions =
87       $prior_cashup
88       ? {
89         'date' => {
90             '-between' =>
91               [ $prior_cashup->timestamp, $self->timestamp ]
92         }
93       }
94       : { 'date' => { '<' => $self->timestamp } };
95
96     my $outgoing_transactions = $self->register->accountlines->search(
97         { %{$conditions}, credit_type_code => undef },
98     );
99     my $income_transactions = $self->register->accountlines->search(
100         { %{$conditions}, debit_type_code => undef },
101     );
102
103     my $income_summary = Koha::Account::Offsets->search(
104         {
105             'me.credit_id' =>
106               { '-in' => [ $income_transactions->get_column('accountlines_id') ] },
107             'me.debit_id' => { '!=' => undef }
108         },
109         {
110             join     => { 'debit' => 'debit_type_code' },
111             group_by => [ 'debit.debit_type_code', 'debit_type_code.description' ],
112             order_by => { '-asc' => 'debit.debit_type_code' },
113             'select' => [ { sum => 'me.amount' }, 'debit.debit_type_code', 'debit_type_code.description' ],
114             'as'     => [ 'total', 'debit_type_code', 'debit_description' ],
115         }
116     );
117
118     my $outgoing_summary = Koha::Account::Offsets->search(
119         {
120             'me.debit_id' =>
121               { '-in' => [ $outgoing_transactions->get_column('accountlines_id') ] },
122             'me.credit_id' => { '!=' => undef }
123         },
124         {
125             join     => { 'credit' => 'credit_type_code' },
126             group_by => [ 'credit.credit_type_code', 'credit_type_code.description' ],
127             order_by => { '-asc' => 'credit.credit_type_code' },
128             'select' => [ { sum => 'me.amount' }, 'credit.credit_type_code', 'credit_type_code.description' ],
129             'as'     => [ 'total', 'credit_type_code', 'credit_description' ],
130         }
131     );
132
133     my @income = map {
134         {
135             total           => $_->get_column('total'),
136             debit_type_code => $_->get_column('debit_type_code'),
137             debit_type      => { description => $_->get_column('debit_description') }
138         }
139     } $income_summary->as_list;
140     my @outgoing = map {
141         {
142             total            => $_->get_column('total'),
143             credit_type_code => $_->get_column('credit_type_code'),
144             credit_type      => { description => $_->get_column('credit_description') }
145         }
146     } $outgoing_summary->as_list;
147
148     $summary = {
149         from_date             => $prior_cashup? $prior_cashup->timestamp : undef,
150         to_date               => $self->timestamp,
151         income                => \@income,
152         outgoing              => \@outgoing,
153         income_transactions   => $income_transactions,
154         outgoing_transactions => $outgoing_transactions,
155     };
156
157     return $summary;
158 }
159
160 =head2 Internal methods
161
162 =cut
163
164 =head3 _type
165
166 =cut
167
168 sub _type {
169     return 'CashRegisterAction';
170 }
171
172 1;
173
174 =head1 AUTHORS
175
176 Martin Renvoize <martin.renvoize@ptfs-europe.com>
177
178 =cut