---
 C4/Auth.pm                                         |    1 -
 C4/Reserves.pm                                     |   55 +++++++++++++++
 admin/smart-rules.pl                               |    9 ++-
 admin/systempreferences.pl                         |    1 -
 installer/data/mysql/de-DE/mandatory/sysprefs.sql  |    1 -
 installer/data/mysql/en/mandatory/sysprefs.sql     |    1 -
 .../1-Obligatoire/unimarc_standard_systemprefs.sql |    1 -
 installer/data/mysql/it-IT/necessari/sysprefs.sql  |    1 -
 .../data/mysql/nb-NO/1-Obligatorisk/sysprefs.sql   |    1 -
 installer/data/mysql/pl-PL/mandatory/sysprefs.sql  |    1 -
 ...m_preferences_full_optimal_for_install_only.sql |    1 -
 ...ystem_preferences_only_translation_updating.sql |    3 -
 ...m_preferences_full_optimal_for_install_only.sql |    1 -
 ...ystem_preferences_only_translation_updating.sql |    3 -
 installer/data/mysql/updatedatabase.pl             |   16 ++++
 .../prog/en/modules/admin/preferences/opac.pref    |    6 --
 .../prog/en/modules/admin/smart-rules.tt           |    3 +
 .../opac-tmpl/prog/en/modules/opac-reserve.tt      |   74 +++++++------------
 opac/opac-reserve.pl                               |   13 +++-
 19 files changed, 115 insertions(+), 77 deletions(-)

