Recalls cronjobs and expiry fixes

Fixing recalls cronjobs and improving the expiry functionality, sponsored by Waikato Institute of Technology. 
Fixes include: 
*(hopefully) fixed the overdue and expiry recalls cronjobs
*fixed the expiration date not saving in the db correctly, and not showing in recalls tables correctly
*added a minimum date to the expiration date when placing a recall on the OPAC side - as currently you can set the expiration date to before the recall is placed!
*fixed the 'checkin and set waiting' button on the recalls queue (circ/recalls_queue.pl) and biblio recalls page (recalls/request.pl?biblionumber=X) - if there was a biblio-level recall and the item had been returned but the recall not set to waiting, this button did not work
*added the 'Expire' option to biblio recalls page (recalls/request.pl?biblionumber=X), waiting recalls (circ/recalls_waiting.pl), member checkouts (circ/circulation.pl?borrowernumber=Y) and member details (members/moremember.pl?borrowernumber=Y) 
*moved recall actions into dropdown menu on biblio recalls page (recalls/request.pl?biblionumber=X) and waiting recalls (circ/recalls_waiting.pl)
*fixed bug where recall actions only work on first row in a table
=== Getting started ===
We need three borrowers (Borrower A, Borrower B, Borrower C) and a biblio (Biblio A) with one item (Item A). You need to be able to log in to the OPAC as both Borrower B and Borrower C. 
=== Test plan (this will take four days of testing) ===
==== Day 1 ====
#Adjust your circulation rules for testing. Set 'recall pickup period' to 1 and 'recall due date interval' to 0 (Recall pickup period cannot be set to 0, otherwise it will default to using the system preference RecallsMaxPickUpDelay) 
#Check out Item A to Borrower A 
#Log in to OPAC as Borrower B and place biblio-level recall on Item A (Recall A) 
#Log in to OPAC as Borrower C and place any type of recall on Item A, set the expiration date to expire tomorrow (Recall B). Notice you must select a date that is today or in the future 
#Log back into the staff side 
#Go to the recalls page for the biblio you placed the recall on (recalls/request.pl?biblionumber=X) and confirm the expiration date shows for Recall B 
#Click the actions dropdowns for both recalls, confirm both dropdowns open and show the options 'Cancel' and 'check in and set waiting' - don't press any buttons 
#Go to Borrower A's page and confirm their checkout is due today
==== Day 2 ====
#Check that the status for Borrower B's recall (Recall A) now says 'overdue to be returned' 
#Check in Item A. Confirm the item as waiting for Borrower B
==== Day 3 ====
#Confirm Borrower C's recall (Recall B) has now been expired due to no longer being needed - check Old recalls (circ/recalls_old_queue.pl) or borrower recall history (members/recallshistory.pl?borrowernumber=Y)
==== Day 4 ====
#Confirm Borrower B's recall (Recall A) has now been expired due to surpassing recall pickup period - check Old recalls (circ/recalls_old_queue.pl) or borrower recall history (members/recallshistory.pl?borrowernumber=Y) 
#Check out Item A to Borrower A again 
#Log into the OPAC as Borrower B and place a recall on Item A 
#Log back into the staff side and check in Item A. Set the recall as waiting for Borrower B 
#Go to Borrower B's detail page (members/moremember.pl?borrowernumber=Y) and confirm you are able to successfully expire the recall 
#If you like, you can do this test again and check expiring the recall works on the member checkouts page (circ/circulation.pl?borrowernumber=Y) 
#Check out Item A to Borrower A again
#Log into the OPAC as Borrower B and place a recall on Item A
#Log back into the staff side and check in Item A. Do not set the recall as waiting
#Go to the biblio recall page (recalls/request.pl?biblionumber=X) and click the 'Check in and set waiting' button. Confirm this works successfully
=== Other links ===
Go back to main recalls page