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

(-)a/C4/Biblio.pm (-8 / +8 lines)
Lines 315-321 sub ModBiblio { Link Here
315
    # update biblionumber and biblioitemnumber in MARC
315
    # update biblionumber and biblioitemnumber in MARC
316
    # FIXME - this is assuming a 1 to 1 relationship between
316
    # FIXME - this is assuming a 1 to 1 relationship between
317
    # biblios and biblioitems
317
    # biblios and biblioitems
318
    my $sth = $dbh->prepare("select biblioitemnumber from biblioitems where biblionumber=? AND deleted_at IS NULL");
318
    my $sth = $dbh->prepare("select biblioitemnumber from biblioitems where biblionumber=? AND deleted_on IS NULL");
319
    $sth->execute($biblionumber);
319
    $sth->execute($biblionumber);
320
    my ($biblioitemnumber) = $sth->fetchrow;
320
    my ($biblioitemnumber) = $sth->fetchrow;
321
    $sth->finish();
321
    $sth->finish();
Lines 384-390 sub DelBiblio { Link Here
384
    my $error;    # for error handling
384
    my $error;    # for error handling
385
385
386
    # First make sure this biblio has no items attached
386
    # First make sure this biblio has no items attached
387
    my $sth = $dbh->prepare("SELECT itemnumber FROM items WHERE biblionumber=? AND deleted_at IS NULL");
387
    my $sth = $dbh->prepare("SELECT itemnumber FROM items WHERE biblionumber=? AND deleted_on IS NULL");
388
    $sth->execute($biblionumber);
388
    $sth->execute($biblionumber);
389
    if ( my $itemnumber = $sth->fetchrow ) {
389
    if ( my $itemnumber = $sth->fetchrow ) {
390
390
Lines 415-421 sub DelBiblio { Link Here
415
    ModZebra( $biblionumber, "recordDelete", "biblioserver" );
415
    ModZebra( $biblionumber, "recordDelete", "biblioserver" );
416
416
417
    # mark biblioitems and items as deleted
417
    # mark biblioitems and items as deleted
418
    $sth = $dbh->prepare("SELECT biblioitemnumber FROM biblioitems WHERE biblionumber=? AND deleted_at IS NULL");
418
    $sth = $dbh->prepare("SELECT biblioitemnumber FROM biblioitems WHERE biblionumber=? AND deleted_on IS NULL");
419
    $sth->execute($biblionumber);
419
    $sth->execute($biblionumber);
420
    while ( my $biblioitemnumber = $sth->fetchrow ) {
420
    while ( my $biblioitemnumber = $sth->fetchrow ) {
421
421
Lines 1133-1139 sub GetMarcBiblio { Link Here
1133
    }
1133
    }
1134
1134
1135
    my $dbh          = C4::Context->dbh;
1135
    my $dbh          = C4::Context->dbh;
1136
    my $sth          = $dbh->prepare("SELECT biblioitemnumber FROM biblioitems WHERE biblionumber=? AND deleted_at IS NULL");
1136
    my $sth          = $dbh->prepare("SELECT biblioitemnumber FROM biblioitems WHERE biblionumber=? AND deleted_on IS NULL");
1137
    $sth->execute($biblionumber);
1137
    $sth->execute($biblionumber);
1138
    my $row     = $sth->fetchrow_hashref;
1138
    my $row     = $sth->fetchrow_hashref;
1139
    my $biblioitemnumber = $row->{'biblioitemnumber'};
1139
    my $biblioitemnumber = $row->{'biblioitemnumber'};
Lines 2756-2762 sub EmbedItemsInMarcBiblio { Link Here
2756
2756
2757
    # ... and embed the current items
2757
    # ... and embed the current items
2758
    my $dbh = C4::Context->dbh;
2758
    my $dbh = C4::Context->dbh;
2759
    my $sth = $dbh->prepare("SELECT itemnumber FROM items WHERE biblionumber = ? and deleted_at IS NULL");
2759
    my $sth = $dbh->prepare("SELECT itemnumber FROM items WHERE biblionumber = ? and deleted_on IS NULL");
2760
    $sth->execute($biblionumber);
2760
    $sth->execute($biblionumber);
2761
    my @item_fields;
2761
    my @item_fields;
2762
    my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber", $frameworkcode );
2762
    my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber", $frameworkcode );
Lines 3086-3092 C<$biblionumber> - the biblionumber of the biblio (and metadata) to be marked as Link Here
3086
sub _koha_delete_biblio {
3086
sub _koha_delete_biblio {
3087
    my ( $dbh, $biblionumber ) = @_;
3087
    my ( $dbh, $biblionumber ) = @_;
3088
    _koha_delete_biblio_metadata( $biblionumber );
3088
    _koha_delete_biblio_metadata( $biblionumber );
3089
    my $sth = $dbh->prepare("UPDATE biblio SET deleted_at = NOW() WHERE biblionumber=?");
3089
    my $sth = $dbh->prepare("UPDATE biblio SET deleted_on = NOW() WHERE biblionumber=?");
3090
    return $sth->execute($biblionumber) ? undef : ($DBI::errstr || "unknown error");
3090
    return $sth->execute($biblionumber) ? undef : ($DBI::errstr || "unknown error");
3091
}
3091
}
3092
3092
Lines 3105-3111 C<$biblionumber> - the biblioitemnumber of the biblioitem to be marked as delet Link Here
3105
3105
3106
sub _koha_delete_biblioitems {
3106
sub _koha_delete_biblioitems {
3107
    my ( $dbh, $biblioitemnumber ) = @_;
3107
    my ( $dbh, $biblioitemnumber ) = @_;
3108
    my $sth = $dbh->prepare("UPDATE biblioitems SET deleted_at = NOW() WHERE biblioitemnumber=?");
3108
    my $sth = $dbh->prepare("UPDATE biblioitems SET deleted_on = NOW() WHERE biblioitemnumber=?");
3109
    return $sth->execute($biblioitemnumber) ? undef : ($DBI::errstr || 'unknown error');
3109
    return $sth->execute($biblioitemnumber) ? undef : ($DBI::errstr || 'unknown error');
3110
}
3110
}
3111
3111
Lines 3120-3126 C<$biblionumber> - the biblionumber of the biblio metadata to be marked as dele Link Here
3120
sub _koha_delete_biblio_metadata {
3120
sub _koha_delete_biblio_metadata {
3121
    my ($biblionumber) = @_;
3121
    my ($biblionumber) = @_;
3122
    my $dbh = C4::Context->dbh;
3122
    my $dbh = C4::Context->dbh;
3123
    my $sth = $dbh->prepare("UPDATE biblio_metadata SET deleted_at = NOW() WHERE biblionumber=?");
3123
    my $sth = $dbh->prepare("UPDATE biblio_metadata SET deleted_on = NOW() WHERE biblionumber=?");
3124
    return $sth->execute($biblionumber);
3124
    return $sth->execute($biblionumber);
3125
}
3125
}
3126
3126
(-)a/C4/Circulation.pm (-1 / +1 lines)
Lines 1806-1812 sub AddReturn { Link Here
1806
    unless ($item) {
1806
    unless ($item) {
1807
        return ( 0, { BadBarcode => $barcode } );    # no barcode means no item or borrower.  bail out.
1807
        return ( 0, { BadBarcode => $barcode } );    # no barcode means no item or borrower.  bail out.
1808
    }
1808
    }
1809
    if ($item->{deleted_at}) {
1809
    if ($item->{deleted_on}) {
1810
        return ( 0, { BadBarcode => $barcode } );
1810
        return ( 0, { BadBarcode => $barcode } );
1811
    }
1811
    }
1812
1812
(-)a/C4/Items.pm (-10 / +10 lines)
Lines 838-844 sub GetItemsForInventory { Link Here
838
        FROM items
838
        FROM items
839
        LEFT JOIN biblio ON items.biblionumber = biblio.biblionumber
839
        LEFT JOIN biblio ON items.biblionumber = biblio.biblionumber
840
        LEFT JOIN biblioitems on items.biblionumber = biblioitems.biblionumber
840
        LEFT JOIN biblioitems on items.biblionumber = biblioitems.biblionumber
841
        WHERE (items.deleted_at IS NULL AND biblio.deleted_at IS NULL AND biblioitems.deleted_at IS NULL)
841
        WHERE (items.deleted_on IS NULL AND biblio.deleted_on IS NULL AND biblioitems.deleted_on IS NULL)
842
    };
842
    };
843
    if ($statushash){
843
    if ($statushash){
844
        for my $authvfield (keys %$statushash){
844
        for my $authvfield (keys %$statushash){
Lines 945-951 Called by C<C4::XISBN> Link Here
945
sub GetItemsByBiblioitemnumber {
945
sub GetItemsByBiblioitemnumber {
946
    my ( $bibitem ) = @_;
946
    my ( $bibitem ) = @_;
947
    my $dbh = C4::Context->dbh;
947
    my $dbh = C4::Context->dbh;
948
    my $sth = $dbh->prepare("SELECT * FROM items WHERE items.biblioitemnumber = ? AND items.deleted_at IS NULL") || die $dbh->errstr;
948
    my $sth = $dbh->prepare("SELECT * FROM items WHERE items.biblioitemnumber = ? AND items.deleted_on IS NULL") || die $dbh->errstr;
949
    # Get all items attached to a biblioitem
949
    # Get all items attached to a biblioitem
950
    my $i = 0;
950
    my $i = 0;
951
    my @results;
951
    my @results;
Lines 1069-1075 sub GetItemsInfo { Link Here
1069
        FROM items
1069
        FROM items
1070
        LEFT JOIN branches AS holding ON items.holdingbranch = holding.branchcode
1070
        LEFT JOIN branches AS holding ON items.holdingbranch = holding.branchcode
1071
        LEFT JOIN branches AS home ON items.homebranch=home.branchcode
1071
        LEFT JOIN branches AS home ON items.homebranch=home.branchcode
1072
        LEFT JOIN biblio      ON      biblio.biblionumber     = items.biblionumber AND biblio.deleted_at IS NULL
1072
        LEFT JOIN biblio      ON      biblio.biblionumber     = items.biblionumber AND biblio.deleted_on IS NULL
1073
        LEFT JOIN biblioitems ON biblioitems.biblioitemnumber = items.biblioitemnumber
1073
        LEFT JOIN biblioitems ON biblioitems.biblioitemnumber = items.biblioitemnumber
1074
        LEFT JOIN issues USING (itemnumber)
1074
        LEFT JOIN issues USING (itemnumber)
1075
        LEFT JOIN borrowers USING (borrowernumber)
1075
        LEFT JOIN borrowers USING (borrowernumber)
Lines 1083-1089 sub GetItemsInfo { Link Here
1083
            AND localization.lang = ?
1083
            AND localization.lang = ?
1084
    |;
1084
    |;
1085
1085
1086
    $query .= " WHERE items.biblionumber = ? AND items.deleted_at IS NULL ORDER BY home.branchname, items.enumchron, LPAD( items.copynumber, 8, '0' ), items.dateaccessioned DESC" ;
1086
    $query .= " WHERE items.biblionumber = ? AND items.deleted_on IS NULL ORDER BY home.branchname, items.enumchron, LPAD( items.copynumber, 8, '0' ), items.dateaccessioned DESC" ;
1087
    my $sth = $dbh->prepare($query);
1087
    my $sth = $dbh->prepare($query);
1088
    $sth->execute($language, $biblionumber);
1088
    $sth->execute($language, $biblionumber);
1089
    my $i = 0;
1089
    my $i = 0;
Lines 1190-1196 sub GetItemsLocationInfo { Link Here
1190
                location, itemcallnumber, cn_sort
1190
                location, itemcallnumber, cn_sort
1191
                FROM items, branches as a, branches as b
1191
                FROM items, branches as a, branches as b
1192
                WHERE homebranch = a.branchcode AND holdingbranch = b.branchcode
1192
                WHERE homebranch = a.branchcode AND holdingbranch = b.branchcode
1193
                AND biblionumber = ? AND deleted_at IS NULL
1193
                AND biblionumber = ? AND deleted_on IS NULL
1194
                ORDER BY cn_sort ASC";
1194
                ORDER BY cn_sort ASC";
1195
    my $sth = $dbh->prepare($query);
1195
    my $sth = $dbh->prepare($query);
1196
        $sth->execute($biblionumber);
1196
        $sth->execute($biblionumber);
Lines 1261-1267 sub GetLastAcquisitions { Link Here
1261
    my $number_of_branches = @{$data->{branches}};
1261
    my $number_of_branches = @{$data->{branches}};
1262
    my $number_of_itemtypes   = @{$data->{itemtypes}};
1262
    my $number_of_itemtypes   = @{$data->{itemtypes}};
1263
1263
1264
    my @where = ('WHERE (items.deleted_at IS NULL AND biblio.deleted_at IS NULL AND biblioitems.deleted_at IS NULL)');
1264
    my @where = ('WHERE (items.deleted_on IS NULL AND biblio.deleted_on IS NULL AND biblioitems.deleted_on IS NULL)');
1265
    $number_of_branches and push @where
1265
    $number_of_branches and push @where
1266
       , 'AND holdingbranch IN ('
1266
       , 'AND holdingbranch IN ('
1267
       , join(',', ('?') x $number_of_branches )
1267
       , join(',', ('?') x $number_of_branches )
Lines 1308-1314 sub GetItemnumbersForBiblio { Link Here
1308
    my $biblionumber = shift;
1308
    my $biblionumber = shift;
1309
    my @items;
1309
    my @items;
1310
    my $dbh = C4::Context->dbh;
1310
    my $dbh = C4::Context->dbh;
1311
    my $sth = $dbh->prepare("SELECT itemnumber FROM items WHERE biblionumber = ? AND deleted_at IS NULL");
1311
    my $sth = $dbh->prepare("SELECT itemnumber FROM items WHERE biblionumber = ? AND deleted_on IS NULL");
1312
    $sth->execute($biblionumber);
1312
    $sth->execute($biblionumber);
1313
    while (my $result = $sth->fetchrow_hashref) {
1313
    while (my $result = $sth->fetchrow_hashref) {
1314
        push @items, $result->{'itemnumber'};
1314
        push @items, $result->{'itemnumber'};
Lines 2084-2090 sub _koha_delete_item { Link Here
2084
2084
2085
    my $dbh = C4::Context->dbh;
2085
    my $dbh = C4::Context->dbh;
2086
2086
2087
    my $sth = $dbh->prepare("UPDATE items SET deleted_at = NOW() WHERE itemnumber = ?");
2087
    my $sth = $dbh->prepare("UPDATE items SET deleted_on = NOW() WHERE itemnumber = ?");
2088
    my $deleted = $sth->execute($itemnum);
2088
    my $deleted = $sth->execute($itemnum);
2089
    return ( $deleted == 1 ) ? 1 : 0;
2089
    return ( $deleted == 1 ) ? 1 : 0;
2090
}
2090
}
Lines 2449-2455 sub SearchItems { Link Here
2449
            LEFT JOIN biblio ON biblio.biblionumber = items.biblionumber
2449
            LEFT JOIN biblio ON biblio.biblionumber = items.biblionumber
2450
            LEFT JOIN biblioitems ON biblioitems.biblioitemnumber = items.biblioitemnumber
2450
            LEFT JOIN biblioitems ON biblioitems.biblioitemnumber = items.biblioitemnumber
2451
            LEFT JOIN biblio_metadata ON biblio_metadata.biblionumber = biblio.biblionumber
2451
            LEFT JOIN biblio_metadata ON biblio_metadata.biblionumber = biblio.biblionumber
2452
            WHERE items.deleted_at IS NULL
2452
            WHERE items.deleted_on IS NULL
2453
    };
2453
    };
2454
    if (defined $where_str and $where_str ne '') {
2454
    if (defined $where_str and $where_str ne '') {
2455
        $query .= qq{ AND $where_str };
2455
        $query .= qq{ AND $where_str };
Lines 2800-2806 sub ToggleNewStatus { Link Here
2800
            SELECT items.biblionumber, items.itemnumber
2800
            SELECT items.biblionumber, items.itemnumber
2801
            FROM items
2801
            FROM items
2802
            LEFT JOIN biblioitems ON biblioitems.biblionumber = items.biblionumber
2802
            LEFT JOIN biblioitems ON biblioitems.biblionumber = items.biblionumber
2803
            WHERE items.deleted_at IS NULL
2803
            WHERE items.deleted_on IS NULL
2804
        |;
2804
        |;
2805
        for my $condition ( @$conditions ) {
2805
        for my $condition ( @$conditions ) {
2806
            if (
2806
            if (
(-)a/C4/Reserves.pm (-2 / +2 lines)
Lines 1132-1138 sub IsAvailableForItemLevelRequest { Link Here
1132
        return 1;
1132
        return 1;
1133
    } elsif ( $on_shelf_holds == 2 ) {
1133
    } elsif ( $on_shelf_holds == 2 ) {
1134
        my @items =
1134
        my @items =
1135
          Koha::Items->search( { biblionumber => $item->{biblionumber}, deleted_at => undef } );
1135
          Koha::Items->search( { biblionumber => $item->{biblionumber}, deleted_on => undef } );
1136
1136
1137
        my $any_available = 0;
1137
        my $any_available = 0;
1138
1138
Lines 2054-2060 sub GetMaxPatronHoldsForRecord { Link Here
2054
    my ( $borrowernumber, $biblionumber ) = @_;
2054
    my ( $borrowernumber, $biblionumber ) = @_;
2055
2055
2056
    my $patron = Koha::Patrons->find($borrowernumber);
2056
    my $patron = Koha::Patrons->find($borrowernumber);
2057
    my @items = Koha::Items->search( { biblionumber => $biblionumber, deleted_at => undef } );
2057
    my @items = Koha::Items->search( { biblionumber => $biblionumber, deleted_on => undef } );
2058
2058
2059
    my $controlbranch = C4::Context->preference('ReservesControlBranch');
2059
    my $controlbranch = C4::Context->preference('ReservesControlBranch');
2060
2060
(-)a/Koha/Biblio.pm (-1 / +1 lines)
Lines 250-256 or list of Koha::Item objects in list context. Link Here
250
sub items {
250
sub items {
251
    my ($self) = @_;
251
    my ($self) = @_;
252
252
253
    $self->{_items} ||= Koha::Items->search( { biblionumber => $self->biblionumber(), deleted_at => undef } );
253
    $self->{_items} ||= Koha::Items->search( { biblionumber => $self->biblionumber(), deleted_on => undef } );
254
254
255
    return wantarray ? $self->{_items}->as_list : $self->{_items};
255
    return wantarray ? $self->{_items}->as_list : $self->{_items};
256
}
256
}
(-)a/Koha/Filter/MARC/EmbedItemsAvailability.pm (-1 / +1 lines)
Lines 79-85 sub _processrecord { Link Here
79
    my $not_onloan_items = Koha::Items->search({
79
    my $not_onloan_items = Koha::Items->search({
80
        biblionumber => $biblionumber,
80
        biblionumber => $biblionumber,
81
        onloan => undef,
81
        onloan => undef,
82
        deleted_at => undef,
82
        deleted_on => undef,
83
    })->count;
83
    })->count;
84
84
85
    # check for field 999
85
    # check for field 999
(-)a/Koha/OAI/Server/GetRecord.pm (-3 / +3 lines)
Lines 39-45 sub new { Link Here
39
    my $sql = "
39
    my $sql = "
40
        SELECT timestamp
40
        SELECT timestamp
41
        FROM   biblioitems
41
        FROM   biblioitems
42
        WHERE  biblionumber=? AND deleted_at IS NULL
42
        WHERE  biblionumber=? AND deleted_on IS NULL
43
    ";
43
    ";
44
    my @bind_params = ($biblionumber);
44
    my @bind_params = ($biblionumber);
45
    if ( $items_included ) {
45
    if ( $items_included ) {
Lines 63-69 sub new { Link Here
63
        $sql = "
63
        $sql = "
64
            SELECT timestamp
64
            SELECT timestamp
65
            FROM biblio
65
            FROM biblio
66
            WHERE biblionumber=? AND deleted_at IS NOT NULL
66
            WHERE biblionumber=? AND deleted_on IS NOT NULL
67
        ";
67
        ";
68
        @bind_params = ($biblionumber);
68
        @bind_params = ($biblionumber);
69
69
Lines 72-78 sub new { Link Here
72
            $sql .= "
72
            $sql .= "
73
                UNION
73
                UNION
74
                SELECT timestamp from items
74
                SELECT timestamp from items
75
                WHERE biblionumber=? AND deleted_at IS NULL
75
                WHERE biblionumber=? AND deleted_on IS NULL
76
            ";
76
            ";
77
            push @bind_params, $biblionumber;
77
            push @bind_params, $biblionumber;
78
            $sql = "
78
            $sql = "
(-)a/Koha/OAI/Server/ListBase.pm (-4 / +4 lines)
Lines 52-58 sub GetRecords { Link Here
52
    my $include_items = $repository->items_included( $format );
52
    my $include_items = $repository->items_included( $format );
53
53
54
    my $sql = "
54
    my $sql = "
55
        SELECT biblionumber, deleted_at
55
        SELECT biblionumber, deleted_on
56
        FROM biblio_metadata
56
        FROM biblio_metadata
57
        WHERE (timestamp >= ? AND timestamp <= ?)
57
        WHERE (timestamp >= ? AND timestamp <= ?)
58
    ";
58
    ";
Lines 96-102 sub GetRecords { Link Here
96
    my $record_sth = $dbh->prepare( $sql ) || die( 'Could not prepare statement: ' . $dbh->errstr );
96
    my $record_sth = $dbh->prepare( $sql ) || die( 'Could not prepare statement: ' . $dbh->errstr );
97
97
98
    $sth->execute( @bind_params ) || die( 'Could not execute statement: ' . $sth->errstr );
98
    $sth->execute( @bind_params ) || die( 'Could not execute statement: ' . $sth->errstr );
99
    while ( my ($biblionumber, $deleted_at) = $sth->fetchrow ) {
99
    while ( my ($biblionumber, $deleted_on) = $sth->fetchrow ) {
100
        $count++;
100
        $count++;
101
        if ( $count > $max ) {
101
        if ( $count > $max ) {
102
            $self->resumptionToken(
102
            $self->resumptionToken(
Lines 120-126 sub GetRecords { Link Here
120
            push @setSpecs, $_->{spec};
120
            push @setSpecs, $_->{spec};
121
        }
121
        }
122
        if ( $metadata ) {
122
        if ( $metadata ) {
123
            my $marcxml = !$deleted_at ? $repository->get_biblio_marcxml($biblionumber, $format) : undef;
123
            my $marcxml = !$deleted_on ? $repository->get_biblio_marcxml($biblionumber, $format) : undef;
124
            if ( $marcxml ) {
124
            if ( $marcxml ) {
125
                $self->record( Koha::OAI::Server::Record->new(
125
                $self->record( Koha::OAI::Server::Record->new(
126
                    $repository, $marcxml, $timestamp, \@setSpecs,
126
                    $repository, $marcxml, $timestamp, \@setSpecs,
Lines 138-144 sub GetRecords { Link Here
138
            $self->identifier( new HTTP::OAI::Header(
138
            $self->identifier( new HTTP::OAI::Header(
139
                identifier => $repository->{ koha_identifier} . ':' . $biblionumber,
139
                identifier => $repository->{ koha_identifier} . ':' . $biblionumber,
140
                datestamp  => $timestamp,
140
                datestamp  => $timestamp,
141
                status     => $deleted_at ? 'deleted' : undef
141
                status     => $deleted_on ? 'deleted' : undef
142
            ) );
142
            ) );
143
        }
143
        }
144
    }
144
    }
(-)a/Koha/Patron.pm (-1 / +1 lines)
Lines 326-332 sub do_check_for_previous_checkout { Link Here
326
    my ( $self, $item ) = @_;
326
    my ( $self, $item ) = @_;
327
327
328
    # Find all items for bib and extract item numbers.
328
    # Find all items for bib and extract item numbers.
329
    my @items = Koha::Items->search({biblionumber => $item->{biblionumber}, deleted_at => undef });
329
    my @items = Koha::Items->search({biblionumber => $item->{biblionumber}, deleted_on => undef });
330
    my @item_nos;
330
    my @item_nos;
331
    foreach my $item (@items) {
331
    foreach my $item (@items) {
332
        push @item_nos, $item->itemnumber;
332
        push @item_nos, $item->itemnumber;
(-)a/about.pl (-10 lines)
Lines 441-454 if ( C4::Context->preference('WebBasedSelfCheck') Link Here
441
        q|select b.borrowernumber from borrowers b join deletedborrowers db on b.borrowernumber=db.borrowernumber|,
441
        q|select b.borrowernumber from borrowers b join deletedborrowers db on b.borrowernumber=db.borrowernumber|,
442
        { Slice => {} }
442
        { Slice => {} }
443
    );
443
    );
444
    my $biblios = $dbh->selectall_arrayref(
445
        q|select b.biblionumber from biblio b join deletedbiblio db on b.biblionumber=db.biblionumber|,
446
        { Slice => {} }
447
    );
448
    my $items = $dbh->selectall_arrayref(
449
        q|select i.itemnumber from items i join deleteditems di on i.itemnumber=di.itemnumber|,
450
        { Slice => {} }
451
    );
452
    my $checkouts = $dbh->selectall_arrayref(
444
    my $checkouts = $dbh->selectall_arrayref(
453
        q|select i.issue_id from issues i join old_issues oi on i.issue_id=oi.issue_id|,
445
        q|select i.issue_id from issues i join old_issues oi on i.issue_id=oi.issue_id|,
454
        { Slice => {} }
446
        { Slice => {} }
Lines 461-468 if ( C4::Context->preference('WebBasedSelfCheck') Link Here
461
        $template->param(
453
        $template->param(
462
            has_ai_issues => 1,
454
            has_ai_issues => 1,
463
            ai_patrons    => $patrons,
455
            ai_patrons    => $patrons,
464
            ai_biblios    => $biblios,
465
            ai_items      => $items,
466
            ai_checkouts  => $checkouts,
456
            ai_checkouts  => $checkouts,
467
            ai_holds      => $holds,
457
            ai_holds      => $holds,
468
        );
458
        );
(-)a/admin/branches.pl (-1 / +1 lines)
Lines 109-115 if ( $op eq 'add_form' ) { Link Here
109
        {   -or => {
109
        {   -or => {
110
                holdingbranch => $branchcode,
110
                holdingbranch => $branchcode,
111
                homebranch    => $branchcode,
111
                homebranch    => $branchcode,
112
                deleted_at    => undef,
112
                deleted_on    => undef,
113
            },
113
            },
114
        }
114
        }
115
    )->count;
115
    )->count;
(-)a/cataloguing/merge.pl (-1 / +1 lines)
Lines 88-94 if ($merge) { Link Here
88
88
89
    # Moving items from the other record to the reference record
89
    # Moving items from the other record to the reference record
90
    foreach my $biblionumber (@biblionumbers) {
90
    foreach my $biblionumber (@biblionumbers) {
91
        my $items = Koha::Items->search({ biblionumber => $biblionumber, deleted_at => undef });
91
        my $items = Koha::Items->search({ biblionumber => $biblionumber, deleted_on => undef });
92
        while ( my $item = $items->next) {
92
        while ( my $item = $items->next) {
93
            my $res = MoveItemFromBiblio( $item->itemnumber, $biblionumber, $ref_biblionumber );
93
            my $res = MoveItemFromBiblio( $item->itemnumber, $biblionumber, $ref_biblionumber );
94
            if ( not defined $res ) {
94
            if ( not defined $res ) {
(-)a/installer/data/mysql/atomicupdate/bug_20271_-_merge_deletedbiblio_and_deleteitems_tables_with_their_alive_cousins.perl (-9 / +9 lines)
Lines 1-26 Link Here
1
$DBversion = 'XXX';  # will be replaced by the RM
1
$DBversion = 'XXX';  # will be replaced by the RM
2
if( CheckVersion( $DBversion ) ) {
2
if( CheckVersion( $DBversion ) ) {
3
    $dbh->do( "ALTER TABLE biblio ADD COLUMN deleted_at datetime DEFAULT NULL" ) or warn $DBI::errstr;
3
    $dbh->do( "ALTER TABLE biblio ADD COLUMN deleted_on datetime DEFAULT NULL" ) or warn $DBI::errstr;
4
    $dbh->do( "ALTER TABLE biblioitems ADD COLUMN deleted_at datetime DEFAULT NULL" ) or warn $DBI::errstr;
4
    $dbh->do( "ALTER TABLE biblioitems ADD COLUMN deleted_on datetime DEFAULT NULL" ) or warn $DBI::errstr;
5
    $dbh->do( "ALTER TABLE biblio_metadata ADD COLUMN deleted_at datetime DEFAULT NULL" ) or warn $DBI::errstr;
5
    $dbh->do( "ALTER TABLE biblio_metadata ADD COLUMN deleted_on datetime DEFAULT NULL" ) or warn $DBI::errstr;
6
    $dbh->do( "ALTER TABLE items ADD COLUMN deleted_at datetime DEFAULT NULL" ) or warn $DBI::errstr;
6
    $dbh->do( "ALTER TABLE items ADD COLUMN deleted_on datetime DEFAULT NULL" ) or warn $DBI::errstr;
7
7
8
    # Need to disable foreign keys on deletedbiblio_metadata to avoid cascading deletes from deletedbiblio
8
    # Need to disable foreign keys on deletedbiblio_metadata to avoid cascading deletes from deletedbiblio
9
    # Bug 17196 introduced a mismatch in foreign keys of deletedbiblio_metadata, so any key must be dropped
9
    # Bug 17196 introduced a mismatch in foreign keys of deletedbiblio_metadata, so any key must be dropped
10
    DropAllForeignKeys('deletedbiblio_metadata');
10
    DropAllForeignKeys('deletedbiblio_metadata');
11
    $dbh->do( "INSERT IGNORE INTO biblio SELECT *, timestamp AS deleted_at FROM deletedbiblio" ) or warn $DBI::errstr;
11
    $dbh->do( "INSERT IGNORE INTO biblio SELECT *, timestamp AS deleted_on FROM deletedbiblio" ) or warn $DBI::errstr;
12
    # We also need to make sure foreign keys references are in place, as Mysql < 5.7 aborts on foreign key errors
12
    # We also need to make sure foreign keys references are in place, as Mysql < 5.7 aborts on foreign key errors
13
    $dbh->do( "INSERT IGNORE INTO biblioitems (
13
    $dbh->do( "INSERT IGNORE INTO biblioitems (
14
        SELECT *, timestamp AS deleted_at FROM deletedbiblioitems
14
        SELECT *, timestamp AS deleted_on FROM deletedbiblioitems
15
        WHERE biblionumber IN (SELECT biblionumber FROM biblio)
15
        WHERE biblionumber IN (SELECT biblionumber FROM biblio)
16
    )" ) or warn $DBI::errstr;
16
    )" ) or warn $DBI::errstr;
17
    # biblio_metadata needs special handling since there is an extra autoincrement id that cannot be moved
17
    # biblio_metadata needs special handling since there is an extra autoincrement id that cannot be moved
18
    $dbh->do( "INSERT IGNORE INTO biblio_metadata (biblionumber, format, marcflavour, metadata, timestamp, deleted_at) (
18
    $dbh->do( "INSERT IGNORE INTO biblio_metadata (biblionumber, format, marcflavour, metadata, timestamp, deleted_on) (
19
        SELECT biblionumber, format, marcflavour, metadata, timestamp, timestamp AS deleted_at FROM deletedbiblio_metadata
19
        SELECT biblionumber, format, marcflavour, metadata, timestamp, timestamp AS deleted_on FROM deletedbiblio_metadata
20
        WHERE biblionumber IN (SELECT biblionumber FROM biblio)
20
        WHERE biblionumber IN (SELECT biblionumber FROM biblio)
21
    )" ) or warn $DBI::errstr;
21
    )" ) or warn $DBI::errstr;
22
    $dbh->do( "INSERT IGNORE INTO items (
22
    $dbh->do( "INSERT IGNORE INTO items (
23
        SELECT *, timestamp AS deleted_at FROM deleteditems
23
        SELECT *, timestamp AS deleted_on FROM deleteditems
24
        WHERE biblioitemnumber IN (SELECT biblioitemnumber FROM biblioitems)
24
        WHERE biblioitemnumber IN (SELECT biblioitemnumber FROM biblioitems)
25
        AND homebranch IN (SELECT homebranch FROM branches)
25
        AND homebranch IN (SELECT homebranch FROM branches)
26
        AND holdingbranch IN (SELECT holdingbranch FROM branches)
26
        AND holdingbranch IN (SELECT holdingbranch FROM branches)
(-)a/installer/data/mysql/kohastructure.sql (-4 / +4 lines)
Lines 140-146 CREATE TABLE `biblio` ( -- table that stores bibliographic information Link Here
140
  `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, -- date and time this record was last touched
140
  `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, -- date and time this record was last touched
141
  `datecreated` DATE NOT NULL, -- the date this record was added to Koha
141
  `datecreated` DATE NOT NULL, -- the date this record was added to Koha
142
  `abstract` LONGTEXT, -- summary from the MARC record (520$a in MARC21)
142
  `abstract` LONGTEXT, -- summary from the MARC record (520$a in MARC21)
143
  `deleted_at` datetime DEFAULT NULL, -- timestamp of deletion
143
  `deleted_on` datetime DEFAULT NULL, -- timestamp of deletion
144
  PRIMARY KEY  (`biblionumber`),
144
  PRIMARY KEY  (`biblionumber`),
145
  KEY `blbnoidx` (`biblionumber`)
145
  KEY `blbnoidx` (`biblionumber`)
146
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
146
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Lines 194-200 CREATE TABLE `biblioitems` ( -- information related to bibliographic records in Link Here
194
  `cn_sort` varchar(255) default NULL, -- normalized version of the call number used for sorting
194
  `cn_sort` varchar(255) default NULL, -- normalized version of the call number used for sorting
195
  `agerestriction` varchar(255) default NULL, -- target audience/age restriction from the bib record (MARC21 521$a)
195
  `agerestriction` varchar(255) default NULL, -- target audience/age restriction from the bib record (MARC21 521$a)
196
  `totalissues` int(10),
196
  `totalissues` int(10),
197
  `deleted_at` datetime DEFAULT NULL, -- timestamp of deletion
197
  `deleted_on` datetime DEFAULT NULL, -- timestamp of deletion
198
  PRIMARY KEY  (`biblioitemnumber`),
198
  PRIMARY KEY  (`biblioitemnumber`),
199
  KEY `bibinoidx` (`biblioitemnumber`),
199
  KEY `bibinoidx` (`biblioitemnumber`),
200
  KEY `bibnoidx` (`biblionumber`),
200
  KEY `bibnoidx` (`biblionumber`),
Lines 800-806 CREATE TABLE `items` ( -- holdings/item information Link Here
800
  `copynumber` varchar(32) default NULL, -- copy number (MARC21 952$t)
800
  `copynumber` varchar(32) default NULL, -- copy number (MARC21 952$t)
801
  `stocknumber` varchar(32) default NULL, -- inventory number (MARC21 952$i)
801
  `stocknumber` varchar(32) default NULL, -- inventory number (MARC21 952$i)
802
  `new_status` VARCHAR(32) DEFAULT NULL, -- 'new' value, you can put whatever free-text information. This field is intented to be managed by the automatic_item_modification_by_age cronjob.
802
  `new_status` VARCHAR(32) DEFAULT NULL, -- 'new' value, you can put whatever free-text information. This field is intented to be managed by the automatic_item_modification_by_age cronjob.
803
  `deleted_at` datetime DEFAULT NULL, -- timestamp of deletion
803
  `deleted_on` datetime DEFAULT NULL, -- timestamp of deletion
804
  PRIMARY KEY  (`itemnumber`),
804
  PRIMARY KEY  (`itemnumber`),
805
  UNIQUE KEY `itembarcodeidx` (`barcode`),
805
  UNIQUE KEY `itembarcodeidx` (`barcode`),
806
  KEY `itemstocknumberidx` (`stocknumber`),
806
  KEY `itemstocknumberidx` (`stocknumber`),
Lines 3833-3839 CREATE TABLE biblio_metadata ( Link Here
3833
    `marcflavour` VARCHAR(16) NOT NULL,
3833
    `marcflavour` VARCHAR(16) NOT NULL,
3834
    `metadata` LONGTEXT NOT NULL,
3834
    `metadata` LONGTEXT NOT NULL,
3835
    `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
3835
    `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
3836
    `deleted_at` datetime DEFAULT NULL, -- timestamp of deletion
3836
    `deleted_on` datetime DEFAULT NULL, -- timestamp of deletion
3837
    PRIMARY KEY(id),
3837
    PRIMARY KEY(id),
3838
    UNIQUE KEY `biblio_metadata_uniq_key` (`biblionumber`,`format`,`marcflavour`),
3838
    UNIQUE KEY `biblio_metadata_uniq_key` (`biblionumber`,`format`,`marcflavour`),
3839
    CONSTRAINT `record_metadata_fk_1` FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE CASCADE,
3839
    CONSTRAINT `record_metadata_fk_1` FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE CASCADE,
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/web_services.pref (-2 / +2 lines)
Lines 40-51 Web services: Link Here
40
                  no: Disable
40
                  no: Disable
41
            - automatic update of OAI-PMH sets when a bibliographic record is created or updated
41
            - automatic update of OAI-PMH sets when a bibliographic record is created or updated
42
        -
42
        -
43
            - Koha's deletedbiblio table
43
            - Koha deleted records
44
            - pref: "OAI-PMH:DeletedRecord"
44
            - pref: "OAI-PMH:DeletedRecord"
45
              choices:
45
              choices:
46
                  persistent: will never be emptied or truncated (persistent)
46
                  persistent: will never be emptied or truncated (persistent)
47
                  transient: might be emptied or truncated at some point (transient)
47
                  transient: might be emptied or truncated at some point (transient)
48
                  no: will never have any data in it (no)
48
                  no: will not be persisted (no)
49
            - "."
49
            - "."
50
    ILS-DI:
50
    ILS-DI:
51
        -
51
        -
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/reports/catalogue_stats.tt (-4 / +4 lines)
Lines 229-236 Link Here
229
            </tr>
229
            </tr>
230
            <tr id="removeddatetr">
230
            <tr id="removeddatetr">
231
                <td>Date deleted (item)</td>
231
                <td>Date deleted (item)</td>
232
                <td><input type="radio" name="Line" value="deleteditems.timestamp" /></td>
232
                <td><input type="radio" name="Line" value="items.deleted_on" /></td>
233
                <td><input type="radio" name="Column" value="deleteditems.timestamp" /></td>
233
                <td><input type="radio" name="Column" value="items.deleted_on" /></td>
234
                <td>
234
                <td>
235
                    <label for="deldateFrom">From</label>
235
                    <label for="deldateFrom">From</label>
236
                    <input type="text" name="Filter" id="deldateFrom" class="datepicker" />
236
                    <input type="text" name="Filter" id="deldateFrom" class="datepicker" />
Lines 305-316 Link Here
305
            var Cellvalue = $("input[name='Cellvalue']:checked").val();
305
            var Cellvalue = $("input[name='Cellvalue']:checked").val();
306
            if(Cellvalue == "deleteditems") {
306
            if(Cellvalue == "deleteditems") {
307
                $("#removeddatetr").show();
307
                $("#removeddatetr").show();
308
                $("input[value='deleteditems.timestamp']").prop('disabled', false);
308
                $("input[value='items.deleted_on']").prop('disabled', false);
309
                $("#deldateFrom").prop('disabled', false);
309
                $("#deldateFrom").prop('disabled', false);
310
                $("#deldateTo").prop('disabled', false);
310
                $("#deldateTo").prop('disabled', false);
311
            } else {
311
            } else {
312
                $("#removeddatetr").hide();
312
                $("#removeddatetr").hide();
313
                $("input[value='deleteditems.timestamp']").prop('disabled', true).prop('checked', false);
313
                $("input[value='items.deleted_on']").prop('disabled', true).prop('checked', false);
314
                $("#deldateFrom").prop('disabled', true).val('');
314
                $("#deldateFrom").prop('disabled', true).val('');
315
                $("#deldateTo").prop('disabled', true).val('');
315
                $("#deldateTo").prop('disabled', true).val('');
316
            }
316
            }
(-)a/labels/label-item-search.pl (-1 / +1 lines)
Lines 137-143 if ($show_results) { Link Here
137
        push (@results_set, $biblio);
137
        push (@results_set, $biblio);
138
        my $biblionumber = $biblio->{'biblionumber'};
138
        my $biblionumber = $biblio->{'biblionumber'};
139
        #DEBUG Notes: Grab the item numbers associated with this MARC record...
139
        #DEBUG Notes: Grab the item numbers associated with this MARC record...
140
        my $items = Koha::Items->search({ biblionumber => $biblionumber, deleted_at => undef }, { order_by => { -desc => 'itemnumber' }});
140
        my $items = Koha::Items->search({ biblionumber => $biblionumber, deleted_on => undef }, { order_by => { -desc => 'itemnumber' }});
141
        #DEBUG Notes: Retrieve the item data for each number...
141
        #DEBUG Notes: Retrieve the item data for each number...
142
        while ( my $item = $items->next ) {
142
        while ( my $item = $items->next ) {
143
            #DEBUG Notes: Build an array element 'item' of the correct bib (results) hash which contains item-specific data...
143
            #DEBUG Notes: Build an array element 'item' of the correct bib (results) hash which contains item-specific data...
(-)a/misc/export_records.pl (-2 / +2 lines)
Lines 110-116 if ( $record_type eq 'bibs' ) { Link Here
110
        };
110
        };
111
    } else {
111
    } else {
112
        my $conditions = {
112
        my $conditions = {
113
            deleted_at => undef,
113
            deleted_on => undef,
114
            ( $starting_biblionumber or $ending_biblionumber )
114
            ( $starting_biblionumber or $ending_biblionumber )
115
                ? (
115
                ? (
116
                    "me.biblionumber" => {
116
                    "me.biblionumber" => {
Lines 182-188 if ($deleted_barcodes) { Link Here
182
        my $barcode = $dbh->selectall_arrayref(q|
182
        my $barcode = $dbh->selectall_arrayref(q|
183
            SELECT DISTINCT barcode
183
            SELECT DISTINCT barcode
184
            FROM items
184
            FROM items
185
            WHERE deleteditems.biblionumber = ? AND deleted_at IS NOT NULL
185
            WHERE biblionumber = ? AND deleted_on IS NOT NULL
186
        |, { Slice => {} }, $record_id );
186
        |, { Slice => {} }, $record_id );
187
        say $_->{barcode} for @$barcode;
187
        say $_->{barcode} for @$barcode;
188
    }
188
    }
(-)a/opac/opac-reserve.pl (-2 / +2 lines)
Lines 286-292 if ( $query->param('place_reserve') ) { Link Here
286
        }
286
        }
287
287
288
        unless ( $can_place_hold_if_available_at_pickup ) {
288
        unless ( $can_place_hold_if_available_at_pickup ) {
289
            my $items_in_this_library = Koha::Items->search({ biblionumber => $biblioNum, holdingbranch => $branch, deleted_at => undef });
289
            my $items_in_this_library = Koha::Items->search({ biblionumber => $biblioNum, holdingbranch => $branch, deleted_on => undef });
290
            my $nb_of_items_issued = $items_in_this_library->search({ 'issue.itemnumber' => { not => undef }}, { join => 'issue' })->count;
290
            my $nb_of_items_issued = $items_in_this_library->search({ 'issue.itemnumber' => { not => undef }}, { join => 'issue' })->count;
291
            my $nb_of_items_unavailable = $items_in_this_library->search({ -or => { lost => { '!=' => 0 }, damaged => { '!=' => 0 }, } });
291
            my $nb_of_items_unavailable = $items_in_this_library->search({ -or => { lost => { '!=' => 0 }, damaged => { '!=' => 0 }, } });
292
            if ( $items_in_this_library->count > $nb_of_items_issued + $nb_of_items_unavailable ) {
292
            if ( $items_in_this_library->count > $nb_of_items_issued + $nb_of_items_unavailable ) {
Lines 537-543 foreach my $biblioNum (@biblionumbers) { Link Here
537
            $numCopiesAvailable++;
537
            $numCopiesAvailable++;
538
538
539
            unless ( $can_place_hold_if_available_at_pickup ) {
539
            unless ( $can_place_hold_if_available_at_pickup ) {
540
                my $items_in_this_library = Koha::Items->search({ biblionumber => $itemInfo->{biblionumber}, holdingbranch => $itemInfo->{holdingbranch}, deleted_at => undef });
540
                my $items_in_this_library = Koha::Items->search({ biblionumber => $itemInfo->{biblionumber}, holdingbranch => $itemInfo->{holdingbranch}, deleted_on => undef });
541
                my $nb_of_items_issued = $items_in_this_library->search({ 'issue.itemnumber' => { not => undef }}, { join => 'issue' })->count;
541
                my $nb_of_items_issued = $items_in_this_library->search({ 'issue.itemnumber' => { not => undef }}, { join => 'issue' })->count;
542
                if ( $items_in_this_library->count > $nb_of_items_issued ) {
542
                if ( $items_in_this_library->count > $nb_of_items_issued ) {
543
                    push @not_available_at, $itemInfo->{holdingbranch};
543
                    push @not_available_at, $itemInfo->{holdingbranch};
(-)a/reports/catalogue_stats.pl (-12 / +12 lines)
Lines 46-52 my $fullreportname = "reports/catalogue_stats.tt"; Link Here
46
my $do_it       = $input->param('do_it');
46
my $do_it       = $input->param('do_it');
47
my $line        = $input->param("Line");
47
my $line        = $input->param("Line");
48
my $column      = $input->param("Column");
48
my $column      = $input->param("Column");
49
my $cellvalue      = $input->param("Cellvalue"); # one of 'items', 'biblios', 'deleteditems'
49
my $cellvalue   = $input->param("Cellvalue"); # one of 'items', 'biblios'
50
my @filters     = $input->multi_param("Filter");
50
my @filters     = $input->multi_param("Filter");
51
my $cotedigits  = $input->param("cotedigits");
51
my $cotedigits  = $input->param("cotedigits");
52
my $output      = $input->param("output");
52
my $output      = $input->param("output");
Lines 173-181 sub calculate { Link Here
173
    my $barcodefilter = @$filters[17];
173
    my $barcodefilter = @$filters[17];
174
    my $not;
174
    my $not;
175
    my $itemstable = 'items';
175
    my $itemstable = 'items';
176
    my $deleted_where = "items.deleted_at IS NULL";
176
    my $deleted_where = "items.deleted_on IS NULL";
177
    $deleted_where = "1" if $cellvalue eq 'allitems';
177
    $deleted_where = "1" if $cellvalue eq 'allitems';
178
    $deleted_where = "items.deleted_at IS NOT NULL" if $cellvalue eq 'deleteditems';
178
    $deleted_where = "items.deleted_on IS NOT NULL" if $cellvalue eq 'items';
179
179
180
    my $dbh = C4::Context->dbh;
180
    my $dbh = C4::Context->dbh;
181
181
Lines 250-257 sub calculate { Link Here
250
    $linefilter[0] = @$filters[10] if ( $line =~ /items\.materials/ );
250
    $linefilter[0] = @$filters[10] if ( $line =~ /items\.materials/ );
251
    $linefilter[0] = @$filters[13] if ( $line =~ /items\.dateaccessioned/ );
251
    $linefilter[0] = @$filters[13] if ( $line =~ /items\.dateaccessioned/ );
252
    $linefilter[1] = @$filters[14] if ( $line =~ /items\.dateaccessioned/ );
252
    $linefilter[1] = @$filters[14] if ( $line =~ /items\.dateaccessioned/ );
253
    $linefilter[0] = @$filters[15] if ( $line =~ /deleteditems\.timestamp/ );
253
    $linefilter[0] = @$filters[15] if ( $line =~ /items\.deleted_on/ );
254
    $linefilter[1] = @$filters[16] if ( $line =~ /deleteditems\.timestamp/ );
254
    $linefilter[1] = @$filters[16] if ( $line =~ /items\.deleted_on/ );
255
255
256
    my @colfilter;
256
    my @colfilter;
257
    $colfilter[0] = @$filters[0] if ( $column =~ /items\.itemcallnumber/ );
257
    $colfilter[0] = @$filters[0] if ( $column =~ /items\.itemcallnumber/ );
Lines 271-278 sub calculate { Link Here
271
    $colfilter[0] = @$filters[10] if ( $column =~ /items\.materials/ );
271
    $colfilter[0] = @$filters[10] if ( $column =~ /items\.materials/ );
272
    $colfilter[0] = @$filters[13] if ( $column =~ /items.dateaccessioned/ );
272
    $colfilter[0] = @$filters[13] if ( $column =~ /items.dateaccessioned/ );
273
    $colfilter[1] = @$filters[14] if ( $column =~ /items\.dateaccessioned/ );
273
    $colfilter[1] = @$filters[14] if ( $column =~ /items\.dateaccessioned/ );
274
    $colfilter[0] = @$filters[15] if ( $column =~ /deleteditems\.timestamp/ );
274
    $colfilter[0] = @$filters[15] if ( $column =~ /items\.deleted_on/ );
275
    $colfilter[1] = @$filters[16] if ( $column =~ /deleteditems\.timestamp/ );
275
    $colfilter[1] = @$filters[16] if ( $column =~ /items\.deleted_on/ );
276
276
277
    # 1st, loop rows.
277
    # 1st, loop rows.
278
    my $origline = $line;
278
    my $origline = $line;
Lines 338-344 sub calculate { Link Here
338
    my $colfield;
338
    my $colfield;
339
    if ( ( $column =~ /itemcallnumber/ ) and ($cotedigits) ) {
339
    if ( ( $column =~ /itemcallnumber/ ) and ($cotedigits) ) {
340
        $colfield = "left($column,$cotedigits)";
340
        $colfield = "left($column,$cotedigits)";
341
    } elsif ( $column =~ /^deleteditems\.timestamp$/ ) {
341
    } elsif ( $column =~ /^items\.deleted_on$/ ) {
342
        $colfield = "DATE($column)";
342
        $colfield = "DATE($column)";
343
    } else {
343
    } else {
344
        $colfield = $column;
344
        $colfield = $column;
Lines 499-512 sub calculate { Link Here
499
        @$filters[14] =~ s/\*/%/g;
499
        @$filters[14] =~ s/\*/%/g;
500
        push @sqlargs, @$filters[14];
500
        push @sqlargs, @$filters[14];
501
    }
501
    }
502
    if ( $cellvalue eq 'deleteditems' and @$filters[15] ) {
502
    if ( $cellvalue eq 'items' and @$filters[15] ) {
503
        $strcalc .= " AND DATE(deleted_at) >= ? ";
503
        $strcalc .= " AND DATE(deleted_on) >= ? ";
504
        @$filters[15] =~ s/\*/%/g;
504
        @$filters[15] =~ s/\*/%/g;
505
        push @sqlargs, @$filters[15];
505
        push @sqlargs, @$filters[15];
506
    }
506
    }
507
    if ( $cellvalue eq 'deleteditems' and @$filters[16] ) {
507
    if ( $cellvalue eq 'items' and @$filters[16] ) {
508
        @$filters[16] =~ s/\*/%/g;
508
        @$filters[16] =~ s/\*/%/g;
509
        $strcalc .= " AND DATE(deleted_at) <= ?";
509
        $strcalc .= " AND DATE(deleted_on) <= ?";
510
        push @sqlargs, @$filters[16];
510
        push @sqlargs, @$filters[16];
511
    }
511
    }
512
    $strcalc .= " group by $linefield, $colfield order by $linefield,$colfield";
512
    $strcalc .= " group by $linefield, $colfield order by $linefield,$colfield";
(-)a/reports/itemslost.pl (-1 / +1 lines)
Lines 115-121 if ( $op eq 'export' ) { Link Here
115
    my $notforloanfilter = $params->{'notforloanfilter'} || undef;
115
    my $notforloanfilter = $params->{'notforloanfilter'} || undef;
116
116
117
    my $params = {
117
    my $params = {
118
        deleted_at => undef,
118
        deleted_on => undef,
119
        ( $branchfilter ? ( homebranch => $branchfilter ) : () ),
119
        ( $branchfilter ? ( homebranch => $branchfilter ) : () ),
120
        (
120
        (
121
            $loststatusfilter
121
            $loststatusfilter
(-)a/t/db_dependent/Acquisition.t (-2 / +2 lines)
Lines 513-519 ok((not defined $error), "DelOrder does not fail"); Link Here
513
$order2 = GetOrder($order2->{ordernumber});
513
$order2 = GetOrder($order2->{ordernumber});
514
ok((defined $order2->{datecancellationprinted}), "order is cancelled");
514
ok((defined $order2->{datecancellationprinted}), "order is cancelled");
515
ok((not defined $order2->{cancellationreason}), "order has no cancellation reason");
515
ok((not defined $order2->{cancellationreason}), "order has no cancellation reason");
516
ok(Koha::Biblios->find($order2->{biblionumber})->deleted_at , "biblio does not exist anymore");
516
ok(Koha::Biblios->find($order2->{biblionumber})->deleted_on , "biblio does not exist anymore");
517
517
518
my $order4 = GetOrder($ordernumbers[3]);
518
my $order4 = GetOrder($ordernumbers[3]);
519
$error = DelOrder($order4->{biblionumber}, $order4->{ordernumber}, 1, "foobar");
519
$error = DelOrder($order4->{biblionumber}, $order4->{ordernumber}, 1, "foobar");
Lines 521-527 ok((not defined $error), "DelOrder does not fail"); Link Here
521
$order4 = GetOrder($order4->{ordernumber});
521
$order4 = GetOrder($order4->{ordernumber});
522
ok((defined $order4->{datecancellationprinted}), "order is cancelled");
522
ok((defined $order4->{datecancellationprinted}), "order is cancelled");
523
ok(($order4->{cancellationreason} eq "foobar"), "order has cancellation reason \"foobar\"");
523
ok(($order4->{cancellationreason} eq "foobar"), "order has cancellation reason \"foobar\"");
524
ok(Koha::Biblios->find($order4->{biblionumber})->deleted_at, "biblio does not exist anymore");
524
ok(Koha::Biblios->find($order4->{biblionumber})->deleted_on, "biblio does not exist anymore");
525
525
526
my $order5 = GetOrder($ordernumbers[4]);
526
my $order5 = GetOrder($ordernumbers[4]);
527
C4::Items::AddItem( { barcode => '0102030405' }, $order5->{biblionumber} );
527
C4::Items::AddItem( { barcode => '0102030405' }, $order5->{biblionumber} );
(-)a/t/db_dependent/Biblio.t (-1 / +1 lines)
Lines 451-457 subtest 'delete biblio' => sub { Link Here
451
    my $err = C4::Biblio::DelBiblio( $biblionumber );
451
    my $err = C4::Biblio::DelBiblio( $biblionumber );
452
    is($err, undef, 'Biblio deleted without error');
452
    is($err, undef, 'Biblio deleted without error');
453
    my $data = GetBiblioData( $biblionumber );
453
    my $data = GetBiblioData( $biblionumber );
454
    isnt( $data->{deleted_at}, undef, 'Biblio deleted with timestamp' );
454
    isnt( $data->{deleted_on}, undef, 'Biblio deleted with timestamp' );
455
};
455
};
456
456
457
# Cleanup
457
# Cleanup
(-)a/t/db_dependent/Items.t (-1 / +1 lines)
Lines 81-87 subtest 'General Add, Get and Del tests' => sub { Link Here
81
    # Delete item.
81
    # Delete item.
82
    DelItem({ biblionumber => $bibnum, itemnumber => $itemnumber });
82
    DelItem({ biblionumber => $bibnum, itemnumber => $itemnumber });
83
    my $getdeleted = GetItem($itemnumber);
83
    my $getdeleted = GetItem($itemnumber);
84
    isnt($getdeleted->{'deleted_at'}, undef, "Item deleted as expected.");
84
    isnt($getdeleted->{'deleted_on'}, undef, "Item deleted as expected.");
85
85
86
    ($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem({ homebranch => $library->{branchcode}, holdingbranch => $library->{branchcode}, location => $location, permanent_location => 'my permanent location', itype => $itemtype->{itemtype} } , $bibnum);
86
    ($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem({ homebranch => $library->{branchcode}, holdingbranch => $library->{branchcode}, location => $location, permanent_location => 'my permanent location', itype => $itemtype->{itemtype} } , $bibnum);
87
    $getitem = GetItem($itemnumber);
87
    $getitem = GetItem($itemnumber);
(-)a/t/db_dependent/Items/DelItem.t (-2 / +2 lines)
Lines 28-41 my ( $item_bibnum, $item_bibitemnum, $itemnumber ); Link Here
28
my $deleted = DelItem( { biblionumber => $biblionumber, itemnumber => $itemnumber } );
28
my $deleted = DelItem( { biblionumber => $biblionumber, itemnumber => $itemnumber } );
29
is( $deleted, 1, "DelItem should return 1 if the item has been deleted" );
29
is( $deleted, 1, "DelItem should return 1 if the item has been deleted" );
30
my $deleted_item = GetItem($itemnumber);
30
my $deleted_item = GetItem($itemnumber);
31
isnt( $deleted_item->{deleted_at}, undef, "DelItem with biblionumber parameter - the item should be deleted." );
31
isnt( $deleted_item->{deleted_on}, undef, "DelItem with biblionumber parameter - the item should be deleted." );
32
32
33
( $item_bibnum, $item_bibitemnum, $itemnumber ) =
33
( $item_bibnum, $item_bibitemnum, $itemnumber ) =
34
  AddItem( { homebranch => $library->{branchcode}, holdingbranch => $library->{branchcode} }, $biblionumber );
34
  AddItem( { homebranch => $library->{branchcode}, holdingbranch => $library->{branchcode} }, $biblionumber );
35
$deleted = DelItem( { biblionumber => $biblionumber, itemnumber => $itemnumber } );
35
$deleted = DelItem( { biblionumber => $biblionumber, itemnumber => $itemnumber } );
36
is( $deleted, 1, "DelItem should return 1 if the item has been deleted" );
36
is( $deleted, 1, "DelItem should return 1 if the item has been deleted" );
37
$deleted_item = GetItem($itemnumber);
37
$deleted_item = GetItem($itemnumber);
38
isnt( $deleted_item->{deleted_at}, undef, "DelItem without biblionumber parameter - the item should be deleted." );
38
isnt( $deleted_item->{deleted_on}, undef, "DelItem without biblionumber parameter - the item should be deleted." );
39
39
40
$deleted = DelItem( { itemnumber => $itemnumber + 1} );
40
$deleted = DelItem( { itemnumber => $itemnumber + 1} );
41
is( $deleted, 0, "DelItem should return 0 if no item has been deleted" );
41
is( $deleted, 0, "DelItem should return 0 if no item has been deleted" );
(-)a/t/db_dependent/OAI/Server.t (-3 lines)
Lines 65-73 my $dbh = C4::Context->dbh; Link Here
65
$dbh->do("SET time_zone='+00:00'");
65
$dbh->do("SET time_zone='+00:00'");
66
$dbh->do('DELETE FROM issues');
66
$dbh->do('DELETE FROM issues');
67
$dbh->do('DELETE FROM biblio');
67
$dbh->do('DELETE FROM biblio');
68
$dbh->do('DELETE FROM deletedbiblio');
69
$dbh->do('DELETE FROM deletedbiblioitems');
70
$dbh->do('DELETE FROM deleteditems');
71
$dbh->do('DELETE FROM oai_sets');
68
$dbh->do('DELETE FROM oai_sets');
72
69
73
set_fixed_time(CORE::time());
70
set_fixed_time(CORE::time());
(-)a/t/lib/TestBuilder.pm (-5 / +4 lines)
Lines 471-483 sub _gen_default_values { Link Here
471
            borrowernotes  => '',
471
            borrowernotes  => '',
472
        },
472
        },
473
        Biblio => {
473
        Biblio => {
474
            deleted_at => undef,
474
            deleted_on => undef,
475
        },
475
        },
476
        Biblioitems => {
476
        Biblioitems => {
477
            deleted_at => undef,
477
            deleted_on => undef,
478
        },
478
        },
479
        BiblioMetadata => {
479
        BiblioMetadata => {
480
            deleted_at => undef,
480
            deleted_on => undef,
481
        },
481
        },
482
        Item => {
482
        Item => {
483
            notforloan         => 0,
483
            notforloan         => 0,
Lines 485-491 sub _gen_default_values { Link Here
485
            withdrawn          => 0,
485
            withdrawn          => 0,
486
            restricted         => 0,
486
            restricted         => 0,
487
            more_subfields_xml => undef,
487
            more_subfields_xml => undef,
488
            deleted_at => undef,
488
            deleted_on => undef,
489
        },
489
        },
490
        Category => {
490
        Category => {
491
            enrolmentfee => 0,
491
            enrolmentfee => 0,
492
- 

Return to bug 20271