3 # This file is part of Koha.
5 # Koha is free software; you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3 of the License, or
8 # (at your option) any later version.
10 # Koha is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with Koha; if not, see <http://www.gnu.org/licenses>.
21 # find Koha's Perl modules
22 # test carefully before changing this
24 eval { require "$FindBin::Bin/../kohalib.pl" };
32 use Koha::Patron::Categories;
38 update_patrons_category.pl - Given a set of parameters update selected patrons from one catgeory to another. Options are cumulative.
42 update_patrons_category.pl -f=categorycode -t=categorycode
43 [-b=branchcode] [-au] [-ao] [-fo=X] [-fu=X]
44 [-rb=date] [-ra=date] [-v]
45 [--field column=value ...]
47 update_patrons_category.pl --help | --man
50 --help brief help message
51 --man full documentation
52 -ao --ageover update if over maximum age for current category
53 -au --ageunder update if under minimuum age current category
54 -fo=X --fineover=X update if fines over X amount
55 -fu=X --fineunder=X update if fines under X amount
56 -rb=date --regbefore update if registration date is before given date
57 -ra=date --regafter update if registration date is after a given date
58 -d --dbfield name=value where <name> is a column in the borrowers table, patrons will be updated if the field is equal to given <value>
59 -v -verbose verbose mode
60 -c --confirm commit changes to db, no action will be taken unless this switch is included
61 -b --branch <branchname> only deal with patrons from this library/branch
62 -f --from <categorycode> change patron category from this category
63 -t --to <categorycode> change patron category to this category
71 Print a brief help message and exits.
75 Prints the manual page and exits.
77 =item B<--verbosse | -v>
79 Verbose. Without this flag set, only fatal errors are reported.
81 =item B<--confirm | -c>
83 Commit changes. Unless this flag set is, the script will report changes but not actually execute them on the database.
85 =item B<--branch | -b>
87 changes patrons for one specific branch. Use the value in the
88 branches.branchcode table.
92 *required* defines the category to update. Expects the code from categories.categorycode.
96 *required* defines the category patrons will be converted to. Expects the code from categories.categorycode.
98 =item B<--ageover | -ao>
100 Update patron only if they are above the maximum age range specified for the 'from' category.
102 =item B<--ageunde | -au>
104 Update patron only if they are below the minimum age range specified for the 'from' category.
106 =item B<--fineover=X | -fo=X>
108 Supply a number and only account with fines over this number will be updated.
110 =item B<==fineunder=X | -fu=X>
112 Supply a number and only account with fines under this number will be updated.
114 =item B<--regbefore=date | -rb=date>
116 Enter a date in ISO format YYYY-MM-DD and only patrons registered before this date wil be updated.
118 =item B<--regafter=date | -ra=date>
120 Enter a date in ISO format YYYY-MM-DD and only patrons registered after this date wil be updated.
122 =item B<--field column=value | -d column=value>
124 Use this flag to specify a column in the borrowers table and update only patrons whose value in that column matches the value supplied (repeatable)
127 --field dateexpiry=2016-01-01
128 will update all patrons who expired on that date, useful for schools etc.
134 This script is designed to update patrons from one category to another.
136 =head1 USAGE EXAMPLES
138 C<update_patron_categories.pl> - Suggests that you read this help. :)
140 C<update_patron_categories.pl> -b=<branchcode> -f=<categorycode> -t=<categorycode> --confirm - Processes a single branch, and updates the patron categories from fromcat to tocat.
142 C<update_patron_categories.pl> -b=<branchcode> -f=<categorycode> -t=<categorycode> -a --confirm - Processes a single branch, and updates the patron categories from fromcat to tocat for patrons outside the age range of fromcat.
144 C<update_patron_categories.pl> -f=<categorycode> -t=<categorycode> -v - Processes all branches, shows all messages, and reports the patrons who would be affected. Takes no action on the database.
148 # These variables are set by command line options.
149 # They are initially set to default values.
159 my $remove_guarantors = 0;
172 'v|verbose' => \$verbose,
173 'c|confirm' => \$doit,
174 'f|from=s' => \$fromcat,
176 'ao|ageover' => \$ageover,
177 'au|ageunder' => \$ageunder,
178 'fo|finesover=s' => \$fine_min,
179 'fu|finesunder=s' => \$fine_max,
180 'rb|regbefore=s' => \$reg_bef,
181 'ra|regafter=s' => \$reg_aft,
182 'b|branch=s' => \$branch_lim,
183 'd|field=s' => \%fields
185 pod2usage(1) if $help;
186 pod2usage( -verbose => 2 ) if $man;
188 warn "v $verbose c $doit f $fromcat t $tocat";
189 warn Data::Dumper::Dumper(%fields);
192 if ( not $fromcat && $tocat ) { #make sure we've specified the info we need.
194 "Must supply category from and to (-f & -t) please specify -help for usage tips.\n";
198 ( $verbose && !$doit ) and print "No actions will be taken (test mode)\n";
202 "Will update patrons from $fromcat to $tocat with conditions below (if any)\n";
206 if ( $reg_bef || $reg_aft ) {
209 if ( defined $reg_bef ) {
210 eval { $date_bef = dt_from_string( $reg_bef, 'iso' ); };
213 "$reg_bef is not a valid date before, aborting! Use a date in format YYYY-MM-DD.$@"
215 if ( defined $reg_aft ) {
216 eval { $date_aft = dt_from_string( $reg_aft, 'iso' ); };
219 "$reg_bef is not a valid date after, aborting! Use a date in format YYYY-MM-DD.$@"
221 $params{dateenrolled}{'<='} = $reg_bef if defined $date_bef;
222 $params{dateenrolled}{'>='} = $reg_aft if defined $date_aft;
225 my $cat_from = Koha::Patron::Categories->find($fromcat);
226 my $cat_to = Koha::Patron::Categories->find($tocat);
227 die "Categories not found" unless $cat_from && $cat_to;
229 $params{"me.categorycode"} = $fromcat;
230 $params{"me.branchcode"} = $branch_lim if $branch_lim;
233 print "Conditions:\n";
234 print " Registered before $reg_bef\n" if $reg_bef;
235 print " Registered after $reg_aft\n" if $reg_aft;
236 print " Total fines more than $fine_min\n" if $fine_min;
237 print " Total fines less than $fine_max\n" if $fine_max;
238 print " Age below minimum for " . $cat_from->description . "\n" if $ageunder;
239 print " Age above maximum for " . $cat_from->description . "\n" if $ageover;
240 if ( defined $branch_lim ) {
241 print " Branchcode of patron is $branch_lim\n";
245 while ( my ( $key, $value ) = each %fields ) {
246 $verbose and print " Borrower column $key is equal to $value\n";
247 $params{ "me." . $key } = $value;
250 my $target_patrons = Koha::Patrons->search_patrons_to_update(
253 search_params => \%params,
254 ageunder => $ageunder,
256 fine_min => $fine_min,
257 fine_max => $fine_max,
260 my $patrons_found = $target_patrons->count;
261 my $actually_updated = 0;
262 my $testdisplay = $doit ? "" : "WOULD HAVE ";
264 while ( my $target_patron = $target_patrons->next() ) {
265 my $target = Koha::Patrons->find( $target_patron->borrowernumber );
267 and print $testdisplay
269 . $target->firstname . " "
271 . " from $fromcat to $tocat\n";
273 $target_patrons->reset;
276 $actually_updated = $target_patrons->update_category( { to => $tocat } );
279 $verbose and print "$patrons_found found, $actually_updated updated\n";