View | Details | Raw Unified | Return to bug 27123
Collapse All | Expand All

(-)a/tools/modborrowers.pl (-181 / +178 lines)
Lines 26-38 Link Here
26
# And for patron attributes.
26
# And for patron attributes.
27
27
28
use Modern::Perl;
28
use Modern::Perl;
29
use CGI qw ( -utf8 );
29
use CGI      qw ( -utf8 );
30
use C4::Auth qw( get_template_and_user );
30
use C4::Auth qw( get_template_and_user );
31
use C4::Koha qw( GetAuthorisedValues );
31
use C4::Koha qw( GetAuthorisedValues );
32
use C4::Members;
32
use C4::Members;
33
use C4::Output qw( output_html_with_http_headers );
33
use C4::Output qw( output_html_with_http_headers );
34
use C4::Context;
34
use C4::Context;
35
use Koha::DateUtils qw( dt_from_string );
35
use Koha::DateUtils    qw( dt_from_string );
36
use Koha::List::Patron qw( GetPatronLists );
36
use Koha::List::Patron qw( GetPatronLists );
37
use Koha::Libraries;
37
use Koha::Libraries;
38
use Koha::Patron::Categories;
38
use Koha::Patron::Categories;
Lines 42-61 use List::MoreUtils qw(uniq); Link Here
42
use Koha::Patron::Messages;
42
use Koha::Patron::Messages;
43
43
44
my $input = CGI->new;
44
my $input = CGI->new;
45
my $op = $input->param('op') || 'show_form';
45
my $op    = $input->param('op') || 'show_form';
46
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
46
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
47
    {   template_name   => "tools/modborrowers.tt",
47
    {
48
        query           => $input,
48
        template_name => "tools/modborrowers.tt",
49
        type            => "intranet",
49
        query         => $input,
50
        flagsrequired   => { tools => "edit_patrons" },
50
        type          => "intranet",
51
        flagsrequired => { tools => "edit_patrons" },
51
    }
52
    }
