|
Lines 22-119
Link Here
|
| 22 |
|
22 |
|
| 23 |
=head1 moremember.pl |
23 |
=head1 moremember.pl |
| 24 |
|
24 |
|
| 25 |
script to do a borrower enquiry/bring up borrower details etc |
25 |
script to do a borrower enquiry/bring up patron details etc |
| 26 |
Displays all the details about a borrower |
26 |
Displays all the details about a patron |
| 27 |
written 20/12/99 by chris@katipo.co.nz |
|
|
| 28 |
last modified 21/1/2000 by chris@katipo.co.nz |
| 29 |
modified 31/1/2001 by chris@katipo.co.nz |
| 30 |
to not allow items on request to be renewed |
| 31 |
|
| 32 |
needs html removed and to use the C4::Output more, but its tricky |
| 33 |
|
27 |
|
| 34 |
=cut |
28 |
=cut |
| 35 |
|
29 |
|
| 36 |
use Modern::Perl; |
30 |
use Modern::Perl; |
| 37 |
use CGI qw ( -utf8 ); |
31 |
use CGI qw ( -utf8 ); |
| 38 |
use HTML::Entities; |
|
|
| 39 |
use C4::Context; |
32 |
use C4::Context; |
| 40 |
use C4::Auth; |
33 |
use C4::Auth; |
| 41 |
use C4::Output; |
34 |
use C4::Output; |
| 42 |
use C4::Members; |
|
|
| 43 |
use C4::Members::Attributes; |
| 44 |
use C4::Members::AttributeTypes; |
35 |
use C4::Members::AttributeTypes; |
| 45 |
use C4::Reserves; |
|
|
| 46 |
use C4::Circulation; |
| 47 |
use C4::Koha; |
| 48 |
use C4::Letters; |
| 49 |
use C4::Biblio; |
| 50 |
use C4::Form::MessagingPreferences; |
36 |
use C4::Form::MessagingPreferences; |
| 51 |
use List::MoreUtils qw/uniq/; |
37 |
use List::MoreUtils qw/uniq/; |
| 52 |
use C4::Members::Attributes qw(GetBorrowerAttributes); |
38 |
use C4::Members::Attributes qw(GetBorrowerAttributes); |
| 53 |
use Koha::Account::Lines; |
|
|
| 54 |
use Koha::AuthorisedValues; |
| 55 |
use Koha::CsvProfiles; |
| 56 |
use Koha::Patron::Debarments qw(GetDebarments); |
39 |
use Koha::Patron::Debarments qw(GetDebarments); |
| 57 |
use Koha::Patron::Messages; |
40 |
use Koha::Patron::Messages; |
| 58 |
#use Smart::Comments; |
|
|
| 59 |
#use Data::Dumper; |
| 60 |
use DateTime; |
| 61 |
use Koha::DateUtils; |
41 |
use Koha::DateUtils; |
| 62 |
use Koha::Database; |
42 |
use Koha::CsvProfiles; |
| 63 |
use Koha::Patrons; |
43 |
use Koha::Patrons; |
| 64 |
use Koha::Patron::Categories; |
|
|
| 65 |
use Koha::Token; |
44 |
use Koha::Token; |
|
|
45 |
use Koha::Checkouts; |
| 66 |
|
46 |
|
| 67 |
use vars qw($debug); |
47 |
use vars qw($debug); |
| 68 |
|
48 |
|
| 69 |
BEGIN { |
49 |
BEGIN { |
| 70 |
$debug = $ENV{DEBUG} || 0; |
50 |
$debug = $ENV{DEBUG} || 0; |
| 71 |
} |
51 |
} |
| 72 |
|
52 |
|
| 73 |
my $dbh = C4::Context->dbh; |
|
|
| 74 |
|
| 75 |
my $input = CGI->new; |
53 |
my $input = CGI->new; |
| 76 |
$debug or $debug = $input->param('debug') || 0; |
54 |
$debug or $debug = $input->param('debug') || 0; |
| 77 |
my $print = $input->param('print'); |
|
|
| 78 |
|
| 79 |
my $template_name; |
| 80 |
my $quickslip = 0; |
| 81 |
|
| 82 |
my $flagsrequired; |
| 83 |
if (defined $print and $print eq "page") { |
| 84 |
$template_name = "members/moremember-print.tt"; |
| 85 |
# circ staff who process checkouts but can't edit |
| 86 |
# patrons still need to be able to access print view |
| 87 |
$flagsrequired = { circulate => "circulate_remaining_permissions" }; |
| 88 |
} elsif (defined $print and $print eq "slip") { |
| 89 |
$template_name = "members/moremember-receipt.tt"; |
| 90 |
# circ staff who process checkouts but can't edit |
| 91 |
# patrons still need to be able to print receipts |
| 92 |
$flagsrequired = { circulate => "circulate_remaining_permissions" }; |
| 93 |
} elsif (defined $print and $print eq "qslip") { |
| 94 |
$template_name = "members/moremember-receipt.tt"; |
| 95 |
$quickslip = 1; |
| 96 |
$flagsrequired = { circulate => "circulate_remaining_permissions" }; |
| 97 |
} elsif (defined $print and $print eq "brief") { |
| 98 |
$template_name = "members/moremember-brief.tt"; |
| 99 |
$flagsrequired = { borrowers => 'edit_borrowers' }; |
| 100 |
} else { |
| 101 |
$template_name = "members/moremember.tt"; |
| 102 |
$flagsrequired = { borrowers => 'edit_borrowers' }; |
| 103 |
} |
| 104 |
|
55 |
|
| 105 |
my ( $template, $loggedinuser, $cookie ) = get_template_and_user( |
56 |
my ( $template, $loggedinuser, $cookie ) = get_template_and_user( |
| 106 |
{ |
57 |
{ |
| 107 |
template_name => $template_name, |
58 |
template_name => "members/moremember.tt", |
| 108 |
query => $input, |
59 |
query => $input, |
| 109 |
type => "intranet", |
60 |
type => "intranet", |
| 110 |
authnotrequired => 0, |
61 |
authnotrequired => 0, |
| 111 |
flagsrequired => $flagsrequired, |
62 |
flagsrequired => { borrowers => 'edit_borrowers' }, |
| 112 |
debug => 1, |
63 |
debug => 1, |
| 113 |
} |
64 |
} |
| 114 |
); |
65 |
); |
| 115 |
my $borrowernumber = $input->param('borrowernumber'); |
66 |
my $borrowernumber = $input->param('borrowernumber'); |
| 116 |
$borrowernumber = HTML::Entities::encode($borrowernumber); |
|
|
| 117 |
my $error = $input->param('error'); |
67 |
my $error = $input->param('error'); |
| 118 |
$template->param( error => $error ) if ( $error ); |
68 |
$template->param( error => $error ) if ( $error ); |
| 119 |
|
69 |
|
|
Lines 121-166
my $patron = Koha::Patrons->find( $borrowernumber );
Link Here
|
| 121 |
my $logged_in_user = Koha::Patrons->find( $loggedinuser ) or die "Not logged in"; |
71 |
my $logged_in_user = Koha::Patrons->find( $loggedinuser ) or die "Not logged in"; |
| 122 |
output_and_exit_if_error( $input, $cookie, $template, { module => 'members', logged_in_user => $logged_in_user, current_patron => $patron } ); |
72 |
output_and_exit_if_error( $input, $cookie, $template, { module => 'members', logged_in_user => $logged_in_user, current_patron => $patron } ); |
| 123 |
|
73 |
|
| 124 |
my $issues = $patron->checkouts; |
|
|
| 125 |
my $balance = $patron->account->balance; |
| 126 |
$template->param( |
| 127 |
issuecount => $issues->count, |
| 128 |
fines => $balance, |
| 129 |
); |
| 130 |
|
| 131 |
my $category_type = $patron->category->category_type; |
74 |
my $category_type = $patron->category->category_type; |
| 132 |
my $data = $patron->unblessed; |
|
|
| 133 |
|
| 134 |
$debug and printf STDERR "dates (enrolled,expiry,birthdate) raw: (%s, %s, %s)\n", map {$data->{$_}} qw(dateenrolled dateexpiry dateofbirth); |
| 135 |
foreach (qw(dateenrolled dateexpiry dateofbirth)) { # FIXME This should be removed |
| 136 |
my $userdate = $data->{$_}; |
| 137 |
unless ($userdate) { |
| 138 |
$debug and warn sprintf "Empty \$data{%12s}", $_; |
| 139 |
$data->{$_} = ''; |
| 140 |
next; |
| 141 |
} |
| 142 |
$data->{$_} = dt_from_string( $userdate ); |
| 143 |
} |
| 144 |
|
75 |
|
| 145 |
for (qw(gonenoaddress lost borrowernotes)) { |
76 |
for (qw(gonenoaddress lost borrowernotes is_debarred)) { |
| 146 |
$data->{$_} and $template->param(flagged => 1) and last; |
77 |
$patron->$_ and $template->param(flagged => 1) and last; |
| 147 |
} |
78 |
} |
| 148 |
|
79 |
|
| 149 |
if ( $patron->is_debarred ) { |
80 |
if ( $patron->is_debarred ) { |
| 150 |
$template->param( |
81 |
$template->param( |
| 151 |
userdebarred => 1, # FIXME Template should use patron->is_debarred |
|
|
| 152 |
flagged => 1, |
| 153 |
debarments => scalar GetDebarments({ borrowernumber => $borrowernumber }), |
82 |
debarments => scalar GetDebarments({ borrowernumber => $borrowernumber }), |
| 154 |
); |
83 |
); |
| 155 |
my $debar = $data->{'debarred'}; |
84 |
if ( $patron->debarred ne "9999-12-31" ) { |
| 156 |
if ( $debar ne "9999-12-31" ) { |
85 |
$template->param( 'userdebarreddate' => $patron->debarred ); |
| 157 |
$template->param( 'userdebarreddate' => output_pref( { dt => dt_from_string( $debar ), dateonly => 1 } ) ); |
|
|
| 158 |
$template->param( 'debarredcomment' => $data->{debarredcomment} ); |
| 159 |
} |
86 |
} |
| 160 |
} |
87 |
} |
| 161 |
|
88 |
|
| 162 |
$data->{ "sex_".$data->{'sex'}."_p" } = 1 if defined $data->{sex}; |
|
|
| 163 |
|
| 164 |
my @relatives; |
89 |
my @relatives; |
| 165 |
if ( my $guarantor = $patron->guarantor ) { |
90 |
if ( my $guarantor = $patron->guarantor ) { |
| 166 |
$template->param( guarantor => $guarantor ); |
91 |
$template->param( guarantor => $guarantor ); |
|
Lines 180-250
if ( my $guarantor = $patron->guarantor ) {
Link Here
|
| 180 |
} |
105 |
} |
| 181 |
|
106 |
|
| 182 |
my $relatives_issues_count = |
107 |
my $relatives_issues_count = |
| 183 |
Koha::Database->new()->schema()->resultset('Issue') |
108 |
Koha::Checkouts->count({ borrowernumber => \@relatives }); |
| 184 |
->count( { borrowernumber => \@relatives } ); |
|
|
| 185 |
|
| 186 |
my %bor; |
| 187 |
$bor{'borrowernumber'} = $borrowernumber; |
| 188 |
|
| 189 |
# Converts the branchcode to the branch name |
| 190 |
my $samebranch; |
| 191 |
if ( C4::Context->preference("IndependentBranches") ) { |
| 192 |
if ( C4::Context->IsSuperLibrarian() ) { |
| 193 |
$samebranch = 1; |
| 194 |
} |
| 195 |
else { |
| 196 |
my $userenv = C4::Context->userenv; |
| 197 |
$samebranch = ( $data->{'branchcode'} eq $userenv->{branch} ); |
| 198 |
} |
| 199 |
} |
| 200 |
else { |
| 201 |
$samebranch = 1; |
| 202 |
} |
| 203 |
my $library = Koha::Libraries->find( $data->{branchcode})->unblessed; |
| 204 |
@{$data}{keys %$library} = values %$library; # merge in all branch columns # FIXME This is really ugly, we should pass the library instead |
| 205 |
|
| 206 |
# If printing a page, send the account informations to the template |
| 207 |
if (defined $print and $print eq "page") { |
| 208 |
my $accts = Koha::Account::Lines->search( |
| 209 |
{ borrowernumber => $patron->borrowernumber, amountoutstanding => { '>' => 0 } }, |
| 210 |
{ order_by => { -desc => 'accountlines_id' } } |
| 211 |
); |
| 212 |
$template->param( accounts => $accts ); |
| 213 |
} |
| 214 |
|
| 215 |
# Show OPAC privacy preference is system preference is set |
| 216 |
if ( C4::Context->preference('OPACPrivacy') ) { # FIXME Should be moved the the template |
| 217 |
$template->param( OPACPrivacy => 1); |
| 218 |
$template->param( "privacy".$data->{'privacy'} => 1); |
| 219 |
} |
| 220 |
|
| 221 |
my $today = DateTime->now( time_zone => C4::Context->tz); |
| 222 |
$today->truncate(to => 'day'); |
| 223 |
my $overdues_exist = 0; |
| 224 |
my $totalprice = 0; |
| 225 |
|
| 226 |
# Calculate and display patron's age |
| 227 |
if ( $data->{dateofbirth} ) { |
| 228 |
$template->param( age => Koha::Patron->new({ dateofbirth => $data->{dateofbirth} })->get_age ); |
| 229 |
} |
| 230 |
|
| 231 |
### ############################################################################### |
| 232 |
# BUILD HTML |
| 233 |
# show all reserves of this borrower, and the position of the reservation .... |
| 234 |
if ($borrowernumber) { |
| 235 |
$template->param( |
| 236 |
holds_count => Koha::Database->new()->schema()->resultset('Reserve') |
| 237 |
->count( { borrowernumber => $borrowernumber } ) ); |
| 238 |
} |
| 239 |
|
109 |
|
| 240 |
# Generate CSRF token for upload and delete image buttons |
110 |
# Generate CSRF token for upload and delete image buttons |
| 241 |
$template->param( |
111 |
$template->param( |
| 242 |
csrf_token => Koha::Token->new->generate_csrf({ session_id => $input->cookie('CGISESSID'),}), |
112 |
csrf_token => Koha::Token->new->generate_csrf({ session_id => $input->cookie('CGISESSID'),}), |
| 243 |
); |
113 |
); |
| 244 |
|
114 |
|
| 245 |
|
|
|
| 246 |
$template->param(%$data); # FIXME This should be removed and used $patron instead, but too many things are processed above |
| 247 |
|
| 248 |
if (C4::Context->preference('ExtendedPatronAttributes')) { |
115 |
if (C4::Context->preference('ExtendedPatronAttributes')) { |
| 249 |
my $attributes = C4::Members::Attributes::GetBorrowerAttributes($borrowernumber); |
116 |
my $attributes = C4::Members::Attributes::GetBorrowerAttributes($borrowernumber); |
| 250 |
my @classes = uniq( map {$_->{class}} @$attributes ); |
117 |
my @classes = uniq( map {$_->{class}} @$attributes ); |
|
Lines 267-273
if (C4::Context->preference('ExtendedPatronAttributes')) {
Link Here
|
| 267 |
} |
134 |
} |
| 268 |
|
135 |
|
| 269 |
$template->param( |
136 |
$template->param( |
| 270 |
ExtendedPatronAttributes => 1, |
|
|
| 271 |
attributes_loop => \@attributes_loop |
137 |
attributes_loop => \@attributes_loop |
| 272 |
); |
138 |
); |
| 273 |
|
139 |
|
|
Lines 280-287
if (C4::Context->preference('ExtendedPatronAttributes')) {
Link Here
|
| 280 |
if (C4::Context->preference('EnhancedMessagingPreferences')) { |
146 |
if (C4::Context->preference('EnhancedMessagingPreferences')) { |
| 281 |
C4::Form::MessagingPreferences::set_form_values({ borrowernumber => $borrowernumber }, $template); |
147 |
C4::Form::MessagingPreferences::set_form_values({ borrowernumber => $borrowernumber }, $template); |
| 282 |
$template->param(messaging_form_inactive => 1); |
148 |
$template->param(messaging_form_inactive => 1); |
| 283 |
$template->param(SMSSendDriver => C4::Context->preference("SMSSendDriver")); |
|
|
| 284 |
$template->param(TalkingTechItivaPhone => C4::Context->preference("TalkingTechItivaPhoneNotification")); |
| 285 |
} |
149 |
} |
| 286 |
|
150 |
|
| 287 |
if ( C4::Context->preference("ExportCircHistory") ) { |
151 |
if ( C4::Context->preference("ExportCircHistory") ) { |
|
Lines 290-296
if ( C4::Context->preference("ExportCircHistory") ) {
Link Here
|
| 290 |
|
154 |
|
| 291 |
my $patron_messages = Koha::Patron::Messages->search( |
155 |
my $patron_messages = Koha::Patron::Messages->search( |
| 292 |
{ |
156 |
{ |
| 293 |
'me.borrowernumber' => $borrowernumber, |
157 |
'me.borrowernumber' => $patron->borrowernumber, |
| 294 |
}, |
158 |
}, |
| 295 |
{ |
159 |
{ |
| 296 |
join => 'manager', |
160 |
join => 'manager', |
|
Lines 308-330
if( $patron_messages->count > 0 ){
Link Here
|
| 308 |
my ( $subtag, $region ) = split '-', $patron->lang; |
172 |
my ( $subtag, $region ) = split '-', $patron->lang; |
| 309 |
my $translated_language = C4::Languages::language_get_description( $subtag, $subtag, 'language' ); |
173 |
my $translated_language = C4::Languages::language_get_description( $subtag, $subtag, 'language' ); |
| 310 |
|
174 |
|
| 311 |
my $total = $patron->account->balance; |
|
|
| 312 |
$template->param( |
175 |
$template->param( |
| 313 |
patron => $patron, |
176 |
patron => $patron, |
|
|
177 |
issuecount => $patron->checkouts->count, |
| 178 |
holds_count => $patron->holds->count, |
| 179 |
fines => $patron->account->balance, |
| 314 |
translated_language => $translated_language, |
180 |
translated_language => $translated_language, |
| 315 |
detailview => 1, |
181 |
detailview => 1, |
| 316 |
was_renewed => scalar $input->param('was_renewed') ? 1 : 0, |
182 |
was_renewed => scalar $input->param('was_renewed') ? 1 : 0, |
| 317 |
todaysdate => output_pref({ dt => dt_from_string, dateformat => 'iso', dateonly => 1 }), |
|
|
| 318 |
totalprice => sprintf("%.2f", $totalprice), |
| 319 |
totaldue => sprintf("%.2f", $total), |
| 320 |
totaldue_raw => $total, |
| 321 |
overdues_exist => $overdues_exist, |
| 322 |
StaffMember => $category_type eq 'S', |
| 323 |
$category_type => 1, # [% IF ( I ) %] = institutional/organisation |
183 |
$category_type => 1, # [% IF ( I ) %] = institutional/organisation |
| 324 |
samebranch => $samebranch, |
|
|
| 325 |
quickslip => $quickslip, |
| 326 |
housebound_role => scalar $patron->housebound_role, |
184 |
housebound_role => scalar $patron->housebound_role, |
| 327 |
PatronsPerPage => C4::Context->preference("PatronsPerPage") || 20, |
|
|
| 328 |
relatives_issues_count => $relatives_issues_count, |
185 |
relatives_issues_count => $relatives_issues_count, |
| 329 |
relatives_borrowernumbers => \@relatives, |
186 |
relatives_borrowernumbers => \@relatives, |
| 330 |
); |
187 |
); |
| 331 |
- |
|
|