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

(-)a/C4/Members/Attributes.pm (-2 / +20 lines)
Lines 330-338 Caches results of C4::Members::AttributeTypes::GetAttributeTypes_hashref(1) for Link Here
330
sub extended_attributes_merge {
330
sub extended_attributes_merge {
331
    my $old = shift or return;
331
    my $old = shift or return;
332
    my $new = shift or return $old;
332
    my $new = shift or return $old;
333
    my $keep = @_ ? shift : 0;
333
    my $keep = shift;
334
    my $move = shift;
335
334
    $AttributeTypes or $AttributeTypes = C4::Members::AttributeTypes::GetAttributeTypes_hashref(1);
336
    $AttributeTypes or $AttributeTypes = C4::Members::AttributeTypes::GetAttributeTypes_hashref(1);
335
    my @merged = @$old;
337
    my @merged = @$old;
338
336
    foreach my $att (@$new) {
339
    foreach my $att (@$new) {
337
        unless ($att->{code}) {
340
        unless ($att->{code}) {
338
            warn "Cannot merge element: no 'code' defined";
341
            warn "Cannot merge element: no 'code' defined";
Lines 347-353 sub extended_attributes_merge { Link Here
347
        }
350
        }
348
        push @merged, $att;
351
        push @merged, $att;
349
    }
352
    }
350
    return [( sort {&_sort_by_code($a,$b)} @merged )];
353
354
    if ($move) {
355
        foreach my $att (@$old) {
356
            if ( $move->{ $att->{code} } ) {
357
                $att->{code} = $move->{ $att->{code} };
358
                unless ( $AttributeTypes->{ $att->{code} }->{repeatable} ) {
359
360
                    # filter out any existing attributes of the same code
361
                    @merged = grep { $att->{code} ne $_->{code} } @merged;
362
                }
363
                push @merged, $att;
364
            }
365
        }
366
    }
367
368
    return [ ( sort { &_sort_by_code( $a, $b ) } @merged ) ];
351
}
369
}
352
370
353
sub _sort_by_code {
371
sub _sort_by_code {
(-)a/Koha/Borrower/Import.pm (-3 / +5 lines)
Lines 21-26 use Carp; Link Here
21
use Text::CSV;
21
use Text::CSV;
22
22
23
use C4::Members;
23
use C4::Members;
24
use C4::Members::Attributes qw(GetBorrowerAttributes extended_attributes_merge SetBorrowerAttributes);
24
use C4::Branch;
25
use C4::Branch;
25
26
26
sub import_patrons {
27
sub import_patrons {
Lines 30-35 sub import_patrons { Link Here
30
    my $matchpoint           = $params->{matchpoint};
31
    my $matchpoint           = $params->{matchpoint};
31
    my $defaults             = $params->{defaults};
32
    my $defaults             = $params->{defaults};
32
    my $ext_preserve         = $params->{preserve_extended_attributes};
33
    my $ext_preserve         = $params->{preserve_extended_attributes};
34
    my $ext_move             = $params->{move_extended_attributes};
33
    my $overwrite_cardnumber = $params->{overwrite_cardnumber};
35
    my $overwrite_cardnumber = $params->{overwrite_cardnumber};
34
36
35
    carp("No file handle passed in!") && return unless $handle;
37
    carp("No file handle passed in!") && return unless $handle;
Lines 162-168 sub import_patrons { Link Here
162
            push @feedback, { feedback => 1, name => 'attribute string', value => $attr_str };
164
            push @feedback, { feedback => 1, name => 'attribute string', value => $attr_str };
163
            delete $borrower{patron_attributes}
165
            delete $borrower{patron_attributes}
164
              ;    # not really a field in borrowers, so we don't want to pass it to ModMember.
166
              ;    # not really a field in borrowers, so we don't want to pass it to ModMember.
165
            $patron_attributes = extended_attributes_code_value_arrayref($attr_str);
167
            $patron_attributes = C4::Members::Attributes::extended_attributes_code_value_arrayref($attr_str);
166
        }
168
        }
167
169
168
        # Popular spreadsheet applications make it difficult to force date outputs to be zero-padded, but we require it.
170
        # Popular spreadsheet applications make it difficult to force date outputs to be zero-padded, but we require it.
Lines 275-283 sub import_patrons { Link Here
275
                }
277
                }
276
            }
278
            }
277
            if ($extended) {
279
            if ($extended) {
278
                if ($ext_preserve) {
280
                if ($ext_preserve || $ext_move) {
279
                    my $old_attributes = GetBorrowerAttributes($borrowernumber);
281
                    my $old_attributes = GetBorrowerAttributes($borrowernumber);
280
                    $patron_attributes = extended_attributes_merge( $old_attributes, $patron_attributes );
282
                    $patron_attributes = extended_attributes_merge( $old_attributes, $patron_attributes, 0, $ext_move );
281
                }
283
                }
282
                push @errors, { unknown_error => 1 }
284
                push @errors, { unknown_error => 1 }
283
                  unless SetBorrowerAttributes( $borrower{'borrowernumber'}, $patron_attributes );
285
                  unless SetBorrowerAttributes( $borrower{'borrowernumber'}, $patron_attributes );
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/import_borrowers.tt (+36 lines)
Lines 15-20 Link Here
15
        $("#dateenrolled").addClass('datepicker');
15
        $("#dateenrolled").addClass('datepicker');
16
        $("#dateexpiry").addClass('datepicker');
16
        $("#dateexpiry").addClass('datepicker');
17
        $("#dateofbirth").addClass('datepicker');
17
        $("#dateofbirth").addClass('datepicker');
18
19
        $("#clone_move_attributes").click( function(){
20
           $(".move_attributes").first().clone().prepend(" ").appendTo("#move_attributes");
21
22
           return false;
23
        });
18
    });
24
    });
