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 1169-1175 sub GetMarcBiblio { Link Here
1169
    }
1169
    }
1170
1170
1171
    my $dbh          = C4::Context->dbh;
1171
    my $dbh          = C4::Context->dbh;
1172
    my $sth          = $dbh->prepare("SELECT biblioitemnumber FROM biblioitems WHERE biblionumber=? AND deleted_at IS NULL");
1172
    my $sth          = $dbh->prepare("SELECT biblioitemnumber FROM biblioitems WHERE biblionumber=? AND deleted_on IS NULL");
1173
    $sth->execute($biblionumber);
1173
    $sth->execute($biblionumber);
1174
    my $row     = $sth->fetchrow_hashref;
1174
    my $row     = $sth->fetchrow_hashref;
1175
    my $biblioitemnumber = $row->{'biblioitemnumber'};
1175
    my $biblioitemnumber = $row->{'biblioitemnumber'};
Lines 2792-2798 sub EmbedItemsInMarcBiblio { Link Here
2792
2792
2793
    # ... and embed the current items
2793
    # ... and embed the current items
2794
    my $dbh = C4::Context->dbh;
2794
    my $dbh = C4::Context->dbh;
2795
    my $sth = $dbh->prepare("SELECT itemnumber FROM items WHERE biblionumber = ? and deleted_at IS NULL");
2795
    my $sth = $dbh->prepare("SELECT itemnumber FROM items WHERE biblionumber = ? and deleted_on IS NULL");
2796
    $sth->execute($biblionumber);
2796
    $sth->execute($biblionumber);
2797
    my @item_fields;
2797
    my @item_fields;
2798
    my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber", $frameworkcode );
2798
    my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber", $frameworkcode );
Lines 3122-3128 C<$biblionumber> - the biblionumber of the biblio (and metadata) to be marked as Link Here
3122
sub _koha_delete_biblio {
3122
sub _koha_delete_biblio {
3123
    my ( $dbh, $biblionumber ) = @_;
3123
    my ( $dbh, $biblionumber ) = @_;
3124
    _koha_delete_biblio_metadata( $biblionumber );
3124
    _koha_delete_biblio_metadata( $biblionumber );
3125
    my $sth = $dbh->prepare("UPDATE biblio SET deleted_at = NOW() WHERE biblionumber=?");
3125
    my $sth = $dbh->prepare("UPDATE biblio SET deleted_on = NOW() WHERE biblionumber=?");
3126
    return $sth->execute($biblionumber) ? undef : ($DBI::errstr || "unknown error");
3126
    return $sth->execute($biblionumber) ? undef : ($DBI::errstr || "unknown error");
3127
}
3127
}
3128
3128
Lines 3141-3147 C<$biblionumber> - the biblioitemnumber of the biblioitem to be marked as delet Link Here
3141
3141
3142
sub _koha_delete_biblioitems {
3142
sub _koha_delete_biblioitems {
3143
    my ( $dbh, $biblioitemnumber ) = @_;
3143
    my ( $dbh, $biblioitemnumber ) = @_;
3144
    my $sth = $dbh->prepare("UPDATE biblioitems SET deleted_at = NOW() WHERE biblioitemnumber=?");
3144
    my $sth = $dbh->prepare("UPDATE biblioitems SET deleted_on = NOW() WHERE biblioitemnumber=?");
3145
    return $sth->execute($biblioitemnumber) ? undef : ($DBI::errstr || 'unknown error');
3145
    return $sth->execute($biblioitemnumber) ? undef : ($DBI::errstr || 'unknown error');
3146
}
3146
}
3147
3147
Lines 3156-3162 C<$biblionumber> - the biblionumber of the biblio metadata to be marked as dele Link Here
3156
sub _koha_delete_biblio_metadata {
3156
sub _koha_delete_biblio_metadata {
3157
    my ($biblionumber) = @_;
3157
    my ($biblionumber) = @_;
3158
    my $dbh = C4::Context->dbh;
3158
    my $dbh = C4::Context->dbh;
3159
    my $sth = $dbh->prepare("UPDATE biblio_metadata SET deleted_at = NOW() WHERE biblionumber=?");
3159
    my $sth = $dbh->prepare("UPDATE biblio_metadata SET deleted_on = NOW() WHERE biblionumber=?");
3160
    return $sth->execute($biblionumber);
3160
    return $sth->execute($biblionumber);
3161
}
3161
}
3162
3162
(-)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 1257-1263 sub GetLastAcquisitions { Link Here
1257
    my $number_of_branches = @{$data->{branches}};
1257
    my $number_of_branches = @{$data->{branches}};
1258
    my $number_of_itemtypes   = @{$data->{itemtypes}};
1258
    my $number_of_itemtypes   = @{$data->{itemtypes}};
1259
1259
1260
    my @where = ('WHERE (items.deleted_at IS NULL AND biblio.deleted_at IS NULL AND biblioitems.deleted_at IS NULL)');
1260
    my @where = ('WHERE (items.deleted_on IS NULL AND biblio.deleted_on IS NULL AND biblioitems.deleted_on IS NULL)');
1261
    $number_of_branches and push @where
1261
    $number_of_branches and push @where
1262
       , 'AND holdingbranch IN ('
1262
       , 'AND holdingbranch IN ('
1263
       , join(',', ('?') x $number_of_branches )
1263
       , join(',', ('?') x $number_of_branches )
Lines 1304-1310 sub GetItemnumbersForBiblio { Link Here
1304
    my $biblionumber = shift;
1304
    my $biblionumber = shift;
1305
    my @items;
1305
    my @items;
1306
    my $dbh = C4::Context->dbh;
1306
    my $dbh = C4::Context->dbh;
1307
    my $sth = $dbh->prepare("SELECT itemnumber FROM items WHERE biblionumber = ? AND deleted_at IS NULL");
1307
    my $sth = $dbh->prepare("SELECT itemnumber FROM items WHERE biblionumber = ? AND deleted_on IS NULL");
1308
    $sth->execute($biblionumber);
1308
    $sth->execute($biblionumber);
1309
    while (my $result = $sth->fetchrow_hashref) {
1309
    while (my $result = $sth->fetchrow_hashref) {
1310
        push @items, $result->{'itemnumber'};
1310
        push @items, $result->{'itemnumber'};
Lines 2080-2086 sub _koha_delete_item { Link Here
2080
2080
2081
    my $dbh = C4::Context->dbh;
2081
    my $dbh = C4::Context->dbh;
2082
2082
2083
    my $sth = $dbh->prepare("UPDATE items SET deleted_at = NOW() WHERE itemnumber = ?");
2083
    my $sth = $dbh->prepare("UPDATE items SET deleted_on = NOW() WHERE itemnumber = ?");
2084
    my $deleted = $sth->execute($itemnum);
2084
    my $deleted = $sth->execute($itemnum);
2085
    return ( $deleted == 1 ) ? 1 : 0;
2085
    return ( $deleted == 1 ) ? 1 : 0;
2086
}
2086
}
Lines 2445-2451 sub SearchItems { Link Here
2445
            LEFT JOIN biblio ON biblio.biblionumber = items.biblionumber
2445
            LEFT JOIN biblio ON biblio.biblionumber = items.biblionumber
2446
            LEFT JOIN biblioitems ON biblioitems.biblioitemnumber = items.biblioitemnumber
2446
            LEFT JOIN biblioitems ON biblioitems.biblioitemnumber = items.biblioitemnumber
2447
            LEFT JOIN biblio_metadata ON biblio_metadata.biblionumber = biblio.biblionumber
2447
            LEFT JOIN biblio_metadata ON biblio_metadata.biblionumber = biblio.biblionumber
2448
            WHERE items.deleted_at IS NULL
2448
            WHERE items.deleted_on IS NULL
2449
    };
2449
    };
2450
    if (defined $where_str and $where_str ne '') {
2450
    if (defined $where_str and $where_str ne '') {
2451
        $query .= qq{ AND $where_str };
2451
        $query .= qq{ AND $where_str };
Lines 2796-2802 sub ToggleNewStatus { Link Here
2796
            SELECT items.biblionumber, items.itemnumber
2796
            SELECT items.biblionumber, items.itemnumber
2797
            FROM items
2797
            FROM items
2798
            LEFT JOIN biblioitems ON biblioitems.biblionumber = items.biblionumber
2798
            LEFT JOIN biblioitems ON biblioitems.biblionumber = items.biblionumber
2799
            WHERE items.deleted_at IS NULL
2799
            WHERE items.deleted_on IS NULL
2800
        |;
2800
        |;
2801
        for my $condition ( @$conditions ) {
2801
        for my $condition ( @$conditions ) {
2802
            if (
2802
            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 440-453 if ( C4::Context->preference('WebBasedSelfCheck') Link Here
440
        q|select b.borrowernumber from borrowers b join deletedborrowers db on b.borrowernumber=db.borrowernumber|,
440
        q|select b.borrowernumber from borrowers b join deletedborrowers db on b.borrowernumber=db.borrowernumber|,
441
        { Slice => {} }
441
        { Slice => {} }
442
    );
442
    );
443
    my $biblios = $dbh->selectall_arrayref(
444
        q|select b.biblionumber from biblio b join deletedbiblio db on b.biblionumber=db.biblionumber|,
445
        { Slice => {} }
446
    );
447
    my $items = $dbh->selectall_arrayref(
448
        q|select i.itemnumber from items i join deleteditems di on i.itemnumber=di.itemnumber|,
449
        { Slice => {} }
450
    );
451
    my $checkouts = $dbh->selectall_arrayref(
443
    my $checkouts = $dbh->selectall_arrayref(
452
        q|select i.issue_id from issues i join old_issues oi on i.issue_id=oi.issue_id|,
444
        q|select i.issue_id from issues i join old_issues oi on i.issue_id=oi.issue_id|,
453
        { Slice => {} }
445
        { Slice => {} }
Lines 460-467 if ( C4::Context->preference('WebBasedSelfCheck') Link Here
460
        $template->param(
452
        $template->param(
461
            has_ai_issues => 1,
453
            has_ai_issues => 1,
462
            ai_patrons    => $patrons,
454
            ai_patrons    => $patrons,
463
            ai_biblios    => $biblios,
464
            ai_items      => $items,
465
            ai_checkouts  => $checkouts,
455
            ai_checkouts  => $checkouts,
466
            ai_holds      => $holds,
456
            ai_holds      => $holds,
467
        );
457
        );
(-)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