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