@@ -, +, @@ --- Koha/Charges/Fees.pm | 42 ++++++++++++++----- Koha/ItemType.pm | 2 +- Koha/Schema/Result/Itemtype.pm | 12 +++++- admin/itemtypes.pl | 5 ++- .../data/mysql/atomicupdate/bug_20912.perl | 4 ++ installer/data/mysql/kohastructure.sql | 3 +- .../prog/en/modules/admin/itemtypes.tt | 14 ++++++- .../prog/en/modules/catalogue/moredetail.tt | 1 + 8 files changed, 66 insertions(+), 17 deletions(-) --- a/Koha/Charges/Fees.pm +++ a/Koha/Charges/Fees.pm @@ -22,6 +22,7 @@ use Modern::Perl; use Carp qw( confess ); use Koha::Calendar; +use Koha::IssuingRules; use Koha::DateUtils qw( dt_from_string ); use Koha::Exceptions; @@ -85,25 +86,44 @@ sub new { =cut sub accumulate_rentalcharge { - my ( $self, $params ) = @_; + my ( $self ) = @_; my $itemtype = Koha::ItemTypes->find( $self->item->effective_itemtype ); - my $rentalcharge_daily = $itemtype->rentalcharge_daily; - - return undef unless $rentalcharge_daily && $rentalcharge_daily > 0; + my $issuing_rule = Koha::IssuingRules->get_effective_issuing_rule( + { + categorycode => $self->patron->categorycode, + itemtype => $itemtype->id, + branchcode => $self->library->id + } + ); + my $units = $issuing_rule->lengthunit; + my $rentalcharge_increment = ( $units eq 'days' ) ? $itemtype->rentalcharge_daily : $itemtype->rentalcharge_hourly; + + return 0 unless $rentalcharge_increment && $rentalcharge_increment > 0; my $duration; - if ( C4::Context->preference('finesCalendar') eq 'noFinesWhenClosed' ) { - my $calendar = Koha::Calendar->new( branchcode => $self->library->id ); - $duration = $calendar->days_between( $self->from_date, $self->to_date ); + my $calendar = Koha::Calendar->new( branchcode => $self->library->id ); + + if ( $units eq 'hours' ) { + if ( C4::Context->preference('finesCalendar') eq 'noFinesWhenClosed' ) { + $duration = + $calendar->hours_between( $self->from_date, $self->to_date ); + } + else { + $duration = $self->to_date->delta_ms($self->from_date); + } } else { - $duration = $self->to_date->delta_days($self->from_date); + if ( C4::Context->preference('finesCalendar') eq 'noFinesWhenClosed' ) { + $duration = + $calendar->days_between( $self->from_date, $self->to_date ); + } + else { + $duration = $self->to_date->delta_days( $self->from_date ); + } } - my $days = $duration->in_units('days'); - - my $charge = $rentalcharge_daily * $days; + my $charge = $rentalcharge_increment * $duration->in_units($units); return $charge; } --- a/Koha/ItemType.pm +++ a/Koha/ItemType.pm @@ -33,7 +33,7 @@ Koha::ItemType - Koha Item type Object class =head1 API -=head2 Class Methods +=head2 Class methods =cut --- a/Koha/Schema/Result/Itemtype.pm +++ a/Koha/Schema/Result/Itemtype.pm @@ -47,6 +47,12 @@ __PACKAGE__->table("itemtypes"); is_nullable: 1 size: [28,6] +=head2 rentalcharge_hourly + + data_type: 'decimal' + is_nullable: 1 + size: [28,6] + =head2 defaultreplacecost data_type: 'decimal' @@ -117,6 +123,8 @@ __PACKAGE__->add_columns( { data_type => "decimal", is_nullable => 1, size => [28, 6] }, "rentalcharge_daily", { data_type => "decimal", is_nullable => 1, size => [28, 6] }, + "rentalcharge_hourly", + { data_type => "decimal", is_nullable => 1, size => [28, 6] }, "defaultreplacecost", { data_type => "decimal", is_nullable => 1, size => [28, 6] }, "processfee", @@ -234,8 +242,8 @@ __PACKAGE__->has_many( ); -# Created by DBIx::Class::Schema::Loader v0.07046 @ 2018-10-25 12:41:04 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:Iyb9JKB8gdyZPtZloHVxSQ +# Created by DBIx::Class::Schema::Loader v0.07046 @ 2019-01-31 11:59:27 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:gYBgGWpeUyFuyzfBNIEKCQ # Use the ItemtypeLocalization view to create the join on localization our $LANGUAGE; --- a/admin/itemtypes.pl +++ a/admin/itemtypes.pl @@ -73,6 +73,7 @@ if ( $op eq 'add_form' ) { my $description = $input->param('description'); my $rentalcharge = $input->param('rentalcharge'); my $rentalcharge_daily = $input->param('rentalcharge_daily'); + my $rentalcharge_hourly = $input->param('rentalcharge_hourly'); my $defaultreplacecost = $input->param('defaultreplacecost'); my $processfee = $input->param('processfee'); my $image = $input->param('image') || q||; @@ -94,6 +95,7 @@ if ( $op eq 'add_form' ) { $itemtype->description($description); $itemtype->rentalcharge($rentalcharge); $itemtype->rentalcharge_daily($rentalcharge_daily); + $itemtype->rentalcharge_hourly($rentalcharge_hourly); $itemtype->defaultreplacecost($defaultreplacecost); $itemtype->processfee($processfee); $itemtype->notforloan($notforloan); @@ -118,7 +120,8 @@ if ( $op eq 'add_form' ) { itemtype => $itemtype_code, description => $description, rentalcharge => $rentalcharge, - rentalcharge_daily => $rentalcharge_daily, + rentalcharge_daily => $rentalcharge_daily, + rentalcharge_hourly => $rentalcharge_hourly, defaultreplacecost => $defaultreplacecost, processfee => $processfee, notforloan => $notforloan, --- a/installer/data/mysql/atomicupdate/bug_20912.perl +++ a/installer/data/mysql/atomicupdate/bug_20912.perl @@ -5,6 +5,10 @@ if ( CheckVersion($DBversion) ) { $dbh->do("ALTER TABLE `itemtypes` ADD COLUMN `rentalcharge_daily` decimal(28,6) default NULL AFTER `rentalcharge`"); } + if ( !column_exists( 'itemtypes', 'rentalcharge_hourly' ) ) { + $dbh->do("ALTER TABLE `itemtypes` ADD COLUMN `rentalcharge_hourly` decimal(28,6) default NULL AFTER `rentalcharge_daily`"); + } + if ( column_exists( 'itemtypes', 'rental_charge_daily' ) ) { $dbh->do("UPDATE `itemtypes` SET `rentalcharge_daily` = `rental_charge_daily`"); $dbh->do("ALTER TABLE `itemtypes` DROP COLUMN `rental_charge_daily`"); --- a/installer/data/mysql/kohastructure.sql +++ a/installer/data/mysql/kohastructure.sql @@ -988,7 +988,8 @@ CREATE TABLE `itemtypes` ( -- defines the item types itemtype varchar(10) NOT NULL default '', -- unique key, a code associated with the item type description LONGTEXT, -- a plain text explanation of the item type rentalcharge decimal(28,6) default NULL, -- the amount charged when this item is checked out/issued - rentalcharge_daily decimal(28,6) default NULL, -- the amount charged for each increment (day/hour) between checkout date and due date + rentalcharge_daily decimal(28,6) default NULL, -- the amount charged for each day between checkout date and due date + rentalcharge_hourly decimal(28,6) default NULL, -- the amount charged for each hour between checkout date and due date defaultreplacecost decimal(28,6) default NULL, -- default replacement cost processfee decimal(28,6) default NULL, -- default text be recorded in the column note when the processing fee is applied notforloan smallint(6) default NULL, -- 1 if the item is not for loan, 0 if the item is available for loan --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/itemtypes.tt @@ -236,7 +236,12 @@ Item types administration
  • - This fee is charged a checkout/renewal time for each day between the checkout/renewal date and due date. + This fee is charged at checkout/renewal time for each day between the checkout/renewal date and due date for loans specified in days. +
  • +
  • + + + This fee is charged at checkout/renewal time for each hour between the checkout/renewal date and due date for loans specifie in hours.
  • @@ -337,6 +342,7 @@ Item types administration Hide in OPAC Rental charge Daily rental charge + Hourly rental charge Default replacement cost Processing fee (when lost) Checkin message @@ -383,6 +389,12 @@ Item types administration [% itemtype.rentalcharge_daily | $Price %] [% END %] + + [% UNLESS ( itemtype.notforloan ) %] + [% itemtype.rentalcharge_hourly | $Price %] + [% END %] + + [% itemtype.defaultreplacecost | $Price %] [% itemtype.processfee | $Price %] [% itemtype.checkinmsg | html_line_break | $raw %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt @@ -36,6 +36,7 @@ [% END %] [% IF ( rentalcharge ) %]
  • Rental charge:[% rentalcharge | $Price %] 
  • [% END %] [% IF ( rentalcharge_daily ) %]
  • Daily rental charge:[% rentalcharge_daily | $Price %] 
  • [% END %] + [% IF ( rentalcharge_hourly ) %]
  • Hourly rental charge:[% rentalcharge_hourly | $Price %] 
  • [% END %]
  • ISBN: [% isbn | html %] 
  • Publisher:[% place | html %] [% publishercode | html %] [% publicationyear | html %] 
  • [% IF ( volumeddesc ) %]
  • Volume: [% volumeddesc | html %]
  • [% END %] --