Bug 18336: DBIC Schema changes
[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     return search_limited( $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 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', 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     return search_limited( $cond );
166 }
167
168 sub get_validated {
169     my ($params)       = @_;
170     my $branchcode     = $params->{branchcode};
171     my $borrowernumber = $params->{borrowernumber};
172
173     my $cond = {
174         'me.validated' => { '!=', undef },
175         ( defined $borrowernumber ? ( 'me.borrower' => $borrowernumber ) : () ),
176         ( defined $branchcode ? ( 'borrower.branchcode' => $branchcode ) : () ),
177     };
178
179     return search_limited( $cond );
180 }
181
182 # TODO This module should be based on Koha::Object[s]
183 sub search_limited {
184     my ( $params, $attributes ) = @_;
185     my $userenv = C4::Context->userenv;
186     my @restricted_branchcodes;
187     if ( $userenv and $userenv->{number} ) {
188         my $logged_in_user = Koha::Patrons->find( $userenv->{number} );
189         @restricted_branchcodes = $logged_in_user->libraries_where_can_see_patrons;
190     }
191     $params->{'borrower.branchcode'} = { -in => \@restricted_branchcodes } if @restricted_branchcodes;
192     $attributes->{join} = 'borrower';
193
194     my $rs = Koha::Database->new->schema->resultset('Discharge');
195     return $rs->search( $params, { join => 'borrower' } );
196 }
197
198 1;