507c7f4224
Allow partial payment of outstanding fines against either individual fine entries or as a lump payment Sponsered by East Brunswick Public Library, East Brunswick, NJ, USA NB: Adds a version of the include circ-menu.inc as circ-menu.tt this has the same functionality as the old include but does not require all the borrowers attributes to be passed as global scoped variables Signed-off-by: Liz Rea <lrea@nekls.org> Bug 3498 - Documentation update to explain what every button does. Help file updated to the following: Pay and Writeoff Fines Each line item can be paid in full, partially paid, or written off. Pay a fine in full Click "Pay" next to the fine you want to pay in full The full amount of the fine will be populated for you in the "Collect From Patron" box Click "Confirm" The fine will be removed from outstanding fines, and displayed as fully paid. Pay a partial fine Click "Pay" next to the fine you want to partially pay Enter the amount you are collecting from the patron in the "Collect From Patron" box Click "Confirm" The fine will be updated to show the original Amount, and the current Amount Outstanding Writeoff a single fine Click "Writeoff" next to the fine you wish to writeoff. The fine will be removed from outstanding fines, and displayed as fully paid. Pay an amount towards all fines Click the "Pay Amount" button Enter the amount you are collecting from the patron in "Collect from Patron." The sum of all fines is shown in "Total Amount Outstanding" Click "Confirm" The fine totals will be updated with the payment applied to oldest fines first. Writeoff All fines Click the "Writeoff All" button All fines will be removed from outstanding fines, and displayed as written off. Pay Selected fines Check the selection boxes next to the fines you wish to pay, click "Pay Selected" Enter an amount to pay towards the fines. Click "Confirm" The fine totals will be updated with the payment applied to the oldest selected fines first. Bug 3498 - adding parens to TT IF Statements for style pay.tt Bug 3498 - Add parens to TT IF statements for style paycollect.tt Signed-off-by: Ian Walls <ian.walls@bywatersolutions.com> Signed-off-by: Chris Cormack <chrisc@catalyst.net.nz>
171 lines
5.7 KiB
Perl
Executable file
171 lines
5.7 KiB
Perl
Executable file
#!/usr/bin/perl
|
|
# Copyright 2009,2010 PTFS Inc.
|
|
# Copyright 2011 PTFS-Europe Ltd
|
|
#
|
|
# This file is part of Koha.
|
|
#
|
|
# Koha is free software; you can redistribute it and/or modify it under the
|
|
# terms of the GNU General Public License as published by the Free Software
|
|
# Foundation; either version 2 of the License, or (at your option) any later
|
|
# version.
|
|
#
|
|
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along
|
|
# with Koha; if not, write to the Free Software Foundation, Inc.,
|
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
use strict;
|
|
use warnings;
|
|
use C4::Context;
|
|
use C4::Auth;
|
|
use C4::Output;
|
|
use CGI;
|
|
use C4::Members;
|
|
use C4::Accounts;
|
|
use C4::Koha;
|
|
use C4::Branch;
|
|
|
|
my $input = CGI->new();
|
|
|
|
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
|
|
{ template_name => 'members/paycollect.tmpl',
|
|
query => $input,
|
|
type => 'intranet',
|
|
authnotrequired => 0,
|
|
flagsrequired => { borrowers => 1, updatecharges => 1 },
|
|
debug => 1,
|
|
}
|
|
);
|
|
|
|
# get borrower details
|
|
my $borrowernumber = $input->param('borrowernumber');
|
|
my $borrower = GetMember( borrowernumber => $borrowernumber );
|
|
my $user = $input->remote_user;
|
|
|
|
# get account details
|
|
my $branch = GetBranch( $input, GetBranches() );
|
|
|
|
my ( $total_due, $accts, $numaccts ) = GetMemberAccountRecords($borrowernumber);
|
|
my $total_paid = $input->param('paid');
|
|
|
|
my $individual = $input->param('pay_individual');
|
|
my $writeoff = $input->param('writeoff_individual');
|
|
my $select_lines = $input->param('selected');
|
|
my $select = $input->param('selected_accts');
|
|
my $accountno;
|
|
|
|
if ( $individual || $writeoff ) {
|
|
if ($individual) {
|
|
$template->param( pay_individual => 1 );
|
|
} elsif ($writeoff) {
|
|
$template->param( writeoff_individual => 1 );
|
|
}
|
|
my $accounttype = $input->param('accounttype');
|
|
my $amount = $input->param('amount');
|
|
my $amountoutstanding = $input->param('amountoutstanding');
|
|
$accountno = $input->param('accountno');
|
|
my $description = $input->param('description');
|
|
my $title = $input->param('title');
|
|
my $notify_id = $input->param('notify_id');
|
|
my $notify_level = $input->param('notify_level');
|
|
$total_due = $amountoutstanding;
|
|
$template->param(
|
|
accounttype => $accounttype,
|
|
accountno => $accountno,
|
|
amount => $amount,
|
|
amountoutstanding => $amountoutstanding,
|
|
title => $title,
|
|
description => $description,
|
|
notify_id => $notify_id,
|
|
notify_level => $notify_level,
|
|
);
|
|
} elsif ($select_lines) {
|
|
$total_due = $input->param('amt');
|
|
$template->param(
|
|
selected_accts => $select_lines,
|
|
amt => $total_due
|
|
);
|
|
}
|
|
|
|
if ( $total_paid and $total_paid ne '0.00' ) {
|
|
if ( $total_paid < 0 or $total_paid > $total_due ) {
|
|
$template->param(
|
|
error => sprintf( 'You must pay a value less than or equal to %f.2',
|
|
$total_due )
|
|
);
|
|
} else {
|
|
if ($individual) {
|
|
if ( $total_paid == $total_due ) {
|
|
makepayment( $borrowernumber, $accountno, $total_paid, $user,
|
|
$branch );
|
|
} else {
|
|
makepartialpayment( $borrowernumber, $accountno, $total_paid,
|
|
$user, $branch );
|
|
}
|
|
print $input->redirect(
|
|
"/cgi-bin/koha/members/pay.pl?borrowernumber=$borrowernumber");
|
|
} else {
|
|
if ($select) {
|
|
if ( $select =~ /^([\d,]*).*/ ) {
|
|
$select = $1; # ensure passing no junk
|
|
}
|
|
my @acc = split /,/, $select;
|
|
recordpayment_selectaccts( $borrowernumber, $total_paid,
|
|
\@acc );
|
|
} else {
|
|
recordpayment( $borrowernumber, $total_paid );
|
|
}
|
|
|
|
# recordpayment does not return success or failure so lets redisplay the boraccount
|
|
|
|
print $input->redirect(
|
|
"/cgi-bin/koha/members/boraccount.pl?borrowernumber=$borrowernumber"
|
|
);
|
|
}
|
|
}
|
|
} else {
|
|
$total_paid = '0.00'; #TODO not right with pay_individual
|
|
}
|
|
|
|
borrower_add_additional_fields($borrower);
|
|
|
|
$template->param(
|
|
|
|
#borrowenumber => $borrower->{borrowernumber}, # some templates require global
|
|
borrowenumber => $borrowernumber, # some templates require global
|
|
borrower => $borrower,
|
|
total => $total_due
|
|
);
|
|
|
|
output_html_with_http_headers $input, $cookie, $template->output;
|
|
|
|
sub borrower_add_additional_fields {
|
|
my $b_ref = shift;
|
|
|
|
# some borrower info is not returned in the standard call despite being assumed
|
|
# in a number of templates. It should not be the business of this script but in lieu of
|
|
# a revised api here it is ...
|
|
if ( $b_ref->{category_type} eq 'C' ) {
|
|
my ( $catcodes, $labels ) =
|
|
GetborCatFromCatType( 'A', 'WHERE category_type = ?' );
|
|
if ( @{$catcodes} ) {
|
|
if ( @{$catcodes} > 1 ) {
|
|
$b_ref->{CATCODE_MULTI} = 1;
|
|
} elsif ( @{$catcodes} == 1 ) {
|
|
$b_ref->{catcode} = $catcodes->[0];
|
|
}
|
|
}
|
|
} elsif ( $b_ref->{category_type} eq 'A' ) {
|
|
$b_ref->{adultborrower} = 1;
|
|
}
|
|
my ( $picture, $dberror ) = GetPatronImage( $b_ref->{cardnumber} );
|
|
if ($picture) {
|
|
$b_ref->{has_picture} = 1;
|
|
}
|
|
|
|
$b_ref->{branchname} = GetBranchName( $b_ref->{branchcode} );
|
|
return;
|
|
}
|