19
</script>
25
</script>
20
</head>
26
</head>
Lines 224-229 Link Here
224
                    </li>
230
                    </li>
225
                </ol>
231
                </ol>
226
            </fieldset>
232
            </fieldset>
233
234
            [% IF patron_attribute_types %]
235
                <fieldset class="rows" id="move_attributes">
236
                    <legend>
237
                        Move existing patron attributes
238
                        <a href="" id="clone_move_attributes"><i class="icon icon-plus-sign" title="Add another from/to pair"></i></a>
239
                    </legend>
240
241
                    <ol class="move_attributes">
242
                        <li>
243
                            <label for="move_attribute_from">From</label>
244
                            <select name="move_attribute_from">
245
                                <option></option>
246
                                [% FOREACH p IN patron_attribute_types %]
247
                                        <option value="[% p.code %]">[% p.description %]</option>
248
                                [% END %]
249
                            </select>
250
                        </li>
251
                        <li>
252
                            <label for="move_attribute_to">To</label>
253
                            <select name="move_attribute_to">
254
                                <option></option>
255
                                [% FOREACH p IN patron_attribute_types %]
256
                                        <option value="[% p.code %]">[% p.description %]</option>
257
                                [% END %]
258
                            </select>
259
                        </li>
260
                    </ol>
261
                </fieldset>
262
            [% END %]
227
        [% END %]
263
        [% END %]
228
264
229
        <fieldset class="action"><input type="submit" value="Import" /></fieldset>
265
        <fieldset class="action"><input type="submit" value="Import" /></fieldset>
(-)a/misc/import_borrowers.pl (-7 / +10 lines)
Lines 30-46 my $matchpoint; Link Here
30
my $overwrite_cardnumber;
30
my $overwrite_cardnumber;
31
my %defaults;
31
my %defaults;
32
my $ext_preserve = 0;
32
my $ext_preserve = 0;
33
my $ext_move;
33
my $verbose      = 0;
34
my $verbose      = 0;
34
my $help;
35
my $help;
35
36
36
GetOptions(
37
GetOptions(
37
    'c|csv=s'                       => \$csv_file,
38
    'c|csv=s'                        => \$csv_file,
38
    'm|matchpoint=s'                => \$matchpoint,
39
    'm|matchpoint=s'                 => \$matchpoint,
39
    'd|default=s'                   => \%defaults,
40
    'd|default=s'                    => \%defaults,
40
    'o|overwrite'                   => \$overwrite_cardnumber,
41
    'o|overwrite'                    => \$overwrite_cardnumber,
41
    'p|preserve-extended-atributes' => \$ext_preserve,
42
    'p|preserve-extended-atributes'  => \$ext_preserve,
42
    'v|verbose+'                    => \$verbose,
43
    'ma|move_extended_attributes=s%' => $ext_move,
43
    'h|help|?'                      => \$help,
44
    'v|verbose+'                     => \$verbose,
45
    'h|help|?'                       => \$help,
44
);
46
);
45
47
46
print_help() if ( $help || !$csv_file || !$matchpoint );
48
print_help() if ( $help || !$csv_file || !$matchpoint );
Lines 55-60 my $return = Koha::Patrons::Import::import_patrons( Link Here
55
        matchpoint                   => $matchpoint,
57
        matchpoint                   => $matchpoint,
56
        overwrite_cardnumber         => $overwrite_cardnumber,
58
        overwrite_cardnumber         => $overwrite_cardnumber,
57
        preserve_extended_attributes => $ext_preserve,
59
        preserve_extended_attributes => $ext_preserve,
60
        move_extended_attributes     => $ext_move,
58
    }
61
    }
