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