Bug 14103: PDF::FromHTML is conditionally required on UseDischarge systempreference
[koha.git] / Koha / Borrower / Discharge.pm
1 package Koha::Borrower::Discharge;
2
3 use Modern::Perl;
4 use CGI;
5 use File::Temp qw( :POSIX );
6
7 use C4::Members qw( GetPendingIssues );
8 use C4::Reserves qw( GetReservesFromBorrowernumber CancelReserve );
9
10 use Koha::Database;
11 use Koha::DateUtils qw( dt_from_string output_pref );
12
13 my $rs = Koha::Database->new->schema->resultset('Discharge');
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     return $rs->search( $values )->count;
31 }
32
33 sub can_be_discharged {
34     my ($params) = @_;
35     return unless $params->{borrowernumber};
36
37     my $issues = GetPendingIssues( $params->{borrowernumber} );
38     if( @$issues ) {
39         return 0;
40     }
41     else {
42         return 1;
43     }
44 }
45
46 sub request {
47     my ($params) = @_;
48     my $borrowernumber = $params->{borrowernumber};
49     return unless $borrowernumber;
50     return unless can_be_discharged({ borrowernumber => $borrowernumber });
51     return if count($params);
52
53     return $rs->create({
54         borrower => $borrowernumber,
55         needed   => dt_from_string,
56     });
57 }
58
59 sub discharge {
60     my ($params) = @_;
61     my $borrowernumber = $params->{borrowernumber};
62     return unless $borrowernumber and can_be_discharged( { borrowernumber => $borrowernumber } );
63
64     # Cancel reserves
65     my @reserves = GetReservesFromBorrowernumber($borrowernumber);
66     for my $reserve (@reserves) {
67         CancelReserve( { reserve_id => $reserve->{reserve_id} } );
68     }
69
70     # Debar the member
71     Koha::Borrower::Debarments::AddDebarment({
72         borrowernumber => $borrowernumber,
73         type           => 'DISCHARGE',
74     });
75
76     # Generate the discharge
77     my $discharge = $rs->search({ borrower => $borrowernumber });
78     if( $discharge->count > 0 ) {
79         $discharge->update({ validated => dt_from_string });
80     }
81     else {
82         $rs->create({
83             borrower  => $borrowernumber,
84             validated => dt_from_string,
85         });
86     }
87 }
88
89 sub generate_as_pdf {
90     my ($params) = @_;
91     return unless $params->{borrowernumber};
92
93     my $letter = C4::Letters::GetPreparedLetter(
94         module      => 'members',
95         letter_code => 'DISCHARGE',
96         tables      => { borrowers => $params->{borrowernumber}, },
97     );
98
99     my $today = output_pref( dt_from_string() );
100     $letter->{'title'}   =~ s/<<today>>/$today/g;
101     $letter->{'content'} =~ s/<<today>>/$today/g;
102
103     my $tmpl = C4::Templates::gettemplate('batch/print-notices.tt', 'intranet', new CGI);
104     $tmpl->param(
105         stylesheet => C4::Context->preference("NoticeCSS"),
106         today      => $today,
107         messages   => [$letter],
108     );
109
110     my $html_path = tmpnam() . '.html';
111     my $pdf_path = tmpnam() . '.pdf';
112     my $html_content = $tmpl->output;
113     open my $html_fh, '>:encoding(utf8)', $html_path;
114     say $html_fh $html_content;
115     close $html_fh;
116     require PDF::FromHTML;
117     my $pdf = PDF::FromHTML->new( encoding => 'utf-8' );
118     $pdf->load_file( $html_path );
119     $pdf->convert;
120     $pdf->write_file( $pdf_path );
121
122     return $pdf_path;
123 }
124
125 sub get_pendings {
126     my ($params)       = @_;
127     my $branchcode     = $params->{branchcode};
128     my $borrowernumber = $params->{borrowernumber};
129
130     my $cond = {
131         'me.needed'    => { '!=', undef },
132         'me.validated' => undef,
133         ( defined $borrowernumber ? ( 'me.borrower' => $borrowernumber ) : () ),
134         ( defined $branchcode ? ( 'borrower.branchcode' => $branchcode ) : () ),
135     };
136
137     my @rs = $rs->search( $cond, { join => 'borrower' } );
138     return \@rs;
139 }
140
141 1;