Bug 14103: Improved testing coverage
[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 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
15 my $rs = Koha::Database->new->schema->resultset('Discharge');
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 $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 request {
49     my ($params) = @_;
50     my $borrowernumber = $params->{borrowernumber};
51     return unless $borrowernumber;
52     return unless can_be_discharged({ borrowernumber => $borrowernumber });
53     return if count($params);
54
55     return $rs->create({
56         borrower => $borrowernumber,
57         needed   => dt_from_string,
58     });
59 }
60
61 sub discharge {
62     my ($params) = @_;
63     my $borrowernumber = $params->{borrowernumber};
64     return unless $borrowernumber and can_be_discharged( { borrowernumber => $borrowernumber } );
65
66     # Cancel reserves
67     my @reserves = GetReservesFromBorrowernumber($borrowernumber);
68     for my $reserve (@reserves) {
69         CancelReserve( { reserve_id => $reserve->{reserve_id} } );
70     }
71
72     # Debar the member
73     Koha::Borrower::Debarments::AddDebarment({
74         borrowernumber => $borrowernumber,
75         type           => 'DISCHARGE',
76     });
77
78     # Generate the discharge
79     my $discharge = $rs->search({ borrower => $borrowernumber });
80     if( $discharge->count > 0 ) {
81         $discharge->update({ validated => dt_from_string });
82     }
83     else {
84         $rs->create({
85             borrower  => $borrowernumber,
86             validated => dt_from_string,
87         });
88     }
89 }
90
91 sub generate_as_pdf {
92     my ($params) = @_;
93     return unless $params->{borrowernumber};
94
95     my $letter = C4::Letters::GetPreparedLetter(
96         module      => 'members',
97         letter_code => 'DISCHARGE',
98         tables      => { borrowers => $params->{borrowernumber}, },
99     );
100
101     my $today = output_pref( dt_from_string() );
102     $letter->{'title'}   =~ s/<<today>>/$today/g;
103     $letter->{'content'} =~ s/<<today>>/$today/g;
104
105     my $tmpl = C4::Templates::gettemplate('batch/print-notices.tt', 'intranet', new CGI);
106     $tmpl->param(
107         stylesheet => C4::Context->preference("NoticeCSS"),
108         today      => $today,
109         messages   => [$letter],
110     );
111
112     my $html_path = tmpnam() . '.html';
113     my $pdf_path = tmpnam() . '.pdf';
114     my $html_content = $tmpl->output;
115     open my $html_fh, '>:encoding(utf8)', $html_path;
116     say $html_fh $html_content;
117     close $html_fh;
118     my $output = eval { require PDF::FromHTML; return; } || $@;
119     if ($output && $params->{testing}) {
120         carp $output;
121         $pdf_path = undef;
122     }
123     elsif ($output) {
124         die $output;
125     }
126     else {
127         my $pdf = PDF::FromHTML->new( encoding => 'utf-8' );
128         $pdf->load_file( $html_path );
129         $pdf->convert;
130         $pdf->write_file( $pdf_path );
131     }
132
133     return $pdf_path;
134 }
135
136 sub get_pendings {
137     my ($params)       = @_;
138     my $branchcode     = $params->{branchcode};
139     my $borrowernumber = $params->{borrowernumber};
140
141     my $cond = {
142         'me.needed'    => { '!=', undef },
143         'me.validated' => undef,
144         ( defined $borrowernumber ? ( 'me.borrower' => $borrowernumber ) : () ),
145         ( defined $branchcode ? ( 'borrower.branchcode' => $branchcode ) : () ),
146     };
147
148     my @rs = $rs->search( $cond, { join => 'borrower' } );
149     return \@rs;
150 }
151
152 1;