diff --git a/C4/Auth.pm b/C4/Auth.pm
index f580e53..2133a35 100644
--- a/C4/Auth.pm
+++ b/C4/Auth.pm
@@ -421,7 +421,6 @@ sub get_template_and_user {
             OPACAmazonReviews         => 
C4::Context->preference("OPACAmazonReviews"),
             OPACFRBRizeEditions       => 
C4::Context->preference("OPACFRBRizeEditions"),
             OpacHighlightedWords       => 
C4::Context->preference("OpacHighlightedWords"),
-            OPACItemHolds             => 
C4::Context->preference("OPACItemHolds"),
             OPACShelfBrowser          => "". 
C4::Context->preference("OPACShelfBrowser"),
             OPACURLOpenInNewWindow    => "" . 
C4::Context->preference("OPACURLOpenInNewWindow"),
             OPACUserCSS               => "". 
C4::Context->preference("OPACUserCSS"),
diff --git a/C4/Reserves.pm b/C4/Reserves.pm
index 8373840..ddb69ec 100644
--- a/C4/Reserves.pm
+++ b/C4/Reserves.pm
@@ -117,6 +117,8 @@ BEGIN {
         &CancelExpiredReserves
 
         &IsAvailableForItemLevelRequest
+
+        &OPACItemHoldsAllowed
         
         &AlterPriority
         &ToggleLowestPriority
@@ -1794,6 +1796,59 @@ sub _ShiftPriorityByDateAndPriority {
     return $new_priority;  # so the caller knows what priority they wind up 
receiving
 }
 
+=head2 OPACItemHoldsAllowed
+
+  OPACItemHoldsAllowed($item_record,$borrower_record);
+
+Checks issuingrules, using the borrowers categorycode, the itemtype, and 
branchcode to see
+if specific item holds are allowed, returns true if so. 
+
+=cut
+
+sub OPACItemHoldsAllowed {
+    my ($item,$borrower) = @_;
+
+    my $branchcode = $item->{homebranch} or die "No homebranch";
+    my $itype;
+    my $dbh = C4::Context->dbh;
+    if (C4::Context->preference('item-level_itypes')) {
+       # We cant trust GetItem to honour the syspref, so safest to do it 
ourselves
+       # When GetItem is fixed, we can remove this
+       $itype = $item->{itype};
+    } 
+    else {
+       my $query = "SELECT itemtype FROM biblioitems WHERE biblioitemnumber = 
? ";
+       my $sth = $dbh->prepare($query);        
+       $sth->execute($item->{biblioitemnumber});
+       if (my $data = $sth->fetchrow_hashref()){
+           $itype = $data->{itemtype};
+       }
+    }
+
+    my $query = "SELECT opacitemholds,categorycode,itemtype,branchcode FROM 
issuingrules WHERE
+          (issuingrules.categorycode = ? OR issuingrules.categorycode = '*')
+        AND
+          (issuingrules.itemtype = ? OR issuingrules.itemtype = '*')
+        AND
+          (issuingrules.branchcode = ? OR issuingrules.branchcode = '*')
+        ORDER BY
+          issuingrules.categorycode desc,
+          issuingrules.itemtype desc,
+          issuingrules.branchcode desc
+       LIMIT 1";
+    my $dbh = C4::Context->dbh;
+    my $sth = $dbh->prepare($query);
+    $sth->execute($borrower->{categorycode},$itype,$branchcode);
+    my $data = $sth->fetchrow_hashref;
+    if ($data->{opacitemholds}){
+       return 1;
+    }
+    else {
+       return 0;
+    }
+}
+
+
 =head1 AUTHOR
 
 Koha Development Team <http://koha-community.org/>
diff --git a/admin/smart-rules.pl b/admin/smart-rules.pl
index f290934..769fe7c 100755
--- a/admin/smart-rules.pl
+++ b/admin/smart-rules.pl
@@ -101,8 +101,8 @@ elsif ($op eq 'delete-branch-item') {
 # save the values entered
 elsif ($op eq 'add') {
     my $sth_search = $dbh->prepare("SELECT COUNT(*) AS total FROM issuingrules 
WHERE branchcode=? AND categorycode=? AND itemtype=?");
-    my $sth_insert = $dbh->prepare("INSERT INTO issuingrules (branchcode, 
categorycode, itemtype, maxissueqty, renewalsallowed, reservesallowed, 
issuelength, hardduedate, hardduedatecompare, fine, finedays, firstremind, 
chargeperiod,rentaldiscount) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
-    my $sth_update=$dbh->prepare("UPDATE issuingrules SET fine=?, finedays=?, 
firstremind=?, chargeperiod=?, maxissueqty=?, renewalsallowed=?, 
reservesallowed=?, issuelength=?, hardduedate=?, hardduedatecompare=?, 
rentaldiscount=?  WHERE branchcode=? AND categorycode=? AND itemtype=?");
+    my $sth_insert = $dbh->prepare("INSERT INTO issuingrules (branchcode, 
categorycode, itemtype, maxissueqty, renewalsallowed, reservesallowed, 
issuelength, hardduedate, hardduedatecompare, fine, finedays, firstremind, 
chargeperiod, rentaldiscount, opacitemholds) 
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
+    my $sth_update=$dbh->prepare("UPDATE issuingrules SET fine=?, finedays=?, 
firstremind=?, chargeperiod=?, maxissueqty=?, renewalsallowed=?, 
reservesallowed=?, issuelength=?, hardduedate=?, hardduedatecompare=?, 
rentaldiscount=? opacitemholds=? WHERE branchcode=? AND categorycode=? AND 
itemtype=?");
     
     my $br = $branch; # branch
     my $bor  = $input->param('categorycode'); # borrower category
@@ -121,14 +121,15 @@ elsif ($op eq 'add') {
     $hardduedate = format_date_in_iso($hardduedate);
     my $hardduedatecompare = $input->param('hardduedatecompare');
     my $rentaldiscount = $input->param('rentaldiscount');
+    my $opacitemholds = $input->param('opacitemholds');
     $debug and warn "Adding $br, $bor, $cat, $fine, $maxissueqty";
 
     $sth_search->execute($br,$bor,$cat);
     my $res = $sth_search->fetchrow_hashref();
     if ($res->{total}) {
-        $sth_update->execute($fine, $finedays,$firstremind, $chargeperiod, 
$maxissueqty, $renewalsallowed,$reservesallowed, 
$issuelength,$hardduedate,$hardduedatecompare,$rentaldiscount, $br,$bor,$cat);
+        $sth_update->execute($fine, $finedays,$firstremind, $chargeperiod, 
$maxissueqty, $renewalsallowed,$reservesallowed, 
$issuelength,$hardduedate,$hardduedatecompare,$rentaldiscount, $opacitemholds, 
$br,$bor,$cat);
     } else {
-        
$sth_insert->execute($br,$bor,$cat,$maxissueqty,$renewalsallowed,$reservesallowed,$issuelength,$hardduedate,$hardduedatecompare,$fine,$finedays,$firstremind,$chargeperiod,$rentaldiscount);
+        
$sth_insert->execute($br,$bor,$cat,$maxissueqty,$renewalsallowed,$reservesallowed,$issuelength,$hardduedate,$hardduedatecompare,$fine,$finedays,$firstremind,$chargeperiod,$rentaldiscount,
 $opacitemholds);
     }
 } 
 elsif ($op eq "set-branch-defaults") {
diff --git a/admin/systempreferences.pl b/admin/systempreferences.pl
index 87ecac4..58cb214 100755
--- a/admin/systempreferences.pl
+++ b/admin/systempreferences.pl
@@ -373,7 +373,6 @@ $tabsysprefs{suggestion}           = "OPAC";
 $tabsysprefs{OpacTopissue}         = "OPAC";
 $tabsysprefs{OpacBrowser}          = "OPAC";
 $tabsysprefs{OpacRenewalAllowed}   = "OPAC";
-$tabsysprefs{OPACItemHolds}        = "OPAC";
 $tabsysprefs{OPACGroupResults}     = "OPAC";
 $tabsysprefs{XSLTDetailsDisplay}   = "OPAC";
 $tabsysprefs{XSLTResultsDisplay}   = "OPAC";
diff --git a/installer/data/mysql/de-DE/mandatory/sysprefs.sql 
b/installer/data/mysql/de-DE/mandatory/sysprefs.sql
index 6eb67a3..f424616 100755
--- a/installer/data/mysql/de-DE/mandatory/sysprefs.sql
+++ b/installer/data/mysql/de-DE/mandatory/sysprefs.sql
@@ -184,7 +184,6 @@ INSERT INTO `systempreferences` 
(variable,value,explanation,options,type) VALUES
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH:archiveID','KOHA-OAI-TEST','OAI-PMH archive 
identification',NULL,'Free');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH:MaxCount','50','OAI-PMH maximum number of records by answer to 
ListRecords and ListIdentifiers queries',NULL,'Integer');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH:ConfFile','','If empty, Koha OAI Server operates in normal 
mode, otherwise it operates in extended mode.',NULL,'File');
-INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OPACItemHolds','1','Allow OPAC users to place hold on specific items. 
If OFF, users can only request next available copy.','','YesNo');
 
 INSERT INTO `systempreferences` (variable, value,options,type, explanation) 
VALUES 
('AddPatronLists','categorycode','categorycode|category_type','Choice','Allow 
user to choose what list to pick up from when adding patrons');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('ExtendedPatronAttributes','0','Use extended patron IDs and 
attributes',NULL,'YesNo');
diff --git a/installer/data/mysql/en/mandatory/sysprefs.sql 
b/installer/data/mysql/en/mandatory/sysprefs.sql
index 0abf9d8..af46f3b 100755
--- a/installer/data/mysql/en/mandatory/sysprefs.sql
+++ b/installer/data/mysql/en/mandatory/sysprefs.sql
@@ -186,7 +186,6 @@ INSERT INTO `systempreferences` 
(variable,value,explanation,options,type) VALUES
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH:archiveID','KOHA-OAI-TEST','OAI-PMH archive 
identification',NULL,'Free');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH:MaxCount','50','OAI-PMH maximum number of records by answer to 
ListRecords and ListIdentifiers queries',NULL,'Integer');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH:ConfFile','','If empty, Koha OAI Server operates in normal 
mode, otherwise it operates in extended mode.',NULL,'File');
-INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OPACItemHolds','1','Allow OPAC users to place hold on specific items. 
If OFF, users can only request next available copy.','','YesNo');
 
 INSERT INTO `systempreferences` (variable, value,options,type, explanation) 
VALUES 
('AddPatronLists','categorycode','categorycode|category_type','Choice','Allow 
user to choose what list to pick up from when adding patrons');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('ExtendedPatronAttributes','0','Use extended patron IDs and 
attributes',NULL,'YesNo');
diff --git 
a/installer/data/mysql/fr-FR/1-Obligatoire/unimarc_standard_systemprefs.sql 
b/installer/data/mysql/fr-FR/1-Obligatoire/unimarc_standard_systemprefs.sql
index 59a258f..acc9589 100755
--- a/installer/data/mysql/fr-FR/1-Obligatoire/unimarc_standard_systemprefs.sql
+++ b/installer/data/mysql/fr-FR/1-Obligatoire/unimarc_standard_systemprefs.sql
@@ -184,7 +184,6 @@ INSERT INTO `systempreferences` 
(variable,value,explanation,options,type) VALUES
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('finesCalendar',"noFinesWhenClosed",'Spécifie l''utilisation  du 
calendrier pour le calcul des dates de retours et les 
amendes',"ignoreCalendar|noFinesWhenClosed",'Choice');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('previousIssuesDefaultSortOrder',"asc",'Ordre d''affichage des prêts en 
cours sur la page de circulation hors prêts du jour',"asc|desc",'Choice');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('todaysIssuesDefaultSortOrder',"desc",'Ordre d''affichage des prêts en 
cours (prêts du jour)',"asc|desc",'Choice');
-INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OPACItemHolds','1','Si activé, les adhérents peuvent placer des 
réservations sur un exemplaire spécifique. Sinon, il ne peuvent que réserver 
le prochain disponible.','','YesNo');
 INSERT INTO `systempreferences` (variable, value,options,type, explanation) 
VALUES 
('AddPatronLists','categorycode','categorycode|category_type','Choice','Slectionner
 categorycode ou category_type permet d''afficher la liste des catégories ou 
des types de catégories à l''ajout d''un lecteur');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('ExtendedPatronAttributes','0','Utiliser les attributs étendus pour les 
adhérents',NULL,'YesNo');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('RenewSerialAddsSuggestion','0','Si activé, génère une suggestion 
d''achat à chaque Renouvellement d''abonnement',NULL,'YesNo');
diff --git a/installer/data/mysql/it-IT/necessari/sysprefs.sql 
b/installer/data/mysql/it-IT/necessari/sysprefs.sql
index dcdf0ee..9b4231d 100755
--- a/installer/data/mysql/it-IT/necessari/sysprefs.sql
+++ b/installer/data/mysql/it-IT/necessari/sysprefs.sql
@@ -124,7 +124,6 @@ INSERT INTO `systempreferences` 
(variable,value,explanation,options,type) VALUES
 insert into `systempreferences` (`variable`, `value`, `options`, 
`explanation`, `type`) values('OPACFRBRizeEditions','1','','Se ON, Koha farà 
delle richieste a uno o più ISBN web services per trovare gli ISBN associabili 
e li visualizzarà in un tab \'Edizioni\' nella visualizzazione 
dettagliata','YesNo');
 insert into `systempreferences` (`variable`, `value`, `options`, 
`explanation`, `type`) values('opacheader','','70|10','Inserire qui HTML da 
includere come header nell\'OPAC','Textarea');
 insert into `systempreferences` (`variable`, `value`, `options`, 
`explanation`, `type`) values('OpacHighlightedWords','1','','Se impostato, le 
parole cercate nell\'OPAC vengono poi evidenziate ','YesNo');
-insert into `systempreferences` (`variable`, `value`, `options`, 
`explanation`, `type`) values('OPACItemHolds','1','','Consente agli utenti 
dell\'OPAC di inserire prenotazioni su specifici documenti. Se INATTIVO, gli 
utenti possono solo richiedere la copia dopo che è tornata ad essere 
disponibile.','YesNo');
 insert into `systempreferences` (`variable`, `value`, `options`, 
`explanation`, `type`) 
values('OPACItemsResultsDisplay','statuses','statuses|itemdetails','statuses : 
mostra solo lo status dei documenti presenti nella lista del risultato. 
itemdisplay : mostra tutti i dati della collocazione di tali documenti 
(sottobiblioteca+collocazione) così come appaiono nell\'interfaccia dello 
staff','Choice');
 insert into `systempreferences` (`variable`, `value`, `options`, 
`explanation`, `type`) values('opaclanguages','en,it-IT','','Per impostare la 
lingua di default dell\'OPAC.','Languages');
 insert into `systempreferences` (`variable`, `value`, `options`, 
`explanation`, `type`) values('opaclanguagesdisplay','1','','Se su ON, consente 
di visualizzare nell\'OPAC la funzione Modifica Lingua','YesNo');
diff --git a/installer/data/mysql/nb-NO/1-Obligatorisk/sysprefs.sql 
b/installer/data/mysql/nb-NO/1-Obligatorisk/sysprefs.sql
index ca71769..56dd9e3 100644
--- a/installer/data/mysql/nb-NO/1-Obligatorisk/sysprefs.sql
+++ b/installer/data/mysql/nb-NO/1-Obligatorisk/sysprefs.sql
@@ -202,7 +202,6 @@ INSERT INTO `systempreferences` 
(variable,value,explanation,options,type) VALUES
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH:archiveID','KOHA-OAI-TEST','OAI-PMH archive 
identification',NULL,'Free');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH:MaxCount','50','OAI-PMH maximum number of records by answer to 
ListRecords and ListIdentifiers queries',NULL,'Integer');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH:ConfFile','','If empty, Koha OAI Server operates in normal 
mode, otherwise it operates in extended mode.',NULL,'File');
-INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OPACItemHolds','1','Allow OPAC users to place hold on specific items. 
If OFF, users can only request next available copy.','','YesNo');
 
 INSERT INTO `systempreferences` (variable, value,options,type, explanation) 
VALUES 
('AddPatronLists','categorycode','categorycode|category_type','Choice','Allow 
user to choose what list to pick up from when adding patrons');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('ExtendedPatronAttributes','0','Use extended patron IDs and 
attributes',NULL,'YesNo');
diff --git a/installer/data/mysql/pl-PL/mandatory/sysprefs.sql 
b/installer/data/mysql/pl-PL/mandatory/sysprefs.sql
index 58ba035..ec435f1 100755
--- a/installer/data/mysql/pl-PL/mandatory/sysprefs.sql
+++ b/installer/data/mysql/pl-PL/mandatory/sysprefs.sql
@@ -183,7 +183,6 @@ INSERT INTO `systempreferences` 
(variable,value,explanation,options,type) VALUES
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH','0','if ON, OAI-PMH server is enabled',NULL,'YesNo');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH:archiveID','KOHA-OAI-TEST','OAI-PMH archive 
identification',NULL,'Free');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH:MaxCount','50','OAI-PMH maximum number of records by answer to 
ListRecords and ListIdentifiers queries',NULL,'Integer');
-INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OPACItemHolds','1','Allow OPAC users to place hold on specific items. 
If OFF, users can only request next available copy.','','YesNo');
 
 INSERT INTO `systempreferences` (variable, value,options,type, explanation) 
VALUES 
('AddPatronLists','categorycode','categorycode|category_type','Choice','Allow 
user to choose what list to pick up from when adding patrons');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('ExtendedPatronAttributes','0','Use extended patron IDs and 
attributes',NULL,'YesNo');
diff --git 
a/installer/data/mysql/ru-RU/mandatory/system_preferences_full_optimal_for_install_only.sql
 
b/installer/data/mysql/ru-RU/mandatory/system_preferences_full_optimal_for_install_only.sql
index 54c533c..6c5a370 100755
--- 
a/installer/data/mysql/ru-RU/mandatory/system_preferences_full_optimal_for_install_only.sql
+++ 
b/installer/data/mysql/ru-RU/mandatory/system_preferences_full_optimal_for_install_only.sql
@@ -210,7 +210,6 @@ INSERT INTO `systempreferences` 
(variable,value,explanation,options,type) VALUES
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH','0','if ON, OAI-PMH server is enabled',NULL,'YesNo');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH:archiveID','KOHA-OAI-TEST','OAI-PMH archive 
identification',NULL,'Free');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH:MaxCount','50','OAI-PMH maximum number of records by answer to 
ListRecords and ListIdentifiers queries',NULL,'Integer');
-INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OPACItemHolds','1','Allow OPAC users to place hold on specific items. 
If OFF, users can only request next available copy.','','YesNo');
 
 INSERT INTO `systempreferences` (variable, value,options,type, explanation) 
VALUES 
('AddPatronLists','categorycode','categorycode|category_type','Choice','Allow 
user to choose what list to pick up from when adding patrons');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('ExtendedPatronAttributes','1','Use extended patron IDs and 
attributes',NULL,'YesNo');
diff --git 
a/installer/data/mysql/ru-RU/mandatory/system_preferences_only_translation_updating.sql
 
b/installer/data/mysql/ru-RU/mandatory/system_preferences_only_translation_updating.sql
index b3bb4e5..150af6d 100644
--- 
a/installer/data/mysql/ru-RU/mandatory/system_preferences_only_translation_updating.sql
+++ 
b/installer/data/mysql/ru-RU/mandatory/system_preferences_only_translation_updating.sql
@@ -400,9 +400,6 @@ UPDATE systempreferences SET explanation='Если 
установлено, вы
 -- UPDATE systempreferences SET explanation='' WHERE 
variable='OpacHighlightedWords';
 --     If Set, then queried words are higlighted in OPAC
 
--- UPDATE systempreferences SET explanation='' WHERE variable='OPACItemHolds';
---     Allow OPAC users to place hold on specific items. If OFF, users can 
only request next available copy.
-
 -- UPDATE systempreferences SET explanation='URL-посилання 
таблиці стилів для компонування сторінок 
для електронічного каталогу' WHERE 
variable='opaclayoutstylesheet';
 --     Enter the name of the layout CSS stylesheet to use in the OPAC
 
diff --git 
a/installer/data/mysql/uk-UA/mandatory/system_preferences_full_optimal_for_install_only.sql
 
b/installer/data/mysql/uk-UA/mandatory/system_preferences_full_optimal_for_install_only.sql
index 9f095ab..16d49ee 100755
--- 
a/installer/data/mysql/uk-UA/mandatory/system_preferences_full_optimal_for_install_only.sql
+++ 
b/installer/data/mysql/uk-UA/mandatory/system_preferences_full_optimal_for_install_only.sql
@@ -235,7 +235,6 @@ INSERT INTO `systempreferences` 
(variable,value,explanation,options,type) VALUES
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH','0','if ON, OAI-PMH server is enabled',NULL,'YesNo');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH:archiveID','KOHA-OAI-TEST','OAI-PMH archive 
identification',NULL,'Free');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OAI-PMH:MaxCount','50','OAI-PMH maximum number of records by answer to 
ListRecords and ListIdentifiers queries',NULL,'Integer');
-INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('OPACItemHolds','1','Allow OPAC users to place hold on specific items. 
If OFF, users can only request next available copy.','','YesNo');
 
 INSERT INTO `systempreferences` (variable, value,options,type, explanation) 
VALUES 
('AddPatronLists','categorycode','categorycode|category_type','Choice','Allow 
user to choose what list to pick up from when adding patrons');
 INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
VALUES('ExtendedPatronAttributes','1','Use extended patron IDs and 
attributes',NULL,'YesNo');
diff --git 
a/installer/data/mysql/uk-UA/mandatory/system_preferences_only_translation_updating.sql
 
b/installer/data/mysql/uk-UA/mandatory/system_preferences_only_translation_updating.sql
index 5d760a8..b71c109 100644
--- 
a/installer/data/mysql/uk-UA/mandatory/system_preferences_only_translation_updating.sql
+++ 
b/installer/data/mysql/uk-UA/mandatory/system_preferences_only_translation_updating.sql
@@ -399,9 +399,6 @@ UPDATE systempreferences SET explanation='Якщо 
встановлено, ви
 -- UPDATE systempreferences SET explanation='Якщо увімкнуто, то 
' WHERE variable='OpacHighlightedWords';
 --     If Set, then queried words are higlighted in OPAC
 
--- UPDATE systempreferences SET explanation='' WHERE variable='OPACItemHolds';
---     Allow OPAC users to place hold on specific items. If OFF, users can 
only request next available copy.
-
 -- UPDATE systempreferences SET explanation='URL-посилання 
таблиці стилів для компонування сторінок 
для електронічного каталогу' WHERE 
variable='opaclayoutstylesheet';
 --     Enter the name of the layout CSS stylesheet to use in the OPAC
 
diff --git a/installer/data/mysql/updatedatabase.pl 
b/installer/data/mysql/updatedatabase.pl
index 9cbc8db..84ae790 100755
--- a/installer/data/mysql/updatedatabase.pl
+++ b/installer/data/mysql/updatedatabase.pl
@@ -4370,6 +4370,22 @@ if (C4::Context->preference("Version") < 
TransformToNum($DBversion)) {
     SetVersion($DBversion);
 }
 
+$DBversion = '3.05.00.XXX';
+if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
+    print "Upgrade to $DBversion done (Bug 5787 move OPACItemHolds system 
preference to circulation matrix)\n";
+    # First create the column
+    $dbh->do("ALTER TABLE issuingrules ADD opacitemholds BOOLEAN");
+    # Now update the column    
+    if (C4::Context->preference("OPACItemHolds")){
+       # Pref is on, set allow for all rules
+       $dbh->do("UPDATE issuingrules SET opacitemholds=1");
+    }
+    # If the preference is not set, leave off
+    # Remove from the systempreferences table
+    $dbh->do("DELETE FROM systempreferences WHERE variable = 
'OPACItemHolds'");    
+    SetVersion ($DBversion);
+}
+
 =head1 FUNCTIONS
 
 =head2 DropAllForeignKeys($table)
diff --git 
a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref 
b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref
index f4be568..fa0ab77 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref
@@ -295,12 +295,6 @@ OPAC:
 #              choices:
 #            - If ON, enables subject cloud on OPAC
         -
-            - pref: OPACItemHolds
-              choices:
-                  yes: Allow
-                  no: "Don't allow"
-            - patrons to place holds on specific items in the OPAC. If this is 
disabled, users can only put a hold on the next available item.
-        -
             - pref: OpacRenewalAllowed
               choices:
                   yes: Allow
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt 
b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt
index 0edcece..6d04802 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt
@@ -81,6 +81,7 @@ for="tobranch"><strong>Clone these rules to:</strong></label> 
<input type="hidde
                 <th>Renewals Allowed (count)</th>
                 <th>Holds Allowed (count)</th>
                        <th>Rental Discount (%)</th>
+                       <th>Allow OPAC Users to place Holds on Items</th>
                                <th>&nbsp;</th>
             </tr>
                                [% FOREACH rule IN rules %]
@@ -122,6 +123,7 @@ for="tobranch"><strong>Clone these rules 
to:</strong></label> <input type="hidde
                                                        <td>[% 
rule.renewalsallowed %]</td>
                                                        <td>[% 
rule.reservesallowed %]</td>
                                                        <td>[% 
rule.rentaldiscount %]</td>
+                                                       <td>[% IF 
rule.opacitemholds %]Yes[% ELSE %]No[% END %]</td>
                                                        <td>
                                                                <a 
class="button" 
href="/cgi-bin/koha/admin/smart-rules.pl?op=delete&amp;itemtype=[% 
rule.itemtype %]&amp;categorycode=[% rule.categorycode %]&amp;branch=[% 
rule.current_branch %]">Delete</a>
                                                        </td>
@@ -176,6 +178,7 @@ for="tobranch"><strong>Clone these rules 
to:</strong></label> <input type="hidde
                     <td><input name="renewalsallowed" size="2" /></td>
                     <td><input name="reservesallowed" size="2" /></td>
                    <td><input name="rentaldiscount" size="2" /></td>
+                   <td><input type="checkbox" name="opacitemholds" value="1" 
/></td>
                     <td><input type="hidden" name="branch" value="[% 
current_branch %]"/><input type="submit" value="Add" class="submit" /></td>
                 </tr>
             </table>
diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-reserve.tt 
b/koha-tmpl/opac-tmpl/prog/en/modules/opac-reserve.tt
index 25e9a3a..8d41466 100644
--- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-reserve.tt
+++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-reserve.tt
@@ -242,9 +242,7 @@
                  <th>Hold Starts on Date</th>
                  [% END %]
                  <th>Hold Not Needed After</th>
-                  [% IF ( OPACItemHolds ) %]
-                    <th id="place_on_hdr" style="display:none">Place On</th>
-                  [% END %]
+          <th id="place_on_hdr" style="display:none">Place On</th>
                   [% UNLESS ( singleBranchMode ) %]
                    [% IF ( choose_branch ) %]
                         <th>Pickup Location</th>
@@ -374,50 +372,32 @@
       <a href="#" style="font-size:85%;text-decoration:none;" 
onclick="document.getElementById('expiration_date_[% bibitemloo.biblionumber 
%]').value='';return false;">Clear Date</a></p>
     </td>[% END %]
 
-                    [% IF ( bibitemloo.holdable ) %]
+         [% IF ( bibitemloo.holdable ) %]
                    <!-- HOLD ABLE -->
-                   [% IF ( OPACItemHolds ) %]
+                   [% IF ( bibitemloo.opacitemholds ) %]
                    <!-- ITEM HOLDS -->
-                                          <td class="place_on_type" 
style="display:none">
-                                            <ul>
-                                                <li>
-                                                  [% UNLESS ( 
bibitemloo.holdable ) %]
-                                                    <input type="radio" 
name="reqtype_[% bibitemloo.biblionumber %]"
-                                                           id="reqany_[% 
bibitemloo.biblionumber %]"
-                                                           class="selectany"
-                                                           value="Any"
-                                                           disabled="disabled"
-                                                    />
-                                                  [% ELSE %]
-                                                    <input type="radio" 
name="reqtype_[% bibitemloo.biblionumber %]"
-                                                           id="reqany_[% 
bibitemloo.biblionumber %]"
-                                                           class="selectany"
-                                                           value="Any"
-                                                           checked="checked"
-                                                    />
-                                                  [% END %]
-                                                  <label for="reqany_[% 
bibitemloo.biblionumber %]">Next available copy</label>
-                                                </li>
-                                                <li>
-                                                  [% UNLESS ( 
bibitemloo.holdable ) %]
-                                                    <input type="radio" 
name="reqtype_[% bibitemloo.biblionumber %]"
-                                                           id="reqspecific_[% 
bibitemloo.biblionumber %]"
-                                                           
class="selectspecific"
-                                                           disabled="disabled"
-                                                           value="Specific"
-                                                    />
-                                                  [% ELSE %]
-                                                    <input type="radio" 
name="reqtype_[% bibitemloo.biblionumber %]"
-                                                           id="reqspecific_[% 
bibitemloo.biblionumber %]"
-                                                           
class="selectspecific"
-                                                           value="Specific"
-                                                    />
-                                                  [% END %]
-                                                  <label for="reqspecific_[% 
bibitemloo.biblionumber %]">A specific copy</label>
-                                                </li>
-                                            </ul>
-                                          </td>
-                                        [% END %][% END %]
+                        <td class="place_on_type" style="display:none">
+                          <ul>
+                              <li>
+                                  <input type="radio" name="reqtype_[% 
bibitemloo.biblionumber %]"
+                                         id="reqany_[% bibitemloo.biblionumber 
%]"
+                                         class="selectany"
+                                         value="Any"
+                                         checked="checked"
+                                  />
+                                <label for="reqany_[% bibitemloo.biblionumber 
%]">Next available copy</label>
+                              </li>
+                              <li>
+                                  <input type="radio" name="reqtype_[% 
bibitemloo.biblionumber %]"
+                                         id="reqspecific_[% 
bibitemloo.biblionumber %]"
+                                         class="selectspecific"
+                                         value="Specific"
+                                  />
+                                <label for="reqspecific_[% 
bibitemloo.biblionumber %]">A specific copy</label>
+                              </li>
+                          </ul>
+                        </td>
+            [% END %][% END %]
 
                     [% UNLESS ( singleBranchMode ) %]
                         [% IF ( bibitemloo.holdable ) %]
@@ -439,7 +419,7 @@
                     [% END %]
                   </tr>
 
-                  [% IF ( OPACItemHolds ) %]
+                  [% IF ( bibitemloo.opacitemholds ) %]
                   [% IF ( bibitemloo.holdable ) %]
                     <tr class="copiesrow" id="copiesrow_[% 
bibitemloo.biblionumber %]">
                       <td>&nbsp;</td>
@@ -520,7 +500,7 @@
                       </td>
                     </tr>
                   [% END %]<!-- bib_available -->
-                  [% END %]<!-- OPACItemHolds -->
+                  [% END %]<!-- bibitemloo.opacitemholds -->
                 [% END %]
               </table><!-- bibitemloop -->
               [% END %] <!-- if message -->
diff --git a/opac/opac-reserve.pl b/opac/opac-reserve.pl
index a92a976..6e2414d 100755
--- a/opac/opac-reserve.pl
+++ b/opac/opac-reserve.pl
@@ -344,6 +344,7 @@ foreach my $biblioNum (@biblionumbers) {
 
     $biblioLoopIter{itemLoop} = [];
     my $numCopiesAvailable = 0;
+    my $numCopiesOPACAvailable = 0;
     foreach my $itemInfo (@{$biblioData->{itemInfos}}) {
         my $itemNum = $itemInfo->{itemnumber};
         my $itemLoopIter = {};
@@ -432,8 +433,13 @@ foreach my $biblioNum (@biblionumbers) {
             $policy_holdallowed = 0;
         }
 
+        $itemLoopIter->{opacitemholds} = OPACItemHoldsAllowed( $itemInfo, 
$borr );
+
         if (IsAvailableForItemLevelRequest($itemNum) and $policy_holdallowed 
and CanItemBeReserved($borrowernumber,$itemNum)) {
-            $itemLoopIter->{available} = 1;
+            if ($itemLoopIter->{opacitemholds}) {
+                $itemLoopIter->{available} = 1;
+                $numCopiesOPACAvailable++;
+            }
             $numCopiesAvailable++;
         }
 
@@ -459,10 +465,12 @@ foreach my $biblioNum (@biblionumbers) {
         $numBibsAvailable++;
         $biblioLoopIter{bib_available} = 1;
         $biblioLoopIter{holdable} = 1;
+        $biblioLoopIter{itemholdable} = 1 if $numCopiesOPACAvailable;
         $anyholdable = 1;
     }
     if ($biblioLoopIter{already_reserved}) {
         $biblioLoopIter{holdable} = undef;
+        $biblioLoopIter{itemholdable} = undef;
         $anyholdable = undef;
     }
     if(not CanBookBeReserved($borrowernumber,$biblioNum)){
@@ -478,9 +486,6 @@ if ( $numBibsAvailable == 0 || !$anyholdable) {
 }
 
 my $itemTableColspan = 7;
-if (! $template->{VARS}->{'OPACItemHolds'}) {
-    $itemTableColspan--;
-}
 if (! $template->{VARS}->{'singleBranchMode'}) {
     $itemTableColspan--;
 }
-- 
1.6.5

_______________________________________________
Koha-patches mailing list
Koha-patches@lists.koha-community.org
http://lists.koha-community.org/cgi-bin/mailman/listinfo/koha-patches
website : http://www.koha-community.org/
git : http://git.koha-community.org/
bugs : http://bugs.koha-community.org/

Reply via email to