use Koha::Database;
use Koha::Exceptions::Object;
+use Koha::DateUtils qw( dt_from_string );
=head1 NAME
return $self->_resultset->update($fields);
}
+=head3 filter_by_last_update
+
+my $filtered_objects = $objects->filter_by_last_update
+
+days exclusive
+from inclusive
+to inclusive
+
+=cut
+
sub filter_by_last_update {
my ( $self, $params ) = @_;
my $timestamp_column_name = $params->{timestamp_column_name} || 'timestamp';
+ my $conditions;
+ Koha::Exceptions::MissingParameter->throw(
+ "Missing mandatory parameter: days or from or to")
+ unless exists $params->{days}
+ or exists $params->{from}
+ or exists $params->{to};
+
+ my $dtf = Koha::Database->new->schema->storage->datetime_parser;
+ if ( exists $params->{days} ) {
+ $conditions->{'<'} = $dtf->format_date( dt_from_string->subtract( days => $params->{days} ) );
+ }
+ if ( exists $params->{from} ) {
+ my $from = ref($params->{from}) ? $params->{from} : dt_from_string($params->{from});
+ $conditions->{'>='} = $dtf->format_date( $from );
+ }
+ if ( exists $params->{to} ) {
+ my $to = ref($params->{to}) ? $params->{to} : dt_from_string($params->{to});
+ $conditions->{'<='} = $dtf->format_date( $to );
+ }
+
return $self->_resultset->search(
{
- $timestamp_column_name => {
- '<' =>
- [ \'DATE_SUB(CURDATE(), INTERVAL ? DAY)', $params->{days} ]
- }
+ $timestamp_column_name => $conditions
}
);
}
use Koha::Old::Holds;
use Koha::Old::Patrons;
use Koha::Item::Transfers;
-
+use Koha::PseudonymizedTransactions;
sub usage {
print STDERR <<USAGE;
--old-issues DAYS Purge checkouts (old_issues) returned more than DAYS days ago.
--old-reserves DAYS Purge reserves (old_reserves) more than DAYS old.
--transfers DAYS Purge transfers completed more than DAYS day ago.
+ --pseudo-transactions DAYS Purge the pseudonymized transactions that have been originally created more than DAYS days ago
+ DAYS is optional and can be replaced by:
+ --pseudo-transactions-from YYYY-MM-DD and/or --pseudo-transactions-to YYYY-MM-DD
USAGE
exit $_[0];
}
my $pOldIssues;
my $pOldReserves;
my $pTransfers;
+my ( $pPseudoTransactions, $pPseudoTransactionsFrom, $pPseudoTransactionsTo );
GetOptions(
'h|help' => \$help,
'deleted-patrons:i' => \$pDeletedPatrons,
'old-issues:i' => \$pOldIssues,
'old-reserves:i' => \$pOldReserves,
- 'transfers:i' => \$pTransfers,
+ 'transfers:i' => \$pTransfers,
+ 'pseudo-transactions:i' => \$pPseudoTransactions,
+ 'pseudo-transactions-from:s' => \$pPseudoTransactionsFrom,
+ 'pseudo-transactions-to:s' => \$pPseudoTransactionsTo,
) || usage(1);
# Use default values
|| $pOldIssues
|| $pOldReserves
|| $pTransfers
+ || defined $pPseudoTransactions
) {
print "You did not specify any cleanup work for the script to do.\n\n";
usage(1);
print "Done with purging transfers.\n" if $verbose;
}
+if (defined $pPseudoTransactions) {
+ print "Purging pseudonymized transactions older than $pPseudoTransactions days.\n" if $verbose;
+ Koha::PseudonymizedTransactions->filter_by_last_update(
+ {
+ timestamp_column_name => 'datetime',
+ ( $pPseudoTransactions ? ( days => $pPseudoTransactions ) : () ),
+ ( $pPseudoTransactionsFrom ? ( from => $pPseudoTransactionsFrom ) : () ),
+ ( $pPseudoTransactionsTo ? ( to => $pPseudoTransactionsTo ) : () ),
+ }
+ )->delete;
+ print "Done with purging pseudonymized transactions.\n" if $verbose;
+}
+
exit(0);
sub RemoveOldSessions {
#!/usr/bin/perl
-# Copyright 2015 Koha Development team
+# Copyright 2019 Koha Development team
#
# This file is part of Koha
#
use Modern::Perl;
-use Test::More tests => 23;
+use Test::More tests => 24;
use Test::Exception;
use Test::MockModule;
use Test::Warn;
use Koha::Patron::Categories;
use Koha::Patrons;
use Koha::Database;
+use Koha::DateUtils qw( dt_from_string );
use t::lib::TestBuilder;
use t::lib::Mocks;
);
$schema->storage->txn_rollback;
+
+};
+
+subtest "filter_by_last_update" => sub {
+
+ $schema->storage->txn_begin;
+
+ my $now = dt_from_string->truncate( to => 'day' );
+ my @borrowernumbers;
+ # Building 6 patrons that have been created today, yesterday, ... 1 per day
+ for my $i ( 0 .. 5 ) {
+ push @borrowernumbers,
+ $builder->build_object(
+ {
+ class => 'Koha::Patrons',
+ value => { updated_on => $now->clone->subtract( days => $i ) }
+ }
+ )->borrowernumber;
+ }
+
+ my $patrons = Koha::Patrons->search(
+ { borrowernumber => { -in => \@borrowernumbers } } );
+
+ try {
+ $patrons->filter_by_last_update( { timestamp_column_name => 'updated_on' } )
+ ->count;
+ }
+ catch {
+ ok(
+ $_->isa('Koha::Exceptions::MissingParameter'),
+ 'Should raise an exception if no parameter given'
+ );
+ };
+
+ my $count = $patrons->filter_by_last_update(
+ { timestamp_column_name => 'updated_on', days => 2 } )->count;
+ is( $count, 3, '3 patrons have been updated before the last 2 days (exclusive)' );
+
+ $count = $patrons->filter_by_last_update(
+ { timestamp_column_name => 'updated_on', days => 1 } )->count;
+ is( $count, 4, '4 patrons have been updated before yesterday (exclusive)' );
+
+ $count = $patrons->filter_by_last_update(
+ { timestamp_column_name => 'updated_on', days => 0 } )->count;
+ is( $count, 5, '5 patrons have been updated before today (exclusive)' );
+
+ $count = $patrons->filter_by_last_update(
+ { timestamp_column_name => 'updated_on', from => $now } )->count;
+ is( $count, 1, '1 patron has been updated "from today" (inclusive)' );
+
+ $count = $patrons->filter_by_last_update(
+ { timestamp_column_name => 'updated_on', to => $now } )->count;
+ is( $count, 6, '6 patrons have been updated "to today" (inclusive)' );
+
+ $count = $patrons->filter_by_last_update(
+ {
+ timestamp_column_name => 'updated_on',
+ from => $now->clone->subtract( days => 4 ),
+ to => $now->clone->subtract( days => 2 )
+ }
+ )->count;
+ is( $count, 3, '3 patrons have been updated between D-4 and D-2' );
+
+ t::lib::Mocks::mock_preference( 'dateformat', 'metric' );
+ try {
+ $count = $patrons->filter_by_last_update(
+ { timestamp_column_name => 'updated_on', from => '1970-12-31' } )
+ ->count;
+ }
+ catch {
+ ok(
+ $_->isa(
+ 'No exception raised, from and to parameters can take an iso formatted date'
+ )
+ );
+ };
+ try {
+ $count = $patrons->filter_by_last_update(
+ { timestamp_column_name => 'updated_on', from => '31/12/1970' } )
+ ->count;
+ }
+ catch {
+ ok(
+ $_->isa(
+ 'No exception raised, from and to parameters can take an metric formatted date (depending on dateformat syspref)'
+ )
+ );
+ };
+
+ $schema->storage->txn_rollback;
};
subtest "from_api_mapping() tests" => sub {