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 |
- |
|
|