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

(-)a/Koha/SimpleMARC.pm (-10 / +50 lines)
Lines 286-308 sub _update_subfield { Link Here
286
286
287
    if (@fields) {
287
    if (@fields) {
288
        unless ($dont_erase) {
288
        unless ($dont_erase) {
289
            @values = ( $values[0] ) x scalar(@fields)
289
290
                if @values == 1;
290
            # If we have only one value, apply it to all fields
291
            foreach my $field (@fields) {
291
            if ( @values == 1 ) {
292
                $field->update( "$subfieldName" => $values[ $i++ ] );
292
                foreach my $field (@fields) {
293
                    $field->update( "$subfieldName" => $values[0] );
294
                }
295
            } else {
296
297
                # For multiple values, we need to handle this differently to maintain order
298
                # First, update existing fields one-to-one with values
299
                my $values_per_field = scalar(@values) / scalar(@fields);
300
                my $remainder        = scalar(@values) % scalar(@fields);
301
302
                if ( scalar(@values) <= scalar(@fields) ) {
303
304
                    # We have fewer or equal values than fields - update sequentially
305
                    for my $i ( 0 .. $#values ) {
306
                        $fields[$i]->update( "$subfieldName" => $values[$i] );
307
                    }
308
309
                    # Remove extra fields if we have more fields than values
310
                    for my $i ( scalar(@values) .. $#fields ) {
311
                        $fields[$i]->delete_subfield( code => $subfieldName );
312
313
                        # Remove field entirely if it has no subfields left
314
                        $record->delete_field( $fields[$i] ) unless $fields[$i]->subfields();
315
                    }
316
                } else {
317
318
                    # We have more values than fields
319
                    # Update existing fields first
320
                    for my $i ( 0 .. $#fields ) {
321
                        $fields[$i]->update( "$subfieldName" => $values[$i] );
322
                    }
323
324
                    # Create new fields for remaining values, inserting them in the right position
325
                    for my $i ( scalar(@fields) .. $#values ) {
326
                        my $new_field = MARC::Field->new( $fieldName, '', '', "$subfieldName" => $values[$i] );
327
328
                        # Insert after the last existing field of this type
329
                        my $last_field = $fields[-1];
330
                        $record->insert_fields_after( $last_field, $new_field );
331
                    }
332
                }
293
            }
333
            }
294
        }
334
        } else {
295
        if ( $i <= scalar(@values) - 1 ) {
335
336
            # dont_erase is true (copy mode), add values to existing fields without erasing
296
            foreach my $field (@fields) {
337
            foreach my $field (@fields) {
297
                foreach my $j ( $i .. scalar(@values) - 1 ) {
338
                foreach my $value (@values) {
298
                    $field->add_subfields( "$subfieldName" => $values[$j] );
339
                    $field->add_subfields( "$subfieldName" => $value );
299
                }
340
                }
300
            }
341
            }
301
        }
342
        }
302
    } else {
343
    } else {
303
        ## Field does not exist, create it.
344
        ## Field does not exist, create it.
304
        foreach my $value (@values) {
345
        foreach my $value (@values) {
305
            my $field = MARC::Field->new( $fieldName, '', '', "$subfieldName" => $values[ $i++ ] );
346
            my $field = MARC::Field->new( $fieldName, '', '', "$subfieldName" => $value );
306
            $record->insert_fields_ordered($field);
347
            $record->insert_fields_ordered($field);
307
        }
348
        }
308
    }
349
    }
309
- 

Return to bug 32950