Bug 8007: Discharge management
[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 HTML::HTMLDoc;
7
8 use C4::Members qw( GetPendingIssues );
9 use C4::Reserves qw( GetReservesFromBorrowernumber CancelReserve );
10
11 use Koha::Database;
12 use Koha::DateUtils qw( dt_from_string output_pref );
13
14 my $rs = Koha::Database->new->schema->resultset('Discharge');
15
16 sub count {
17     my ($params) = @_;
18     my $values = {};
19
20     if( $params->{borrowernumber} ) {
21         $values->{borrower} = $params->{borrowernumber};
22     }
23     if( $params->{pending} ) {
24         $values->{needed} = { '!=', undef };
25         $values->{validated} = undef;
26     }
27     elsif( $params->{validated} ) {
28         $values->{validated} = { '!=', undef };
29     }
30
31     return $rs->search( $values )->count;
32 }
33
34 sub can_be_discharged {
35     my ($params) = @_;
36     return unless $params->{borrowernumber};
37
38     my $issues = GetPendingIssues( $params->{borrowernumber} );
39     if( @$issues ) {
40         return 0;
41     }
42     else {
43         return 1;
44     }
45 }
46
47 sub request {
48     my ($params) = @_;
49     my $borrowernumber = $params->{borrowernumber};
50     return unless $borrowernumber;
51     return unless can_be_discharged({ borrowernumber => $borrowernumber });
52     return if count($params);
53
54     return $rs->create({
55         borrower => $borrowernumber,
56         needed   => dt_from_string,
57     });
58 }
59
60 sub discharge {
61     my ($params) = @_;
62     my $borrowernumber = $params->{borrowernumber};
63     return unless $borrowernumber and can_be_discharged( { borrowernumber => $borrowernumber } );
64
65     # Cancel reserves
66     my @reserves = GetReservesFromBorrowernumber($borrowernumber);
67     for my $reserve (@reserves) {
68         CancelReserve( { reserve_id => $reserve->{reserve_id} } );
69     }
70
71     # Debar the member
72     Koha::Borrower::Debarments::AddDebarment({
73         borrowernumber => $borrowernumber,
74         type           => 'DISCHARGE',
75     });
76
77     # Generate the discharge
78     my $discharge = $rs->search({ borrower => $borrowernumber });
79     if( $discharge->count > 0 ) {
80         $discharge->update({ validated => dt_from_string });
81     }
82     else {
83         $rs->create({
84             borrower  => $borrowernumber,
85             validated => dt_from_string,
86         });
87     }
88 }
89
90 sub generate_as_pdf {
91     my ($params) = @_;
92     return unless $params->{borrowernumber};
93
94     my $letter = C4::Letters::GetPreparedLetter(
95         module      => 'members',
96         letter_code => 'DISCHARGE',
97         tables      => { borrowers => $params->{borrowernumber}, },
98     );
99
100     my $today = output_pref( dt_from_string() );
101     $letter->{'title'}   =~ s/<<today>>/$today/g;
102     $letter->{'content'} =~ s/<<today>>/$today/g;
103
104     my $tmpl = C4::Templates::gettemplate('batch/print-notices.tt', 'intranet', new CGI);
105     $tmpl->param(
106         stylesheet => C4::Context->preference("NoticeCSS"),
107         today      => $today,
108         messages   => [$letter],
109     );
110
111     my $pdf_path = tmpnam();
112     my $htmldoc  = new HTML::HTMLDoc();
113     $htmldoc->set_html_content($tmpl->output);
114     $htmldoc->generate_pdf()->to_file($pdf_path);
115
116     return $pdf_path;
117 }
118
119 sub get_pendings {
120     my ($params)       = @_;
121     my $branchcode     = $params->{branchcode};
122     my $borrowernumber = $params->{borrowernumber};
123
124     my $cond = {
125         'me.needed'    => { '!=', undef },
126         'me.validated' => undef,
127         ( defined $borrowernumber ? ( 'me.borrower' => $borrowernumber ) : () ),
128         ( defined $branchcode ? ( 'borrower.branchcode' => $branchcode ) : () ),
129     };
130
131     my @rs = $rs->search( $cond, { join => 'borrower' } );
132     return \@rs;
133 }
134
135 1;