Main Koha release repository https://koha-community.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

152 lines
4.0 KiB

package Koha::Borrower::Discharge;
use Modern::Perl;
use CGI;
use File::Temp qw( :POSIX );
use Carp;
use C4::Templates qw ( gettemplate );
use C4::Members qw( GetPendingIssues );
use C4::Reserves qw( GetReservesFromBorrowernumber CancelReserve );
use Koha::Database;
use Koha::DateUtils qw( dt_from_string output_pref );
my $rs = Koha::Database->new->schema->resultset('Discharge');
sub count {
my ($params) = @_;
my $values = {};
if( $params->{borrowernumber} ) {
$values->{borrower} = $params->{borrowernumber};
}
if( $params->{pending} ) {
$values->{needed} = { '!=', undef };
$values->{validated} = undef;
}
elsif( $params->{validated} ) {
$values->{validated} = { '!=', undef };
}
return $rs->search( $values )->count;
}
sub can_be_discharged {
my ($params) = @_;
return unless $params->{borrowernumber};
my $issues = GetPendingIssues( $params->{borrowernumber} );
if( @$issues ) {
return 0;
}
else {
return 1;
}
}
sub request {
my ($params) = @_;
my $borrowernumber = $params->{borrowernumber};
return unless $borrowernumber;
return unless can_be_discharged({ borrowernumber => $borrowernumber });
return if count($params);
return $rs->create({
borrower => $borrowernumber,
needed => dt_from_string,
});
}
sub discharge {
my ($params) = @_;
my $borrowernumber = $params->{borrowernumber};
return unless $borrowernumber and can_be_discharged( { borrowernumber => $borrowernumber } );
# Cancel reserves
my @reserves = GetReservesFromBorrowernumber($borrowernumber);
for my $reserve (@reserves) {
CancelReserve( { reserve_id => $reserve->{reserve_id} } );
}
# Debar the member
Koha::Borrower::Debarments::AddDebarment({
borrowernumber => $borrowernumber,
type => 'DISCHARGE',
});
# Generate the discharge
my $discharge = $rs->search({ borrower => $borrowernumber });
if( $discharge->count > 0 ) {
$discharge->update({ validated => dt_from_string });
}
else {
$rs->create({
borrower => $borrowernumber,
validated => dt_from_string,
});
}
}
sub generate_as_pdf {
my ($params) = @_;
return unless $params->{borrowernumber};
my $letter = C4::Letters::GetPreparedLetter(
module => 'members',
letter_code => 'DISCHARGE',
tables => { borrowers => $params->{borrowernumber}, branches => $params->{'branchcode'}, },
);
my $today = output_pref( dt_from_string() );
$letter->{'title'} =~ s/<<today>>/$today/g;
$letter->{'content'} =~ s/<<today>>/$today/g;
my $tmpl = C4::Templates::gettemplate('batch/print-notices.tt', 'intranet', new CGI);
$tmpl->param(
stylesheet => C4::Context->preference("NoticeCSS"),
today => $today,
messages => [$letter],
);
my $html_path = tmpnam() . '.html';
my $pdf_path = tmpnam() . '.pdf';
my $html_content = $tmpl->output;
open my $html_fh, '>:encoding(utf8)', $html_path;
say $html_fh $html_content;
close $html_fh;
my $output = eval { require PDF::FromHTML; return; } || $@;
if ($output && $params->{testing}) {
carp $output;
$pdf_path = undef;
}
elsif ($output) {
die $output;
}
else {
my $pdf = PDF::FromHTML->new( encoding => 'utf-8' );
$pdf->load_file( $html_path );
$pdf->convert;
$pdf->write_file( $pdf_path );
}
return $pdf_path;
}
sub get_pendings {
my ($params) = @_;
my $branchcode = $params->{branchcode};
my $borrowernumber = $params->{borrowernumber};
my $cond = {
'me.needed' => { '!=', undef },
'me.validated' => undef,
( defined $borrowernumber ? ( 'me.borrower' => $borrowernumber ) : () ),
( defined $branchcode ? ( 'borrower.branchcode' => $branchcode ) : () ),
};
my @rs = $rs->search( $cond, { join => 'borrower' } );
return \@rs;
}
1;