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