52
);
53
);
53
54
54
my $logged_in_user = Koha::Patrons->find( $loggedinuser );
55
my $logged_in_user = Koha::Patrons->find($loggedinuser);
55
56
56
$template->param( CanUpdatePasswordExpiration => 1 ) if $logged_in_user->is_superlibrarian;
57
$template->param( CanUpdatePasswordExpiration => 1 ) if $logged_in_user->is_superlibrarian;
57
58
58
my $dbh       = C4::Context->dbh;
59
my $dbh = C4::Context->dbh;
59
60
60
# Show borrower informations
61
# Show borrower informations
61
if ( $op eq 'cud-show' || $op eq 'show' ) {
62
if ( $op eq 'cud-show' || $op eq 'show' ) {
Lines 65-74 if ( $op eq 'cud-show' || $op eq 'show' ) { Link Here
65
    my $useborrowernumbers = 0;
66
    my $useborrowernumbers = 0;
66
67
67
    # Get cardnumbers from a file or the input area
68
    # Get cardnumbers from a file or the input area
68
    if( my $cardnumberlist = $input->param('cardnumberlist') ){
69
    if ( my $cardnumberlist = $input->param('cardnumberlist') ) {
70
69
        # User submitted a list of card numbers
71
        # User submitted a list of card numbers
70
        push @patronidnumbers, split( /\s\n/, $cardnumberlist );
72
        push @patronidnumbers, split( /\s\n/, $cardnumberlist );
71
    } elsif ( my $cardnumberuploadfile = $input->param('cardnumberuploadfile') ){
73
    } elsif ( my $cardnumberuploadfile = $input->param('cardnumberuploadfile') ) {
74
72
        # User uploaded a file of card numbers
75
        # User uploaded a file of card numbers
73
        binmode $cardnumberuploadfile, ':encoding(UTF-8)';
76
        binmode $cardnumberuploadfile, ':encoding(UTF-8)';
74
        while ( my $content = <$cardnumberuploadfile> ) {
77
        while ( my $content = <$cardnumberuploadfile> ) {
Lines 76-86 if ( $op eq 'cud-show' || $op eq 'show' ) { Link Here
76
            $content =~ s/[\r\n]*$//;
79
            $content =~ s/[\r\n]*$//;
77
            push @patronidnumbers, $content if $content;
80
            push @patronidnumbers, $content if $content;
78
        }
81
        }
79
    } elsif ( my $borrowernumberlist = $input->param('borrowernumberlist') ){
82
    } elsif ( my $borrowernumberlist = $input->param('borrowernumberlist') ) {
83
80
        # User submitted a list of borrowernumbers
84
        # User submitted a list of borrowernumbers
81
        $useborrowernumbers = 1;
85
        $useborrowernumbers = 1;
82
        push @patronidnumbers, split( /\s\n/, $borrowernumberlist );
86
        push @patronidnumbers, split( /\s\n/, $borrowernumberlist );
83
    } elsif ( my $borrowernumberuploadfile = $input->param('borrowernumberuploadfile') ){
87
    } elsif ( my $borrowernumberuploadfile = $input->param('borrowernumberuploadfile') ) {
88
84
        # User uploaded a file of borrowernumbers
89
        # User uploaded a file of borrowernumbers
85
        $useborrowernumbers = 1;
90
        $useborrowernumbers = 1;
86
        binmode $borrowernumberuploadfile, ':encoding(UTF-8)';
91
        binmode $borrowernumberuploadfile, ':encoding(UTF-8)';
Lines 89-127 if ( $op eq 'cud-show' || $op eq 'show' ) { Link Here
89
            $content =~ s/[\r\n]*$//;
94
            $content =~ s/[\r\n]*$//;
90
            push @patronidnumbers, $content if $content;
95
            push @patronidnumbers, $content if $content;
91
        }
96
        }
92
    } elsif ( my $patron_list_id = $input->param('patron_list_id') ){
97
    } elsif ( my $patron_list_id = $input->param('patron_list_id') ) {
98
93
        # User selected a patron list
99
        # User selected a patron list
94
        my ($list) = GetPatronLists( { patron_list_id => $patron_list_id } );
100
        my ($list) = GetPatronLists( { patron_list_id => $patron_list_id } );
95
        @patronidnumbers =
101
        @patronidnumbers =
96
          $list->patron_list_patrons()->search_related('borrowernumber')
102
            $list->patron_list_patrons()->search_related('borrowernumber')->get_column('cardnumber')->all();
97
          ->get_column('cardnumber')->all();
98
    }
103
    }
99
104
100
    my $max_nb_attr = 0;
105
    my $max_nb_attr = 0;
101
106
102
    # Make sure there is only one of each patron id number
107
    # Make sure there is only one of each patron id number
103
    @patronidnumbers = uniq( @patronidnumbers );
108
    @patronidnumbers = uniq(@patronidnumbers);
104
109
105
    for my $patronidnumber ( @patronidnumbers ) {
110
    for my $patronidnumber (@patronidnumbers) {
106
        my $patron;
111
        my $patron;
107
        if( $useborrowernumbers == 1 ){
112
        if ( $useborrowernumbers == 1 ) {
108
            $patron = Koha::Patrons->find( { borrowernumber => $patronidnumber } );
113
            $patron = Koha::Patrons->find( { borrowernumber => $patronidnumber } );
109
        } else {
114
        } else {
110
            $patron = Koha::Patrons->find( { cardnumber => $patronidnumber } );
115
            $patron = Koha::Patrons->find( { cardnumber => $patronidnumber } );
111
        }
116
        }
112
        if ( $patron ) {
117
        if ($patron) {
113
            if ( $logged_in_user->can_see_patron_infos( $patron ) ) {
118
            if ( $logged_in_user->can_see_patron_infos($patron) ) {
114
                my $borrower = $patron->unblessed;
119
                my $borrower        = $patron->unblessed;
115
                my $attributes = $patron->extended_attributes;
120
                my $attributes      = $patron->extended_attributes;
116
                my $patron_messages = Koha::Patron::Messages->search(
121
                my $patron_messages = Koha::Patron::Messages->search(
117
                    {
122
                    {
118
                        'me.borrowernumber' => $patron->borrowernumber,
123
                        'me.borrowernumber' => $patron->borrowernumber,
119
                    }
124
                    }
120
                );
125
                );
121
                $borrower->{patron_messages} = $patron_messages->as_list;
126
                $borrower->{patron_messages}         = $patron_messages->as_list;
122
                $borrower->{patron_attributes} = $attributes->as_list;
127
                $borrower->{patron_attributes}       = $attributes->as_list;
123
                $borrower->{patron_attributes_count} = $attributes->count;
128
                $borrower->{patron_attributes_count} = $attributes->count;
124
                $max_nb_attr = $borrower->{patron_attributes_count} if $borrower->{patron_attributes_count} > $max_nb_attr;
129
                $max_nb_attr                         = $borrower->{patron_attributes_count}
130
                    if $borrower->{patron_attributes_count} > $max_nb_attr;
125
                push @borrowers, $borrower;
131
                push @borrowers, $borrower;
126
            } else {
132
            } else {
127
                push @notfoundcardnumbers, $patronidnumber;
133
                push @notfoundcardnumbers, $patronidnumber;
Lines 132-157 if ( $op eq 'cud-show' || $op eq 'show' ) { Link Here
132
    }
138
    }
133
139
134
    # Just for a correct display
140
    # Just for a correct display
135
    for my $borrower ( @borrowers ) {
141
    for my $borrower (@borrowers) {
136
        my $length = $borrower->{patron_attributes_count};
142
        my $length = $borrower->{patron_attributes_count};
137
        push @{ $borrower->{patron_attributes} }, {} for ( $length .. $max_nb_attr - 1);
143
        push @{ $borrower->{patron_attributes} }, {} for ( $length .. $max_nb_attr - 1 );
138
    }
144
    }
139
145
140
    # Construct the patron attributes list
146
    # Construct the patron attributes list
141
    my @patron_attributes_values;
147
    my @patron_attributes_values;
142
    my @patron_attributes_codes;
148
    my @patron_attributes_codes;
143
    my $library_id = C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef;
149
    my $library_id             = C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef;
144
    my $patron_attribute_types = Koha::Patron::Attribute::Types->search_with_library_limits({}, {}, $library_id);
150
    my $patron_attribute_types = Koha::Patron::Attribute::Types->search_with_library_limits( {}, {}, $library_id );
145
    my @patron_categories = Koha::Patron::Categories->search_with_library_limits({}, {order_by => ['description']})->as_list;
151
    my @patron_categories =
152
        Koha::Patron::Categories->search_with_library_limits( {}, { order_by => ['description'] } )->as_list;
146
    while ( my $attr_type = $patron_attribute_types->next ) {
153
    while ( my $attr_type = $patron_attribute_types->next ) {
147
        next if $attr_type->unique_id; # Don't display patron attributes that must be unqiue
154
        next if $attr_type->unique_id;    # Don't display patron attributes that must be unqiue
148
        my $options = $attr_type->authorised_value_category
155
        my $options =
156
            $attr_type->authorised_value_category
149
            ? GetAuthorisedValues( $attr_type->authorised_value_category )
157
            ? GetAuthorisedValues( $attr_type->authorised_value_category )
150
            : undef;
158
            : undef;
151
        push @patron_attributes_values,
159
        push @patron_attributes_values,
152
            {
160
            {
153
                attribute_code => $attr_type->code,
161
            attribute_code => $attr_type->code,
154
                options        => $options,
162
            options        => $options,
155
            };
163
            };
156
164
157
        my $category_code = $attr_type->category_code;
165
        my $category_code = $attr_type->category_code;
Lines 160-177 if ( $op eq 'cud-show' || $op eq 'show' ) { Link Here
160
            @patron_categories;
168
            @patron_categories;
161
        push @patron_attributes_codes,
169
        push @patron_attributes_codes,
162
            {
170
            {
163
                attribute_code => $attr_type->code,
171
            attribute_code => $attr_type->code,
164
                attribute_lib  => $attr_type->description,
172
            attribute_lib  => $attr_type->description,
165
                category_lib   => $category_lib,
173
            category_lib   => $category_lib,
166
                type           => $attr_type->authorised_value_category ? 'select' : 'text',
174
            type           => $attr_type->authorised_value_category ? 'select' : 'text',
167
            };
175
            };
168
    }
176
    }
169
177
170
    my @attributes_header = ();
178
    my @attributes_header = ();
171
    for ( 1 .. scalar( $max_nb_attr ) ) {
179
    for ( 1 .. scalar($max_nb_attr) ) {
172
        push @attributes_header, { attribute => "Attributes $_" };
180
        push @attributes_header, { attribute => "Attributes $_" };
173
    }
181
    }
174
    $template->param( borrowers => \@borrowers );
182
    $template->param( borrowers         => \@borrowers );
175
    $template->param( attributes_header => \@attributes_header );
183
    $template->param( attributes_header => \@attributes_header );
176
    @notfoundcardnumbers = map { { cardnumber => $_ } } @notfoundcardnumbers;
184
    @notfoundcardnumbers = map { { cardnumber => $_ } } @notfoundcardnumbers;
177
    $template->param( notfoundcardnumbers => \@notfoundcardnumbers )
185
    $template->param( notfoundcardnumbers => \@notfoundcardnumbers )
Lines 179-185 if ( $op eq 'cud-show' || $op eq 'show' ) { Link Here
179
    $template->param( useborrowernumbers => $useborrowernumbers );
187
    $template->param( useborrowernumbers => $useborrowernumbers );
180
188
181
    # Construct drop-down list values
189
    # Construct drop-down list values
182
    my $branches = Koha::Libraries->search({}, { order_by => ['branchname'] })->unblessed;
190
    my $branches = Koha::Libraries->search( {}, { order_by => ['branchname'] } )->unblessed;
183
    my @branches_option;
191
    my @branches_option;
184
    push @branches_option, { value => $_->{branchcode}, lib => $_->{branchname} } for @$branches;
192
    push @branches_option, { value => $_->{branchcode}, lib => $_->{branchname} } for @$branches;
185
    unshift @branches_option, { value => "", lib => "" };
193
    unshift @branches_option, { value => "", lib => "" };
Lines 201-358 if ( $op eq 'cud-show' || $op eq 'show' ) { Link Here
201
209
202
    my @fields = (
210
    my @fields = (
203
        {
211
        {
204
            name => "surname",
212
            name      => "surname",
205
            type => "text",
213
            type      => "text",
206
            mandatory => ( grep /surname/, @mandatoryFields ) ? 1 : 0
214
            mandatory => ( grep /surname/, @mandatoryFields ) ? 1 : 0
207
        }
215
        },
208
        ,
209
        {
216
        {
210
            name => "firstname",
217
            name      => "firstname",
211
            type => "text",
218
            type      => "text",
212
            mandatory => ( grep /firstname/, @mandatoryFields ) ? 1 : 0,
219
            mandatory => ( grep /firstname/, @mandatoryFields ) ? 1 : 0,
213
        }
220
        },
214
        ,
215
        {
221
        {
216
            name => "branchcode",
222
            name      => "branchcode",
217
            type => "select",
223
            type      => "select",
218
            option => \@branches_option,
224
            option    => \@branches_option,
219
            mandatory => ( grep /branchcode/, @mandatoryFields ) ? 1 : 0,
225
            mandatory => ( grep /branchcode/, @mandatoryFields ) ? 1 : 0,
220
        }
226
        },
221
        ,
222
        {
227
        {
223
            name => "categorycode",
228
            name      => "categorycode",
224
            type => "select",
229
            type      => "select",
225
            option => \@categories_option,
230
            option    => \@categories_option,
226
            mandatory => ( grep /categorycode/, @mandatoryFields ) ? 1 : 0,
231
            mandatory => ( grep /categorycode/, @mandatoryFields ) ? 1 : 0,
227
        }
232
        },
228
        ,
229
        {
233
        {
230
            name => "streetnumber",
234
            name      => "streetnumber",
231
            type => "text",
235
            type      => "text",
232
            mandatory => ( grep /streetnumber/, @mandatoryFields ) ? 1 : 0,
236
            mandatory => ( grep /streetnumber/, @mandatoryFields ) ? 1 : 0,
233
        }
237
        },
234
        ,
235
        {
238
        {
236
            name => "address",
239
            name      => "address",
237
            type => "text",
240
            type      => "text",
238
            mandatory => ( grep /address/, @mandatoryFields ) ? 1 : 0,
241
            mandatory => ( grep /address/, @mandatoryFields ) ? 1 : 0,
239
        }
242
        },
240
        ,
241
        {
243
        {
242
            name => "address2",
244
            name      => "address2",
243
            type => "text",
245
            type      => "text",
244
            mandatory => ( grep /address2/, @mandatoryFields ) ? 1 : 0,
246
            mandatory => ( grep /address2/, @mandatoryFields ) ? 1 : 0,
245
        }
247
        },
246
        ,
247
        {
248
        {
248
            name => "city",
249
            name      => "city",
249
            type => "text",
250
            type      => "text",
250
            mandatory => ( grep /city/, @mandatoryFields ) ? 1 : 0,
251
            mandatory => ( grep /city/, @mandatoryFields ) ? 1 : 0,
251
        }
252
        },
252
        ,
253
        {
253
        {
254
            name => "state",
254
            name      => "state",
255
            type => "text",
255
            type      => "text",
256
            mandatory => ( grep /state/, @mandatoryFields ) ? 1 : 0,
256
            mandatory => ( grep /state/, @mandatoryFields ) ? 1 : 0,
257
        }
257
        },
258
        ,
259
        {
258
        {
260
            name => "zipcode",
259
            name      => "zipcode",
261
            type => "text",
260
            type      => "text",
262
            mandatory => ( grep /zipcode/, @mandatoryFields ) ? 1 : 0,
261
            mandatory => ( grep /zipcode/, @mandatoryFields ) ? 1 : 0,
263
        }
262
        },
264
        ,
265
        {
263
        {
266
            name => "country",
264
            name      => "country",
267
            type => "text",
265
            type      => "text",
268
            mandatory => ( grep /country/, @mandatoryFields ) ? 1 : 0,
266
            mandatory => ( grep /country/, @mandatoryFields ) ? 1 : 0,
269
        }
267
        },
270
        ,
271
        {
268
        {
272
            name => "email",
269
            name      => "email",
273
            type => "text",
270
            type      => "text",
274
            mandatory => ( grep /email/, @mandatoryFields ) ? 1 : 0,
271
            mandatory => ( grep /email/, @mandatoryFields ) ? 1 : 0,
275
        }
272
        },
276
        ,
277
        {
273
        {
278
            name => "phone",
274
            name      => "phone",
279
            type => "text",
275
            type      => "text",
280
            mandatory => ( grep /phone/, @mandatoryFields ) ? 1 : 0,
276
            mandatory => ( grep /phone/, @mandatoryFields ) ? 1 : 0,
281
        }
277
        },
282
        ,
283
        {
278
        {
284
            name => "mobile",
279
            name      => "mobile",
285
            type => "text",
280
            type      => "text",
286
            mandatory => ( grep /mobile/, @mandatoryFields ) ? 1 : 0,
281
            mandatory => ( grep /mobile/, @mandatoryFields ) ? 1 : 0,
287
        }
282
        },
288
        ,
289
        {
283
        {
290
            name      => "fax",
284
            name      => "fax",
291
            type      => "text",
285
            type      => "text",
292
            mandatory => ( grep /fax/, @mandatoryFields ) ? 1 : 0,
286
            mandatory => ( grep /fax/, @mandatoryFields ) ? 1 : 0,
293
        }
287
        },
294
        ,
295
        {
288
        {
296
            name => "sort1",
289
            name      => "sort1",
297
            type => @sort1_option ? "select" : "text",
290
            type      => @sort1_option ? "select" : "text",
298
            option => \@sort1_option,
291
            option    => \@sort1_option,
299
            mandatory => ( grep /sort1/, @mandatoryFields ) ? 1 : 0,
292
            mandatory => ( grep /sort1/, @mandatoryFields ) ? 1 : 0,
300
        }
293
        },
301
        ,
302
        {
294
        {
303
            name => "sort2",
295
            name      => "sort2",
304
            type => @sort2_option ? "select" : "text",
296
            type      => @sort2_option ? "select" : "text",
305
            option => \@sort2_option,
297
            option    => \@sort2_option,
306
            mandatory => ( grep /sort2/, @mandatoryFields ) ? 1 : 0,
298
            mandatory => ( grep /sort2/, @mandatoryFields ) ? 1 : 0,
307
        }
299
        },
308
        ,
309
        {
300
        {
310
            name => "dateenrolled",
301
            name      => "dateenrolled",
311
            type => "date",
302
            type      => "date",
312
            mandatory => ( grep /dateenrolled/, @mandatoryFields ) ? 1 : 0,
303
            mandatory => ( grep /dateenrolled/, @mandatoryFields ) ? 1 : 0,
313
        }
304
        },
314
        ,
315
        {
305
        {
316
            name => "dateexpiry",
306
            name      => "dateexpiry",
317
            type => "date",
307
            type      => "date",
318
            mandatory => ( grep /dateexpiry/, @mandatoryFields ) ? 1 : 0,
308
            mandatory => ( grep /dateexpiry/, @mandatoryFields ) ? 1 : 0,
319
        }
309
        },
320
        ,
321
        {
310
        {
322
            name => "borrowernotes",
311
            name      => "borrowernotes",
323
            type => "text",
312
            type      => "text",
324
            mandatory => ( grep /borrowernotes/, @mandatoryFields ) ? 1 : 0,
313
            mandatory => ( grep /borrowernotes/, @mandatoryFields ) ? 1 : 0,
325
        }
314
        },
326
        ,
327
        {
315
        {
328
            name => "opacnote",
316
            name      => "opacnote",
329
            type => "text",
317
            type      => "text",
330
            mandatory => ( grep /opacnote/, @mandatoryFields ) ? 1 : 0,
318
            mandatory => ( grep /opacnote/, @mandatoryFields ) ? 1 : 0,
331
        }
319
        },
332
        ,
333
        {
320
        {
334
            name => "message",
321
            name      => "message",
335
            type => "message_type",
322
            type      => "message_type",
336
            mandatory => ( grep /message/, @mandatoryFields ) ? 1 : 0,
323
            mandatory => ( grep /message/, @mandatoryFields ) ? 1 : 0,
337
        }
324
        },
338
        ,
339
        {
325
        {
340
            name => "debarred",
326
            name      => "debarred",
341
            type => "date",
327
            type      => "date",
342
            mandatory => ( grep /debarred/, @mandatoryFields ) ? 1 : 0,
328
            mandatory => ( grep /debarred/, @mandatoryFields ) ? 1 : 0,
343
        }
329
        },
344
        ,
345
        {
330
        {
346
            name => "debarredcomment",
331
            name      => "debarredcomment",
347
            type => "text",
332
            type      => "text",
348
            mandatory => ( grep /debarredcomment/, @mandatoryFields ) ? 1 : 0,
333
            mandatory => ( grep /debarredcomment/, @mandatoryFields ) ? 1 : 0,
349
        },
334
        },
350
    );
335
    );
351
336
352
    push @fields, { name => "password_expiration_date", type => "date" } if $logged_in_user->is_superlibrarian;
337
    push @fields, { name => "password_expiration_date", type => "date" } if $logged_in_user->is_superlibrarian;
353
338
354
    $template->param('patron_attributes_codes', \@patron_attributes_codes);
339
    $template->param( 'patron_attributes_codes',  \@patron_attributes_codes );
355
    $template->param('patron_attributes_values', \@patron_attributes_values);
340
    $template->param( 'patron_attributes_values', \@patron_attributes_values );
356
341
357
    $template->param( fields => \@fields );
342
    $template->param( fields => \@fields );
358
    $op = 'show';
343
    $op = 'show';
Lines 372-390 if ( $op eq 'cud-do' ) { Link Here
372
        $infos->{$field} = ""     if grep { $_ eq $field } @disabled;
357
        $infos->{$field} = ""     if grep { $_ eq $field } @disabled;
373
    }
358
    }
374
359
375
    for my $field ( qw( dateenrolled dateexpiry debarred password_expiration_date ) ) {
360
    for my $field (qw( dateenrolled dateexpiry debarred password_expiration_date )) {
376
        $infos->{$field} = dt_from_string($infos->{$field}) if $infos->{$field};
361
        $infos->{$field} = dt_from_string( $infos->{$field} ) if $infos->{$field};
377
    }
362
    }
378
363
379
    delete $infos->{password_expiration_date} unless $logged_in_user->is_superlibrarian;
364
    delete $infos->{password_expiration_date} unless $logged_in_user->is_superlibrarian;
380
365
381
    my @errors;
366
    my @errors;
382
    my @borrowernumbers = $input->multi_param('borrowernumber');
367
    my @borrowernumbers = $input->multi_param('borrowernumber');
368
383
    # For each borrower selected
369
    # For each borrower selected
384
    for my $borrowernumber ( @borrowernumbers ) {
370
    for my $borrowernumber (@borrowernumbers) {
385
371
386
        # If at least one field are filled, we want to modify the borrower
372
        # If at least one field are filled, we want to modify the borrower
387
        if ( defined $infos ) {
373
        if ( defined $infos ) {
374
388
            # If a debarred date or debarred comment has been submitted make a new debarment
375
            # If a debarred date or debarred comment has been submitted make a new debarment
389
            if ( $infos->{debarred} || $infos->{debarredcomment} ) {
376
            if ( $infos->{debarred} || $infos->{debarredcomment} ) {
390
                AddDebarment(
377
                AddDebarment(
Lines 393-432 if ( $op eq 'cud-do' ) { Link Here
393
                        type           => 'MANUAL',
380
                        type           => 'MANUAL',
394
                        comment        => $infos->{debarredcomment},
381
                        comment        => $infos->{debarredcomment},
395
                        expiration     => $infos->{debarred},
382
                        expiration     => $infos->{debarred},
396
                    });
383
                    }
384
                );
397
            }
385
            }
398
386
399
            # If debarment date or debarment comment are disabled then remove all debarrments
387
            # If debarment date or debarment comment are disabled then remove all debarrments
400
            my $patron = Koha::Patrons->find( $borrowernumber );
388
            my $patron = Koha::Patrons->find($borrowernumber);
401
            if ( grep { /debarred/ } @disabled ) {
389
            if ( grep { /debarred/ } @disabled ) {
402
                eval {
390
                eval {
403
                   my $debarrments = $patron->restrictions;
391
                    my $debarrments = $patron->restrictions;
404
                   while( my $debarment = $debarrments->next ) {
392
                    while ( my $debarment = $debarrments->next ) {
405
                      DelDebarment( $debarment->borrower_debarment_id );
393
                        DelDebarment( $debarment->borrower_debarment_id );
406
                   }
394
                    }
407
                };
395
                };
408
            }
396
            }
397
409
            # If 'message' or 'add_message_type' is defined then delete both at the same time
398
            # If 'message' or 'add_message_type' is defined then delete both at the same time
410
            if ( grep { $_ eq 'message' } @disabled) {
399
            if ( grep { $_ eq 'message' } @disabled ) {
411
                my $patron = Koha::Patrons->find( $borrowernumber );
400
                my $patron = Koha::Patrons->find($borrowernumber);
412
                $patron->messages()->delete();
401
                $patron->messages()->delete();
413
            }
402
            }
414
            $infos->{borrowernumber} = $borrowernumber;
403
            $infos->{borrowernumber} = $borrowernumber;
415
            eval { $patron->set($infos)->store; };
404
            eval { $patron->set($infos)->store; };
416
            if ( $@ ) { # FIXME We could provide better error handling here
405
            if ($@) {    # FIXME We could provide better error handling here
417
                $infos->{cardnumber} = $patron ? $patron->cardnumber || '' : '';
406
                $infos->{cardnumber} = $patron ? $patron->cardnumber || '' : '';
418
                push @errors, { error => "can_not_update", borrowernumber => $infos->{borrowernumber}, cardnumber => $infos->{cardnumber} };
407
                push @errors,
408
                    {
409
                    error      => "can_not_update", borrowernumber => $infos->{borrowernumber},
410
                    cardnumber => $infos->{cardnumber}
411
                    };
419
            }
412
            }
420
        }
413
        }
421
414
422
        my $patron = Koha::Patrons->find( $borrowernumber );
415
        my $patron      = Koha::Patrons->find($borrowernumber);
423
        my @attributes = $input->multi_param('patron_attributes');
416
        my @attributes  = $input->multi_param('patron_attributes');
424
        my @attr_values = $input->multi_param('patron_attributes_value');
417
        my @attr_values = $input->multi_param('patron_attributes_value');
425
        my $attributes;
418
        my $attributes;
426
        my $i = 0;
419
        my $i = 0;
427
        for my $code ( @attributes ) {
420
        for my $code (@attributes) {
428
            push @{ $attributes->{$code}->{values} }, shift @attr_values; # Handling repeatables
421
            push @{ $attributes->{$code}->{values} }, shift @attr_values;    # Handling repeatables
429
            $attributes->{$code}->{disabled} = grep { $_ eq sprintf("attr%s_value", ++$i) } @disabled;
422
            $attributes->{$code}->{disabled} = grep { $_ eq sprintf( "attr%s_value", ++$i ) } @disabled;
430
        }
423
        }
431
424
432
        for my $code ( keys %$attributes ) {
425
        for my $code ( keys %$attributes ) {
Lines 438-461 if ( $op eq 'cud-do' ) { Link Here
438
            next if $attr_type->category_code and $attr_type->category_code ne $patron->categorycode;
431
            next if $attr_type->category_code and $attr_type->category_code ne $patron->categorycode;
439
432
440
            if ( $attributes->{$code}->{disabled} ) {
433
            if ( $attributes->{$code}->{disabled} ) {
434
441
                # The attribute is disabled, we remove it for this borrower !
435
                # The attribute is disabled, we remove it for this borrower !
442
                eval {
436
                eval {
443
                    $patron->extended_attributes->search({'me.code' => $code})->filter_by_branch_limitations->delete;
437
                    $patron->extended_attributes->search( { 'me.code' => $code } )
438
                        ->filter_by_branch_limitations->delete;
444
                };
439
                };
445
                push @errors, { error => $@ } if $@;
440
                push @errors, { error => $@ } if $@;
446
            } else {
441
            } else {
447
                eval {
442
                eval {
448
                    $patron->extended_attributes->search({'me.code' => $code})->filter_by_branch_limitations->delete;
443
                    $patron->extended_attributes->search( { 'me.code' => $code } )
449
                    $patron->add_extended_attribute({ code => $code, attribute => $_ }) for @{$attributes->{$code}->{values}};
444
                        ->filter_by_branch_limitations->delete;
445
                    $patron->add_extended_attribute( { code => $code, attribute => $_ } )
446
                        for @{ $attributes->{$code}->{values} };
450
                };
447
                };
451
                push @errors, { error => $@ } if $@;
448
                push @errors, { error => $@ } if $@;
452
            }
449
            }
453
        }
450
        }
454
451
455
        # Handle patron messages
452
        # Handle patron messages
456
        my $message          = $input->param('message');
453
        my $message      = $input->param('message');
457
        my $branchcode       = C4::Context::mybranch;
454
        my $branchcode   = C4::Context::mybranch;
458
        my $message_type     = $input->param('add_message_type');
455
        my $message_type = $input->param('add_message_type');
459
456
460
        Koha::Patron::Message->new(
457
        Koha::Patron::Message->new(
461
            {
458
            {
Lines 467-488 if ( $op eq 'cud-do' ) { Link Here
467
        )->store;
464
        )->store;
468
    }
465
    }
469
466
470
    $op = "show_results"; # We have process modifications, the user want to view its
467
    $op = "show_results";    # We have process modifications, the user want to view its
471
468
472
    # Construct the results list
469
    # Construct the results list
473
    my @borrowers;
470
    my @borrowers;
474
    my $max_nb_attr = 0;
471
    my $max_nb_attr = 0;
475
    for my $borrowernumber ( @borrowernumbers ) {
472
    for my $borrowernumber (@borrowernumbers) {
476
        my $patron = Koha::Patrons->find( $borrowernumber );
473
        my $patron = Koha::Patrons->find($borrowernumber);
477
        if ( $patron ) {
474
        if ($patron) {
478
            my $category_description = $patron->category->description;
475
            my $category_description = $patron->category->description;
479
            my $borrower = $patron->unblessed;
476
            my $borrower             = $patron->unblessed;
480
            my $patron_messages = Koha::Patron::Messages->search(
477
            my $patron_messages      = Koha::Patron::Messages->search(
481
                    {
478
                {
482
                        'me.borrowernumber' => $patron->borrowernumber,
479
                    'me.borrowernumber' => $patron->borrowernumber,
483
                    }
480
                }
484
                );
481
            );
485
            $borrower->{patron_messages} = $patron_messages->as_list;
482
            $borrower->{patron_messages}      = $patron_messages->as_list;
486
            $borrower->{category_description} = $category_description;
483
            $borrower->{category_description} = $category_description;
487
            my $attributes = $patron->extended_attributes;
484
            my $attributes = $patron->extended_attributes;
488
            $borrower->{patron_attributes} = $attributes->as_list;
485
            $borrower->{patron_attributes} = $attributes->as_list;
Lines 491-508 if ( $op eq 'cud-do' ) { Link Here
491
        }
488
        }
492
    }
489
    }
493
    my @patron_attributes_option;
490
    my @patron_attributes_option;
494
    for my $borrower ( @borrowers ) {
491
    for my $borrower (@borrowers) {
495
        push @patron_attributes_option, { value => "$_->{code}", lib => $_->{code} } for @{ $borrower->{patron_attributes} };
492
        push @patron_attributes_option, { value => "$_->{code}", lib => $_->{code} }
493
            for @{ $borrower->{patron_attributes} };
496
        my $length = scalar( @{ $borrower->{patron_attributes} } );
494
        my $length = scalar( @{ $borrower->{patron_attributes} } );
497
        push @{ $borrower->{patron_attributes} }, {} for ( $length .. $max_nb_attr - 1);
495
        push @{ $borrower->{patron_attributes} }, {} for ( $length .. $max_nb_attr - 1 );
498
    }
496
    }
499
497
500
    my @attributes_header = ();
498
    my @attributes_header = ();
501
    for ( 1 .. scalar( $max_nb_attr ) ) {
499
    for ( 1 .. scalar($max_nb_attr) ) {
502
        push @attributes_header, { attribute => "Attributes $_" };
500
        push @attributes_header, { attribute => "Attributes $_" };
503
    }
501
    }
504
502
505
    $template->param( borrowers => \@borrowers );
503
    $template->param( borrowers         => \@borrowers );
506
    $template->param( attributes_header => \@attributes_header );
504
    $template->param( attributes_header => \@attributes_header );
507
505
508
    $template->param( errors => \@errors );
506
    $template->param( errors => \@errors );
509
- 

Return to bug 27123