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

(-)a/C4/Items.pm (-86 lines)
Lines 414-457 If log_action is true or undefined, the action will be logged. Link Here
414
sub ModItem {
414
sub ModItem {
415
    my ( $item, $biblionumber, $itemnumber, $additional_params ) = @_;
415
    my ( $item, $biblionumber, $itemnumber, $additional_params ) = @_;
416
    my $log_action = $additional_params->{log_action} // 1;
416
    my $log_action = $additional_params->{log_action} // 1;
417
    my $unlinked_item_subfields = $additional_params->{unlinked_item_subfields};
418
419
    return unless %$item;
420
    $item->{'itemnumber'} = $itemnumber or return;
421
422
    # if $biblionumber is undefined, get it from the current item
423
    unless (defined $biblionumber) {
424
        $biblionumber = _get_single_item_column('biblionumber', $itemnumber);
425
    }
426
427
    if ($unlinked_item_subfields) {
428
        $item->{'more_subfields_xml'} = _get_unlinked_subfields_xml($unlinked_item_subfields);
429
    };
430
431
    my @fields = qw( itemlost withdrawn damaged );
432
433
    # Only retrieve the item if we need to set an "on" date field
434
    if ( $item->{itemlost} || $item->{withdrawn} || $item->{damaged} ) {
435
        my $pre_mod_item = Koha::Items->find( $item->{'itemnumber'} );
436
        for my $field (@fields) {
437
            if (    defined( $item->{$field} )
438
                and not $pre_mod_item->$field
439
                and $item->{$field} )
440
            {
441
                $item->{ $field . '_on' } =
442
                  DateTime::Format::MySQL->format_datetime( dt_from_string() );
443
            }
444
        }
445
    }
446
447
    # If the field is defined but empty, we are removing and,
448
    # and thus need to clear out the 'on' field as well
449
    for my $field (@fields) {
450
        if ( defined( $item->{$field} ) && !$item->{$field} ) {
451
            $item->{ $field . '_on' } = undef;
452
        }
453
    }
454
455
417
456
    _set_derived_columns_for_mod($item);
418
    _set_derived_columns_for_mod($item);
457
    _do_column_fixes_for_mod($item);
419
    _do_column_fixes_for_mod($item);
Lines 1305-1357 sub _set_derived_columns_for_add { Link Here
1305
    }
1267
    }
1306
}
1268
}
1307
1269
1308
=head2 _set_derived_columns_for_mod 
1309
1310
  _set_derived_column_for_mod($item);
1311
1312
Given an item hash representing a new item to be modified.
1313
calculate any derived columns.  Currently the only
1314
such column is C<items.cn_sort>.
1315
1316
This routine differs from C<_set_derived_columns_for_add>
1317
in that it needs to handle partial item records.  In other
1318
words, the caller of C<ModItem> may have supplied only one
1319
or two columns to be changed, so this function needs to
1320
determine whether any of the columns to be changed affect
1321
any of the derived columns.  Also, if a derived column
1322
depends on more than one column, but the caller is not
1323
changing all of then, this routine retrieves the unchanged
1324
values from the database in order to ensure a correct
1325
calculation.
1326
1327
=cut
1328
1329
sub _set_derived_columns_for_mod {
1330
    my $item = shift;
1331
1332
    foreach my $column (keys %derived_columns) {
1333
        my $builder = $derived_columns{$column}->{'BUILDER'};
1334
        my $source_values = {};
1335
        my %missing_sources = ();
1336
        my $must_recalc = 0;
1337
        foreach my $source_column (keys %{ $derived_columns{$column} }) {
1338
            next if $source_column eq 'BUILDER';
1339
            if (exists $item->{$source_column}) {
1340
                $must_recalc = 1;
1341
                $source_values->{$source_column} = $item->{$source_column};
1342
            } else {
1343
                $missing_sources{$source_column} = 1;
1344
            }
1345
        }
1346
        if ($must_recalc) {
1347
            foreach my $source_column (keys %missing_sources) {
1348
                $source_values->{$source_column} = _get_single_item_column($source_column, $item->{'itemnumber'});
1349
            }
1350
            $builder->($item, $source_values);
1351
        }
1352
    }
1353
}
1354
1355
=head2 _do_column_fixes_for_mod
1270
=head2 _do_column_fixes_for_mod
1356
1271
1357
  _do_column_fixes_for_mod($item);
1272
  _do_column_fixes_for_mod($item);
1358
- 

Return to bug 23463