@@ -, +, @@ - Koha > Admin > circ rules > set 1 day fine every day of overdue for default rule - Issue a book return date last week - check-in the book => no debarment is set the limit of the debarment considered as unlimited and not displayed independant from debarrdate changes and can be used when placing an unlimited debarment too) --- C4/Circulation.pm | 60 ++++++++++++++++++++ C4/Members.pm | 11 ++- C4/Overdues.pm | 23 ++++---- circ/circulation.pl | 11 ++++ circ/returns.pl | 7 ++- installer/data/mysql/updatedatabase.pl | 11 ++++ .../prog/en/modules/circ/circulation.tt | 10 +++ .../intranet-tmpl/prog/en/modules/circ/returns.tt | 3 + .../prog/en/modules/members/memberentrygen.tt | 36 +++++++++++- .../prog/en/modules/members/moremember.tt | 5 +- koha-tmpl/opac-tmpl/prog/en/modules/opac-user.tt | 2 +- kohaversion.pl | 2 +- members/memberentry.pl | 19 +++++- members/moremember.pl | 12 ++++- members/setstatus.pl | 4 +- opac/opac-user.pl | 1 + 16 files changed, 188 insertions(+), 29 deletions(-) --- a/C4/Circulation.pm +++ a/C4/Circulation.pm @@ -43,6 +43,7 @@ use Date::Calc qw( Date_to_Days Day_of_Week Add_Delta_Days + check_date ); use POSIX qw(strftime); use C4::Branch; # GetBranches @@ -1626,6 +1627,10 @@ sub AddReturn { if ($borrowernumber) { my $fix = _FixOverduesOnReturn($borrowernumber, $item->{itemnumber}, $exemptfine, $dropbox); defined($fix) or warn "_FixOverduesOnReturn($borrowernumber, $item->{itemnumber}...) failed!"; # zero is OK, check defined + + # fix fine days + my $debardate = _FixFineDaysOnReturn( $borrower, $item, $issue->{date_due} ); + $messages->{'Debarred'} = $debardate if ($debardate); } # find reserves..... @@ -1749,6 +1754,61 @@ sub MarkIssueReturned { $sth_del->execute($borrowernumber, $itemnumber); } +=head2 _FixFineDaysOnReturn + + &_FixFineDaysOnReturn($borrower, $item, $datedue); + +C<$borrower> borrower hashref + +C<$item> item hashref + +C<$datedue> date due + +Internal function, called only by AddReturn that calculate and update the user fine days, and debars him + +=cut + +sub _FixFineDaysOnReturn { + my ( $borrower, $item, $datedue ) = @_; + + if ($datedue) { + $datedue = C4::Dates->new( $datedue, "iso" ); + } else { + return; + } + + my $branchcode = _GetCircControlBranch( $item, $borrower ); + my $calendar = C4::Calendar->new( branchcode => $branchcode ); + my $today = C4::Dates->new(); + + my $deltadays = $calendar->daysBetween( $datedue, C4::Dates->new() ); + + my $circcontrol = C4::Context::preference('CircControl'); + my $issuingrule = GetIssuingRule( $borrower->{categorycode}, $item->{itype}, $branchcode ); + my $finedays = $issuingrule->{finedays}; + + # exit if no finedays defined + return unless $finedays; + my $grace = $issuingrule->{firstremind}; + + if ( $deltadays - $grace > 0 ) { + my @newdate = Add_Delta_Days( Today(), $deltadays * $finedays ); + my $isonewdate = join( '-', @newdate ); + my ( $deby, $debm, $debd ) = split( /-/, $borrower->{debarred} ); + if ( check_date( $deby, $debm, $debd ) ) { + my @olddate = split( /-/, $borrower->{debarred} ); + + if ( Delta_Days( @olddate, @newdate ) > 0 ) { + C4::Members::DebarMember( $borrower->{borrowernumber}, $isonewdate ); + return $isonewdate; + } + } else { + C4::Members::DebarMember( $borrower->{borrowernumber}, $isonewdate ); + return $isonewdate; + } + } +} + =head2 _FixOverduesOnReturn &_FixOverduesOnReturn($brn,$itm, $exemptfine, $dropboxmode); --- a/C4/Members.pm +++ a/C4/Members.pm @@ -2090,7 +2090,7 @@ sub GetBorrowersNamesAndLatestIssue { =head2 DebarMember - my $success = DebarMember( $borrowernumber ); +my $success = DebarMember( $borrowernumber, $todate ); marks a Member as debarred, and therefore unable to checkout any more items. @@ -2102,13 +2102,16 @@ true on success, false on failure sub DebarMember { my $borrowernumber = shift; + my $todate = shift; return unless defined $borrowernumber; return unless $borrowernumber =~ /^\d+$/; - return ModMember( borrowernumber => $borrowernumber, - debarred => 1 ); - + return ModMember( + borrowernumber => $borrowernumber, + debarred => $todate + ); + } =head2 ModPrivacy --- a/C4/Overdues.pm +++ a/C4/Overdues.pm @@ -1048,16 +1048,17 @@ sub CheckBorrowerDebarred { SELECT debarred FROM borrowers WHERE borrowernumber=? + AND debarred > NOW() |; my $sth = $dbh->prepare($query); $sth->execute($borrowernumber); - my ($debarredstatus) = $sth->fetchrow; - return ( $debarredstatus eq '1' ? 1 : 0 ); + my $debarredstatus = $sth->fetchrow; + return $debarredstatus; } =head2 UpdateBorrowerDebarred - ($borrowerstatut) = &UpdateBorrowerDebarred($borrowernumber); +($borrowerstatut) = &UpdateBorrowerDebarred($borrowernumber, $todate); update status of borrowers in borrowers table (field debarred) @@ -1066,16 +1067,16 @@ C<$borrowernumber> borrower number =cut sub UpdateBorrowerDebarred{ - my($borrowernumber) = @_; - my $dbh = C4::Context->dbh; - my $query=qq|UPDATE borrowers - SET debarred='1' + my ( $borrowernumber, $todate ) = @_; + my $dbh = C4::Context->dbh; + my $query = qq|UPDATE borrowers + SET debarred=? WHERE borrowernumber=? |; - my $sth=$dbh->prepare($query); - $sth->execute($borrowernumber); - $sth->finish; - return 1; + my $sth = $dbh->prepare($query); + $sth->execute( $todate, $borrowernumber ); + $sth->finish; + return 1; } =head2 CheckExistantNotifyid --- a/circ/circulation.pl +++ a/circ/circulation.pl @@ -30,6 +30,7 @@ use C4::Dates qw/format_date/; use C4::Branch; # GetBranches use C4::Koha; # GetPrinter use C4::Circulation; +use C4::Overdues qw/CheckBorrowerDebarred/; use C4::Members; use C4::Biblio; use C4::Reserves; @@ -259,6 +260,16 @@ if ($borrowernumber) { issuecount => $issue, finetotal => $fines ); + + my $debar = CheckBorrowerDebarred($borrowernumber); + if ($debar) { + $template->param( 'userdebarred' => 1 ); + $template->param( 'debarredcomment' => $borrower->{debarredcomment} ); + if ( $debar ne "9999-12-31" ) { + $template->param( 'userdebarreddate' => C4::Dates::format_date($debar) ); + } + } + } # --- a/circ/returns.pl +++ a/circ/returns.pl @@ -454,7 +454,12 @@ foreach my $code ( keys %$messages ) { } elsif ( $code eq 'Wrongbranch' ) { } - + elsif ( $code eq 'Debarred' ) { + $err{debarred} = format_date( $messages->{'Debarred'} ); + $err{debarcardnumber} = $borrower->{cardnumber}; + $err{debarborrowernumber} = $borrower->{borrowernumber}; + $err{debarname} = "$borrower->{firstname} $borrower->{surname}"; + } else { die "Unknown error code $code"; # note we need all the (empty) elsif's above, or we die. # This forces the issue of staying in sync w/ Circulation.pm --- a/installer/data/mysql/updatedatabase.pl +++ a/installer/data/mysql/updatedatabase.pl @@ -4332,6 +4332,17 @@ if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { SetVersion($DBversion); } +$DBversion = "3.05.00.002"; +if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { + my $borrowers = $dbh->selectcol_arrayref( "SELECT borrowernumber from borrowers where debarred <>0;", { Columns => [1] } ); + $dbh->do("ALTER TABLE borrowers MODIFY debarred DATE DEFAULT NULL;"); + $dbh->do( "UPDATE borrowers set debarred='9999-12-31' where borrowernumber IN (" . join( ",", @$borrowers ) . ");" ) if ($borrowers and scalar(@$borrowers)>0); + $dbh->do("ALTER TABLE borrowers ADD COLUMN debarredcomment VARCHAR(255) DEFAULT NULL AFTER debarred;"); + print "Upgrade done (Change borrowers.debarred into Date )\n"; + + SetVersion($DBversion); +} + =head1 FUNCTIONS =head2 DropAllForeignKeys($table) --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt @@ -567,6 +567,16 @@ No patron matched [% message %]
  • Lost: Patron's card is lost
  • [% END %] + [% IF ( userdebarred ) %] +
  • + Restricted: Patron's account is restricted [% IF (userdebarreddate ) %] until [% userdebarreddate %] [% END %] [% IF (debarredcomment ) %]([% debarredcomment %])[% END %] +
    + + + +
    +
  • [% END %] + [% IF ( dbarred ) %]
  • Restricted: Patron's account is restricted Lift restriction
  • [% END %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt @@ -304,6 +304,9 @@ function Dopop(link) { [% IF ( errmsgloo.withdrawn ) %]

    Item is withdrawn.

    [% END %] + [% IF ( errmsgloo.debarred ) %] +

    [% errmsgloo.debarname %]([% errmsgloo.debarcardnumber %]) is now debarred until [% errmsgloo.debarred %]

    + [% END %] [% END %] [% IF ( soundon ) %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/memberentrygen.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/members/memberentrygen.tt @@ -947,7 +947,6 @@ [% FOREACH flagloo IN flagloop %]
  • @@ -963,10 +962,43 @@ [% END %] -
  • + [% END %] +
  • + + [% IF ( debarred ) %] + + + + + [% ELSE %] + + + + + [% END %] + +
    + + + Show Calendar + +
    + + +
  • + + [% END %] [% END %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt @@ -158,11 +158,10 @@ function validate1(date) { [% IF ( flagged ) %]