@@ -, +, @@ --- Koha/Item.pm | 49 +- Koha/Library.pm | 46 ++ Koha/REST/V1/Stage.pm | 60 ++ Koha/StockRotationItem.pm | 273 +++++++++ Koha/StockRotationItems.pm | 128 +++++ Koha/StockRotationRota.pm | 182 ++++++ Koha/StockRotationRotas.pm | 105 ++++ Koha/StockRotationStage.pm | 419 ++++++++++++++ Koha/StockRotationStages.pm | 90 +++ Koha/Util/StockRotation.pm | 247 ++++++++ api/v1/swagger/paths.json | 3 + api/v1/swagger/paths/rotas.json | 79 +++ catalogue/stockrotation.pl | 179 ++++++ .../mysql/atomicupdate/stockrot_tables.sql | 4 +- .../mysql/en/mandatory/sample_notices.sql | 3 +- installer/data/mysql/kohastructure.sql | 72 +-- installer/data/mysql/sysprefs.sql | 7 +- .../prog/css/src/staff-global.scss | 121 ++++ .../intranet-tmpl/prog/css/staff-global.css | 2 +- .../prog/en/includes/biblio-view-menu.inc | 1 + .../prog/en/includes/permissions.inc | 5 +- .../en/includes/stockrotation-toolbar.inc | 12 + .../prog/en/includes/tools-menu.inc | 5 + .../en/modules/catalogue/stockrotation.tt | 171 ++++++ .../prog/en/modules/tools/stockrotation.tt | 510 +++++++++++++++++ .../prog/en/modules/tools/tools-home.tt | 7 + .../prog/js/pages/stockrotation.js | 65 +++ misc/cronjobs/stockrotation.pl | 528 +++++++++++++++++ t/db_dependent/Items.t | 61 ++ t/db_dependent/Koha/Libraries.t | 25 +- t/db_dependent/StockRotationItems.t | 393 +++++++++++++ t/db_dependent/StockRotationRotas.t | 175 ++++++ t/db_dependent/StockRotationStages.t | 377 +++++++++++++ t/db_dependent/api/v1/stockrotationstage.t | 172 ++++++ tools/stockrotation.pl | 531 ++++++++++++++++++ 35 files changed, 5059 insertions(+), 48 deletions(-) create mode 100644 Koha/REST/V1/Stage.pm create mode 100644 Koha/StockRotationItem.pm create mode 100644 Koha/StockRotationItems.pm create mode 100644 Koha/StockRotationRota.pm create mode 100644 Koha/StockRotationRotas.pm create mode 100644 Koha/StockRotationStage.pm create mode 100644 Koha/StockRotationStages.pm create mode 100644 Koha/Util/StockRotation.pm create mode 100644 api/v1/swagger/paths/rotas.json create mode 100755 catalogue/stockrotation.pl create mode 100644 koha-tmpl/intranet-tmpl/prog/en/includes/stockrotation-toolbar.inc create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/stockrotation.tt create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/tools/stockrotation.tt create mode 100644 koha-tmpl/intranet-tmpl/prog/js/pages/stockrotation.js create mode 100755 misc/cronjobs/stockrotation.pl create mode 100644 t/db_dependent/StockRotationItems.t create mode 100644 t/db_dependent/StockRotationRotas.t create mode 100644 t/db_dependent/StockRotationStages.t create mode 100644 t/db_dependent/api/v1/stockrotationstage.t create mode 100755 tools/stockrotation.pl --- a/Koha/Item.pm +++ a/Koha/Item.pm @@ -31,6 +31,8 @@ use Koha::Item::Transfer::Limits; use Koha::Item::Transfers; use Koha::Patrons; use Koha::Libraries; +use Koha::StockRotationItem; +use Koha::StockRotationRotas; use base qw(Koha::Object); @@ -282,7 +284,52 @@ sub current_holds { return Koha::Holds->_new_from_dbic($hold_rs); } -=head3 type +=head3 stockrotationitem + + my $sritem = Koha::Item->stockrotationitem; + +Returns the stock rotation item associated with the current item. + +=cut + +sub stockrotationitem { + my ( $self ) = @_; + my $rs = $self->_result->stockrotationitem; + return 0 if !$rs; + return Koha::StockRotationItem->_new_from_dbic( $rs ); +} + +=head3 add_to_rota + + my $item = $item->add_to_rota($rota_id); + +Add this item to the rota identified by $ROTA_ID, which means associating it +with the first stage of that rota. Should this item already be associated +with a rota, then we will move it to the new rota. + +=cut + +sub add_to_rota { + my ( $self, $rota_id ) = @_; + Koha::StockRotationRotas->find($rota_id)->add_item($self->itemnumber); + return $self; +} + +=head3 biblio + + my $biblio = $item->biblio; + +Returns the biblio associated with the current item. + +=cut + +sub biblio { + my ( $self ) = @_; + my $rs = $self->_result->biblio; + return Koha::Biblio->_new_from_dbic( $rs ); +} + +=head3 _type =cut --- a/Koha/Library.pm +++ a/Koha/Library.pm @@ -24,6 +24,7 @@ use Carp; use C4::Context; use Koha::Database; +use Koha::StockRotationStages; use base qw(Koha::Object); @@ -41,6 +42,51 @@ TODO: Ask the author to add a proper description =cut +sub get_categories { + my ( $self, $params ) = @_; + # TODO This should return Koha::LibraryCategories + return $self->{_result}->categorycodes( $params ); +} + +=head3 update_categories + +TODO: Ask the author to add a proper description + +=cut + +sub update_categories { + my ( $self, $categories ) = @_; + $self->_result->delete_related( 'branchrelations' ); + $self->add_to_categories( $categories ); +} + +=head3 add_to_categories + +TODO: Ask the author to add a proper description + +=cut + +sub add_to_categories { + my ( $self, $categories ) = @_; + for my $category ( @$categories ) { + $self->_result->add_to_categorycodes( $category->_result ); + } +} + +=head3 stockrotationstages + + my $stages = Koha::Library->stockrotationstages; + +Returns the stockrotation stages associated with this Library. + +=cut + +sub stockrotationstages { + my ( $self ) = @_; + my $rs = $self->_result->stockrotationstages; + return Koha::StockRotationStages->_new_from_dbic( $rs ); +} + =head3 get_effective_marcorgcode my $marcorgcode = Koha::Libraries->find( $library_id )->get_effective_marcorgcode(); --- a/Koha/REST/V1/Stage.pm +++ a/Koha/REST/V1/Stage.pm @@ -0,0 +1,60 @@ +package Koha::REST::V1::Stage; + +# 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 3 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 Modern::Perl; + +use Mojo::Base 'Mojolicious::Controller'; + +use Koha::StockRotationRotas; +use Koha::StockRotationStages; + +=head1 NAME + +Koha::REST::V1::Stage + +=head2 Operations + +=head3 move + +Move a stage up or down the stockrotation rota. + +=cut + +sub move { + my $c = shift->openapi->valid_input or return; + my $input = $c->validation->output; + + my $rota = Koha::StockRotationRotas->find( $input->{rota_id} ); + my $stage = Koha::StockRotationStages->find( $input->{stage_id} ); + + if ( $stage && $rota ) { + my $result = $stage->move_to( $input->{position} ); + return $c->render( openapi => {}, status => 200 ) if $result; + return $c->render( + openapi => { error => "Bad request - new position invalid" }, + status => 400 + ); + } + else { + return $c->render( + openapi => { error => "Not found - Invalid rota or stage ID" }, + status => 404 + ); + } +} + +1; --- a/Koha/StockRotationItem.pm +++ a/Koha/StockRotationItem.pm @@ -0,0 +1,273 @@ +package Koha::StockRotationItem; + +# Copyright PTFS Europe 2016 +# +# 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 3 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 Modern::Perl; + +use DateTime; +use DateTime::Duration; +use Koha::Database; +use Koha::DateUtils qw/dt_from_string/; +use Koha::Item::Transfer; +use Koha::Item; +use Koha::StockRotationStage; + +use base qw(Koha::Object); + +=head1 NAME + +StockRotationItem - Koha StockRotationItem Object class + +=head1 SYNOPSIS + +StockRotationItem class used primarily by stockrotation .pls and the stock +rotation cron script. + +=head1 DESCRIPTION + +Standard Koha::Objects definitions, and additional methods. + +=head1 API + +=head2 Class Methods + +=cut + +=head3 _type + +=cut + +sub _type { + return 'Stockrotationitem'; +} + +=head3 itemnumber + + my $item = Koha::StockRotationItem->itemnumber; + +Returns the item associated with the current stock rotation item. + +=cut + +sub itemnumber { + my ( $self ) = @_; + my $rs = $self->_result->itemnumber; + return Koha::Item->_new_from_dbic( $rs ); +} + +=head3 stage + + my $stage = Koha::StockRotationItem->stage; + +Returns the stage associated with the current stock rotation item. + +=cut + +sub stage { + my ( $self ) = @_; + my $rs = $self->_result->stage; + return Koha::StockRotationStage->_new_from_dbic( $rs ); +} + +=head3 needs_repatriating + + 1|0 = $item->needs_repatriating; + +Return 1 if this item is currently not at the library it should be at +according to our stockrotation plan. + +=cut + +sub needs_repatriating { + my ( $self ) = @_; + my ( $item, $stage ) = ( $self->itemnumber, $self->stage ); + if ( $self->itemnumber->get_transfer ) { + return 0; # We're in transit. + } elsif ( $item->holdingbranch ne $stage->branchcode_id + || $item->homebranch ne $stage->branchcode_id ) { + return 1; # We're not where we should be. + } else { + return 0; # We're at home. + } +} + +=head3 needs_advancing + + 1|0 = $item->needs_advancing; + +Return 1 if this item is ready to be moved on to the next stage in its rota. + +=cut + +sub needs_advancing { + my ( $self ) = @_; + return 0 if $self->itemnumber->get_transfer; # intransfer: don't advance. + return 1 if $self->fresh; # Just on rota: advance. + my $completed = $self->itemnumber->_result->branchtransfers->search( + { 'comments' => "StockrotationAdvance" }, + { order_by => { -desc => 'datearrived' } } + ); + # Do maths on whether we need to be moved on. + if ( $completed->count ) { + my $arrival = dt_from_string( + $completed->next->datearrived, 'iso' + ); + my $duration = DateTime::Duration + ->new( days => $self->stage->duration ); + if ( $arrival + $duration le DateTime->now ) { + return 1; + } else { + return 0; + } + } else { + die "We have no historical branch transfer; this should not have happened!"; + } +} + +=head3 repatriate + + 1|0 = $sritem->repatriate + +Put this item into branch transfer with 'StockrotationCorrection' comment, so +that it may return to it's stage.branch to continue its rota as normal. + +=cut + +sub repatriate { + my ( $self, $msg ) = @_; + # Create the transfer. + my $transfer_stored = Koha::Item::Transfer->new({ + 'itemnumber' => $self->itemnumber_id, + 'frombranch' => $self->itemnumber->holdingbranch, + 'tobranch' => $self->stage->branchcode_id, + 'datesent' => DateTime->now, + 'comments' => $msg || "StockrotationRepatriation", + })->store; + $self->itemnumber->homebranch($self->stage->branchcode_id)->store; + return $transfer_stored; +} + +=head3 advance + + 1|0 = $sritem->advance; + +Put this item into branch transfer with 'StockrotationAdvance' comment, to +transfer it to the next stage in its rota. + +If this is the last stage in the rota and this rota is cyclical, we return to +the first stage. If it is not cyclical, then we delete this +StockRotationItem. + +If this item is 'indemand', and advance is invoked, we disable 'indemand' and +advance the item as per usual. + +=cut + +sub advance { + my ( $self ) = @_; + my $item = $self->itemnumber; + my $transfer = Koha::Item::Transfer->new({ + 'itemnumber' => $self->itemnumber_id, + 'frombranch' => $item->holdingbranch, + 'datesent' => DateTime->now, + 'comments' => "StockrotationAdvance" + }); + + if ( $self->indemand && !$self->fresh ) { + $self->indemand(0)->store; # De-activate indemand + $transfer->tobranch($self->stage->branchcode_id); + $transfer->datearrived(DateTime->now); + } else { + # Find and update our stage. + my $stage = $self->stage; + my $new_stage; + if ( $self->fresh ) { # Just added to rota + $new_stage = $self->stage->first_sibling || $self->stage; + $transfer->tobranch($new_stage->branchcode_id); + $transfer->datearrived(DateTime->now) # Already at first branch + if $item->holdingbranch eq $new_stage->branchcode_id; + $self->fresh(0)->store; # Reset fresh + } elsif ( !$stage->last_sibling ) { # Last stage + if ( $stage->rota->cyclical ) { # Cyclical rota? + # Revert to first stage. + $new_stage = $stage->first_sibling || $stage; + $transfer->tobranch($new_stage->branchcode_id); + $transfer->datearrived(DateTime->now); + } else { + $self->delete; # StockRotationItem is done. + return 1; + } + } else { + # Just advance. + $new_stage = $self->stage->next_sibling; + } + $self->stage_id($new_stage->stage_id)->store; # Set new stage + $item->homebranch($new_stage->branchcode_id)->store; # Update homebranch + $transfer->tobranch($new_stage->branchcode_id); # Send to new branch + } + + return $transfer->store; +} + +=head3 investigate + + my $report = $item->investigate; + +Return the base set of information, namely this individual item's report, for +generating stockrotation reports about this stockrotationitem. + +=cut + +sub investigate { + my ( $self ) = @_; + my $item_report = { + title => $self->itemnumber->_result->biblioitem + ->biblionumber->title, + author => $self->itemnumber->_result->biblioitem + ->biblionumber->author, + callnumber => $self->itemnumber->itemcallnumber, + location => $self->itemnumber->location, + onloan => $self->itemnumber->onloan, + barcode => $self->itemnumber->barcode, + itemnumber => $self->itemnumber_id, + branch => $self->itemnumber->_result->holdingbranch, + object => $self, + }; + my $reason; + if ( $self->fresh ) { + $reason = 'initiation'; + } elsif ( $self->needs_repatriating ) { + $reason = 'repatriation'; + } elsif ( $self->needs_advancing ) { + $reason = 'advancement'; + $reason = 'in-demand' if $self->indemand; + } else { + $reason = 'not-ready'; + } + $item_report->{reason} = $reason; + + return $item_report; +} + +1; + +=head1 AUTHOR + +Alex Sassmannshausen + +=cut --- a/Koha/StockRotationItems.pm +++ a/Koha/StockRotationItems.pm @@ -0,0 +1,128 @@ +package Koha::StockRotationItems; + +# Copyright PTFS Europe 2016 +# +# 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 3 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 Modern::Perl; + +use Koha::Database; +use Koha::StockRotationItem; + +use base qw(Koha::Objects); + +=head1 NAME + +StockRotationItems - Koha StockRotationItems Object class + +=head1 SYNOPSIS + +StockRotationItems class used primarily by stockrotation .pls and the stock +rotation cron script. + +=head1 DESCRIPTION + +Standard Koha::Objects definitions, and additional methods. + +=head1 API + +=head2 Class Methods + +=cut + +=head3 _type + +=cut + +sub _type { + return 'Stockrotationitem'; +} + +=head3 object_class + +=cut + +sub object_class { + return 'Koha::StockRotationItem'; +} + +=head3 investigate + + my $report = $items->investigate; + +Return a stockrotation report about this set of stockrotationitems. + +In this part of the overall investigation process we split individual item +reports into appropriate action segments of our items report and increment +some counters. + +The report generated here will be used on the stage level to slot our item +reports into appropriate sections of the branched report. + +For details of intent and context of this procedure, please see +Koha::StockRotationRota->investigate. + +=cut + +sub investigate { + my ( $self ) = @_; + + my $items_report = { + items => [], + log => [], + initiable_items => [], + repatriable_items => [], + advanceable_items => [], + indemand_items => [], + actionable => 0, + stationary => 0, + }; + while ( my $item = $self->next ) { + my $report = $item->investigate; + if ( $report->{reason} eq 'initiation' ) { + $items_report->{initiable}++; + $items_report->{actionable}++; + push @{$items_report->{items}}, $report; + push @{$items_report->{initiable_items}}, $report; + } elsif ( $report->{reason} eq 'repatriation' ) { + $items_report->{repatriable}++; + $items_report->{actionable}++; + push @{$items_report->{items}}, $report; + push @{$items_report->{repatriable_items}}, $report; + } elsif ( $report->{reason} eq 'advancement' ) { + $items_report->{actionable}++; + push @{$items_report->{items}}, $report; + push @{$items_report->{advanceable_items}}, $report; + } elsif ( $report->{reason} eq 'in-demand' ) { + $items_report->{actionable}++; + push @{$items_report->{items}}, $report; + push @{$items_report->{indemand_items}}, $report; + } else { + $items_report->{stationary}++; + push @{$items_report->{log}}, $report; + } + } + + return $items_report; +} + +1; + +=head1 AUTHOR + +Alex Sassmannshausen + +=cut --- a/Koha/StockRotationRota.pm +++ a/Koha/StockRotationRota.pm @@ -0,0 +1,182 @@ +package Koha::StockRotationRota; + +# Copyright PTFS Europe 2016 +# +# 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 3 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 Modern::Perl; + +use Koha::Database; +use Koha::StockRotationStages; +use Koha::StockRotationItem; +use Koha::StockRotationItems; + +use base qw(Koha::Object); + +=head1 NAME + +StockRotationRota - Koha StockRotationRota Object class + +=head1 SYNOPSIS + +StockRotationRota class used primarily by stockrotation .pls and the stock +rotation cron script. + +=head1 DESCRIPTION + +Standard Koha::Objects definitions, and additional methods. + +=head1 API + +=head2 Class Methods + +=cut + +=head3 stockrotationstages + + my $stages = Koha::StockRotationRota->stockrotationstages; + +Returns the stages associated with the current rota. + +=cut + +sub stockrotationstages { + my ( $self ) = @_; + my $rs = $self->_result->stockrotationstages; + return Koha::StockRotationStages->_new_from_dbic( $rs ); +} + +=head3 add_item + + my $rota = $rota->add_item($itemnumber); + +Add item identified by $ITEMNUMBER to this rota, which means we associate it +with the first stage of this rota. Should the item already be associated with +a rota, move it from that rota to this rota. + +=cut + +sub add_item { + my ( $self, $itemnumber ) = @_; + my $sritem = Koha::StockRotationItems->find($itemnumber); + if ($sritem) { + $sritem->stage_id($self->first_stage->stage_id) + ->indemand(0)->fresh(1)->store; + } else { + $sritem = Koha::StockRotationItem->new({ + itemnumber_id => $itemnumber, + stage_id => $self->first_stage->stage_id, + indemand => 0, + fresh => 1, + })->store; + } + return $self; +} + +=head3 first_stage + + my $stage = $rota->first_stage; + +Return the first stage attached to this rota (the one that has an undefined +`stagebefore`). + +=cut + +sub first_stage { + my ( $self ) = @_; + my $guess = $self->stockrotationstages->next; + my $stage = $guess->first_sibling; + return ( $stage ) ? $stage : $guess; +} + +=head3 stockrotationitems + + my $items = $rota->stockrotationitems; + +Return all items associated with this rota via its stages. + +=cut + +sub stockrotationitems { + my ( $self ) = @_; + my $rs = Koha::StockRotationItems->search( + { 'stage.rota_id' => $self->rota_id }, { join => [ qw/stage/ ] } + ); + return $rs; +} + +=head3 investigate + + my $report = $rota->investigate($report_so_far); + +Aim here is to return $report augmented with content for this rota. We +delegate to $stage->investigate. + +The report will include some basic information and 2 primary reports: + +- per rota report in 'rotas'. This report is mainly used by admins to do check + & compare results. + +- branched report in 'branched'. This is the workhorse: emails to libraries + are compiled from these reports, and they will have the actionable work. + +Both reports are generated in stage based investigations; the rota report is +then glued into place at this stage. + +=cut + +sub investigate { + my ( $self, $report ) = @_; + my $count = $self->stockrotationitems->count; + $report->{sum_items} += $count; + + if ( $self->active ) { + $report->{rotas_active}++; + # stockrotationstages->investigate augments $report with the stage's + # content. This is how 'branched' slowly accumulates all items. + $report = $self->stockrotationstages->investigate($report); + # Add our rota report to the full report. + push @{$report->{rotas}}, { + name => $self->title, + id => $self->rota_id, + items => $report->{tmp_items} || [], + log => $report->{tmp_log} || [], + }; + delete $report->{tmp_items}; + delete $report->{tmp_log}; + } else { # Rota is not active. + $report->{rotas_inactive}++; + $report->{items_inactive} += $count; + } + + return $report; +} + +=head3 _type + +=cut + +sub _type { + return 'Stockrotationrota'; +} + +1; + +=head1 AUTHOR + +Alex Sassmannshausen + +=cut --- a/Koha/StockRotationRotas.pm +++ a/Koha/StockRotationRotas.pm @@ -0,0 +1,105 @@ +package Koha::StockRotationRotas; + +# Copyright PTFS Europe 2016 +# +# 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 3 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 Modern::Perl; + +use Koha::Database; +use Koha::StockRotationRota; + +use base qw(Koha::Objects); + +=head1 NAME + +StockRotationRotas - Koha StockRotationRotas Object class + +=head1 SYNOPSIS + +StockRotationRotas class used primarily by stockrotation .pls and the stock +rotation cron script. + +=head1 DESCRIPTION + +Standard Koha::Objects definitions, and additional methods. + +=head1 API + +=head2 Class Methods + +=cut + +=head3 investigate + + my $report = $rotas->investigate; + +Return a report detailing the current status and required actions for all +relevant items spread over rotas. + +See Koha::StockRotationRota->investigate for details. + +=cut + +sub investigate { + my ( $self ) = @_; + + my $report = { + actionable => 0, + advanceable => 0, + initiable => 0, + items_inactive => 0, + repatriable => 0, + rotas_active => 0, + rotas_inactive => 0, + stationary => 0, + sum_items => 0, + sum_rotas => $self->count, + branched => {}, + rotas => [], + items => [], + }; + + while ( my $rota = $self->next ) { + $report = $rota->investigate($report) + } + + return $report; +} + +=head3 _type + +=cut + +sub _type { + return 'Stockrotationrota'; +} + +=head3 object_class + +=cut + +sub object_class { + return 'Koha::StockRotationRota'; +} + +1; + +=head1 AUTHOR + +Alex Sassmannshausen + +=cut --- a/Koha/StockRotationStage.pm +++ a/Koha/StockRotationStage.pm @@ -0,0 +1,419 @@ +package Koha::StockRotationStage; + +# Copyright PTFS Europe 2016 +# +# 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 3 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 Modern::Perl; + +use Koha::Database; +use Koha::Library; +use Koha::StockRotationRota; + +use base qw(Koha::Object); + +=head1 NAME + +StockRotationStage - Koha StockRotationStage Object class + +=head1 SYNOPSIS + +StockRotationStage class used primarily by stockrotation .pls and the stock +rotation cron script. + +=head1 DESCRIPTION + +Standard Koha::Objects definitions, and additional methods. + +=head1 API + +=head2 Class Methods + +=cut + +=head3 _type + +=cut + +sub _type { + return 'Stockrotationstage'; +} + +sub _relation { + my ( $self, $method, $type ) = @_; + return sub { + my $rs = $self->_result->$method; + return 0 if !$rs; + my $namespace = 'Koha::' . $type; + return $namespace->_new_from_dbic( $rs ); + } +} + +=head3 stockrotationitems + + my $stages = Koha::StockRotationStage->stockrotationitems; + +Returns the items associated with the current stage. + +=cut + +sub stockrotationitems { + my ( $self ) = @_; + return &{$self->_relation(qw/ stockrotationitems StockRotationItems /)}; +} + +=head3 branchcode + + my $branch = Koha::StockRotationStage->branchcode; + +Returns the branch associated with the current stage. + +=cut + +sub branchcode { + my ( $self ) = @_; + return &{$self->_relation(qw/ branchcode Library /)}; +} + +=head3 rota + + my $rota = Koha::StockRotationStage->rota; + +Returns the rota associated with the current stage. + +=cut + +sub rota { + my ( $self ) = @_; + return &{$self->_relation(qw/ rota StockRotationRota /)}; +} + +=head3 siblings + + my $siblings = $stage->siblings; + +Koha::Object wrapper around DBIx::Class::Ordered. + +=cut + +sub siblings { + my ( $self ) = @_; + return &{$self->_relation(qw/ siblings StockRotationStages /)}; +} + +=head3 next_siblings + + my $next_siblings = $stage->next_siblings; + +Koha::Object wrapper around DBIx::Class::Ordered. + +=cut + +sub next_siblings { + my ( $self ) = @_; + return &{$self->_relation(qw/ next_siblings StockRotationStages /)}; +} + +=head3 previous_siblings + + my $previous_siblings = $stage->previous_siblings; + +Koha::Object wrapper around DBIx::Class::Ordered. + +=cut + +sub previous_siblings { + my ( $self ) = @_; + return &{$self->_relation(qw/ previous_siblings StockRotationStages /)}; +} + +=head3 next_sibling + + my $next = $stage->next_sibling; + +Koha::Object wrapper around DBIx::Class::Ordered. + +=cut + +sub next_sibling { + my ( $self ) = @_; + return &{$self->_relation(qw/ next_sibling StockRotationStage /)}; +} + +=head3 previous_sibling + + my $previous = $stage->previous_sibling; + +Koha::Object Wrapper around DBIx::Class::Ordered. + +=cut + +sub previous_sibling { + my ( $self ) = @_; + return &{$self->_relation(qw/ previous_sibling StockRotationStage /)}; +} + +=head3 first_sibling + + my $first = $stage->first_sibling; + +Koha::Object Wrapper around DBIx::Class::Ordered. + +=cut + +sub first_sibling { + my ( $self ) = @_; + return &{$self->_relation(qw/ first_sibling StockRotationStage /)}; +} + +=head3 last_sibling + + my $last = $stage->last_sibling; + +Koha::Object Wrapper around DBIx::Class::Ordered. + +=cut + +sub last_sibling { + my ( $self ) = @_; + return &{$self->_relation(qw/ last_sibling StockRotationStage /)}; +} + +=head3 move_previous + + 1|0 = $stage->move_previous; + +Koha::Object Wrapper around DBIx::Class::Ordered. + +=cut + +sub move_previous { + my ( $self ) = @_; + return $self->_result->move_previous; +} + +=head3 move_next + + 1|0 = $stage->move_next; + +Koha::Object Wrapper around DBIx::Class::Ordered. + +=cut + +sub move_next { + my ( $self ) = @_; + return $self->_result->move_next; +} + +=head3 move_first + + 1|0 = $stage->move_first; + +Koha::Object Wrapper around DBIx::Class::Ordered. + +=cut + +sub move_first { + my ( $self ) = @_; + return $self->_result->move_first; +} + +=head3 move_last + + 1|0 = $stage->move_last; + +Koha::Object Wrapper around DBIx::Class::Ordered. + +=cut + +sub move_last { + my ( $self ) = @_; + return $self->_result->move_last; +} + +=head3 move_to + + 1|0 = $stage->move_to($position); + +Koha::Object Wrapper around DBIx::Class::Ordered. + +=cut + +sub move_to { + my ( $self, $position ) = @_; + return $self->_result->move_to($position) + if ( $position le $self->rota->stockrotationstages->count ); + return 0; +} + +=head3 move_to_group + + 1|0 = $stage->move_to_group($rota_id, [$position]); + +Koha::Object Wrapper around DBIx::Class::Ordered. + +=cut + +sub move_to_group { + my ( $self, $rota_id, $position ) = @_; + return $self->_result->move_to_group($rota_id, $position); +} + +=head3 delete + + 1|0 = $stage->delete; + +Koha::Object Wrapper around DBIx::Class::Ordered. + +=cut + +sub delete { + my ( $self ) = @_; + return $self->_result->delete; +} + +=head3 investigate + + my $report = $stage->investigate($report_so_far); + +Return a stage based report. This report will mutate and augment the report +that is passed to it. It slots item reports into the branched and temporary +rota sections of the report. It also increments a number of counters. + +For details of intent and context of this procedure, please see +Koha::StockRotationRota->investigate. + +=cut + +sub investigate { + my ( $self, $report ) = @_; + my $new_stage = $self->next_sibling; + my $duration = $self->duration; + # Generate stage items report + my $items_report = $self->stockrotationitems->investigate; + + # Merge into general report + + ## Branched indexes + ### The branched indexes work as follows: + ### - They contain information about the relevant branch + ### - They contain an index of actionable items for that branch + ### - They contain an index of non-actionable items for that branch + + ### Items are assigned to a particular branched index as follows: + ### - 'advanceable' : assigned to branch of the current stage + ### (this should also be the current holding branch) + ### - 'log' items are always assigned to branch of current stage. + ### - 'indemand' : assigned to branch of current stage + ### (this should also be the current holding branch) + ### - 'initiable' : assigned to the current holding branch of item + ### - 'repatriable' : assigned to the current holding branch of item + + ### 'Advanceable', 'log', 'indemand': + + # Set up our stage branch info. + my $stagebranch = $self->_result->branchcode; + my $stagebranchcode = $stagebranch->branchcode; + + # Initiate our stage branch index if it does not yet exist. + if ( !$report->{branched}->{$stagebranchcode} ) { + $report->{branched}->{$stagebranchcode} = { + code => $stagebranchcode, + name => $stagebranch->branchname, + email => $stagebranch->branchreplyto + ? $stagebranch->branchreplyto + : $stagebranch->branchemail, + phone => $stagebranch->branchphone, + items => [], + log => [], + }; + } + + push @{$report->{branched}->{$stagebranchcode}->{items}}, + @{$items_report->{advanceable_items}}; + push @{$report->{branched}->{$stagebranchcode}->{log}}, + @{$items_report->{log}}; + push @{$report->{branched}->{$stagebranchcode}->{items}}, + @{$items_report->{indemand_items}}; + + ### 'Initiable' & 'Repatriable' + foreach my $ireport (@{$items_report->{initiable_items}}) { + my $branch = $ireport->{branch}; + my $branchcode = $branch->branchcode; + if ( !$report->{branched}->{$branchcode} ) { + $report->{branched}->{$branchcode} = { + code => $branchcode, + name => $branch->branchname, + email => $stagebranch->branchreplyto + ? $stagebranch->branchreplyto + : $stagebranch->branchemail, + phone => $branch->branchphone, + items => [], + log => [], + }; + } + push @{$report->{branched}->{$branchcode}->{items}}, $ireport; + } + + foreach my $ireport (@{$items_report->{repatriable_items}}) { + my $branch = $ireport->{branch}; + my $branchcode = $branch->branchcode; + if ( !$report->{branched}->{$branchcode} ) { + $report->{branched}->{$branchcode} = { + code => $branchcode, + name => $branch->branchname, + email => $stagebranch->branchreplyto + ? $stagebranch->branchreplyto + : $stagebranch->branchemail, + phone => $branch->branchphone, + items => [], + log => [], + }; + } + push @{$report->{branched}->{$branchcode}->{items}}, $ireport; + } + + ## Per rota indexes + ### Per rota indexes are item reports pushed into the index for the + ### current rota. We don't know where that index is yet as we don't know + ### about the current rota. To resolve this we assign our items and log + ### to tmp indexes. They will be merged into the proper rota index at the + ### rota level. + push @{$report->{tmp_items}}, @{$items_report->{items}}; + push @{$report->{tmp_log}}, @{$items_report->{log}}; + + ## Collection of items + ### Finally we just add our collection of items to the full item index. + push @{$report->{items}}, @{$items_report->{items}}; + + ## Assemble counters + $report->{actionable} += $items_report->{actionable}; + $report->{indemand} += scalar @{$items_report->{indemand_items}}; + $report->{advanceable} += scalar @{$items_report->{advanceable_items}}; + $report->{initiable} += scalar @{$items_report->{initiable_items}}; + $report->{repatriable} += scalar @{$items_report->{repatriable_items}}; + $report->{stationary} += scalar @{$items_report->{log}}; + + return $report; +} + +1; + +=head1 AUTHOR + +Alex Sassmannshausen + +=cut --- a/Koha/StockRotationStages.pm +++ a/Koha/StockRotationStages.pm @@ -0,0 +1,90 @@ +package Koha::StockRotationStages; + +# Copyright PTFS Europe 2016 +# +# 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 3 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 Modern::Perl; + +use Koha::Database; +use Koha::StockRotationStage; + +use base qw(Koha::Objects); + +=head1 NAME + +StockRotationStages - Koha StockRotationStages Object class + +=head1 SYNOPSIS + +StockRotationStages class used primarily by stockrotation .pls and the stock +rotation cron script. + +=head1 DESCRIPTION + +Standard Koha::Objects definitions, and additional methods. + +=head1 API + +=head2 Class Methods + +=cut + +=head3 investigate + + my $report = $stages->investigate($rota_so_far); + +Return a report detailing the current status and required actions for all +relevant items spread over the set of stages. + +For details of intent and context of this procedure, please see +Koha::StockRotationRota->investigate. + +=cut + +sub investigate { + my ( $self, $report ) = @_; + + while ( my $stage = $self->next ) { + $report = $stage->investigate($report); + } + + return $report; +} + +=head3 _type + +=cut + +sub _type { + return 'Stockrotationstage'; +} + +=head3 object_class + +=cut + +sub object_class { + return 'Koha::StockRotationStage'; +} + +1; + +=head1 AUTHOR + +Alex Sassmannshausen + +=cut --- a/Koha/Util/StockRotation.pm +++ a/Koha/Util/StockRotation.pm @@ -0,0 +1,247 @@ +package Koha::Util::StockRotation; + +# Module contains subroutines used with Stock Rotation +# +# Copyright 2016 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 3 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 Modern::Perl; + +use Koha::Items; +use Koha::StockRotationItems; +use Koha::Database; + +our ( @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS ); +BEGIN { + require Exporter; + @ISA = qw( Exporter ); + @EXPORT = qw( ); + @EXPORT_OK = qw( + get_branches + get_stages + toggle_indemand + remove_from_stage + get_barcodes_status + add_items_to_rota + move_to_next_stage + ); + %EXPORT_TAGS = ( ALL => [ @EXPORT_OK, @EXPORT ] ); +} + +=head1 NAME + +Koha::Util::StockRotation - utility class with routines for Stock Rotation + +=head1 FUNCTIONS + +=head2 get_branches + + returns all branches ordered by branchname as an array, each element + contains a hashref containing branch details + +=cut + +sub get_branches { + + return Koha::Libraries->search( + {}, + { order_by => ['branchname'] } + )->unblessed; + +} + +=head2 get_stages + + returns an arrayref of StockRotationStage objects representing + all stages for a passed rota + +=cut + +sub get_stages { + + my $rota = shift; + + my @out = (); + + if ($rota->stockrotationstages->count > 0) { + + push @out, $rota->first_stage->unblessed; + + push @out, @{$rota->first_stage->siblings->unblessed}; + + } + + return \@out; +} + +=head2 toggle_indemand + + given an item's ID & stage ID toggle that item's in_demand + status on that stage + +=cut + +sub toggle_indemand { + + my ($item_id, $stage_id) = @_; + + # Get the item object + my $item = Koha::StockRotationItems->find( + { + itemnumber_id => $item_id, + stage_id => $stage_id + } + ); + + # Toggle the item's indemand flag + my $new_indemand = ($item->indemand == 1) ? 0 : 1; + + $item->indemand($new_indemand)->store; + +} + +=head2 move_to_next_stage + + given an item's ID and stage ID, move it + to the next stage on the rota + +=cut + +sub move_to_next_stage { + + my ($item_id, $stage_id) = shift; + + # Get the item object + my $item = Koha::StockRotationItems->find( + { + itemnumber_id => $item_id, + stage_id => $stage_id + } + ); + + $item->advance; + +} + +=head2 remove_from_stage + + given an item's ID & stage ID, remove that item from that stage + +=cut + +sub remove_from_stage { + + my ($item_id, $stage_id) = @_; + + # Get the item object and delete it + Koha::StockRotationItems->find( + { + itemnumber_id => $item_id, + stage_id => $stage_id + } + )->delete; + +} + +=head2 get_barcodes_status + + take an arrayref of barcodes and a status hashref and populate it + +=cut + +sub get_barcodes_status { + + my ($rota_id, $barcodes, $status) = @_; + + # Get the items associated with these barcodes + my $items = Koha::Items->search( + { + barcode => { '-in' => $barcodes } + }, + { + prefetch => 'stockrotationitem' + } + ); + # Get an array of barcodes that were found + # Assign each barcode's status + my @found = (); + while (my $item = $items->next) { + + push @found, $item->barcode if $item->barcode; + + # Check if it's on a rota + my $on_rota = $item->stockrotationitem; + + # It is on a rota + if ($on_rota) { + + # Check if it's on this rota + if ($on_rota->stage->rota->rota_id == $rota_id) { + + # It's on this rota + push @{$status->{on_this}}, $item; + + } else { + + # It's on another rota + push @{$status->{on_other}}, $item; + + } + + } else { + + # Item is not on a rota + push @{$status->{ok}}, $item; + + } + + } + + # Create an array of barcodes supplied in the file that + # were not found in the catalogue + my %found_in_cat = map{ $_ => 1 } @found; + push @{$status->{not_found}}, grep( + !defined $found_in_cat{$_}, @{$barcodes} + ); + +} + +=head2 add_items_to_rota + + take an arrayref of Koha::Item objects and add them to the passed rota + +=cut + +sub add_items_to_rota { + + my ($rota_id, $items) = @_; + + foreach my $item(@{$items}) { + + $item->add_to_rota($rota_id); + + } + +} + +1; + +=head1 AUTHOR + +Andrew Isherwood + +=cut --- a/api/v1/swagger/paths.json +++ a/api/v1/swagger/paths.json @@ -34,5 +34,8 @@ }, "/illrequests": { "$ref": "paths/illrequests.json#/~1illrequests" + }, + "/rotas/{rota_id}/stages/{stage_id}/position": { + "$ref": "paths/rotas.json#/~1rotas~1{rota_id}~1stages~1{stage_id}~1position" } } --- a/api/v1/swagger/paths/rotas.json +++ a/api/v1/swagger/paths/rotas.json @@ -0,0 +1,79 @@ +{ + "/rotas/{rota_id}/stages/{stage_id}/position": { + "put": { + "x-mojo-to": "Stage#move", + "operationId": "moveStage", + "tags": ["rotas"], + "parameters": [{ + "name": "rota_id", + "in": "path", + "required": true, + "description": "A rotas ID", + "type": "integer" + }, { + "name": "stage_id", + "in": "path", + "required": true, + "description": "A stages ID", + "type": "integer" + }, { + "name": "position", + "in": "body", + "required": true, + "description": "A stages position in the rota", + "schema": { + "type": "integer" + } + }], + "produces": [ + "application/json" + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "../definitions.json#/error" + } + }, + "401": { + "description": "Authentication required", + "schema": { + "$ref": "../definitions.json#/error" + } + }, + "403": { + "description": "Access forbidden", + "schema": { + "$ref": "../definitions.json#/error" + } + }, + "404": { + "description": "Position not found", + "schema": { + "$ref": "../definitions.json#/error" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "../definitions.json#/error" + } + }, + "503": { + "description": "Under maintenance", + "schema": { + "$ref": "../definitions.json#/error" + } + } + }, + "x-koha-authorization": { + "permissions": { + "borrowers": "1" + } + } + } + } +} --- a/catalogue/stockrotation.pl +++ a/catalogue/stockrotation.pl @@ -0,0 +1,179 @@ +#!/usr/bin/perl + +# Copyright 2016 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 3 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. + +=head1 stockrotation.pl + + Script to manage item assignments to stock rotation rotas. Including their + assiciated stages + +=cut + +use Modern::Perl; +use CGI; + +use C4::Auth; +use C4::Output; +use C4::Search; + +use Koha::Biblio; +use Koha::Item; +use Koha::StockRotationRotas; +use Koha::StockRotationStages; +use Koha::Util::StockRotation qw(:ALL); + +my $input = new CGI; + +unless (C4::Context->preference('StockRotation')) { + # redirect to Intranet home if self-check is not enabled + print $input->redirect("/cgi-bin/koha/mainpage.pl"); + exit; +} + +my %params = $input->Vars(); + +my $op = $params{op}; + +my $biblionumber = $input->param('biblionumber'); + +my ($template, $loggedinuser, $cookie) = get_template_and_user( + { + template_name => 'catalogue/stockrotation.tt', + query => $input, + type => 'intranet', + authnotrequired => 0, + flagsrequired => { + catalogue => 1, + stockrotation => 'manage_rota_items', + }, + } +); + +if (!defined $op) { + + # List all items along with their associated rotas + my $biblio = Koha::Biblios->find($biblionumber); + + my $items = $biblio->items; + + # Get only rotas with stages + my $rotas = Koha::StockRotationRotas->search( + { + 'stockrotationstages.stage_id' => { '!=', undef } + }, + { + join => 'stockrotationstages', + collapse => 1, + order_by => 'title' + } + ); + + # Construct a model to pass to the view + my @item_data = (); + + while (my $item = $items->next) { + + my $item_hashref = { + bib_item => $item + }; + + my $stockrotationitem = $item->stockrotationitem; + + # If this item is on a rota + if ($stockrotationitem != 0) { + + # This item's rota + my $rota = $stockrotationitem->stage->rota; + + # This rota's stages + my $stages = get_stages($rota); + + $item_hashref->{rota} = $rota; + + $item_hashref->{stockrotationitem} = $stockrotationitem; + + $item_hashref->{stages} = $stages; + + } + + push @item_data, $item_hashref; + + } + + $template->param( + no_op_set => 1, + rotas => $rotas, + items => \@item_data, + branches => get_branches(), + biblio => $biblio, + biblionumber => $biblio->biblionumber, + stockrotationview => 1, + C4::Search::enabled_staff_search_views + ); + +} elsif ($op eq "toggle_in_demand") { + + # Toggle in demand + toggle_indemand($params{item_id}, $params{stage_id}); + + # Return to items list + print $input->redirect("?biblionumber=$biblionumber"); + +} elsif ($op eq "remove_item_from_stage") { + + # Remove from the stage + remove_from_stage($params{item_id}, $params{stage_id}); + + # Return to items list + print $input->redirect("?biblionumber=$biblionumber"); + +} elsif ($op eq "move_to_next_stage") { + + move_to_next_stage($params{item_id}, $params{stage_id}); + + # Return to items list + print $input->redirect("?biblionumber=" . $params{biblionumber}); + +} elsif ($op eq "add_item_to_rota") { + + my $item = Koha::Items->find($params{item_id}); + + $item->add_to_rota($params{rota_id}); + + print $input->redirect("?biblionumber=" . $params{biblionumber}); + +} elsif ($op eq "confirm_remove_from_rota") { + + $template->param( + op => $params{op}, + stage_id => $params{stage_id}, + item_id => $params{item_id}, + biblionumber => $params{biblionumber}, + stockrotationview => 1, + C4::Search::enabled_staff_search_views + ); + +} + +output_html_with_http_headers $input, $cookie, $template->output; + +=head1 AUTHOR + +Andrew Isherwood + +=cut --- a/installer/data/mysql/atomicupdate/stockrot_tables.sql +++ a/installer/data/mysql/atomicupdate/stockrot_tables.sql @@ -28,7 +28,7 @@ CREATE TABLE IF NOT EXISTS stockrotationstages ( FOREIGN KEY (`branchcode_id`) REFERENCES `branches` (`branchcode`) ON UPDATE CASCADE ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- Stock Rotation Items @@ -46,7 +46,7 @@ CREATE TABLE IF NOT EXISTS stockrotationitems ( FOREIGN KEY (`stage_id`) REFERENCES `stockrotationstages` (`stage_id`) ON UPDATE CASCADE ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- System preferences --- a/installer/data/mysql/en/mandatory/sample_notices.sql +++ a/installer/data/mysql/en/mandatory/sample_notices.sql @@ -176,8 +176,9 @@ INSERT INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title` ('circulation', 'AR_SLIP', '', 'Article request - print slip', 0, 'Article request', 'Article request:\r\n\r\n<> <> (<>),\r\n\r\nTitle: <>\r\nBarcode: <>\r\n\r\nArticle requested:\r\nTitle: <>\r\nAuthor: <>\r\nVolume: <>\r\nIssue: <>\r\nDate: <>\r\nPages: <>\r\nChapters: <>\r\nNotes: <>\r\n', 'print'), ('circulation', 'AR_PROCESSING', '', 'Article request - processing', 0, 'Article request processing', 'Dear <> <> (<>),\r\n\r\nWe are now processing your request for an article from <> (<>).\r\n\r\nArticle requested:\r\nTitle: <>\r\nAuthor: <>\r\nVolume: <>\r\nIssue: <>\r\nDate: <>\r\nPages: <>\r\nChapters: <>\r\nNotes: <>\r\n\r\nThank you!', 'email'), ('circulation', 'CHECKOUT_NOTE', '', 'Checkout note on item set by patron', '0', 'Checkout note', '<> <> has added a note to the item <> - <> (<>).','email'); - INSERT INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content`, `message_transport_type`, `lang`) VALUES ('circulation', 'ACCOUNT_PAYMENT', '', 'Account payment', 0, 'Account payment', '[%- USE Price -%]\r\nA payment of [% credit.amount * -1 | $Price %] has been applied to your account.\r\n\r\nThis payment affected the following fees:\r\n[%- FOREACH o IN offsets %]\r\nDescription: [% o.debit.description %]\r\nAmount paid: [% o.amount * -1 | $Price %]\r\nAmount remaining: [% o.debit.amountoutstanding | $Price %]\r\n[% END %]', 'email', 'default'), ('circulation', 'ACCOUNT_WRITEOFF', '', 'Account writeoff', 0, 'Account writeoff', '[%- USE Price -%]\r\nAn account writeoff of [% credit.amount * -1 | $Price %] has been applied to your account.\r\n\r\nThis writeoff affected the following fees:\r\n[%- FOREACH o IN offsets %]\r\nDescription: [% o.debit.description %]\r\nAmount paid: [% o.amount * -1 | $Price %]\r\nAmount remaining: [% o.debit.amountoutstanding | $Price %]\r\n[% END %]', 'email', 'default'); +INSERT INTO `letter` (`module`, `code`, `branchcode`, `name`, `is_html`, `title`, `content`, `message_transport_type`) VALUES +('circulation', 'SR_SLIP', '', 'Stock Rotation Slip', 0, 'Stockrotation Report', 'Stockrotation report for [% branch.name %]:\r\n\r\n[% IF branch.items.size %][% branch.items.size %] items to be processed for this branch.\r\n[% ELSE %]No items to be processed for this branch\r\n[% END %][% FOREACH item IN branch.items %][% IF item.reason ne \'in-demand\' %]Title: [% item.title %]\r\nAuthor: [% item.author %]\r\nCallnumber: [% item.callnumber %]\r\nLocation: [% item.location %]\r\nBarcode: [% item.barcode %]\r\nOn loan?: [% item.onloan %]\r\nStatus: [% item.reason %]\r\nCurrent Library: [% item.branch.branchname %] [% item.branch.branchcode %]\r\n\r\n[% END %][% END %]', 'email'); --- a/installer/data/mysql/kohastructure.sql +++ a/installer/data/mysql/kohastructure.sql @@ -4152,40 +4152,6 @@ CREATE TABLE illrequests ( ON UPDATE CASCADE ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; --- --- Table structure for table `stockrotationrotas` --- - -CREATE TABLE IF NOT EXISTS stockrotationrotas ( - rota_id int(11) auto_increment, -- Stockrotation rota ID - title varchar(100) NOT NULL, -- Title for this rota - description text NOT NULL default '', -- Description for this rota - cyclical tinyint(1) NOT NULL default 0, -- Should items on this rota keep cycling? - active tinyint(1) NOT NULL default 0, -- Is this rota currently active? - PRIMARY KEY (`rota_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; - --- --- Table structure for table `stockrotationstages` --- - -CREATE TABLE IF NOT EXISTS stockrotationstages ( - stage_id int(11) auto_increment, -- Unique stage ID - position int(11) NOT NULL, -- The position of this stage within its rota - rota_id int(11) NOT NULL, -- The rota this stage belongs to - branchcode_id varchar(10) NOT NULL, -- Branch this stage relates to - duration int(11) NOT NULL default 4, -- The number of days items shoud occupy this stage - PRIMARY KEY (`stage_id`), - CONSTRAINT `stockrotationstages_rifk` - FOREIGN KEY (`rota_id`) - REFERENCES `stockrotationrotas` (`rota_id`) - ON UPDATE CASCADE ON DELETE CASCADE, - CONSTRAINT `stockrotationstages_bifk` - FOREIGN KEY (`branchcode_id`) - REFERENCES `branches` (`branchcode`) - ON UPDATE CASCADE ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; - -- -- Table structure for table `illrequestattributes` -- @@ -4215,7 +4181,7 @@ CREATE TABLE library_groups ( description MEDIUMTEXT NULL DEFAULT NULL, -- Longer explanation of the group, if necessary ft_hide_patron_info tinyint(1) NOT NULL DEFAULT 0, -- Turn on the feature "Hide patron's info" for this group ft_search_groups_opac tinyint(1) NOT NULL DEFAULT 0, -- Use this group for staff side search groups - ft_search_groups_staff tinyint(1) NOT NULL DEFAULT 0, -- Use this group for opac side search groups + ft_search_groups_staff tinyint(1) NOT NULL DEFAULT 0, -- Use this group for opac side search groups created_on TIMESTAMP NULL, -- Date and time of creation updated_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- Date and time of last PRIMARY KEY id ( id ), @@ -4236,6 +4202,40 @@ CREATE TABLE `oauth_access_tokens` ( PRIMARY KEY (`access_token`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +-- +-- Table structure for table `stockrotationrotas` +-- + +CREATE TABLE IF NOT EXISTS stockrotationrotas ( + rota_id int(11) auto_increment, -- Stockrotation rota ID + title varchar(100) NOT NULL, -- Title for this rota + description text NOT NULL default '', -- Description for this rota + cyclical tinyint(1) NOT NULL default 0, -- Should items on this rota keep cycling? + active tinyint(1) NOT NULL default 0, -- Is this rota currently active? + PRIMARY KEY (`rota_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Table structure for table `stockrotationstages` +-- + +CREATE TABLE IF NOT EXISTS stockrotationstages ( + stage_id int(11) auto_increment, -- Unique stage ID + position int(11) NOT NULL, -- The position of this stage within its rota + rota_id int(11) NOT NULL, -- The rota this stage belongs to + branchcode_id varchar(10) NOT NULL, -- Branch this stage relates to + duration int(11) NOT NULL default 4, -- The number of days items shoud occupy this stage + PRIMARY KEY (`stage_id`), + CONSTRAINT `stockrotationstages_rifk` + FOREIGN KEY (`rota_id`) + REFERENCES `stockrotationrotas` (`rota_id`) + ON UPDATE CASCADE ON DELETE CASCADE, + CONSTRAINT `stockrotationstages_bifk` + FOREIGN KEY (`branchcode_id`) + REFERENCES `branches` (`branchcode`) + ON UPDATE CASCADE ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + -- -- Table structure for table `stockrotationitems` -- @@ -4254,7 +4254,7 @@ CREATE TABLE IF NOT EXISTS stockrotationitems ( FOREIGN KEY (`stage_id`) REFERENCES `stockrotationstages` (`stage_id`) ON UPDATE CASCADE ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; --- a/installer/data/mysql/sysprefs.sql +++ a/installer/data/mysql/sysprefs.sql @@ -475,6 +475,8 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('reviewson','1','','If ON, enables patron reviews of bibliographic records in the OPAC','YesNo'), ('RisExportAdditionalFields', '', NULL , 'Define additional RIS tags to export from MARC records in YAML format as an associative array with either a marc tag/subfield combination as the value, or a list of tag/subfield combinations.', 'textarea'), ('RoutingListAddReserves','0','','If ON the patrons on routing lists are automatically added to holds on the issue.','YesNo'), +('RotationPreventTransfers','0',NULL,'If ON, prevent any transfers for items on stock rotation rotas, except for stock rotation transfers','YesNo'), +('RoutingListAddReserves','1','','If ON the patrons on routing lists are automatically added to holds on the issue.','YesNo'), ('RoutingListNote','To change this note edit RoutingListNote system preference.','70|10','Define a note to be shown on all routing lists','Textarea'), ('RoutingSerials','1',NULL,'If ON, serials routing is enabled','YesNo'), ('SCOMainUserBlock','','70|10','Add a block of HTML that will display on the self checkout screen','Textarea'), @@ -521,6 +523,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('StaffSerialIssueDisplayCount','3','','Number of serial issues to display per subscription in the Staff client','Integer'), ('StaticHoldsQueueWeight','0',NULL,'Specify a list of library location codes separated by commas -- the list of codes will be traversed and weighted with first values given higher weight for holds fulfillment -- alternatively, if RandomizeHoldsQueueWeight is set, the list will be randomly selective','Integer'), ('StatisticsFields','location|itype|ccode', NULL, 'Define Fields (from the items table) used for statistics members','Free'), +('StockRotation','0',NULL,'If ON, enables the stock rotation module','YesNo'), ('StoreLastBorrower','0','','If ON, the last borrower to return an item will be stored in items.last_returned_by','YesNo'), ('SubfieldsToAllowForRestrictedBatchmod','','Define a list of subfields for which edition is authorized when items_batchmod_restricted permission is enabled, separated by spaces. Example: 995\$f 995\$h 995\$j',NULL,'Free'), ('SubfieldsToAllowForRestrictedEditing','','Define a list of subfields for which edition is authorized when edit_items_restricted permission is enabled, separated by spaces. Example: 995\$f 995\$h 995\$j',NULL,'Free'), @@ -611,7 +614,5 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('XSLTListsDisplay','default','','Enable XSLT stylesheet control over lists pages display on intranet','Free'), ('XSLTResultsDisplay','default','','Enable XSL stylesheet control over results page display on intranet','Free'), ('z3950AuthorAuthFields','701,702,700',NULL,'Define the MARC biblio fields for Personal Name Authorities to fill biblio.author','free'), -('z3950NormalizeAuthor','0','','If ON, Personal Name Authorities will replace authors in biblio.author','YesNo'), -('StockRotation','0',NULL,'If ON, enables the stock rotation module','YesNo'), -('RotationPreventTransfers','0',NULL,'If ON, prevent any transfers for items on stock rotation rotas, except for stock rotation transfers','YesNo') +('z3950NormalizeAuthor','0','','If ON, Personal Name Authorities will replace authors in biblio.author','YesNo') ; --- a/koha-tmpl/intranet-tmpl/prog/css/src/staff-global.scss +++ a/koha-tmpl/intranet-tmpl/prog/css/src/staff-global.scss @@ -4026,6 +4026,127 @@ span { width: 100% !important; } +#stockrotation { + h3 { + margin: 30px 0 10px 0; + } + .dialog { + h3 { + margin: 10px 0; + } + margin-bottom: 20px; + } + .highlight_stage { + font-weight: bold; + } +} + +#catalog_stockrotation .highlight_stage { + font-weight: bold; +} + +#stockrotation { + #rota_form { + textarea { + width: 300px; + height: 100px; + } + #name { + width: 300px; + } + fieldset { + width: auto; + } + } + #stage_form fieldset, #add_rota_item_form fieldset { + width: auto; + } + .dialog.alert { + ul { + margin: 20px 0; + } + li { + list-style-type: none; + } + } +} + +#catalog_stockrotation { + .item_select_rota { + vertical-align: middle; + } + h1 { + margin-bottom: 20px; + } +} + +#stockrotation td.actions, #catalog_stockrotation td.actions { + vertical-align: middle; +} + +#stockrotation .stage, #catalog_stockrotation .stage { + display: inline-block; + padding: 5px 7px; + margin: 3px 0 3px 0; + border-radius: 5px; + background-color: rgba(0, 0, 0, 0.1); +} + +#stage_list_headings { + font-weight: bold; + span { + padding: 3px; + } +} + +#manage_stages { + ul { + padding-left: 0; + } + li { + list-style: none; + margin-bottom: 5px; + span { + padding: 6px 3px; + } + } + .stagename { + width: 15em; + display: inline-block; + } + .stageduration { + width: 10em; + display: inline-block; + } + .stageactions { + display: inline-block; + } + li:nth-child(odd) { + background-color: #F3F3F3; + } + .drag_handle { + margin-right: 6px; + cursor: move; + } + .drag_placeholder { + height: 2em; + border: 1px dotted #aaa; + } + h3 { + display: inline-block; + } + #ajax_status { + display: inline-block; + border: 1px solid #bcbcbc; + border-radius: 5px; + padding: 5px; + margin-left: 10px; + background: #f3f3f3; + } + #manage_stages_help { + margin: 20px 0; + } +} #helper { span { --- a/koha-tmpl/intranet-tmpl/prog/css/staff-global.css +++ a/koha-tmpl/intranet-tmpl/prog/css/staff-global.css @@ -1, +1, @@ -@charset "UTF-8";@import url("../../lib/yui/reset-fonts-grids.css") screen;::-moz-selection{background:#538200;color:#fff}::selection{background:#538200;color:#fff}a:link,a:visited{color:#004d99;text-decoration:none}a:active,a:hover{color:#538200;text-decoration:none}a:hover .term{color:#ff9090}a.btn:link,a.btn:visited{color:#333}a.btn.btn-link:link,a.btn.btn-link:visited{color:#004d99}a.btn.btn-link:hover{color:#538200}a.cancel{padding-left:1em}a.cartRemove{color:#c33;font-size:90%;margin:0;padding:0}a.close:hover{color:#538200}a.csv{background-image:url(../img/famfamfam/silk/page_white_excel.png)}a.dropdown-toggle{white-space:nowrap}a.incart{color:#666}a.debit,a.overdue{color:#c00}a.popup{background:transparent url(../img/pop-up-link.png) 100% no-repeat;padding-right:15px}a.disabled{color:#999}a.document{background-position:0 middle;background-repeat:no-repeat;display:inline-block;min-height:20px;padding-left:20px}a.highlight_toggle{display:none}a .localimage img{border:1px solid #00c;margin:0 .5em;padding:.3em}a.pdf{background-image:url(../img/famfamfam/silk/page_white_acrobat.png)}a.submit{background:linear-gradient(180deg,#fff 0,#f7f7f7 35%,#e0e0e0);border:1px outset #999;border-left-color:#666;border-top-color:#666;color:#333;padding:.25em;display:inline-block}a.submit:active{border:1px inset #999}a.submit:disabled{background:#eee none;border:1px solid silver;color:#999}a.term{text-decoration:underline}a.xml{background-image:url(../img/famfamfam/silk/page_white_code.png)}aside h5{font-size:100%;margin:.5em 0}aside fieldset.brief{margin:0;padding:.4em .7em}aside fieldset.brief fieldset{margin:0;padding:.5em 0}aside fieldset.brief fieldset legend{font-size:85%}aside fieldset.brief li.checkbox label,aside fieldset.brief li.dateinsert label,aside fieldset.brief li.dateinsert span.label{display:inline}aside fieldset.brief li.radio{padding:.7em 0}aside fieldset.brief li.radio input{padding:.3em 0}aside fieldset.brief li.radio label,aside fieldset.brief li.radio span.label{display:inline}aside fieldset.brief ol{font-size:85%;margin:0;padding:0}aside fieldset.brief [type=text],aside fieldset.brief select{width:100%}button{background:linear-gradient(180deg,#fff 0,#f7f7f7 35%,#e0e0e0);border:1px outset #999;border-left-color:#666;border-top-color:#666;color:#333;padding:.25em}button:active{border:1px inset #999}button:disabled{background:#eee none;border:1px solid silver;color:#999}button.closebtn{background:transparent;border:0;cursor:pointer;padding:0}main .yui-b fieldset.brief [type=text],main .yui-b fieldset.brief select{width:auto}table{border-collapse:collapse;border-right:1px solid #bcbcbc;border-top:1px solid #bcbcbc}table .btn-group{white-space:nowrap}table .btn-group .btn{display:inline-block;float:none}table.indexes td{vertical-align:middle}table>caption span.actions{font-size:66%;font-weight:400;margin:0 .5em 0 0}table.invis,table.invis td,table.invis tr{border:0}table+table{margin-top:1em}td,th{border-bottom:1px solid #bcbcbc;border-left:1px solid #bcbcbc;padding:.2em .3em}td{background-color:#fff;vertical-align:top}td.actions{white-space:nowrap}td.borderless{border:0 none;border-collapse:separate}td.data{font-family:Courier New,Courier,monospace}td.data,td.total{text-align:right}td input.approve{background-color:#ffc}th{background-color:#e8e8e8;font-weight:700;text-align:center}th.data{font-family:Courier New,Courier,monospace;text-align:right}body{font-family:Arial,Verdana,Helvetica,sans-serif;padding:0 0 4em;text-align:left}br.clear{clear:both;line-height:1px}form{display:inline}form.confirm{display:block;text-align:center}h1{font-size:161.6%;font-weight:700}h1#logo{border:0 none;float:left;margin:.75em .3em .75em .7em;padding:0;width:180px}h2{font-size:146.5%}h2,h3{font-weight:700}h3{font-size:131%}h4{font-size:116%}h4,h5{font-weight:700}h5{font-size:100%}h6{font-size:93%;font-weight:700}h1,h2,h3,h4,h5,h6{margin:.3em 0}hr{clear:both}p{margin:.5em 0}strong{font-weight:700}em strong,strong em{font-style:italic;font-weight:700}cite,em{font-style:italic}input,textarea{line-height:normal;padding:2px 4px}input:focus,textarea:focus{border-color:#538200;border-radius:4px;border-style:solid}input[type=checkbox],input[type=radio]{margin:0;vertical-align:middle}input[type=button]:active,input[type=submit]:active{border:1px inset #999}input[type=button],input[type=reset],input[type=submit]{background:linear-gradient(180deg,#fff 0,#f7f7f7 35%,#e0e0e0);border:1px outset #999;border-left-color:#666;border-top-color:#666;color:#333;padding:.25em}input[type=button]:active,input[type=reset]:active,input[type=submit]:active{border:1px inset #999}input[type=button]:disabled,input[type=reset]:disabled,input[type=submit]:disabled{background:#eee none;border:1px solid silver;color:#999}input.alert{background-color:#ff9;border-color:#900}input.submit{background:linear-gradient(180deg,#fff 0,#f7f7f7 35%,#e0e0e0);border:1px outset #999;border-left-color:#666;border-top-color:#666;color:#333;padding:.25em}input.submit:active{border:1px inset #999}input.submit:disabled{background:#eee none;border:1px solid silver;color:#999}input.warning{background:#fff url(../img/famfamfam/silk/error.png) no-repeat 4px;padding:.25em .25em .25em 25px}.label,label{color:#000;display:inline;font-size:inherit;font-weight:400;max-width:inherit;padding:0;vertical-align:middle}.label input[type=checkbox],.label input[type=radio],label input[type=checkbox],label input[type=radio]{margin-top:0}.label.circ_barcode,label.circ_barcode{font-size:105%;font-weight:700}.label.permissioncode,label.permissioncode{font-style:italic}.label.permissioncode:before,label.permissioncode:before{content:"("}.label.permissioncode:after,label.permissioncode:after{content:")"}.label.required,label.required{color:#c00}.subfield-label{font-style:italic}.subfield-label span.subfield-code{font-weight:700}.members-update-table{padding-top:10px}#navmenulist li{border-bottom:1px solid #eee;list-style-image:url(../img/arrow-bullet.gif);padding:.2em 0}#navmenulist li a{text-decoration:none}#navmenulist li a.current{font-weight:700}#doc,#doc1,#doc2,#doc3{padding-top:1em}.main{margin-top:1em}#login_controls{padding:.4em .5em;position:absolute;right:.5em}ul{padding-left:1.1em}ul li{list-style-type:disc}ul li input.submit{font-size:87%;padding:2px}ul li li{list-style-type:circle}ul .toolbar{padding-left:0}ul .toolbar button{font-family:Arial,Verdana,Helvetica,sans-serif;padding-bottom:2px}ul .toolbar li{display:inline;list-style:none}ul.budget_hierarchy{margin-left:0;padding-left:0}ul.budget_hierarchy li{display:inline}ul.budget_hierarchy li:after{content:" -> "}ul.budget_hierarchy li:first-child:after,ul.budget_hierarchy li:last-child:after{content:""}ul.fa-ul li{list-style-type:none}ul.ui-tabs-nav li{list-style:none}ol{padding-left:1.5em}ol li{list-style:decimal}ol.bibliodetails{float:left;margin:0 0 1em 1em}ol.bibliodetails li{border-bottom:1px solid #e8e8e8;list-style-type:none;padding:.1em}ol.bibliodetails span.label{border-right:1px solid #e8e8e8;float:left;font-weight:700;margin-right:1em;width:12em}.gradient{background-image:linear-gradient(180deg,#e6f0f2 1%,#fff 99%);display:inline-block;width:100%}.cart-controls{border-top:1px solid #e8e8e8;padding:7px 0}#editions table,#editions td{border:0}.highlighted-row,.highlighted-row td{background-color:#ffd000!important}tbody tr:nth-child(odd) td{background-color:#f3f3f3;border:1px solid #bcbcbc;border-right:1px solid #bcbcbc}.overdue td.od{color:#c00;font-weight:700}tr.clickable{cursor:pointer}tr.expired td{color:#999}tr.highlight td{background-color:#f6f6f6;border-color:#bcbcbc}tr.highlight th[scope=row]{background-color:#ddd;border-color:#bcbcbc}tr.highlight table.invis td{border:0}tr.odd.onissue td{background-color:#ffffe1}tr.ok:nth-child(2n) td,tr.ok:nth-child(odd) td,tr.ok td,tr.onissue td{background-color:#ffc}tr.reserved td{background-color:#eeffd4}tr.transfered td{background-color:#e8f0f6}tr.warn:nth-child(odd) td,tr.warn td{background-color:#ff9090}.table_borrowers tr:hover td{background-color:#ff9}tfoot td{background-color:#f3f3f3;font-weight:700}caption{color:#000;font-size:133.9%;font-weight:700;margin:.3em 0}.problem{background-color:#ffc;color:#900;font-weight:700;line-height:1.7em}fieldset{background-color:#f4f8f9;border:2px solid #b9d8d9;border-radius:5px;margin:1em 1em 1em 0;padding:1em}fieldset+fieldset.action{padding-top:20px}fieldset .lastchecked{border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-width:0;margin-bottom:0}fieldset.action{background-color:transparent;border:0;clear:both;float:none;margin:.9em 0 0;padding:.4em;width:auto}fieldset.brief{border:2px solid #b9d8d9}fieldset.brief div.hint{margin-bottom:.4em}fieldset.brief label{display:block;font-weight:700;padding:.3em 0}fieldset.brief label.inline{display:inline;float:none;margin-left:1em;width:auto}fieldset.brief li[aria-disabled=true]{color:#999}fieldset.brief li.inline{display:inline;float:none;margin-left:1em;width:auto}fieldset.brief li,fieldset.brief ol{list-style-type:none}fieldset.brief span .label{display:block;font-weight:700;padding:.3em 0;text-align:left}fieldset.rows{border:2px solid #b9d8d9;border-width:1px;clear:left;float:left;font-size:90%;margin:.9em 0 0;padding:0;width:100%}fieldset.rows fieldset{background-color:transparent;border-width:1px;margin:1em;padding:.3em}fieldset.rows fieldset.action{padding:1em}fieldset.rows.inputnote{clear:left;float:left;margin:1em 0 0 11em}fieldset.rows.left label{text-align:left;width:8em}fieldset.rows.left li{padding-bottom:.4em}fieldset.rows.left span label{text-align:left;width:8em}fieldset.rows.ui-accordion-content{border-top-left-radius:0;border-top-right-radius:0;margin:0;padding:0;width:auto}fieldset.rows.ui-accordion-content table{margin:0}fieldset.rows.unselected{background-color:#fff;border:0;border-width:0}fieldset.rows caption{font-size:120%}fieldset.rows div.hint{margin-bottom:.4em;margin-left:10.5em}fieldset.rows label{float:left;font-weight:700;margin-right:1em;text-align:right;width:9em}fieldset.rows label.error{float:none;margin-left:1em;width:auto}fieldset.rows label.inline{display:inline;float:none;margin-left:1em}fieldset.rows label.yesno{float:none;width:auto}fieldset.rows legend{font-size:110%;font-weight:700;margin-left:1em}fieldset.rows li{clear:left;float:left;list-style-type:none;padding-bottom:1em;width:100%}fieldset.rows li[aria-disabled=true]{color:#999}fieldset.rows li.radio{padding-left:9em;width:auto}fieldset.rows li.radio input+label{margin-left:0;padding-left:0}fieldset.rows li.radio label{float:none;margin:0 0 0 1em;width:auto}fieldset.rows li input+label{margin-left:0;padding-left:0}fieldset.rows ol{list-style-type:none;padding:1em 1em 0}fieldset.rows ol.radio label{float:none;margin-left:20px;margin-right:30px;padding-left:0;vertical-align:middle;width:auto}fieldset.rows ol.radio label.radio{float:left;margin-right:1em;margin-top:0;width:9em}fieldset.rows ol.radio input[type=checkbox],fieldset.rows ol.radio input[type=radio]{margin-left:-20px}fieldset.rows p{margin:1em 0 1em 1em}fieldset.rows span.label{float:left;font-weight:700;margin-right:1em;text-align:right;width:9em}fieldset.rows table{clear:both;font-size:105%;margin:1em 0 1em 1em}fieldset.rows table.mceListBox{margin:0}fieldset.rows td label{float:none;font-weight:400;width:auto}fieldset.rows .inputnote{clear:left;float:left;margin:1em 0 0 11em}fieldset.rows+h3{clear:both;padding-top:.5em}#multi_receiving fieldset.rows label{width:50%}.yui-u div.hint{margin-bottom:.4em}.yui-u fieldset.rows div.hint{margin-left:7.5em}.yui-u fieldset.rows label,.yui-u fieldset.rows span.label{width:10em}.yui-u .rows li p label.widelabel,legend{width:auto}legend{background-color:#fff;border:2px solid #b9d8d9;border-radius:3px;font-size:123.1%;font-weight:700;padding:.2em .5em}details>summary{cursor:pointer}details>summary:before{content:"\f0da";display:inline-block;font-family:FontAwesome;width:1em}details>summary.checkouts-by-itemtype li{display:inline-block}details[open]>summary:before{content:"\f0d7"}#floating-save{background-color:rgba(185,216,217,.6);bottom:3%;position:fixed;right:1%;width:150px}#breadcrumbs{background-color:#e6f0f2;clear:both;font-size:90%;margin:0;padding:.2em .5em .4em 10px}#header.navbar{margin-bottom:0}#header.navbar-default{background:#e6f0f2;border:0;box-shadow:none}#header+#breadcrumbs{margin-top:1em}#header>.container-fluid{padding:0}div.action{background-color:transparent;border:0;clear:both;float:none;margin:.9em 0 0;padding:.4em;width:auto}div .circmessage{margin-bottom:.3em;padding:0 .4em .4em}div .circmessage:first-child{margin-top:1em}div.error{background-color:#ff9;border:2px dashed #900;margin:1em;padding:.5em}div.first fieldset{margin-right:0}div.help{margin:.9em 0 0}div.justify{text-align:justify}div.message{background:linear-gradient(180deg,#fff 0,#f4f6fa 2%,#eaeef5 23%,#e8edf6 94%,#cddbf2);border:1px solid #bcbcbc;text-align:center;width:55%}div.message h5,div.message ul{padding-left:25%;text-align:left}div.message ul+h4{margin-top:.7em}div.note{background:linear-gradient(180deg,#f4f6fa 0,#e8edf6);border:1px solid #bcbcbc;margin:.5em 0;padding:.5em}div.note i.fa-exclamation{color:#c00;font-style:italic;padding:0 .3em}div.rules{display:block}div.results,div[class$=_table_controls]{padding:.7em 0}div.rule{background-color:#f4f8f9;border:2px solid #b9d8d9;border-radius:5px;margin:.3em;padding:.3em}div.lastchecked{border:2px solid #bcdb89;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding:.2em 1em}div.listgroup{clear:left}div.listgroup h4{font-style:italic}div.listgroup h4 a,div.listgroup input{font-size:80%}div.sysprefs h3{margin:.2em 0 .2em .4em}div.sysprefs dl{margin-left:1.5em}div.sysprefs.hint{float:right;margin:.7em;padding:.5em;width:25%}div.rows{clear:left;float:left;margin:0;padding:0;width:100%}div.rows+div.rows{margin-top:.6em}div.rows li{border-bottom:1px solid #eee;clear:left;float:left;list-style-type:none;padding-bottom:.2em;padding-top:.1em;width:100%}div.rows ol{list-style-type:none;padding:.5em 1em 0 0}div.rows ol li li{border-bottom:0}div.rows span.label{float:left;font-weight:700;margin-right:1em;padding-top:0;text-align:left;width:9em}div.pages{margin:.5em 0}div.pages a{font-weight:700;padding:1px 5px;text-decoration:none}div.pages a:link,div.pages a:visited{background-color:#eee;color:#36c}div.pages a:active,div.pages a:hover{background-color:#ffc}div.pages .current,div.pages .currentPage{background-color:#e6fcb7;color:#666;font-weight:700;padding:1px 5px}div.pages .inactive{background-color:#f3f3f3;color:#bcbcbc;font-weight:700;padding:1px 5px}div .browse{margin:.5em 0}#header_search{background-position:.5em .5em;background-repeat:no-repeat;float:left;margin:.3em 0 .5em}#header_search input{font-size:1.3em}#header_search input.submit{font-size:1em}#header_search div.residentsearch{border:0;border-bottom:1px solid #85ca11;padding:0 0 .2em}#header_search ul.ui-tabs-nav{margin-left:1em;padding-top:0}#header_search ul.ui-tabs-nav li.ui-state-default{background:transparent none;border:0;top:0}#header_search ul.ui-tabs-nav li.ui-state-default a{padding:.3em .6em}#header_search ul.ui-tabs-nav li.ui-tabs-active{background-color:#fffff1;border:1px solid #85ca11;border-top-width:0;top:-2px}#header_search ul.ui-tabs-nav li.ui-tabs-active a{text-decoration:none}#header_search .ui-corner-top{border-radius:0 0 4px 4px}#header_search>div,#header_search>div>li,#header_search>ul,#header_search>ul>li{display:none}#header_search>div:first-of-type,#header_search>div>li:first-of-type,#header_search>ul:first-of-type,#header_search>ul>li:first-of-type{display:block}.head-searchbox{width:30em}#checkouts,#reserves{border:1px solid #b9d8d9;padding:1em}.tip{color:gray;font-size:93%}.single-line{white-space:nowrap}.ex{font-family:Courier New,Courier,monospace}.ex,dt{font-weight:700}dd{font-size:90%;font-weight:400;padding:.2em;text-indent:2.5em}#toolbar,.btn-toolbar{background-color:#edf4f6;border:1px solid #e6f0f2;border-radius:5px 5px 0 0;margin:0;padding:5px}#disabled2 a,#disabled a,#disabled a:hover{color:#999}.patroninfo{margin-top:-.5em}.patroninfo h5{border-right:1px solid #b9d8d9;margin-bottom:0;padding-bottom:.5em;padding-left:-.5em;padding-top:.3em}.patroninfo h5:empty{border-right:0}.patroninfo ul{border:0;border-bottom:0;border-right:1px solid #b9d8d9;border-top:0;margin:0;padding:0}.patroninfo ul li{list-style-type:none;margin:0}.patroninfo+#menu{margin-right:0}#patronbasics div{background:transparent url(../img/patron-blank.min.svg) 10px 5px no-repeat;height:125px;padding:0;width:105px}#patronbasics div,#patronimage{border:1px solid #ccc;margin:.3em 0 .3em .3em}#patronimage{max-width:140px;padding:.2em}.patronviews{border-right:1px solid #000;border-top:1px solid #000;margin-bottom:.5em;padding:.5em 0}.column-tool{font-size:80%}.hint{color:#666;font-size:95%}.yui-b fieldset.brief{padding:.4em .7em}.yui-b fieldset.brief fieldset{margin:0 .3em;padding:.5em}.yui-b fieldset.brief fieldset legend{font-size:85%}#tools_holidays .yui-b fieldset.brief li.checkbox input{margin-left:0}.yui-b fieldset.brief li.checkbox label{display:inline}#tools_holidays .yui-b fieldset.brief li.checkbox label{margin-left:20px}.yui-b fieldset.brief li.dateinsert label,.yui-b fieldset.brief li.dateinsert span.label{display:inline}.yui-b fieldset.brief li.radio{padding:.7em 0}.yui-b fieldset.brief li.radio input{padding:.3em 0}#tools_holidays .yui-b fieldset.brief li.radio input{margin-left:0}.yui-b fieldset.brief li.radio label{display:inline}#tools_holidays .yui-b fieldset.brief li.radio label{margin-left:20px}.yui-b fieldset.brief li.radio label span.label{display:inline}.yui-b fieldset.brief ol{font-size:85%;margin:0;padding:0}.yui-b fieldset.brief [type=text],.yui-b fieldset.brief select{width:100%}.yui-b fieldset.rows div.hint{margin-left:10.5em}#yui-main .yui-b fieldset.brief [type=text],#yui-main .yui-b fieldset.brief select,.yui-b fieldset.rows td label,.yui-b fieldset.rows td span.label{width:auto}.btn-toolbar fieldset.action{margin-top:0}.btn-toolbar .dropdown-menu{font-size:13px}.rows .label{white-space:normal}.checkedout{color:#999;font-style:italic}.subfield_not_filled{background-color:#ff9}.content_hidden{display:none;visibility:hidden}.content_visible{display:block;visibility:visible}#z3950searcht table{border:0;padding:20px}#z3950_search_targets{height:338px;overflow-y:auto}#z3950_search_targets_acq{height:308px;overflow-y:auto}.z3950checks{padding-left:1em}.error{color:#c00}.status_ok{background-color:#90ee90}.status_warn{background-color:red}i.error{color:#c00}i.success{color:green}i.warn{color:orange}.checkout-setting{font-size:85%;padding-top:.3em}.checkout-setting input{vertical-align:middle}.checkout-setting label{font-size:inherit;font-weight:400}.checkout-settings{background-color:#f4f8f9;border-radius:0;border-top:2px solid #b9d8d9;display:none;margin-left:-1em;margin-right:-1em;margin-top:1em;padding:1em 1em 0}#show-checkout-settings{margin-top:.5em}.blocker,.inaccurate-item-statuses{color:#900}.circmessage li{list-style:url(../img/arrow-bullet.gif);margin-bottom:.2em}#circ_needsconfirmation{margin:auto}.dialog{border:1px solid #bcbcbc;border-radius:2px;margin:1em auto;padding:.5em;text-align:center;width:65%}.dialog a.approve{display:inline-block}.dialog a.approve,.dialog button{background:#fff none;border:1px outset #999;border-left-color:#666;border-top-color:#666;margin:.4em;padding:.4em;white-space:pre-line}.dialog a.approve:active,.dialog button:active{border:1px inset #999}.dialog a.approve:hover,.dialog button:hover{background-color:#ffc}.dialog h2,.dialog h3,.dialog h4{margin:auto;text-align:center}.dialog input{background-color:#fff;border:1px solid #bcbcbc;margin:.4em;padding:.4em .4em .4em 25px}.dialog input:hover{background-color:#ffc}.dialog input[type=submit]{background:#fff none}.dialog li{list-style-position:inside}.dialog table{margin:.5em auto}.dialog table td{text-align:left}.dialog table th{text-align:right}.alert{background:linear-gradient(180deg,#fef8d3 0,#ffec91 9%,#ffed87 89%,#f9dc00);border:1px solid #e0c726;color:inherit;text-align:center;text-shadow:none}.alert strong{color:#900}.alert .closebtn{line-height:20px;position:relative;right:-21px;top:-2px}.approve i.fa,.success i.fa{color:green}.deny i.fa{color:#c00}.new i.fa{color:#425faf}.accesskey{text-decoration:underline}.missing,.term{background-color:#ffc}.term{color:#900}.shelvingloc{display:block;font-style:italic}#menu{border-right:1px solid #b9d8d9;margin-right:.5em;padding-bottom:2em;padding-top:1em}#menu li a{background:linear-gradient(180deg,#e8f0f6 0,#e8f0f6 96%,#c1c1c1);border:1px solid #b9d8d9;border-bottom-left-radius:5px;border-top-left-radius:5px;display:block;font-size:111%;margin:.5em 0;margin-right:-1px;padding:.4em .3em;text-decoration:none}#menu li a:hover{background:linear-gradient(180deg,#fafafa 0,#fff 96%,#e6e6e6 97%,#ccc 99%,#c1c1c1)}#menu li.active a,#menu li a:hover{border-bottom:1px solid #85ca11;border-left:1px solid #85ca11;border-top:1px solid #85ca11}#menu li.active a{background-color:#fff;background-image:none;border-right:0;color:#000;font-weight:700}#menu li.active a:hover{background-color:#fff;color:#538200}#menu ul li{list-style-type:none}#logo{background:transparent url(../img/koha-logo-medium.png) no-repeat scroll 0;margin:.75em .3em .75em .7em}#logo a{border:0;cursor:pointer;display:block;height:0!important;margin:0;overflow:hidden;padding:44px 0 0;text-decoration:none;width:180px}#closewindow{margin-top:2em;text-align:center}#closewindow a{font-weight:700}.barcode{font-size:200%;vertical-align:middle}li.email{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.patronbriefinfo li.email{font-size:87%;padding:0 10px 0 0;width:90%}.empty{color:#ccc}.address{font-size:110%}.address li{list-style-type:none}.title{font-size:105%;font-weight:700}.hold{float:right;font-size:90%;margin:0}.thumbnail{display:block;margin:auto}.thumbnail>li{list-style-type:none}#searchresults ul li{clear:left;font-size:90%;list-style:url(../img/item-bullet.gif);padding:.2em 0}#searchresults ul li img{float:left;margin:3px 5px 3px -5px}#searchresults ul span.status{clear:left;color:#900;display:block}#searchresults ul span.unavailable{clear:left;display:block}#searchresults ul table td{vertical-align:top}#searchresults.unavailability strong{display:block}#searchheader{background-color:#e6f0f2;border:1px solid #b9d8d9;border-radius:5px 5px 0 0;font-size:80%;margin:0 0 .5em -1px;padding:.4em 0 .4em 1em}#searchheader.floating{border-radius:0;margin-top:0}#searchheader .btn-group>.btn:first-child{margin-left:.7em}#searchheader form{float:right;padding:5px 5px 3px 0}#searchheader form.fz3950{float:right;font-size:125%;padding:0 0 0 5em}#searchheader form.fz3950bigrpad{float:right;font-size:125%;padding:5px 25em 0 0}#search-facets{border:1px solid #b9d8d9;border-radius:5px 5px 0 0}#search-facets h4{background-color:#e6f0f2;border-bottom:1px solid #b9d8d9;border-radius:5px 5px 0 0;font-size:90%;margin:0;padding:.4em .2em;text-align:center}#search-facets ul{margin:0;padding:.3em}#search-facets ul li{font-weight:700;list-style-type:none}#search-facets li li{font-size:85%;font-weight:400;margin-bottom:2px;padding:.1em .2em}#search-facets li.showmore{font-weight:700;text-indent:1em}.facet-count{display:inline-block}#bookcoverimg{text-align:center}.searchhighlightblob{font-size:75%;font-style:italic}#displayexample{background-color:#ccc;margin-bottom:10px;padding:5px}#irregularity_summary{vertical-align:top}#toplevelmenu{padding:0}#CheckAll,#CheckNone,#CheckPending{font-weight:400;margin:0 .5em 0 0}.dmg,.lost,.wdn{color:#900;display:block}.datedue{color:#999;display:block;font-style:italic}.credit,.waitinghere{color:#690}#mainuserblock{border:1px solid #e8e8e8;margin-top:.5em;padding:.5em}.labeledmarc-table{border:0}.labeledmarc-label{border:0;color:#000;font-size:11pt;font-style:italic;padding:5}.labeledmarc-value{border:0;color:#000;font-size:10pt;padding:5}#marcPreview table{border:0;font-family:Courier New,Courier,monospace;font-size:95%;margin:.7em 0 0}#marcPreview tbody tr:nth-child(odd) td{background-color:#fff}#marcPreview td,#marcPreview th{border:0;padding:2px;vertical-align:top}#marcPreview th{background-color:#fff;text-align:left;white-space:nowrap}#marcPreview.modal-dialog,.modal-dialog.modal-wide{width:80%}@media (max-width:767px){#marcPreview{margin:0;width:auto}}#cartDetails{background-color:#fff;border:1px solid #739acf;box-shadow:1px 1px 3px 0 #666;color:#000;display:none;margin:0;padding:10px;text-align:center;width:180px;z-index:2}#cartmenulink{background:transparent url(../img/cart-small.gif) 0 no-repeat;padding-left:15px}#basketcount span{display:inline;font-size:90%;font-weight:400;padding:0}#moremenu{display:none}.results_summary{color:#707070;display:block;font-size:85%;padding:0 0 .5em}.results_summary a{font-weight:400}.results_summary .label{color:#202020}.child_fund_amount{font-style:italic}.number_box{font-size:105%;line-height:200%}.number_box a,.number_box span{background-color:#e4ecf5;border:1px solid #a4bedd;border-radius:4px;font-weight:700;padding:.1em .4em;text-decoration:none}.number_box a:hover,.number_box span:hover{background-color:#ebeff7}.container{border:1px solid #eee;margin:1em 0;padding:1em}.import_export{position:relative}.import_export .export_ok{background:#e3e3e3 none;border:0;cursor:pointer;margin-left:20px;padding:10px}.import_export .import_export_options{background:#fff;border:1px solid #cdcdcd;left:60px;padding:10px;position:absolute;top:0;width:300px;z-index:1}.import_export_options{background:#e3e3e3 none;border:0;cursor:pointer;margin-left:20px;padding:10px}.import_export_options fieldset.rows li label{width:16em}.import_export_options .importing{background:none;padding:inherit}.form_import fieldset.rows li label{width:auto}.form_import .input_import{border:1px solid #bcbcbc}.importing{position:relative}.importing .importing_msg{padding-bottom:10px;padding-left:10px}.field_hint{color:gray;font-style:italic;padding-left:1em}.m880{display:block;float:right;padding-left:20px;text-align:right;width:50%}.advsearch{margin:0}.advsearch table{border-collapse:separate;border-spacing:5px;border-width:0}.advsearch td{border:1px solid #eee;padding:.3em .4em}#circ_circulation_issue{position:relative}#clearscreen{position:absolute;right:0;top:0}#clearscreen a{background-color:#eee;border-radius:0 0 0 5px;color:#ccc;display:block;font-size:160%;font-weight:700;padding:0 .7em .2em;text-decoration:none;text-shadow:0 -1px 0 #666}#clearscreen a:hover{color:#c00}.pager{background-color:#e8e8e8;border:1px solid #bcbcbc;border-radius:5px;display:inline-block;font-size:85%;margin:.4em 0;padding:.3em .5em}.pager img{vertical-align:middle}.pager img.last{padding-right:5px}.pager input.pagedisplay{background-color:transparent;border:0;font-weight:700;text-align:center}.pager p{margin:0}.no-image{background-color:#fff;border:1px solid #aaa;border-radius:3px;color:#979797;display:block;font-size:86%;font-weight:700;text-align:center;width:75px}#acqui_order_supplierlist>div.supplier{border:1px solid #eee;margin:.5em;padding:1em}#acqui_order_supplierlist>div>div>.baskets{margin-top:.5em}#acqui_order_supplierlist>div>span.action{margin-left:5em}#acqui_order_supplierlist>div>span.suppliername{display:inline;font-size:1.7em;margin-bottom:.5em}.supplier-contact-details{float:left}#ADD-contact{margin:0 0 8px 8px}#contact-template{display:none}.ui-widget-content{background:#fff none;border:1px solid #b9d8d9;color:#222}.ui-widget-header{background:#e6f0f2 none;border:1px solid #b9d8d9;color:#222;font-weight:700}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{background:#f4f8f9 none;border:1px solid #b9d8d9;color:#555;font-weight:400}.ui-state-focus,.ui-state-hover,.ui-widget-content .ui-state-focus,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-focus,.ui-widget-header .ui-state-hover{background:#e6f0f2 none;border:1px solid #b9d8d9;color:#212121;font-weight:400}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{background:#fff none;border:1px solid #aaa;color:#212121;font-weight:400}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{background:#fff4c6;border:1px solid #fed22f;color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{background:#fef1ec;border:1px solid #cd0a0a;color:#cd0a0a}.ui-autocomplete{box-shadow:2px 2px 2px rgba(0,0,0,.3);cursor:default;position:absolute}.ui-autocomplete.ui-widget-content .ui-state-hover{background:#e6f0f2 none;border:1px solid #b9d8d9;color:#212121;font-weight:400}.ui-autocomplete-loading{background:#fff url(../img/spinner-small.gif) 100% no-repeat}.ui-menu li{list-style:none}.ui-tabs-nav .ui-tabs-active a,.ui-tabs-nav a:active,.ui-tabs-nav a:focus,.ui-tabs-nav a:hover,.ui-tabs-nav span.a{background:none repeat scroll 0 0 transparent;outline:0 none}.ui-tabs-nav.ui-widget-header{background:none;border:0}.ui-tabs .ui-tabs-nav li{background:#e6f0f2 none;border:1px solid #b9d8d9;margin-right:.4em;top:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active{background-color:#fff;border:1px solid #b9d8d9;border-bottom-width:0}.ui-tabs .ui-tabs-nav li.ui-tabs-active a{color:#000;font-weight:700}.ui-tabs .ui-tabs-nav li.ui-tabs-active.ui-state-hover{background:#fff none}.ui-tabs .ui-tabs-nav li.ui-state-default.ui-state-hover{background:#edf4f5 none}.ui-tabs .ui-tabs-panel{border:1px solid #b9d8d9}.ui-tabs.ui-widget-content{background:transparent none;border:0}.ui-tabs .ui-state-default a,.ui-tabs .ui-state-default a:link,.ui-tabs .ui-state-default a:visited{color:#004d99}.ui-tabs .ui-state-hover a,.ui-tabs .ui-state-hover a:link,.ui-tabs .ui-state-hover a:visited{color:#538200}.ui-widget,.ui-widget button,.ui-widget input,.ui-widget select,.ui-widget textarea{font-family:inherit;font-size:inherit}.statictabs ul{background:none repeat scroll 0 0 transparent;border:0 none;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top-left-radius:4px;border-top-right-radius:4px;color:#222;font-size:100%;font-weight:700;line-height:1.3;list-style:none outside none;margin:0;outline:0 none;padding:.2em .2em 0;text-decoration:none}.statictabs ul:after{clear:both}.statictabs ul:after,.statictabs ul:before{content:"";display:table}.statictabs ul li{background:none repeat scroll 0 0 #e6f0f2;border:1px solid #b9d8d9;border-bottom:0 none;border-top-left-radius:4px;border-top-right-radius:4px;color:#555;float:left;font-weight:400;list-style:none outside none;margin-bottom:0;margin-right:.4em;padding:0;position:relative;top:1px;white-space:nowrap}.statictabs ul li.active{background-color:#fff;color:#212121;font-weight:400;padding-bottom:1px}.statictabs ul li.active a{background:none repeat scroll 0 0 transparent;color:#000;cursor:text;font-weight:700;outline:0 none;top:1px}.statictabs ul li a{color:#004d99;cursor:pointer;float:left;padding:.5em 1em;text-decoration:none}.statictabs ul li a:hover{background-color:#edf4f5;border-top-left-radius:4px;border-top-right-radius:4px;color:#538200}.statictabs .tabs-container{background:none repeat scroll 0 0 transparent;border:1px solid #b9d8d9;border-bottom-left-radius:4px;border-bottom-right-radius:4px;color:#222;display:block;padding:1em 1.4em}.authref{font-style:normal;text-indent:4em}.seealso,.seefrom{font-style:italic;text-indent:2em}#authfinderops{float:right}.authorizedheading{font-weight:700}.authres_notes,.authres_otherscript,.authres_seealso{padding-top:3px}.authres_notes{font-style:italic}.contents{width:75%}.contents .r,.contents .t{display:inline}.contents .t{font-weight:700}.contents .t:first-child:before{content:"→ "}.contents .t:before{content:"\A→ ";white-space:pre}.contentblock{margin-left:2em;position:relative}#hierarchies a{color:#069;font-weight:400;text-decoration:underline}#hierarchies a:hover{color:#903}#didyoumeanintranet,#didyoumeanopac{float:left;width:260px}.pluginlist{padding-bottom:10px}.plugin{margin:0 1em 1em 0}.pluginname{background-color:#e6f0f2;cursor:move;margin:.3em;padding-bottom:4px;padding-left:.2em}.pluginname .ui-icon{float:right}.plugindesc{padding:.4em}.ui-sortable-placeholder{border:1px dotted #000;height:80px;visibility:visible}.ui-sortable-placeholder *{visibility:hidden}.ui-datepicker{box-shadow:1px 1px 3px 0 #666}.ui-datepicker table{border:0;border-collapse:collapse;font-size:.9em;margin:0 0 .4em;width:100%}.ui-datepicker th{background:transparent none;border:0;font-weight:700;padding:.7em .3em;text-align:center}.ui-datepicker-trigger{margin:0 3px;vertical-align:middle}.ui-timepicker-div dl{text-align:left}.ui-timepicker-div dl dd{margin:0 10px 10px 65px}.ui-timepicker-div dl dt{height:25px;margin-bottom:-25px}.ui-timepicker-div dl td{font-size:90%}.ui-timepicker-div .ui-widget-header{margin-bottom:8px}.ui-tpicker-grid-label{background:none;border:0;margin:0;padding:0}.ui_tpicker_microsec,.ui_tpicker_millisec,.ui_tpicker_second{display:none}.ui-accordion-header,.ui-widget-content .ui-accordion-header{font-size:110%;font-weight:700}video{width:480px}.btn,button{border-color:#adadad #adadad #949494;font-family:Arial,Verdana,Helvetica,sans-serif}.btn.btn-link,button.btn-link{border:0}.btn-group-xs>.btn,.btn-xs{font-size:10.5px;padding:3px 5px}#toolbar .dropdown-menu{border-top-width:1px;font-size:13px}#toolbar.floating{border-radius:0;margin-top:0}.dropdown-menu{border-color:rgba(0,0,0,.2);border-top:0;font-size:12px}.dropdown-menu li{list-style:none outside none}.dropdown-menu li>a{padding:4px 20px}.dropdown-menu li>a:focus,.dropdown-menu li>a:hover{background-image:linear-gradient(180deg,#08c,#0077b3);background-repeat:repeat-x;color:#fff;text-decoration:none}.navbar{color:#333;min-height:20px}.navbar .nav>li{list-style:none outside none;padding:0 .6em}.navbar .nav>li>a{color:#004d99;font-weight:700;padding:.4em .2em}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#538200}.navbar .nav li .dropdown.active>.dropdown-toggle:focus,.navbar .nav li .dropdown.open.active>.dropdown-toggle:focus,.navbar .nav li .dropdown.open>.dropdown-toggle:focus{background:#e6f0f2 none;box-shadow:none}#changelanguage .dropdown-menu>li>a,#changelanguage .dropdown-menu>li>span{padding:5px 15px}#changelanguage .navbar-text{margin:0}#changelanguage .navbar-text span{display:block;line-height:20px}.loggedout{color:#004d99;font-weight:700;padding:.4em .2em}.navbar-static-top .navbar-inner{background:#e6f0f2 none;border:0;box-shadow:none;min-height:0;padding-left:0}.navbar-fixed-bottom .navbar-inner{min-height:0;padding:.4em 0}.navbar-fixed-bottom .nav>li{border-right:1px solid #ccc}.navbar-fixed-bottom .nav>li>a{font-weight:400}.navbar-fixed-bottom .nav>li:last-child{border-right:0}.navbar-fixed-bottom .nav>li.navbar-text{line-height:normal;padding:.4em .7em}.tooltip.bottom .tooltip-arrow{border-bottom-color:#eee}.tooltip.bottom .tooltip-inner{background-color:#fff;border:1px solid rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);color:#000;font-size:120%;padding:1em}.separator{color:#666;padding:0 .2em}.close{-webkit-filter:none;filter:none;float:none;font-weight:400;line-height:1.5;position:inherit;right:auto;text-shadow:none;top:auto}.close,.close:hover{font-size:inherit;opacity:inherit}.close:hover{color:inherit;-webkit-filter:inherit;filter:inherit}.checkbox label,.radio label{margin-left:20px;padding-left:0}.checkbox input[type=checkbox],.radio input[type=radio]{margin-left:0;position:relative}.modal-header .closebtn{margin-top:4px}.closebtn{color:#000;filter:alpha(opacity=20);float:right;font-size:21px;font-weight:700;line-height:1;opacity:.2;text-shadow:0 1px 0 #fff}.closebtn:focus,.closebtn:hover{color:#000;cursor:pointer;filter:alpha(opacity=50);opacity:.5;text-decoration:none}.modal-body{background-color:#fff;overflow-y:auto}.modal-content{background-color:#edf4f6}.btn-group label,.btn-group select{font-size:13px}.tooltip-inner{white-space:pre-wrap}pre{border:0;border-radius:0;display:block;line-height:inherit;margin:0;word-break:break-all;word-wrap:break-word}code,pre{background-color:transparent;color:inherit;font-size:inherit;padding:0}code{border-radius:0}.pagination>li>a,.pagination>li>span{font-weight:700}.waiting{cursor:wait}#jobfailed,#jobpanel,#jobstatus{display:none}#jobstatus{margin:.4em}#jobprogress{background:url(../img/progress.png) -300px 0 no-repeat;border:1px solid #666;display:inline-block;height:10px;width:200px}.progress_panel{border:2px solid #eee;border-radius:5px;clear:both;font-size:120%;margin:1em 0;padding:1em}progress{width:50%}#selections{white-space:normal;width:100%}#selections input{margin:0 2px;vertical-align:middle}#selections span{background-color:#ebf3ff;border-radius:5px;font-size:75%;line-height:240%;margin:3px;padding:3px;white-space:nowrap}#selections span.selected{background-color:#cce0fc}#changepasswordf input[type=password],#changepasswordf input[type=text]{font-family:Courier New,Courier,monospace;font-size:140%;padding:.3em}.floating{box-shadow:0 3px 2px 0 rgba(0,0,0,.5)}.inline{display:inline}.nowrap,.tag_editor{white-space:nowrap}.tag_editor{background:transparent url(../img/edit-tag.png) 0 0 no-repeat;display:block;float:left;height:16px;margin:4px;overflow:hidden;text-indent:100%;width:16px}.browse-controls{margin-left:1.1em;margin-right:.5em;padding-bottom:1em;padding-top:1em}#browse-return-to-results{border-top-left-radius:3px;border-top-right-radius:3px;display:block;text-align:center}.browse-button{color:#004d99;display:inline-block;padding:.4em .6em}.browse-button:hover{background:#fafafa}span.browse-button{background:#fafafa;color:#222}span.circ-hlt{color:#c00;font-weight:700}span.expired{color:#900;font-style:italic}span.name{font-style:italic;font-weight:700}span.permissiondesc{font-weight:400}span.required{color:#c00;font-style:italic;margin-left:.5em}.result-biblio-itemtype{float:right;font-size:85%;margin:.5em;padding:.5em;text-align:center}.result-biblio-itemtype img{display:block;margin:auto;margin-bottom:2px}.browse-label,.browse-prev-next{border:1px solid #b9d8d9}.browse-label{background-color:#e8f0f6;border-top-left-radius:5px;border-top-right-radius:5px}.browse-prev-next{border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-top-width:0}#browse-previous{border-bottom-left-radius:5px;border-right:1px solid #b9d8d9;padding-right:1em}#browse-next{border-bottom-right-radius:5px;border-top-width:0;float:right;padding-right:1em}.loading-overlay{background-color:#fff;cursor:wait;height:100%;left:0;opacity:.7;position:fixed;top:0;width:100%;z-index:3}.loading-overlay div{background:transparent url(../img/loading.gif) 0 0 no-repeat;font-size:175%;font-weight:700;height:2em;left:50%;margin:-1em 0 0 -2.5em;padding-left:50px;position:absolute;top:50%;width:15em}#merge_invoices{display:none;margin:1em auto}#merge{margin:.5em 0 0}#merge_table tr.active td{background-color:#ffc}.renewals{display:block;font-size:.8em;padding:.5em}#transport-types{padding-top:.5px}#i18nMenu .navbar-text .currentlanguage{color:#000;font-weight:700}#i18nMenu a.currentlanguage:link,#i18nMenu a.currentlanguage:visited{font-weight:700}#i18nMenu a .sublanguage-selected{color:#000;font-weight:700}#circ_circulation_issue .onsite_checkout-select,.onsite_checkout-select label{font-size:inherit;font-weight:400}.onsite_checkout{color:#c00}.onsite-checkout-only{background-color:rgba(255,242,206,.5);border:1px solid #fff2ce;border-radius:4px}.branchgriditem{background-color:#fff;border:1px solid #b9d8d9;border-radius:3px;display:table-cell;float:left;margin:3px;padding:.3em}.branchgridrow{display:table-row}.branchselector{display:table}.hq-author{font-weight:700}#cn_browser_table_wrapper>#cn_browser_table{margin:auto;width:90%}#new_rule{background-color:#f4f8f9;border:2px solid #b9d8d9;border-radius:5px;display:none;margin:.3em;padding:.3em}.blocks{margin-bottom:.3em}.remove_rule{font-size:80%;padding-left:.7em}.underline{text-decoration:underline}.overline{text-decoration:overline}.order-control{padding-right:5px}#borrower_message{margin-top:10px}.form-group{margin-bottom:10px}.form-group label{font-weight:700}.modal-textarea{width:98%}#pat_member #patron_list_dialog,#pat_member #searchresults,#patron_search #filters{display:none}#fixedlengthbuilderaction{border:3px solid #e6f0f2;left:80%;padding:5px;position:relative;top:-80px;width:12%}.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background:#e6f0f2 none;box-shadow:none}.navbar-default.navbar-fixed-bottom .navbar-nav>.open>a:focus,.navbar-default.navbar-fixed-bottom .navbar-nav>.open>a:hover{background:transparent none;box-shadow:none}#interlibraryloans #dataPreviewLabel{margin:.3em 0}#interlibraryloans h1{margin:1em 0}#interlibraryloans h2{margin-bottom:20px}#interlibraryloans h3{margin-top:20px}#interlibraryloans .bg-info{overflow:auto;position:relative}#interlibraryloans .format h4{margin-bottom:20px}#interlibraryloans .format h5{margin-top:20px}#interlibraryloans .format input{margin:10px 0}#interlibraryloans .format li{list-style:none}#interlibraryloans #add-new-fields{margin:1em}#interlibraryloans #column-toggle,#interlibraryloans #reset-toggle{font-weight:700;line-height:1.5em;margin:15px 0}#interlibraryloans #freeform-fields .custom-name{margin-right:1em;text-align:right;width:9em}#interlibraryloans #freeform-fields .delete-new-field{margin-left:1em}#interlibraryloans #search-summary{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}#ill-view-panel{margin-top:15px}#ill-view-panel h3{margin-bottom:10px}#ill-view-panel h4{margin-bottom:20px}#ill-view-panel .notesopac{display:inline-block}#ill-view-panel .rows div{height:1em;margin-bottom:1em}#requestattributes{font-family:monospace;line-height:1.3em}#ill-requests{width:100%!important}#helper span,#logged-in-info-full{display:none}.loggedin-menu-label{color:#777;font-size:12px;line-height:1.42857143;padding:4px 12px;white-space:nowrap}.loggedin-menu-label span{color:#000;font-weight:700}.loggedin-menu-label.divider{padding:0}.buttons-list{margin-bottom:30px;padding:0}.buttons-list li{list-style-type:none}.buttons-list li a.circ-button{background-color:#f4f8f9;background-position:5px 3px;background-repeat:no-repeat;border:2px solid #b9d8d9;border-radius:6px;box-sizing:content-box;color:#000;display:block;font-size:110%;font-weight:700;margin:.5em 0;max-width:260px;padding:8px;text-decoration:none}.buttons-list li a.circ-button:hover{border-color:#538200;color:#538200}@media (min-width:200px){.navbar-nav>li{float:left}.navbar-right{float:right!important;margin-right:-15px}.navbar-nav{float:left;margin:0}.navbar-nav .open .dropdown-menu{background-color:#fff;border:1px solid rgba(0,0,0,.15);box-shadow:0 6px 12px rgba(0,0,0,.175);float:left;position:absolute;width:auto}.navbar-nav .open .dropdown-menu.dropdown-menu-left{left:auto;right:0}.navbar-nav .open .dropdown-menu.dropdown-menu-right{right:auto}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{background-color:#0081c2;background-image:linear-gradient(180deg,#08c,#0077b3);background-repeat:repeat-x;color:#fff;text-decoration:none}}@media (min-width:800px){#helper i{display:none}#helper span,#logged-in-info-full{display:inline}#logged-in-info-brief,.loggedin-menu-label{display:none}} +@charset "UTF-8";@import url("../../lib/yui/reset-fonts-grids.css") screen;::-moz-selection{background:#538200;color:#fff}::selection{background:#538200;color:#fff}a:link,a:visited{color:#004d99;text-decoration:none}a:active,a:hover{color:#538200;text-decoration:none}a:hover .term{color:#ff9090}a.btn:link,a.btn:visited{color:#333}a.btn.btn-link:link,a.btn.btn-link:visited{color:#004d99}a.btn.btn-link:hover{color:#538200}a.cancel{padding-left:1em}a.cartRemove{color:#c33;font-size:90%;margin:0;padding:0}a.close:hover{color:#538200}a.csv{background-image:url(../img/famfamfam/silk/page_white_excel.png)}a.dropdown-toggle{white-space:nowrap}a.incart{color:#666}a.debit,a.overdue{color:#c00}a.popup{background:transparent url(../img/pop-up-link.png) 100% no-repeat;padding-right:15px}a.disabled{color:#999}a.document{background-position:0 middle;background-repeat:no-repeat;display:inline-block;min-height:20px;padding-left:20px}a.highlight_toggle{display:none}a .localimage img{border:1px solid #00c;margin:0 .5em;padding:.3em}a.pdf{background-image:url(../img/famfamfam/silk/page_white_acrobat.png)}a.submit{background:linear-gradient(180deg,#fff 0,#f7f7f7 35%,#e0e0e0);border:1px outset #999;border-left-color:#666;border-top-color:#666;color:#333;padding:.25em;display:inline-block}a.submit:active{border:1px inset #999}a.submit:disabled{background:#eee none;border:1px solid silver;color:#999}a.term{text-decoration:underline}a.xml{background-image:url(../img/famfamfam/silk/page_white_code.png)}aside h5{font-size:100%;margin:.5em 0}aside fieldset.brief{margin:0;padding:.4em .7em}aside fieldset.brief fieldset{margin:0;padding:.5em 0}aside fieldset.brief fieldset legend{font-size:85%}aside fieldset.brief li.checkbox label,aside fieldset.brief li.dateinsert label,aside fieldset.brief li.dateinsert span.label{display:inline}aside fieldset.brief li.radio{padding:.7em 0}aside fieldset.brief li.radio input{padding:.3em 0}aside fieldset.brief li.radio label,aside fieldset.brief li.radio span.label{display:inline}aside fieldset.brief ol{font-size:85%;margin:0;padding:0}aside fieldset.brief [type=text],aside fieldset.brief select{width:100%}button{background:linear-gradient(180deg,#fff 0,#f7f7f7 35%,#e0e0e0);border:1px outset #999;border-left-color:#666;border-top-color:#666;color:#333;padding:.25em}button:active{border:1px inset #999}button:disabled{background:#eee none;border:1px solid silver;color:#999}button.closebtn{background:transparent;border:0;cursor:pointer;padding:0}main .yui-b fieldset.brief [type=text],main .yui-b fieldset.brief select{width:auto}table{border-collapse:collapse;border-right:1px solid #bcbcbc;border-top:1px solid #bcbcbc}table .btn-group{white-space:nowrap}table .btn-group .btn{display:inline-block;float:none}table.indexes td{vertical-align:middle}table>caption span.actions{font-size:66%;font-weight:400;margin:0 .5em 0 0}table.invis,table.invis td,table.invis tr{border:0}table+table{margin-top:1em}td,th{border-bottom:1px solid #bcbcbc;border-left:1px solid #bcbcbc;padding:.2em .3em}td{background-color:#fff;vertical-align:top}td.actions{white-space:nowrap}td.borderless{border:0 none;border-collapse:separate}td.data{font-family:Courier New,Courier,monospace}td.data,td.total{text-align:right}td input.approve{background-color:#ffc}th{background-color:#e8e8e8;font-weight:700;text-align:center}th.data{font-family:Courier New,Courier,monospace;text-align:right}body{font-family:Arial,Verdana,Helvetica,sans-serif;padding:0 0 4em;text-align:left}br.clear{clear:both;line-height:1px}form{display:inline}form.confirm{display:block;text-align:center}h1{font-size:161.6%;font-weight:700}h1#logo{border:0 none;float:left;margin:.75em .3em .75em .7em;padding:0;width:180px}h2{font-size:146.5%}h2,h3{font-weight:700}h3{font-size:131%}h4{font-size:116%}h4,h5{font-weight:700}h5{font-size:100%}h6{font-size:93%;font-weight:700}h1,h2,h3,h4,h5,h6{margin:.3em 0}hr{clear:both}p{margin:.5em 0}strong{font-weight:700}em strong,strong em{font-style:italic;font-weight:700}cite,em{font-style:italic}input,textarea{line-height:normal;padding:2px 4px}input:focus,textarea:focus{border-color:#538200;border-radius:4px;border-style:solid}input[type=checkbox],input[type=radio]{margin:0;vertical-align:middle}input[type=button]:active,input[type=submit]:active{border:1px inset #999}input[type=button],input[type=reset],input[type=submit]{background:linear-gradient(180deg,#fff 0,#f7f7f7 35%,#e0e0e0);border:1px outset #999;border-left-color:#666;border-top-color:#666;color:#333;padding:.25em}input[type=button]:active,input[type=reset]:active,input[type=submit]:active{border:1px inset #999}input[type=button]:disabled,input[type=reset]:disabled,input[type=submit]:disabled{background:#eee none;border:1px solid silver;color:#999}input.alert{background-color:#ff9;border-color:#900}input.submit{background:linear-gradient(180deg,#fff 0,#f7f7f7 35%,#e0e0e0);border:1px outset #999;border-left-color:#666;border-top-color:#666;color:#333;padding:.25em}input.submit:active{border:1px inset #999}input.submit:disabled{background:#eee none;border:1px solid silver;color:#999}input.warning{background:#fff url(../img/famfamfam/silk/error.png) no-repeat 4px;padding:.25em .25em .25em 25px}.label,label{color:#000;display:inline;font-size:inherit;font-weight:400;max-width:inherit;padding:0;vertical-align:middle}.label input[type=checkbox],.label input[type=radio],label input[type=checkbox],label input[type=radio]{margin-top:0}.label.circ_barcode,label.circ_barcode{font-size:105%;font-weight:700}.label.permissioncode,label.permissioncode{font-style:italic}.label.permissioncode:before,label.permissioncode:before{content:"("}.label.permissioncode:after,label.permissioncode:after{content:")"}.label.required,label.required{color:#c00}.subfield-label{font-style:italic}.subfield-label span.subfield-code{font-weight:700}.members-update-table{padding-top:10px}#navmenulist li{border-bottom:1px solid #eee;list-style-image:url(../img/arrow-bullet.gif);padding:.2em 0}#navmenulist li a{text-decoration:none}#navmenulist li a.current{font-weight:700}#doc,#doc1,#doc2,#doc3{padding-top:1em}.main{margin-top:1em}#login_controls{padding:.4em .5em;position:absolute;right:.5em}ul{padding-left:1.1em}ul li{list-style-type:disc}ul li input.submit{font-size:87%;padding:2px}ul li li{list-style-type:circle}ul .toolbar{padding-left:0}ul .toolbar button{font-family:Arial,Verdana,Helvetica,sans-serif;padding-bottom:2px}ul .toolbar li{display:inline;list-style:none}ul.budget_hierarchy{margin-left:0;padding-left:0}ul.budget_hierarchy li{display:inline}ul.budget_hierarchy li:after{content:" -> "}ul.budget_hierarchy li:first-child:after,ul.budget_hierarchy li:last-child:after{content:""}ul.fa-ul li{list-style-type:none}ul.ui-tabs-nav li{list-style:none}ol{padding-left:1.5em}ol li{list-style:decimal}ol.bibliodetails{float:left;margin:0 0 1em 1em}ol.bibliodetails li{border-bottom:1px solid #e8e8e8;list-style-type:none;padding:.1em}ol.bibliodetails span.label{border-right:1px solid #e8e8e8;float:left;font-weight:700;margin-right:1em;width:12em}.gradient{background-image:linear-gradient(180deg,#e6f0f2 1%,#fff 99%);display:inline-block;width:100%}.cart-controls{border-top:1px solid #e8e8e8;padding:7px 0}#editions table,#editions td{border:0}.highlighted-row,.highlighted-row td{background-color:#ffd000!important}tbody tr:nth-child(odd) td{background-color:#f3f3f3;border:1px solid #bcbcbc;border-right:1px solid #bcbcbc}.overdue td.od{color:#c00;font-weight:700}tr.clickable{cursor:pointer}tr.expired td{color:#999}tr.highlight td{background-color:#f6f6f6;border-color:#bcbcbc}tr.highlight th[scope=row]{background-color:#ddd;border-color:#bcbcbc}tr.highlight table.invis td{border:0}tr.odd.onissue td{background-color:#ffffe1}tr.ok:nth-child(2n) td,tr.ok:nth-child(odd) td,tr.ok td,tr.onissue td{background-color:#ffc}tr.reserved td{background-color:#eeffd4}tr.transfered td{background-color:#e8f0f6}tr.warn:nth-child(odd) td,tr.warn td{background-color:#ff9090}.table_borrowers tr:hover td{background-color:#ff9}tfoot td{background-color:#f3f3f3;font-weight:700}caption{color:#000;font-size:133.9%;font-weight:700;margin:.3em 0}.problem{background-color:#ffc;color:#900;font-weight:700;line-height:1.7em}fieldset{background-color:#f4f8f9;border:2px solid #b9d8d9;border-radius:5px;margin:1em 1em 1em 0;padding:1em}fieldset+fieldset.action{padding-top:20px}fieldset .lastchecked{border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-width:0;margin-bottom:0}fieldset.action{background-color:transparent;border:0;clear:both;float:none;margin:.9em 0 0;padding:.4em;width:auto}fieldset.brief{border:2px solid #b9d8d9}fieldset.brief div.hint{margin-bottom:.4em}fieldset.brief label{display:block;font-weight:700;padding:.3em 0}fieldset.brief label.inline{display:inline;float:none;margin-left:1em;width:auto}fieldset.brief li[aria-disabled=true]{color:#999}fieldset.brief li.inline{display:inline;float:none;margin-left:1em;width:auto}fieldset.brief li,fieldset.brief ol{list-style-type:none}fieldset.brief span .label{display:block;font-weight:700;padding:.3em 0;text-align:left}fieldset.rows{border:2px solid #b9d8d9;border-width:1px;clear:left;float:left;font-size:90%;margin:.9em 0 0;padding:0;width:100%}fieldset.rows fieldset{background-color:transparent;border-width:1px;margin:1em;padding:.3em}fieldset.rows fieldset.action{padding:1em}fieldset.rows.inputnote{clear:left;float:left;margin:1em 0 0 11em}fieldset.rows.left label{text-align:left;width:8em}fieldset.rows.left li{padding-bottom:.4em}fieldset.rows.left span label{text-align:left;width:8em}fieldset.rows.ui-accordion-content{border-top-left-radius:0;border-top-right-radius:0;margin:0;padding:0;width:auto}fieldset.rows.ui-accordion-content table{margin:0}fieldset.rows.unselected{background-color:#fff;border:0;border-width:0}fieldset.rows caption{font-size:120%}fieldset.rows div.hint{margin-bottom:.4em;margin-left:10.5em}fieldset.rows label{float:left;font-weight:700;margin-right:1em;text-align:right;width:9em}fieldset.rows label.error{float:none;margin-left:1em;width:auto}fieldset.rows label.inline{display:inline;float:none;margin-left:1em}fieldset.rows label.yesno{float:none;width:auto}fieldset.rows legend{font-size:110%;font-weight:700;margin-left:1em}fieldset.rows li{clear:left;float:left;list-style-type:none;padding-bottom:1em;width:100%}fieldset.rows li[aria-disabled=true]{color:#999}fieldset.rows li.radio{padding-left:9em;width:auto}fieldset.rows li.radio input+label{margin-left:0;padding-left:0}fieldset.rows li.radio label{float:none;margin:0 0 0 1em;width:auto}fieldset.rows li input+label{margin-left:0;padding-left:0}fieldset.rows ol{list-style-type:none;padding:1em 1em 0}fieldset.rows ol.radio label{float:none;margin-left:20px;margin-right:30px;padding-left:0;vertical-align:middle;width:auto}fieldset.rows ol.radio label.radio{float:left;margin-right:1em;margin-top:0;width:9em}fieldset.rows ol.radio input[type=checkbox],fieldset.rows ol.radio input[type=radio]{margin-left:-20px}fieldset.rows p{margin:1em 0 1em 1em}fieldset.rows span.label{float:left;font-weight:700;margin-right:1em;text-align:right;width:9em}fieldset.rows table{clear:both;font-size:105%;margin:1em 0 1em 1em}fieldset.rows table.mceListBox{margin:0}fieldset.rows td label{float:none;font-weight:400;width:auto}fieldset.rows .inputnote{clear:left;float:left;margin:1em 0 0 11em}fieldset.rows+h3{clear:both;padding-top:.5em}#multi_receiving fieldset.rows label{width:50%}.yui-u div.hint{margin-bottom:.4em}.yui-u fieldset.rows div.hint{margin-left:7.5em}.yui-u fieldset.rows label,.yui-u fieldset.rows span.label{width:10em}.yui-u .rows li p label.widelabel,legend{width:auto}legend{background-color:#fff;border:2px solid #b9d8d9;border-radius:3px;font-size:123.1%;font-weight:700;padding:.2em .5em}details>summary{cursor:pointer}details>summary:before{content:"\f0da";display:inline-block;font-family:FontAwesome;width:1em}details>summary.checkouts-by-itemtype li{display:inline-block}details[open]>summary:before{content:"\f0d7"}#floating-save{background-color:rgba(185,216,217,.6);bottom:3%;position:fixed;right:1%;width:150px}#breadcrumbs{background-color:#e6f0f2;clear:both;font-size:90%;margin:0;padding:.2em .5em .4em 10px}#header.navbar{margin-bottom:0}#header.navbar-default{background:#e6f0f2;border:0;box-shadow:none}#header+#breadcrumbs{margin-top:1em}#header>.container-fluid{padding:0}div.action{background-color:transparent;border:0;clear:both;float:none;margin:.9em 0 0;padding:.4em;width:auto}div .circmessage{margin-bottom:.3em;padding:0 .4em .4em}div .circmessage:first-child{margin-top:1em}div.error{background-color:#ff9;border:2px dashed #900;margin:1em;padding:.5em}div.first fieldset{margin-right:0}div.help{margin:.9em 0 0}div.justify{text-align:justify}div.message{background:linear-gradient(180deg,#fff 0,#f4f6fa 2%,#eaeef5 23%,#e8edf6 94%,#cddbf2);border:1px solid #bcbcbc;text-align:center;width:55%}div.message h5,div.message ul{padding-left:25%;text-align:left}div.message ul+h4{margin-top:.7em}div.note{background:linear-gradient(180deg,#f4f6fa 0,#e8edf6);border:1px solid #bcbcbc;margin:.5em 0;padding:.5em}div.note i.fa-exclamation{color:#c00;font-style:italic;padding:0 .3em}div.rules{display:block}div.results,div[class$=_table_controls]{padding:.7em 0}div.rule{background-color:#f4f8f9;border:2px solid #b9d8d9;border-radius:5px;margin:.3em;padding:.3em}div.lastchecked{border:2px solid #bcdb89;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding:.2em 1em}div.listgroup{clear:left}div.listgroup h4{font-style:italic}div.listgroup h4 a,div.listgroup input{font-size:80%}div.sysprefs h3{margin:.2em 0 .2em .4em}div.sysprefs dl{margin-left:1.5em}div.sysprefs.hint{float:right;margin:.7em;padding:.5em;width:25%}div.rows{clear:left;float:left;margin:0;padding:0;width:100%}div.rows+div.rows{margin-top:.6em}div.rows li{border-bottom:1px solid #eee;clear:left;float:left;list-style-type:none;padding-bottom:.2em;padding-top:.1em;width:100%}div.rows ol{list-style-type:none;padding:.5em 1em 0 0}div.rows ol li li{border-bottom:0}div.rows span.label{float:left;font-weight:700;margin-right:1em;padding-top:0;text-align:left;width:9em}div.pages{margin:.5em 0}div.pages a{font-weight:700;padding:1px 5px;text-decoration:none}div.pages a:link,div.pages a:visited{background-color:#eee;color:#36c}div.pages a:active,div.pages a:hover{background-color:#ffc}div.pages .current,div.pages .currentPage{background-color:#e6fcb7;color:#666;font-weight:700;padding:1px 5px}div.pages .inactive{background-color:#f3f3f3;color:#bcbcbc;font-weight:700;padding:1px 5px}div .browse{margin:.5em 0}#header_search{background-position:.5em .5em;background-repeat:no-repeat;float:left;margin:.3em 0 .5em}#header_search input{font-size:1.3em}#header_search input.submit{font-size:1em}#header_search div.residentsearch{border:0;border-bottom:1px solid #85ca11;padding:0 0 .2em}#header_search ul.ui-tabs-nav{margin-left:1em;padding-top:0}#header_search ul.ui-tabs-nav li.ui-state-default{background:transparent none;border:0;top:0}#header_search ul.ui-tabs-nav li.ui-state-default a{padding:.3em .6em}#header_search ul.ui-tabs-nav li.ui-tabs-active{background-color:#fffff1;border:1px solid #85ca11;border-top-width:0;top:-2px}#header_search ul.ui-tabs-nav li.ui-tabs-active a{text-decoration:none}#header_search .ui-corner-top{border-radius:0 0 4px 4px}#header_search>div,#header_search>div>li,#header_search>ul,#header_search>ul>li{display:none}#header_search>div:first-of-type,#header_search>div>li:first-of-type,#header_search>ul:first-of-type,#header_search>ul>li:first-of-type{display:block}.head-searchbox{width:30em}#checkouts,#reserves{border:1px solid #b9d8d9;padding:1em}.tip{color:gray;font-size:93%}.single-line{white-space:nowrap}.ex{font-family:Courier New,Courier,monospace}.ex,dt{font-weight:700}dd{font-size:90%;font-weight:400;padding:.2em;text-indent:2.5em}#toolbar,.btn-toolbar{background-color:#edf4f6;border:1px solid #e6f0f2;border-radius:5px 5px 0 0;margin:0;padding:5px}#disabled2 a,#disabled a,#disabled a:hover{color:#999}.patroninfo{margin-top:-.5em}.patroninfo h5{border-right:1px solid #b9d8d9;margin-bottom:0;padding-bottom:.5em;padding-left:-.5em;padding-top:.3em}.patroninfo h5:empty{border-right:0}.patroninfo ul{border:0;border-bottom:0;border-right:1px solid #b9d8d9;border-top:0;margin:0;padding:0}.patroninfo ul li{list-style-type:none;margin:0}.patroninfo+#menu{margin-right:0}#patronbasics div{background:transparent url(../img/patron-blank.min.svg) 10px 5px no-repeat;height:125px;padding:0;width:105px}#patronbasics div,#patronimage{border:1px solid #ccc;margin:.3em 0 .3em .3em}#patronimage{max-width:140px;padding:.2em}.patronviews{border-right:1px solid #000;border-top:1px solid #000;margin-bottom:.5em;padding:.5em 0}.column-tool{font-size:80%}.hint{color:#666;font-size:95%}.yui-b fieldset.brief{padding:.4em .7em}.yui-b fieldset.brief fieldset{margin:0 .3em;padding:.5em}.yui-b fieldset.brief fieldset legend{font-size:85%}#tools_holidays .yui-b fieldset.brief li.checkbox input{margin-left:0}.yui-b fieldset.brief li.checkbox label{display:inline}#tools_holidays .yui-b fieldset.brief li.checkbox label{margin-left:20px}.yui-b fieldset.brief li.dateinsert label,.yui-b fieldset.brief li.dateinsert span.label{display:inline}.yui-b fieldset.brief li.radio{padding:.7em 0}.yui-b fieldset.brief li.radio input{padding:.3em 0}#tools_holidays .yui-b fieldset.brief li.radio input{margin-left:0}.yui-b fieldset.brief li.radio label{display:inline}#tools_holidays .yui-b fieldset.brief li.radio label{margin-left:20px}.yui-b fieldset.brief li.radio label span.label{display:inline}.yui-b fieldset.brief ol{font-size:85%;margin:0;padding:0}.yui-b fieldset.brief [type=text],.yui-b fieldset.brief select{width:100%}.yui-b fieldset.rows div.hint{margin-left:10.5em}#yui-main .yui-b fieldset.brief [type=text],#yui-main .yui-b fieldset.brief select,.yui-b fieldset.rows td label,.yui-b fieldset.rows td span.label{width:auto}.btn-toolbar fieldset.action{margin-top:0}.btn-toolbar .dropdown-menu{font-size:13px}.rows .label{white-space:normal}.checkedout{color:#999;font-style:italic}.subfield_not_filled{background-color:#ff9}.content_hidden{display:none;visibility:hidden}.content_visible{display:block;visibility:visible}#z3950searcht table{border:0;padding:20px}#z3950_search_targets{height:338px;overflow-y:auto}#z3950_search_targets_acq{height:308px;overflow-y:auto}.z3950checks{padding-left:1em}.error{color:#c00}.status_ok{background-color:#90ee90}.status_warn{background-color:red}i.error{color:#c00}i.success{color:green}i.warn{color:orange}.checkout-setting{font-size:85%;padding-top:.3em}.checkout-setting input{vertical-align:middle}.checkout-setting label{font-size:inherit;font-weight:400}.checkout-settings{background-color:#f4f8f9;border-radius:0;border-top:2px solid #b9d8d9;display:none;margin-left:-1em;margin-right:-1em;margin-top:1em;padding:1em 1em 0}#show-checkout-settings{margin-top:.5em}.blocker,.inaccurate-item-statuses{color:#900}.circmessage li{list-style:url(../img/arrow-bullet.gif);margin-bottom:.2em}#circ_needsconfirmation{margin:auto}.dialog{border:1px solid #bcbcbc;border-radius:2px;margin:1em auto;padding:.5em;text-align:center;width:65%}.dialog a.approve{display:inline-block}.dialog a.approve,.dialog button{background:#fff none;border:1px outset #999;border-left-color:#666;border-top-color:#666;margin:.4em;padding:.4em;white-space:pre-line}.dialog a.approve:active,.dialog button:active{border:1px inset #999}.dialog a.approve:hover,.dialog button:hover{background-color:#ffc}.dialog h2,.dialog h3,.dialog h4{margin:auto;text-align:center}.dialog input{background-color:#fff;border:1px solid #bcbcbc;margin:.4em;padding:.4em .4em .4em 25px}.dialog input:hover{background-color:#ffc}.dialog input[type=submit]{background:#fff none}.dialog li{list-style-position:inside}.dialog table{margin:.5em auto}.dialog table td{text-align:left}.dialog table th{text-align:right}.alert{background:linear-gradient(180deg,#fef8d3 0,#ffec91 9%,#ffed87 89%,#f9dc00);border:1px solid #e0c726;color:inherit;text-align:center;text-shadow:none}.alert strong{color:#900}.alert .closebtn{line-height:20px;position:relative;right:-21px;top:-2px}.approve i.fa,.success i.fa{color:green}.deny i.fa{color:#c00}.new i.fa{color:#425faf}.accesskey{text-decoration:underline}.missing,.term{background-color:#ffc}.term{color:#900}.shelvingloc{display:block;font-style:italic}#menu{border-right:1px solid #b9d8d9;margin-right:.5em;padding-bottom:2em;padding-top:1em}#menu li a{background:linear-gradient(180deg,#e8f0f6 0,#e8f0f6 96%,#c1c1c1);border:1px solid #b9d8d9;border-bottom-left-radius:5px;border-top-left-radius:5px;display:block;font-size:111%;margin:.5em 0;margin-right:-1px;padding:.4em .3em;text-decoration:none}#menu li a:hover{background:linear-gradient(180deg,#fafafa 0,#fff 96%,#e6e6e6 97%,#ccc 99%,#c1c1c1)}#menu li.active a,#menu li a:hover{border-bottom:1px solid #85ca11;border-left:1px solid #85ca11;border-top:1px solid #85ca11}#menu li.active a{background-color:#fff;background-image:none;border-right:0;color:#000;font-weight:700}#menu li.active a:hover{background-color:#fff;color:#538200}#menu ul li{list-style-type:none}#logo{background:transparent url(../img/koha-logo-medium.png) no-repeat scroll 0;margin:.75em .3em .75em .7em}#logo a{border:0;cursor:pointer;display:block;height:0!important;margin:0;overflow:hidden;padding:44px 0 0;text-decoration:none;width:180px}#closewindow{margin-top:2em;text-align:center}#closewindow a{font-weight:700}.barcode{font-size:200%;vertical-align:middle}li.email{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.patronbriefinfo li.email{font-size:87%;padding:0 10px 0 0;width:90%}.empty{color:#ccc}.address{font-size:110%}.address li{list-style-type:none}.title{font-size:105%;font-weight:700}.hold{float:right;font-size:90%;margin:0}.thumbnail{display:block;margin:auto}.thumbnail>li{list-style-type:none}#searchresults ul li{clear:left;font-size:90%;list-style:url(../img/item-bullet.gif);padding:.2em 0}#searchresults ul li img{float:left;margin:3px 5px 3px -5px}#searchresults ul span.status{clear:left;color:#900;display:block}#searchresults ul span.unavailable{clear:left;display:block}#searchresults ul table td{vertical-align:top}#searchresults.unavailability strong{display:block}#searchheader{background-color:#e6f0f2;border:1px solid #b9d8d9;border-radius:5px 5px 0 0;font-size:80%;margin:0 0 .5em -1px;padding:.4em 0 .4em 1em}#searchheader.floating{border-radius:0;margin-top:0}#searchheader .btn-group>.btn:first-child{margin-left:.7em}#searchheader form{float:right;padding:5px 5px 3px 0}#searchheader form.fz3950{float:right;font-size:125%;padding:0 0 0 5em}#searchheader form.fz3950bigrpad{float:right;font-size:125%;padding:5px 25em 0 0}#search-facets{border:1px solid #b9d8d9;border-radius:5px 5px 0 0}#search-facets h4{background-color:#e6f0f2;border-bottom:1px solid #b9d8d9;border-radius:5px 5px 0 0;font-size:90%;margin:0;padding:.4em .2em;text-align:center}#search-facets ul{margin:0;padding:.3em}#search-facets ul li{font-weight:700;list-style-type:none}#search-facets li li{font-size:85%;font-weight:400;margin-bottom:2px;padding:.1em .2em}#search-facets li.showmore{font-weight:700;text-indent:1em}.facet-count{display:inline-block}#bookcoverimg{text-align:center}.searchhighlightblob{font-size:75%;font-style:italic}#displayexample{background-color:#ccc;margin-bottom:10px;padding:5px}#irregularity_summary{vertical-align:top}#toplevelmenu{padding:0}#CheckAll,#CheckNone,#CheckPending{font-weight:400;margin:0 .5em 0 0}.dmg,.lost,.wdn{color:#900;display:block}.datedue{color:#999;display:block;font-style:italic}.credit,.waitinghere{color:#690}#mainuserblock{border:1px solid #e8e8e8;margin-top:.5em;padding:.5em}.labeledmarc-table{border:0}.labeledmarc-label{border:0;color:#000;font-size:11pt;font-style:italic;padding:5}.labeledmarc-value{border:0;color:#000;font-size:10pt;padding:5}#marcPreview table{border:0;font-family:Courier New,Courier,monospace;font-size:95%;margin:.7em 0 0}#marcPreview tbody tr:nth-child(odd) td{background-color:#fff}#marcPreview td,#marcPreview th{border:0;padding:2px;vertical-align:top}#marcPreview th{background-color:#fff;text-align:left;white-space:nowrap}#marcPreview.modal-dialog,.modal-dialog.modal-wide{width:80%}@media (max-width:767px){#marcPreview{margin:0;width:auto}}#cartDetails{background-color:#fff;border:1px solid #739acf;box-shadow:1px 1px 3px 0 #666;color:#000;display:none;margin:0;padding:10px;text-align:center;width:180px;z-index:2}#cartmenulink{background:transparent url(../img/cart-small.gif) 0 no-repeat;padding-left:15px}#basketcount span{display:inline;font-size:90%;font-weight:400;padding:0}#moremenu{display:none}.results_summary{color:#707070;display:block;font-size:85%;padding:0 0 .5em}.results_summary a{font-weight:400}.results_summary .label{color:#202020}.child_fund_amount{font-style:italic}.number_box{font-size:105%;line-height:200%}.number_box a,.number_box span{background-color:#e4ecf5;border:1px solid #a4bedd;border-radius:4px;font-weight:700;padding:.1em .4em;text-decoration:none}.number_box a:hover,.number_box span:hover{background-color:#ebeff7}.container{border:1px solid #eee;margin:1em 0;padding:1em}.import_export{position:relative}.import_export .export_ok{background:#e3e3e3 none;border:0;cursor:pointer;margin-left:20px;padding:10px}.import_export .import_export_options{background:#fff;border:1px solid #cdcdcd;left:60px;padding:10px;position:absolute;top:0;width:300px;z-index:1}.import_export_options{background:#e3e3e3 none;border:0;cursor:pointer;margin-left:20px;padding:10px}.import_export_options fieldset.rows li label{width:16em}.import_export_options .importing{background:none;padding:inherit}.form_import fieldset.rows li label{width:auto}.form_import .input_import{border:1px solid #bcbcbc}.importing{position:relative}.importing .importing_msg{padding-bottom:10px;padding-left:10px}.field_hint{color:gray;font-style:italic;padding-left:1em}.m880{display:block;float:right;padding-left:20px;text-align:right;width:50%}.advsearch{margin:0}.advsearch table{border-collapse:separate;border-spacing:5px;border-width:0}.advsearch td{border:1px solid #eee;padding:.3em .4em}#circ_circulation_issue{position:relative}#clearscreen{position:absolute;right:0;top:0}#clearscreen a{background-color:#eee;border-radius:0 0 0 5px;color:#ccc;display:block;font-size:160%;font-weight:700;padding:0 .7em .2em;text-decoration:none;text-shadow:0 -1px 0 #666}#clearscreen a:hover{color:#c00}.pager{background-color:#e8e8e8;border:1px solid #bcbcbc;border-radius:5px;display:inline-block;font-size:85%;margin:.4em 0;padding:.3em .5em}.pager img{vertical-align:middle}.pager img.last{padding-right:5px}.pager input.pagedisplay{background-color:transparent;border:0;font-weight:700;text-align:center}.pager p{margin:0}.no-image{background-color:#fff;border:1px solid #aaa;border-radius:3px;color:#979797;display:block;font-size:86%;font-weight:700;text-align:center;width:75px}#acqui_order_supplierlist>div.supplier{border:1px solid #eee;margin:.5em;padding:1em}#acqui_order_supplierlist>div>div>.baskets{margin-top:.5em}#acqui_order_supplierlist>div>span.action{margin-left:5em}#acqui_order_supplierlist>div>span.suppliername{display:inline;font-size:1.7em;margin-bottom:.5em}.supplier-contact-details{float:left}#ADD-contact{margin:0 0 8px 8px}#contact-template{display:none}.ui-widget-content{background:#fff none;border:1px solid #b9d8d9;color:#222}.ui-widget-header{background:#e6f0f2 none;border:1px solid #b9d8d9;color:#222;font-weight:700}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{background:#f4f8f9 none;border:1px solid #b9d8d9;color:#555;font-weight:400}.ui-state-focus,.ui-state-hover,.ui-widget-content .ui-state-focus,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-focus,.ui-widget-header .ui-state-hover{background:#e6f0f2 none;border:1px solid #b9d8d9;color:#212121;font-weight:400}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{background:#fff none;border:1px solid #aaa;color:#212121;font-weight:400}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{background:#fff4c6;border:1px solid #fed22f;color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{background:#fef1ec;border:1px solid #cd0a0a;color:#cd0a0a}.ui-autocomplete{box-shadow:2px 2px 2px rgba(0,0,0,.3);cursor:default;position:absolute}.ui-autocomplete.ui-widget-content .ui-state-hover{background:#e6f0f2 none;border:1px solid #b9d8d9;color:#212121;font-weight:400}.ui-autocomplete-loading{background:#fff url(../img/spinner-small.gif) 100% no-repeat}.ui-menu li{list-style:none}.ui-tabs-nav .ui-tabs-active a,.ui-tabs-nav a:active,.ui-tabs-nav a:focus,.ui-tabs-nav a:hover,.ui-tabs-nav span.a{background:none repeat scroll 0 0 transparent;outline:0 none}.ui-tabs-nav.ui-widget-header{background:none;border:0}.ui-tabs .ui-tabs-nav li{background:#e6f0f2 none;border:1px solid #b9d8d9;margin-right:.4em;top:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active{background-color:#fff;border:1px solid #b9d8d9;border-bottom-width:0}.ui-tabs .ui-tabs-nav li.ui-tabs-active a{color:#000;font-weight:700}.ui-tabs .ui-tabs-nav li.ui-tabs-active.ui-state-hover{background:#fff none}.ui-tabs .ui-tabs-nav li.ui-state-default.ui-state-hover{background:#edf4f5 none}.ui-tabs .ui-tabs-panel{border:1px solid #b9d8d9}.ui-tabs.ui-widget-content{background:transparent none;border:0}.ui-tabs .ui-state-default a,.ui-tabs .ui-state-default a:link,.ui-tabs .ui-state-default a:visited{color:#004d99}.ui-tabs .ui-state-hover a,.ui-tabs .ui-state-hover a:link,.ui-tabs .ui-state-hover a:visited{color:#538200}.ui-widget,.ui-widget button,.ui-widget input,.ui-widget select,.ui-widget textarea{font-family:inherit;font-size:inherit}.statictabs ul{background:none repeat scroll 0 0 transparent;border:0 none;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top-left-radius:4px;border-top-right-radius:4px;color:#222;font-size:100%;font-weight:700;line-height:1.3;list-style:none outside none;margin:0;outline:0 none;padding:.2em .2em 0;text-decoration:none}.statictabs ul:after{clear:both}.statictabs ul:after,.statictabs ul:before{content:"";display:table}.statictabs ul li{background:none repeat scroll 0 0 #e6f0f2;border:1px solid #b9d8d9;border-bottom:0 none;border-top-left-radius:4px;border-top-right-radius:4px;color:#555;float:left;font-weight:400;list-style:none outside none;margin-bottom:0;margin-right:.4em;padding:0;position:relative;top:1px;white-space:nowrap}.statictabs ul li.active{background-color:#fff;color:#212121;font-weight:400;padding-bottom:1px}.statictabs ul li.active a{background:none repeat scroll 0 0 transparent;color:#000;cursor:text;font-weight:700;outline:0 none;top:1px}.statictabs ul li a{color:#004d99;cursor:pointer;float:left;padding:.5em 1em;text-decoration:none}.statictabs ul li a:hover{background-color:#edf4f5;border-top-left-radius:4px;border-top-right-radius:4px;color:#538200}.statictabs .tabs-container{background:none repeat scroll 0 0 transparent;border:1px solid #b9d8d9;border-bottom-left-radius:4px;border-bottom-right-radius:4px;color:#222;display:block;padding:1em 1.4em}.authref{font-style:normal;text-indent:4em}.seealso,.seefrom{font-style:italic;text-indent:2em}#authfinderops{float:right}.authorizedheading{font-weight:700}.authres_notes,.authres_otherscript,.authres_seealso{padding-top:3px}.authres_notes{font-style:italic}.contents{width:75%}.contents .r,.contents .t{display:inline}.contents .t{font-weight:700}.contents .t:first-child:before{content:"→ "}.contents .t:before{content:"\A→ ";white-space:pre}.contentblock{margin-left:2em;position:relative}#hierarchies a{color:#069;font-weight:400;text-decoration:underline}#hierarchies a:hover{color:#903}#didyoumeanintranet,#didyoumeanopac{float:left;width:260px}.pluginlist{padding-bottom:10px}.plugin{margin:0 1em 1em 0}.pluginname{background-color:#e6f0f2;cursor:move;margin:.3em;padding-bottom:4px;padding-left:.2em}.pluginname .ui-icon{float:right}.plugindesc{padding:.4em}.ui-sortable-placeholder{border:1px dotted #000;height:80px;visibility:visible}.ui-sortable-placeholder *{visibility:hidden}.ui-datepicker{box-shadow:1px 1px 3px 0 #666}.ui-datepicker table{border:0;border-collapse:collapse;font-size:.9em;margin:0 0 .4em;width:100%}.ui-datepicker th{background:transparent none;border:0;font-weight:700;padding:.7em .3em;text-align:center}.ui-datepicker-trigger{margin:0 3px;vertical-align:middle}.ui-timepicker-div dl{text-align:left}.ui-timepicker-div dl dd{margin:0 10px 10px 65px}.ui-timepicker-div dl dt{height:25px;margin-bottom:-25px}.ui-timepicker-div dl td{font-size:90%}.ui-timepicker-div .ui-widget-header{margin-bottom:8px}.ui-tpicker-grid-label{background:none;border:0;margin:0;padding:0}.ui_tpicker_microsec,.ui_tpicker_millisec,.ui_tpicker_second{display:none}.ui-accordion-header,.ui-widget-content .ui-accordion-header{font-size:110%;font-weight:700}video{width:480px}.btn,button{border-color:#adadad #adadad #949494;font-family:Arial,Verdana,Helvetica,sans-serif}.btn.btn-link,button.btn-link{border:0}.btn-group-xs>.btn,.btn-xs{font-size:10.5px;padding:3px 5px}#toolbar .dropdown-menu{border-top-width:1px;font-size:13px}#toolbar.floating{border-radius:0;margin-top:0}.dropdown-menu{border-color:rgba(0,0,0,.2);border-top:0;font-size:12px}.dropdown-menu li{list-style:none outside none}.dropdown-menu li>a{padding:4px 20px}.dropdown-menu li>a:focus,.dropdown-menu li>a:hover{background-image:linear-gradient(180deg,#08c,#0077b3);background-repeat:repeat-x;color:#fff;text-decoration:none}.navbar{color:#333;min-height:20px}.navbar .nav>li{list-style:none outside none;padding:0 .6em}.navbar .nav>li>a{color:#004d99;font-weight:700;padding:.4em .2em}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#538200}.navbar .nav li .dropdown.active>.dropdown-toggle:focus,.navbar .nav li .dropdown.open.active>.dropdown-toggle:focus,.navbar .nav li .dropdown.open>.dropdown-toggle:focus{background:#e6f0f2 none;box-shadow:none}#changelanguage .dropdown-menu>li>a,#changelanguage .dropdown-menu>li>span{padding:5px 15px}#changelanguage .navbar-text{margin:0}#changelanguage .navbar-text span{display:block;line-height:20px}.loggedout{color:#004d99;font-weight:700;padding:.4em .2em}.navbar-static-top .navbar-inner{background:#e6f0f2 none;border:0;box-shadow:none;min-height:0;padding-left:0}.navbar-fixed-bottom .navbar-inner{min-height:0;padding:.4em 0}.navbar-fixed-bottom .nav>li{border-right:1px solid #ccc}.navbar-fixed-bottom .nav>li>a{font-weight:400}.navbar-fixed-bottom .nav>li:last-child{border-right:0}.navbar-fixed-bottom .nav>li.navbar-text{line-height:normal;padding:.4em .7em}.tooltip.bottom .tooltip-arrow{border-bottom-color:#eee}.tooltip.bottom .tooltip-inner{background-color:#fff;border:1px solid rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);color:#000;font-size:120%;padding:1em}.separator{color:#666;padding:0 .2em}.close{-webkit-filter:none;filter:none;float:none;font-weight:400;line-height:1.5;position:inherit;right:auto;text-shadow:none;top:auto}.close,.close:hover{font-size:inherit;opacity:inherit}.close:hover{color:inherit;-webkit-filter:inherit;filter:inherit}.checkbox label,.radio label{margin-left:20px;padding-left:0}.checkbox input[type=checkbox],.radio input[type=radio]{margin-left:0;position:relative}.modal-header .closebtn{margin-top:4px}.closebtn{color:#000;filter:alpha(opacity=20);float:right;font-size:21px;font-weight:700;line-height:1;opacity:.2;text-shadow:0 1px 0 #fff}.closebtn:focus,.closebtn:hover{color:#000;cursor:pointer;filter:alpha(opacity=50);opacity:.5;text-decoration:none}.modal-body{background-color:#fff;overflow-y:auto}.modal-content{background-color:#edf4f6}.btn-group label,.btn-group select{font-size:13px}.tooltip-inner{white-space:pre-wrap}pre{border:0;border-radius:0;display:block;line-height:inherit;margin:0;word-break:break-all;word-wrap:break-word}code,pre{background-color:transparent;color:inherit;font-size:inherit;padding:0}code{border-radius:0}.pagination>li>a,.pagination>li>span{font-weight:700}.waiting{cursor:wait}#jobfailed,#jobpanel,#jobstatus{display:none}#jobstatus{margin:.4em}#jobprogress{background:url(../img/progress.png) -300px 0 no-repeat;border:1px solid #666;display:inline-block;height:10px;width:200px}.progress_panel{border:2px solid #eee;border-radius:5px;clear:both;font-size:120%;margin:1em 0;padding:1em}progress{width:50%}#selections{white-space:normal;width:100%}#selections input{margin:0 2px;vertical-align:middle}#selections span{background-color:#ebf3ff;border-radius:5px;font-size:75%;line-height:240%;margin:3px;padding:3px;white-space:nowrap}#selections span.selected{background-color:#cce0fc}#changepasswordf input[type=password],#changepasswordf input[type=text]{font-family:Courier New,Courier,monospace;font-size:140%;padding:.3em}.floating{box-shadow:0 3px 2px 0 rgba(0,0,0,.5)}.inline{display:inline}.nowrap,.tag_editor{white-space:nowrap}.tag_editor{background:transparent url(../img/edit-tag.png) 0 0 no-repeat;display:block;float:left;height:16px;margin:4px;overflow:hidden;text-indent:100%;width:16px}.browse-controls{margin-left:1.1em;margin-right:.5em;padding-bottom:1em;padding-top:1em}#browse-return-to-results{border-top-left-radius:3px;border-top-right-radius:3px;display:block;text-align:center}.browse-button{color:#004d99;display:inline-block;padding:.4em .6em}.browse-button:hover{background:#fafafa}span.browse-button{background:#fafafa;color:#222}span.circ-hlt{color:#c00;font-weight:700}span.expired{color:#900;font-style:italic}span.name{font-style:italic;font-weight:700}span.permissiondesc{font-weight:400}span.required{color:#c00;font-style:italic;margin-left:.5em}.result-biblio-itemtype{float:right;font-size:85%;margin:.5em;padding:.5em;text-align:center}.result-biblio-itemtype img{display:block;margin:auto;margin-bottom:2px}.browse-label,.browse-prev-next{border:1px solid #b9d8d9}.browse-label{background-color:#e8f0f6;border-top-left-radius:5px;border-top-right-radius:5px}.browse-prev-next{border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-top-width:0}#browse-previous{border-bottom-left-radius:5px;border-right:1px solid #b9d8d9;padding-right:1em}#browse-next{border-bottom-right-radius:5px;border-top-width:0;float:right;padding-right:1em}.loading-overlay{background-color:#fff;cursor:wait;height:100%;left:0;opacity:.7;position:fixed;top:0;width:100%;z-index:3}.loading-overlay div{background:transparent url(../img/loading.gif) 0 0 no-repeat;font-size:175%;font-weight:700;height:2em;left:50%;margin:-1em 0 0 -2.5em;padding-left:50px;position:absolute;top:50%;width:15em}#merge_invoices{display:none;margin:1em auto}#merge{margin:.5em 0 0}#merge_table tr.active td{background-color:#ffc}.renewals{display:block;font-size:.8em;padding:.5em}#transport-types{padding-top:.5px}#i18nMenu .navbar-text .currentlanguage{color:#000;font-weight:700}#i18nMenu a.currentlanguage:link,#i18nMenu a.currentlanguage:visited{font-weight:700}#i18nMenu a .sublanguage-selected{color:#000;font-weight:700}#circ_circulation_issue .onsite_checkout-select,.onsite_checkout-select label{font-size:inherit;font-weight:400}.onsite_checkout{color:#c00}.onsite-checkout-only{background-color:rgba(255,242,206,.5);border:1px solid #fff2ce;border-radius:4px}.branchgriditem{background-color:#fff;border:1px solid #b9d8d9;border-radius:3px;display:table-cell;float:left;margin:3px;padding:.3em}.branchgridrow{display:table-row}.branchselector{display:table}.hq-author{font-weight:700}#cn_browser_table_wrapper>#cn_browser_table{margin:auto;width:90%}#new_rule{background-color:#f4f8f9;border:2px solid #b9d8d9;border-radius:5px;display:none;margin:.3em;padding:.3em}.blocks{margin-bottom:.3em}.remove_rule{font-size:80%;padding-left:.7em}.underline{text-decoration:underline}.overline{text-decoration:overline}.order-control{padding-right:5px}#borrower_message{margin-top:10px}.form-group{margin-bottom:10px}.form-group label{font-weight:700}.modal-textarea{width:98%}#pat_member #patron_list_dialog,#pat_member #searchresults,#patron_search #filters{display:none}#fixedlengthbuilderaction{border:3px solid #e6f0f2;left:80%;padding:5px;position:relative;top:-80px;width:12%}.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background:#e6f0f2 none;box-shadow:none}.navbar-default.navbar-fixed-bottom .navbar-nav>.open>a:focus,.navbar-default.navbar-fixed-bottom .navbar-nav>.open>a:hover{background:transparent none;box-shadow:none}#interlibraryloans #dataPreviewLabel{margin:.3em 0}#interlibraryloans h1{margin:1em 0}#interlibraryloans h2{margin-bottom:20px}#interlibraryloans h3{margin-top:20px}#interlibraryloans .bg-info{overflow:auto;position:relative}#interlibraryloans .format h4{margin-bottom:20px}#interlibraryloans .format h5{margin-top:20px}#interlibraryloans .format input{margin:10px 0}#interlibraryloans .format li{list-style:none}#interlibraryloans #add-new-fields{margin:1em}#interlibraryloans #column-toggle,#interlibraryloans #reset-toggle{font-weight:700;line-height:1.5em;margin:15px 0}#interlibraryloans #freeform-fields .custom-name{margin-right:1em;text-align:right;width:9em}#interlibraryloans #freeform-fields .delete-new-field{margin-left:1em}#interlibraryloans #search-summary{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}#ill-view-panel{margin-top:15px}#ill-view-panel h3{margin-bottom:10px}#ill-view-panel h4{margin-bottom:20px}#ill-view-panel .notesopac{display:inline-block}#ill-view-panel .rows div{height:1em;margin-bottom:1em}#requestattributes{font-family:monospace;line-height:1.3em}#ill-requests{width:100%!important}#helper span,#logged-in-info-full{display:none}.loggedin-menu-label{color:#777;font-size:12px;line-height:1.42857143;padding:4px 12px;white-space:nowrap}.loggedin-menu-label span{color:#000;font-weight:700}.loggedin-menu-label.divider{padding:0}.buttons-list{margin-bottom:30px;padding:0}.buttons-list li{list-style-type:none}.buttons-list li a.circ-button{background-color:#f4f8f9;background-position:5px 3px;background-repeat:no-repeat;border:2px solid #b9d8d9;border-radius:6px;box-sizing:content-box;color:#000;display:block;font-size:110%;font-weight:700;margin:.5em 0;max-width:260px;padding:8px;text-decoration:none}.buttons-list li a.circ-button:hover{border-color:#538200;color:#538200}@media (min-width:200px){.navbar-nav>li{float:left}.navbar-right{float:right!important;margin-right:-15px}.navbar-nav{float:left;margin:0}.navbar-nav .open .dropdown-menu{background-color:#fff;border:1px solid rgba(0,0,0,.15);box-shadow:0 6px 12px rgba(0,0,0,.175);float:left;position:absolute;width:auto}.navbar-nav .open .dropdown-menu.dropdown-menu-left{left:auto;right:0}.navbar-nav .open .dropdown-menu.dropdown-menu-right{right:auto}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{background-color:#0081c2;background-image:linear-gradient(180deg,#08c,#0077b3);background-repeat:repeat-x;color:#fff;text-decoration:none}}@media (min-width:800px){#helper i{display:none}#helper span,#logged-in-info-full{display:inline}#logged-in-info-brief,.loggedin-menu-label{display:none}} --- a/koha-tmpl/intranet-tmpl/prog/en/includes/biblio-view-menu.inc +++ a/koha-tmpl/intranet-tmpl/prog/en/includes/biblio-view-menu.inc @@ -40,5 +40,6 @@ [% IF ( issuehistoryview ) %]
  • [% ELSE %]
  • [% END %] Checkout history
  • [% IF ( CAN_user_tools_view_system_logs ) %][% IF ( logview ) %]
  • [% ELSE %]
  • [% END %]Modification log
  • [% END %] +[% IF ( CAN_user_stockrotation_manage_rota_items && Koha.Preference('StockRotation') ) %][% IF ( stockrotationview ) %]
  • [% ELSE %]
  • [% END %]Rota
  • [% END %] --- a/koha-tmpl/intranet-tmpl/prog/en/includes/permissions.inc +++ a/koha-tmpl/intranet-tmpl/prog/en/includes/permissions.inc @@ -118,8 +118,7 @@ [%# self_check %] [%- CASE 'self_checkin_module' -%]Log into the self check-in module. Note: this permission prevents the patron from using any other OPAC functionality [%- CASE 'self_checkout_module' -%]Perform self checkout at the OPAC. It should be used for the patron matching the AutoSelfCheckID + [%- CASE 'manage_rota_items' -%]Add and remove items from rotas + [%- CASE 'manage_rotas' -%]Create, edit and delete rotas [%- END -%] - [%- CASE 'can_add_items_rotas' -%]Add and remove items from rotas - [%- CASE 'can_edit_rotas' -%]Create, edit and delete rotas - [%- END -%] [%- END -%] --- a/koha-tmpl/intranet-tmpl/prog/en/includes/stockrotation-toolbar.inc +++ a/koha-tmpl/intranet-tmpl/prog/en/includes/stockrotation-toolbar.inc @@ -0,0 +1,12 @@ +[% USE Koha %] +
    + [% IF no_op_set %] + New rota + [% END %] + [% IF op == 'manage_stages' %] + Edit rota + [% END %] + [% IF op == 'manage_items' %] + Edit rota + [% END %] +
    --- a/koha-tmpl/intranet-tmpl/prog/en/includes/tools-menu.inc +++ a/koha-tmpl/intranet-tmpl/prog/en/includes/tools-menu.inc @@ -1,3 +1,5 @@ +[% USE Koha %] +