Bug 17762: Send lang to GetPreparedLetter
[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( GetReservesFromBorrowernumber CancelReserve );
11
12 use Koha::Database;
13 use Koha::DateUtils qw( dt_from_string output_pref );
14 use Koha::Patrons;
15
16 my $rs = Koha::Database->new->schema->resultset('Discharge');
17
18 sub count {
19     my ($params) = @_;
20     my $values = {};
21
22     if( $params->{borrowernumber} ) {
23         $values->{borrower} = $params->{borrowernumber};
24     }
25     if( $params->{pending} ) {
26         $values->{needed} = { '!=', undef };
27         $values->{validated} = undef;
28     }
29     elsif( $params->{validated} ) {
30         $values->{validated} = { '!=', undef };
31     }
32
33     return $rs->search( $values )->count;
34 }
35
36 sub can_be_discharged {
37     my ($params) = @_;
38     return unless $params->{borrowernumber};
39
40     my $issues = GetPendingIssues( $params->{borrowernumber} );
41     if( @$issues ) {
42         return 0;
43     }
44     else {
45         return 1;
46     }
47 }
48
49 sub is_discharged {
50     my ($params) = @_;
51     return unless $params->{borrowernumber};
52     my $borrowernumber = $params->{borrowernumber};
53
54     my $restricted = Koha::Patrons->find( $borrowernumber )->is_debarred;
55     my $validated = get_validated({borrowernumber => $borrowernumber});
56
57     if ($restricted && $validated) {
58         return 1;
59     } else {
60         return 0;
61     }
62 }
63
64 sub request {
65     my ($params) = @_;
66     my $borrowernumber = $params->{borrowernumber};
67     return unless $borrowernumber;
68     return unless can_be_discharged({ borrowernumber => $borrowernumber });
69
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 @reserves = GetReservesFromBorrowernumber($borrowernumber);
83     for my $reserve (@reserves) {
84         CancelReserve( { reserve_id => $reserve->{reserve_id} } );
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 $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', new CGI);
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     open my $html_fh, '>:encoding(utf8)', $html_path;
133     say $html_fh $html_content;
134     close $html_fh;
135     my $output = eval { require PDF::FromHTML; return; } || $@;
136     if ($output && $params->{testing}) {
137         carp $output;
138         $pdf_path = undef;
139     }
140     elsif ($output) {
141         die $output;
142     }
143     else {
144         my $pdf = PDF::FromHTML->new( encoding => 'utf-8' );
145         $pdf->load_file( $html_path );
146         $pdf->convert;
147         $pdf->write_file( $pdf_path );
148     }
149
150     return $pdf_path;
151 }
152
153 sub get_pendings {
154     my ($params)       = @_;
155     my $branchcode     = $params->{branchcode};
156     my $borrowernumber = $params->{borrowernumber};
157
158     my $cond = {
159         'me.needed'    => { '!=', undef },
160         'me.validated' => undef,
161         ( defined $borrowernumber ? ( 'me.borrower' => $borrowernumber ) : () ),
162         ( defined $branchcode ? ( 'borrower.branchcode' => $branchcode ) : () ),
163     };
164
165     my @rs = $rs->search( $cond, { join => 'borrower' } );
166     return \@rs;
167 }
168
169 sub get_validated {
170     my ($params)       = @_;
171     my $branchcode     = $params->{branchcode};
172     my $borrowernumber = $params->{borrowernumber};
173
174     my $cond = {
175         'me.validated' => { '!=', undef },
176         ( defined $borrowernumber ? ( 'me.borrower' => $borrowernumber ) : () ),
177         ( defined $branchcode ? ( 'borrower.branchcode' => $branchcode ) : () ),
178     };
179
180     my @rs = $rs->search( $cond, { join => 'borrower' } );
181     return \@rs;
182 }
183
184
185 1;