59
);
62
);
60
63
(-)a/t/Members_Attributes.t (-1 / +40 lines)
Lines 5-11 Link Here
5
use strict;
5
use strict;
6
use warnings;
6
use warnings;
7
7
8
use Test::More tests => 11;
8
use Test::More tests => 23;
9
9
10
BEGIN {
10
BEGIN {
11
    use_ok('C4::Members::Attributes', qw(:all));
11
    use_ok('C4::Members::Attributes', qw(:all));
Lines 23-28 INIT { Link Here
23
                       'code' => 'grade',
23
                       'code' => 'grade',
24
                       'unique_id' => '0'
24
                       'unique_id' => '0'
25
                     },
25
                     },
26
          'grade_prev' => {
27
                       'opac_display' => '0',
28
                       'staff_searchable' => '1',
29
                       'description' => 'Previous grade level',
30
                       'password_allowed' => '0',
31
                       'authorised_value_category' => '',
32
                       'repeatable' => '0',
33
                       'code' => 'grade_prev',
34
                       'unique_id' => '0'
35
                     },
36
          'grade_prev_r' => {
37
                       'opac_display' => '0',
38
                       'staff_searchable' => '1',
39
                       'description' => 'Previous grade level',
40
                       'password_allowed' => '0',
41
                       'authorised_value_category' => '',
42
                       'repeatable' => '1',
43
                       'code' => 'grade_prev_r',
44
                       'unique_id' => '0'
45
                     },
26
          'deanslist' => {
46
          'deanslist' => {
27
                           'opac_display' => '0',
47
                           'opac_display' => '0',
28
                           'staff_searchable' => '1',
48
                           'staff_searchable' => '1',
Lines 102-104 foreach my $test (@merge_tests) { Link Here
102
    ok($merged = extended_attributes_merge($old, $new, 1),             "extended_attributes_merge(\$old, \$new, 1)");
122
    ok($merged = extended_attributes_merge($old, $new, 1),             "extended_attributes_merge(\$old, \$new, 1)");
103
}
123
}
104
124
125
my $old = extended_attributes_code_value_arrayref("grade:02,grade_prev:01");
126
my $new = extended_attributes_code_value_arrayref("grade:03");
127
my $merged = extended_attributes_merge($old, $new, 0, { "grade" => "grade_prev" });
128
is( scalar @$merged, 2, "Merge has two attributes" );
129
is( $merged->[0]->{code},  'grade',      "First attribute has code of 'grade'" );
130
is( $merged->[0]->{value}, '03',         "First attribute has value of '03'" );
131
is( $merged->[1]->{code},  'grade_prev', "Second attribute has code of 'grade_prev'" );
132
is( $merged->[1]->{value}, '02',         "Second attribute has value of '02'" );
133
134
$old = extended_attributes_code_value_arrayref("grade:02,grade_prev_r:01");
135
$new = extended_attributes_code_value_arrayref("grade:03");
136
$merged = extended_attributes_merge($old, $new, 0, { "grade" => "grade_prev_r" });
137
is( scalar @$merged, 3, "Merge has three attributes" );
138
is( $merged->[0]->{code},  'grade',        "First attribute has code of 'grade'" );
139
is( $merged->[0]->{value}, '03',           "First attribute has value of '03'" );
140
is( $merged->[1]->{code},  'grade_prev_r', "Second attribute has code of 'grade_prev'" );
141
is( $merged->[1]->{value}, '01',           "Second attribute has value of '01'" );
142
is( $merged->[2]->{code},  'grade_prev_r', "Third attribute has code of 'grade_prev'" );
143
is( $merged->[2]->{value}, '02',           "Third attribute has value of '02'" );
(-)a/tools/import_borrowers.pl (-2 / +10 lines)
Lines 110-115 if ( $uploadborrowers && length($uploadborrowers) > 0 ) { Link Here
110
    my $handle   = $input->upload('uploadborrowers');
110
    my $handle   = $input->upload('uploadborrowers');
111
    my %defaults = $input->Vars;
111
    my %defaults = $input->Vars;
112
112
113
    my @move_attribute_from = $input->param('move_attribute_from');
114
    my @move_attribute_to = $input->param('move_attribute_to');
115
    my %move;
116
    @move{@move_attribute_from} = @move_attribute_to;
117
113
    my $return = Koha::Patrons::Import::import_patrons(
118
    my $return = Koha::Patrons::Import::import_patrons(
114
        {
119
        {
115
            file                         => $handle,
120
            file                         => $handle,
Lines 117-122 if ( $uploadborrowers && length($uploadborrowers) > 0 ) { Link Here
117
            matchpoint                   => $matchpoint,
122
            matchpoint                   => $matchpoint,
118
            overwrite_cardnumber         => $input->param('overwrite_cardnumber'),
123
            overwrite_cardnumber         => $input->param('overwrite_cardnumber'),
119
            preserve_extended_attributes => $input->param('ext_preserve') || 0,
124
            preserve_extended_attributes => $input->param('ext_preserve') || 0,
125
            move_extended_attributes     => \%move,
120
        }
126
        }
121
    );
127
    );
122
128
Lines 157-163 else { Link Here
157
                  { code => "patron_attribute_" . $attr_type->code(), description => $attr_type->description() };
163
                  { code => "patron_attribute_" . $attr_type->code(), description => $attr_type->description() };
158
            }
164
            }
159
        }
165
        }
160
        $template->param( matchpoints => \@matchpoints );
166
        $template->param(
167
            matchpoints            => \@matchpoints,
168
            patron_attribute_types =>  [C4::Members::AttributeTypes::GetAttributeTypes()],
169
        );
161
    }
170
    }
162
}
171
}
163
172
164
- 

Return to bug 13717