From 88a149f38c4097b912432a8a035de3e7007ac426 Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Tue, 30 Sep 2014 16:56:46 +0200 Subject: [PATCH] Bug 13014: Notify budget owner on new suggestion - UT When a suggestion is created and linked to a fund, a mail will be generated, using a cronjob, to notify the budget owner. A suggestion is considered as "can be treated" if its status is "ASKED". Signed-off-by: Frederic Demians --- C4/Suggestions.pm | 18 +++++++++++++++++ t/db_dependent/Suggestions.t | 46 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/C4/Suggestions.pm b/C4/Suggestions.pm index ee421d9..82f085c 100644 --- a/C4/Suggestions.pm +++ b/C4/Suggestions.pm @@ -49,6 +49,7 @@ our @EXPORT = qw( NewSuggestion SearchSuggestion DelSuggestionsOlderThan + GetUnprocessedSuggestions ); =head1 NAME @@ -596,6 +597,23 @@ sub DelSuggestionsOlderThan { $sth->execute("-$days"); } +sub GetUnprocessedSuggestions { + my ( $number_of_days_since_the_last_modification ) = @_; + + $number_of_days_since_the_last_modification ||= 0; + + my $dbh = C4::Context->dbh; + + my $s = $dbh->selectall_arrayref(q| + SELECT * + FROM suggestions + WHERE STATUS = 'ASKED' + AND budgetid IS NOT NULL + AND CAST(NOW() AS DATE) - CAST(suggesteddate AS DATE) = ? + |, { Slice => {} }, $number_of_days_since_the_last_modification ); + return $s; +} + 1; __END__ diff --git a/t/db_dependent/Suggestions.t b/t/db_dependent/Suggestions.t index dc9d131..259f1ae 100644 --- a/t/db_dependent/Suggestions.t +++ b/t/db_dependent/Suggestions.t @@ -18,12 +18,14 @@ use Modern::Perl; use C4::Context; +use C4::Budgets qw( AddBudgetPeriod AddBudget ); use C4::Members; use C4::Letters; use Koha::DateUtils qw( dt_from_string ); -use Test::More tests => 100; +use DateTime::Duration; +use Test::More tests => 109; use Test::Warn; BEGIN { @@ -65,6 +67,20 @@ my $my_suggestion = { note => 'my note', }; +# Create a fund for the budgetid value +my $bpid = C4::Budgets::AddBudgetPeriod({ + budget_period_startdate => '2008-01-01', +}); +my $my_budget = { + budget_code => 'ABCD', + budget_amount => '123.132000', + budget_name => 'Periodiques', + budget_notes => 'This is a note', + budget_period_id => $bpid, +}; +my $budget_id = C4::Budgets::AddBudget($my_budget); + +my $unprocessed_suggestions; is( CountSuggestion(), 0, 'CountSuggestion without the status returns 0' ); is( CountSuggestion('ASKED'), 0, 'CountSuggestion returns the correct number of suggestions' ); @@ -89,8 +105,12 @@ is( $suggestion->{budgetid}, undef, 'NewSuggestion should set budgetid to NULL i is( CountSuggestion('ASKED'), 1, 'CountSuggestion returns the correct number of suggestions' ); +$unprocessed_suggestions = C4::Suggestions::GetUnprocessedSuggestions; +is( scalar( @$unprocessed_suggestions ), 0, 'GetUnprocessedSuggestions should return 0 if a suggestion has been processed but not linked to a fund' ); + is( ModSuggestion(), undef, 'ModSuggestion without the suggestion returns undef' ); + my $mod_suggestion1 = { title => 'my modified title', author => 'my modified author', @@ -112,6 +132,28 @@ is( $suggestion->{managedby}, undef, 'ModSuggestion stores empty string as undef is( $suggestion->{manageddate}, undef, 'ModSuggestion stores empty string as undef for date' ); isnt( $suggestion->{accepteddate}, undef, 'ModSuggestion does not update a non given date value' ); is( $suggestion->{note}, 'my note', 'ModSuggestion should not erase data if not given' ); +is( $suggestion->{budgetid}, undef, 'ModSuggestion should set budgetid to NULL if not given' ); + +ModSuggestion({ suggestionid => $my_suggestionid, budgetid => $budget_id }); +$suggestion = GetSuggestion($my_suggestionid); +is( $suggestion->{budgetid}, $budget_id, 'ModSuggestion should modify budgetid if given' ); + +$unprocessed_suggestions = C4::Suggestions::GetUnprocessedSuggestions; +is( scalar( @$unprocessed_suggestions ), 1, 'GetUnprocessedSuggestions should return the suggestion if the suggestion is linked to a fund and has not been processed yet' ); + +ModSuggestion( { suggestionid => $my_suggestionid, STATUS => 'REJECTED' } ); +$unprocessed_suggestions = C4::Suggestions::GetUnprocessedSuggestions; +is( scalar( @$unprocessed_suggestions ), 0, 'GetUnprocessedSuggestions should return the suggestion if the suggestion is linked to a fund and has not been processed yet' ); + +ModSuggestion( { suggestionid => $my_suggestionid, STATUS => 'ASKED', suggesteddate => dt_from_string->add_duration(DateTime::Duration->new(days => -4) ) } ); +$unprocessed_suggestions = C4::Suggestions::GetUnprocessedSuggestions; +is( scalar( @$unprocessed_suggestions ), 0, 'GetUnprocessedSuggestions should use 0 as default value for days' ); +$unprocessed_suggestions = C4::Suggestions::GetUnprocessedSuggestions(4); +is( scalar( @$unprocessed_suggestions ), 1, 'GetUnprocessedSuggestions should return the suggestion suggested 4 days ago' ); +$unprocessed_suggestions = C4::Suggestions::GetUnprocessedSuggestions(3); +is( scalar( @$unprocessed_suggestions ), 0, 'GetUnprocessedSuggestions should not return the suggestion, it has not been suggested 3 days ago' ); +$unprocessed_suggestions = C4::Suggestions::GetUnprocessedSuggestions(5); +is( scalar( @$unprocessed_suggestions ), 0, 'GetUnprocessedSuggestions should not return the suggestion, it has not been suggested 5 days ago' ); my $messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber, @@ -121,6 +163,7 @@ is( @$messages, 0, 'ModSuggestions does not send an email if the status is not u my $mod_suggestion2 = { STATUS => 'STALLED', suggestionid => $my_suggestionid, + }; warning_is { $status = ModSuggestion($mod_suggestion2) } "No suggestions STALLED letter transported by email", @@ -143,7 +186,6 @@ is( @$messages, 1, 'ModSuggestion sends an email if the status is updated' ); is( CountSuggestion('CHECKED'), 1, 'CountSuggestion returns the correct number of suggestions' ); - is( GetSuggestionInfo(), undef, 'GetSuggestionInfo without the suggestion id returns undef' ); $suggestion = GetSuggestionInfo($my_suggestionid); is( $suggestion->{suggestionid}, $my_suggestionid, 'GetSuggestionInfo returns the suggestion id correctly' ); -- 2.1.0