Bug 19935: Use ->checkouts when ->pending_checkouts->count was used
[koha.git] / Koha / Patron / Discharge.pm
1 package Koha::Patron::Discharge;
2
3 use Modern::Perl;
4 use CGI;
5 use File::Temp qw( :POSIX );
6 use Carp;
7
8 use C4::Templates qw ( gettemplate );
9
10 use Koha::Database;
11 use Koha::DateUtils qw( dt_from_string output_pref );
12 use Koha::Patrons;
13
14 sub count {
15     my ($params) = @_;
16     my $values = {};
17
18     if( $params->{borrowernumber} ) {
19         $values->{borrower} = $params->{borrowernumber};
20     }
21     if( $params->{pending} ) {
22         $values->{needed} = { '!=', undef };
23         $values->{validated} = undef;
24     }
25     elsif( $params->{validated} ) {
26         $values->{validated} = { '!=', undef };
27     }
28
29     return search_limited( $values )->count;
30 }
31
32 sub can_be_discharged {
33     my ($params) = @_;
34     return unless $params->{borrowernumber};
35
36     my $patron = Koha::Patrons->find( $params->{borrowernumber} );
37     return unless $patron;
38
39     my $has_pending_checkouts = $patron->checkouts->count;
40     return $has_pending_checkouts ? 0 : 1;
41 }
42
43 sub is_discharged {
44     my ($params) = @_;
45     return unless $params->{borrowernumber};
46     my $borrowernumber = $params->{borrowernumber};
47
48     my $restricted = Koha::Patrons->find( $borrowernumber )->is_debarred;
49     my @validated = get_validated({borrowernumber => $borrowernumber});
50
51     if ($restricted && @validated) {
52         return 1;
53     } else {
54         return 0;
55     }
56 }
57
58 sub request {
59     my ($params) = @_;
60     my $borrowernumber = $params->{borrowernumber};
61     return unless $borrowernumber;
62     return unless can_be_discharged({ borrowernumber => $borrowernumber });
63
64     my $rs = Koha::Database->new->schema->resultset('Discharge');
65     return $rs->create({
66         borrower => $borrowernumber,
67         needed   => dt_from_string,
68     });
69 }
70
71 sub discharge {
72     my ($params) = @_;
73     my $borrowernumber = $params->{borrowernumber};
74     return unless $borrowernumber and can_be_discharged( { borrowernumber => $borrowernumber } );
75
76     # Cancel reserves
77     my $patron = Koha::Patrons->find( $borrowernumber );
78     my $holds = $patron->holds;
79     while ( my $hold = $holds->next ) {
80         $hold->cancel;
81     }
82
83     # Debar the member
84     Koha::Patron::Debarments::AddDebarment({
85         borrowernumber => $borrowernumber,
86         type           => 'DISCHARGE',
87     });
88
89     # Generate the discharge
90     my $rs = Koha::Database->new->schema->resultset('Discharge');
91     my $discharge = $rs->search({ borrower => $borrowernumber }, { order_by => { -desc => 'needed' }, rows => 1 });
92     if( $discharge->count > 0 ) {
93         $discharge->update({ validated => dt_from_string });
94     }
95     else {
96         $rs->create({
97             borrower  => $borrowernumber,
98             validated => dt_from_string,
99         });
100     }
101 }
102
103 sub generate_as_pdf {
104     my ($params) = @_;
105     return unless $params->{borrowernumber};
106
107     my $patron = Koha::Patrons->find( $params->{borrowernumber} );
108     my $letter = C4::Letters::GetPreparedLetter(
109         module      => 'members',
110         letter_code => 'DISCHARGE',
111         lang        => $patron->lang,
112         tables      => { borrowers => $params->{borrowernumber}, branches => $params->{'branchcode'}, },
113     );
114
115     my $today = output_pref( dt_from_string() );
116     $letter->{'title'}   =~ s/<<today>>/$today/g;
117     $letter->{'content'} =~ s/<<today>>/$today/g;
118
119     my $tmpl = C4::Templates::gettemplate('batch/print-notices.tt', 'intranet', new CGI);
120     $tmpl->param(
121         stylesheet => C4::Context->preference("NoticeCSS"),
122         today      => $today,
123         messages   => [$letter],
124     );
125
126     my $html_path = tmpnam() . '.html';
127     my $pdf_path = tmpnam() . '.pdf';
128     my $html_content = $tmpl->output;
129     open my $html_fh, '>:encoding(utf8)', $html_path;
130     say $html_fh $html_content;
131     close $html_fh;
132     my $output = eval { require PDF::FromHTML; return; } || $@;
133     if ($output && $params->{testing}) {
134         carp $output;
135         $pdf_path = undef;
136     }
137     elsif ($output) {
138         die $output;
139     }
140     else {
141         my $pdf = PDF::FromHTML->new( encoding => 'utf-8' );
142         $pdf->load_file( $html_path );
143         $pdf->convert;
144         $pdf->write_file( $pdf_path );
145     }
146
147     return $pdf_path;
148 }
149
150 sub get_pendings {
151     my ($params)       = @_;
152     my $branchcode     = $params->{branchcode};
153     my $borrowernumber = $params->{borrowernumber};
154
155     my $cond = {
156         'me.needed'    => { '!=', undef },
157         'me.validated' => undef,
158         ( defined $borrowernumber ? ( 'me.borrower' => $borrowernumber ) : () ),
159         ( defined $branchcode ? ( 'borrower.branchcode' => $branchcode ) : () ),
160     };
161
162     return search_limited( $cond );
163 }
164
165 sub get_validated {
166     my ($params)       = @_;
167     my $branchcode     = $params->{branchcode};
168     my $borrowernumber = $params->{borrowernumber};
169
170     my $cond = {
171         'me.validated' => { '!=', undef },
172         ( defined $borrowernumber ? ( 'me.borrower' => $borrowernumber ) : () ),
173         ( defined $branchcode ? ( 'borrower.branchcode' => $branchcode ) : () ),
174     };
175
176     return search_limited( $cond );
177 }
178
179 # TODO This module should be based on Koha::Object[s]
180 sub search_limited {
181     my ( $params, $attributes ) = @_;
182     my $userenv = C4::Context->userenv;
183     my @restricted_branchcodes;
184     if ( $userenv and $userenv->{number} ) {
185         my $logged_in_user = Koha::Patrons->find( $userenv->{number} );
186         @restricted_branchcodes = $logged_in_user->libraries_where_can_see_patrons;
187     }
188     $params->{'borrower.branchcode'} = { -in => \@restricted_branchcodes } if @restricted_branchcodes;
189     $attributes->{join} = 'borrower';
190
191     my $rs = Koha::Database->new->schema->resultset('Discharge');
192     return $rs->search( $params, { join => 'borrower' } );
193 }
194
195 1;