X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=suggestion%2Fsuggestion.pl;h=27a263cd2c0aa07db015e8df3fd92b084b770545;hb=9d6d641d1f8b77271800f43bc027b651f9aea52b;hp=91ab7419bd4e63c11f92c20feeb93262c7179abe;hpb=cd7b84f6754ca264070afcac6fc8cb65ea0f930e;p=srvgit diff --git a/suggestion/suggestion.pl b/suggestion/suggestion.pl index 91ab7419bd..27a263cd2c 100755 --- a/suggestion/suggestion.pl +++ b/suggestion/suggestion.pl @@ -17,30 +17,28 @@ # You should have received a copy of the GNU General Public License # along with Koha; if not, see . -use strict; -#use warnings; FIXME - Bug 2505 +use Modern::Perl; require Exporter; use CGI qw ( -utf8 ); -use C4::Auth; # get_template_and_user -use C4::Output; +use C4::Auth qw( get_template_and_user ); +use C4::Output qw( output_html_with_http_headers ); use C4::Suggestions; -use C4::Koha; #GetItemTypes -use C4::Budgets; -use C4::Search; +use C4::Koha qw( GetAuthorisedValues ); +use C4::Budgets qw( GetBudget GetBudgets GetBudgetHierarchy CanUserUseBudget ); +use C4::Search qw( FindDuplicate GetDistinctValues ); use C4::Members; -use C4::Debug; - use Koha::DateUtils qw( dt_from_string ); use Koha::AuthorisedValues; use Koha::Acquisition::Currencies; use Koha::Libraries; +use Koha::Patrons; -use URI::Escape; +use URI::Escape qw( uri_escape ); sub Init{ my $suggestion= shift @_; # "Managed by" is used only when a suggestion is being edited (not when created) - if ($suggestion->{'suggesteddate'} eq "0000-00-00" ||$suggestion->{'suggesteddate'} eq "") { + if ($suggestion->{'suggesteddate'} eq "") { # new suggestion $suggestion->{suggesteddate} = dt_from_string; $suggestion->{'suggestedby'} = C4::Context->userenv->{"number"} unless ($suggestion->{'suggestedby'}); @@ -58,20 +56,21 @@ sub GetCriteriumDesc{ if ($displayby =~ /status/i) { unless ( grep { /$criteriumvalue/ } qw(ASKED ACCEPTED REJECTED CHECKED ORDERED AVAILABLE) ) { my $av = Koha::AuthorisedValues->search({ category => 'SUGGEST_STATUS', authorised_value => $criteriumvalue }); - return $av->count ? $av->next->lib : 'Unkown'; + return $av->count ? $av->next->lib : 'Unknown'; } return ($criteriumvalue eq 'ASKED'?"Pending":ucfirst(lc( $criteriumvalue))) if ($displayby =~/status/i); } - return Koha::Libraries->find($criteriumvalue)->branchname - if $displayby =~ /branchcode/; + if ( $displayby =~ /branchcode/ ) { + return $criteriumvalue ? Koha::Libraries->find($criteriumvalue)->branchname : "__ANY__"; + } if ( $displayby =~ /itemtype/ ) { my $av = Koha::AuthorisedValues->search({ category => 'SUGGEST_FORMAT', authorised_value => $criteriumvalue }); - return $av->count ? $av->next->lib : 'Unkown'; + return $av->count ? $av->next->lib : 'Unknown'; } if ($displayby =~/suggestedby/||$displayby =~/managedby/||$displayby =~/acceptedby/){ - my $borr=C4::Members::GetMember(borrowernumber=>$criteriumvalue); - return "" unless $borr; - return $$borr{surname} . ", " . $$borr{firstname}; + my $patron = Koha::Patrons->find( $criteriumvalue ); + return "" unless $patron; + return $patron->surname . ", " . $patron->firstname; } if ( $displayby =~ /budgetid/) { my $budget = GetBudget($criteriumvalue); @@ -84,16 +83,21 @@ my $input = CGI->new; my $redirect = $input->param('redirect'); my $suggestedbyme = (defined $input->param('suggestedbyme')? $input->param('suggestedbyme'):1); my $op = $input->param('op')||'else'; -my @editsuggestions = $input->multi_param('edit_field'); +my @editsuggestions = $input->multi_param('suggestionid'); my $suggestedby = $input->param('suggestedby'); my $returnsuggestedby = $input->param('returnsuggestedby'); my $returnsuggested = $input->param('returnsuggested'); my $managedby = $input->param('managedby'); my $displayby = $input->param('displayby') || ''; my $tabcode = $input->param('tabcode'); +my $save_confirmed = $input->param('save_confirmed') || 0; +my $notify = $input->param('notify'); +my $filter_archived = $input->param('filter_archived'); + +my $reasonsloop = GetAuthorisedValues("SUGGEST"); # filter informations which are not suggestion related. -my $suggestion_ref = $input->Vars; +my $suggestion_ref = { %{$input->Vars} }; # Copying, otherwise $input will be modified # get only the columns of Suggestion my $schema = Koha::Database->new()->schema; @@ -101,121 +105,223 @@ my $columns = ' '.join(' ', $schema->source('Suggestion')->columns).' '; my $suggestion_only = { map { $columns =~ / $_ / ? ($_ => $suggestion_ref->{$_}) : () } keys %$suggestion_ref }; $suggestion_only->{STATUS} = $suggestion_ref->{STATUS}; -delete $$suggestion_ref{$_} foreach qw( suggestedbyme op displayby tabcode edit_field ); +delete $$suggestion_ref{$_} foreach qw( suggestedbyme op displayby tabcode notify filter_archived ); foreach (keys %$suggestion_ref){ - delete $$suggestion_ref{$_} if (!$$suggestion_ref{$_} && ($op eq 'else' || $op eq 'change')); + delete $$suggestion_ref{$_} if (!$$suggestion_ref{$_} && ($op eq 'else' )); } my ( $template, $borrowernumber, $cookie, $userflags ) = get_template_and_user( { template_name => "suggestion/suggestion.tt", query => $input, type => "intranet", - flagsrequired => { catalogue => 1 }, + flagsrequired => { suggestions => 'suggestions_manage' }, } ); $borrowernumber = $input->param('borrowernumber') if ( $input->param('borrowernumber') ); $template->param('borrowernumber' => $borrowernumber); +my $branchfilter = $input->param('branchcode') || C4::Context->userenv->{'branch'}; ######################################### ## Operations ## + if ( $op =~ /save/i ) { - $suggestion_only->{suggesteddate} = dt_from_string( $suggestion_only->{suggesteddate} ) - if $suggestion_only->{suggesteddate}; + my @messages; + my $biblio = MarcRecordFromNewSuggestion({ + title => $suggestion_only->{title}, + author => $suggestion_only->{author}, + itemtype => $suggestion_only->{itemtype}, + }); + + my $manager = Koha::Patrons->find( $suggestion_only->{managedby} ); + if ( $manager && not $manager->has_permission({suggestions => 'suggestions_manage'})) { + push @messages, { type => 'error', code => 'manager_not_enough_permissions' }; + $template->param( + messages => \@messages, + ); + delete $suggestion_ref->{suggesteddate}; + delete $suggestion_ref->{manageddate}; + delete $suggestion_ref->{managedby}; + Init($suggestion_ref); + } + elsif ( !$suggestion_only->{suggestionid} && ( my ($duplicatebiblionumber, $duplicatetitle) = FindDuplicate($biblio) ) && !$save_confirmed ) { + push @messages, { type => 'error', code => 'biblio_exists', id => $duplicatebiblionumber, title => $duplicatetitle }; + $template->param( + messages => \@messages, + need_confirm => 1 + ); + delete $suggestion_ref->{suggesteddate}; + delete $suggestion_ref->{manageddate}; + Init($suggestion_ref); + } + else { - if ( $suggestion_only->{"STATUS"} ) { - if ( my $tmpstatus = lc( $suggestion_only->{"STATUS"} ) =~ /ACCEPTED|REJECTED/i ) { - $suggestion_only->{ lc( $suggestion_only->{"STATUS"}) . "date" } = dt_from_string; - $suggestion_only->{ lc( $suggestion_only->{"STATUS"}) . "by" } = C4::Context->userenv->{number}; + for my $date_key ( qw( suggesteddate manageddate accepteddate rejecteddate ) ) { + $suggestion_only->{$date_key} = dt_from_string( $suggestion_only->{$date_key} ) + if $suggestion_only->{$date_key}; } - $suggestion_only->{manageddate} = dt_from_string; - $suggestion_only->{"managedby"} = C4::Context->userenv->{number}; - } - if ( $suggestion_only->{'suggestionid'} > 0 ) { - &ModSuggestion($suggestion_only); - } else { - ###FIXME:Search here if suggestion already exists. - my $suggestions_loop = - SearchSuggestion( $suggestion_only ); - if (@$suggestions_loop>=1){ - #some suggestion are answering the request Donot Add - my @messages; - for my $suggestion ( @$suggestions_loop ) { - push @messages, { type => 'error', code => 'already_exists', id => $suggestion->{suggestionid} }; + + if ( $suggestion_only->{"STATUS"} ) { + if ( my $tmpstatus = lc( $suggestion_only->{"STATUS"} ) =~ /ACCEPTED|REJECTED/i ) { + $suggestion_only->{ lc( $suggestion_only->{"STATUS"}) . "date" } = dt_from_string; + $suggestion_only->{ lc( $suggestion_only->{"STATUS"}) . "by" } = C4::Context->userenv->{number}; } - $template->param( messages => \@messages ); - } - else { - ## Adding some informations related to suggestion - &NewSuggestion($suggestion_only); + $suggestion_only->{manageddate} = dt_from_string; + $suggestion_only->{"managedby"} ||= C4::Context->userenv->{number}; } - # empty fields, to avoid filter in "SearchSuggestion" - } - map{delete $$suggestion_ref{$_}} keys %$suggestion_ref; - $op = 'else'; - if( $redirect eq 'purchase_suggestions' ) { - print $input->redirect("/cgi-bin/koha/members/purchase-suggestions.pl?borrowernumber=$borrowernumber"); - } + my $otherreason = $input->param('other_reason'); + if ($suggestion_only->{reason} eq 'other' && $otherreason) { + $suggestion_only->{reason} = $otherreason; + } + if ( $suggestion_only->{'suggestionid'} > 0 ) { + + $suggestion_only->{lastmodificationdate} = dt_from_string; + $suggestion_only->{lastmodificationby} = C4::Context->userenv->{number}; + + &ModSuggestion($suggestion_only); + + if ( $notify ) { + my $patron = Koha::Patrons->find( $suggestion_only->{managedby} ); + my $email_address = $patron->notice_email_address; + if ($patron->notice_email_address) { + + my $letter = C4::Letters::GetPreparedLetter( + module => 'suggestions', + letter_code => 'NOTIFY_MANAGER', + branchcode => $patron->branchcode, + lang => $patron->lang, + tables => { + suggestions => $suggestion_only->{suggestionid}, + branches => $patron->branchcode, + borrowers => $patron->borrowernumber, + }, + ); + C4::Letters::EnqueueLetter( + { + letter => $letter, + borrowernumber => $patron->borrowernumber, + message_transport_type => 'email' + } + ); + } + } + } else { + ###FIXME:Search here if suggestion already exists. + my $suggestions_loop = + SearchSuggestion( $suggestion_only ); + if (@$suggestions_loop>=1){ + #some suggestion are answering the request Donot Add + my @messages; + for my $suggestion ( @$suggestions_loop ) { + push @messages, { type => 'error', code => 'already_exists', id => $suggestion->{suggestionid} }; + } + $template->param( messages => \@messages ); + } + else { + ## Adding some informations related to suggestion + &NewSuggestion($suggestion_only); + } + # empty fields, to avoid filter in "SearchSuggestion" + } + map{delete $$suggestion_ref{$_} unless $_ eq 'branchcode' } keys %$suggestion_ref; + $op = 'else'; + + if( $redirect eq 'purchase_suggestions' ) { + print $input->redirect("/cgi-bin/koha/members/purchase-suggestions.pl?borrowernumber=$borrowernumber"); + } + } } elsif ($op=~/add/) { - #Adds suggestion + #Adds suggestion Init($suggestion_ref); $op ='save'; -} +} elsif ($op=~/edit/) { #Edit suggestion $suggestion_ref=&GetSuggestion($$suggestion_ref{'suggestionid'}); + $suggestion_ref->{reasonsloop} = $reasonsloop; + my $other_reason = 1; + foreach my $reason ( @{ $reasonsloop } ) { + if ($suggestion_ref->{reason} eq $reason->{lib}) { + $other_reason = 0; + } + } + $other_reason = 0 unless $suggestion_ref->{reason}; + $template->param(other_reason => $other_reason); Init($suggestion_ref); $op ='save'; } -elsif ($op eq "change" ) { +elsif ($op eq "update_status" ) { + + my $suggestion; # set accepted/rejected/managed informations if applicable # ie= if the librarian has chosen some action on the suggestions - if ($suggestion_only->{"STATUS"} eq "ACCEPTED"){ - $suggestion_only->{accepteddate} = dt_from_string; - $suggestion_only->{"acceptedby"}=C4::Context->userenv->{number}; - } elsif ($suggestion_only->{"STATUS"} eq "REJECTED"){ - $suggestion_only->{rejecteddate} = dt_from_string; - $suggestion_only->{"rejectedby"}=C4::Context->userenv->{number}; + my $STATUS = $input->param('STATUS'); + my $accepted_by = $input->param('acceptedby'); + if ( $STATUS eq "ACCEPTED" ) { + $suggestion = { + accepteddate => dt_from_string, + acceptedby => C4::Context->userenv->{number}, + }; } - if ($suggestion_only->{"STATUS"}){ - $suggestion_only->{manageddate} = dt_from_string; - $suggestion_only->{"managedby"}=C4::Context->userenv->{number}; + elsif ( $STATUS eq "REJECTED" ) { + $suggestion = { + rejecteddate => dt_from_string, + rejectedby => C4::Context->userenv->{number}, + }; } - if ( my $reason = $$suggestion_ref{"reason$tabcode"}){ + if ($STATUS) { + $suggestion->{manageddate} = dt_from_string; + $suggestion->{managedby} = C4::Context->userenv->{number}; + $suggestion->{STATUS} = $STATUS; + } + if ( my $reason = $input->param("reason") ) { if ( $reason eq "other" ) { - $reason = $$suggestion_ref{"other_reason$tabcode"}; + $reason = $input->param("other_reason"); } - $suggestion_only->{reason}=$reason; + $suggestion->{reason} = $reason; } foreach my $suggestionid (@editsuggestions) { next unless $suggestionid; - $suggestion_only->{'suggestionid'}=$suggestionid; - &ModSuggestion($suggestion_only); - } - my $params = ''; - foreach my $key ( - qw( - displayby branchcode title author isbn publishercode copyrightdate - collectiontitle suggestedby suggesteddate_from suggesteddate_to - manageddate_from manageddate_to accepteddate_from - accepteddate_to budgetid - ) - ) - { - $params .= $key . '=' . uri_escape($input->param($key)) . '&' - if defined($input->param($key)); + $suggestion->{suggestionid} = $suggestionid; + &ModSuggestion($suggestion); } - print $input->redirect("/cgi-bin/koha/suggestion/suggestion.pl?$params"); + redirect_with_params($input); }elsif ($op eq "delete" ) { foreach my $delete_field (@editsuggestions) { &DelSuggestion( $borrowernumber, $delete_field,'intranet' ); } - $op = 'else'; + redirect_with_params($input); +} +elsif ($op eq "archive" ) { + Koha::Suggestions->find($_)->update({ archived => 1 }) for @editsuggestions; + + redirect_with_params($input); +} +elsif ($op eq "unarchive" ) { + Koha::Suggestions->find($_)->update({ archived => 0 }) for @editsuggestions; + + redirect_with_params($input); +} +elsif ( $op eq 'update_itemtype' ) { + my $new_itemtype = $input->param('suggestion_itemtype'); + foreach my $suggestionid (@editsuggestions) { + next unless $suggestionid; + &ModSuggestion({ suggestionid => $suggestionid, itemtype => $new_itemtype }); + } + redirect_with_params($input); +} +elsif ( $op eq 'update_manager' ) { + my $managedby = $input->param('suggestion_managedby'); + foreach my $suggestionid (@editsuggestions) { + next unless $suggestionid; + &ModSuggestion({ suggestionid => $suggestionid, managedby => $managedby }); + } + redirect_with_params($input); } elsif ( $op eq 'show' ) { $suggestion_ref=&GetSuggestion($$suggestion_ref{'suggestionid'}); @@ -225,9 +331,8 @@ elsif ( $op eq 'show' ) { } if ($op=~/else/) { $op='else'; - + $displayby||="STATUS"; - delete $$suggestion_ref{'branchcode'} if($displayby eq "branchcode"); # distinct values of display by my $criteria_list=GetDistinctValues("suggestions.".$displayby); my (@criteria_dv, $criteria_has_empty); @@ -241,8 +346,15 @@ if ($op=~/else/) { # aggregate null and empty values under empty value push @criteria_dv, '' if $criteria_has_empty; + # Hack to not modify GetDistinctValues for this specific case + if ( $displayby eq 'branchcode' + && C4::Context->preference('IndependentBranches') + && not C4::Context->IsSuperLibrarian ) + { + @criteria_dv = ( C4::Context->userenv->{'branch'} ); + } + my @allsuggestions; - my $reasonsloop = GetAuthorisedValues("SUGGEST"); foreach my $criteriumvalue ( @criteria_dv ) { # By default, display suggestions from current working branch unless ( exists $$suggestion_ref{'branchcode'} ) { @@ -250,10 +362,10 @@ if ($op=~/else/) { } my $definedvalue = defined $$suggestion_ref{$displayby} && $$suggestion_ref{$displayby} ne ""; - next if ( $definedvalue && $$suggestion_ref{$displayby} ne $criteriumvalue ); + next if ( $definedvalue && $$suggestion_ref{$displayby} ne $criteriumvalue ) and ($displayby ne 'branchcode' && $branchfilter ne '__ANY__' ); $$suggestion_ref{$displayby} = $criteriumvalue; - my $suggestions = &SearchSuggestion($suggestion_ref); + my $suggestions = &SearchSuggestion({ %$suggestion_ref, archived => $filter_archived }); foreach my $suggestion (@$suggestions) { if ($suggestion->{budgetid}){ my $bud = GetBudget( $suggestion->{budgetid} ); @@ -266,7 +378,7 @@ if ($op=~/else/) { "suggestionscount"=>scalar(@$suggestions), 'suggestions_loop'=>$suggestions, 'reasonsloop' => $reasonsloop, - }; + } if @$suggestions; delete $$suggestion_ref{$displayby} unless $definedvalue; } @@ -278,23 +390,13 @@ if ($op=~/else/) { ); } -foreach my $element ( qw(managedby suggestedby acceptedby) ) { -# $debug || warn $$suggestion_ref{$element}; - if ($$suggestion_ref{$element}){ - my $member=GetMember(borrowernumber=>$$suggestion_ref{$element}); - $template->param( - $element."_borrowernumber"=>$$member{borrowernumber}, - $element."_firstname"=>$$member{firstname}, - $element."_surname"=>$$member{surname}, - $element."_branchcode"=>$$member{branchcode}, - $element."_description"=>$$member{description}, - $element."_category_type"=>$$member{category_type} - ); - } -} $template->param( - %$suggestion_ref, - "op_$op" => 1, + "${_}_patron" => scalar Koha::Patrons->find( $suggestion_ref->{$_} ) ) + for qw(managedby suggestedby acceptedby lastmodificationby); + +$template->param( + %$suggestion_ref, + filter_archived => $filter_archived, "op" =>$op, ); @@ -303,8 +405,6 @@ if(defined($returnsuggested) and $returnsuggested ne "noone") print $input->redirect("/cgi-bin/koha/members/moremember.pl?borrowernumber=".$returnsuggested."#suggestions"); } -my $branchfilter = ($displayby ne "branchcode") ? $input->param('branchcode') : C4::Context->userenv->{'branch'}; - $template->param( branchfilter => $branchfilter, ); @@ -314,15 +414,8 @@ $template->param( returnsuggestedby => $returnsuggestedby ); my $patron_reason_loop = GetAuthorisedValues("OPAC_SUG"); $template->param(patron_reason_loop=>$patron_reason_loop); -#Budgets management -my $budgets = []; -if ($branchfilter) { - my $searchbudgets = { budget_branchcode => $branchfilter }; - $budgets = GetBudgets($searchbudgets); -} else { - $budgets = GetBudgets(undef); -} - +# Budgets for filtering +my $budgets = GetBudgets; my @budgets_loop; foreach my $budget ( @{$budgets} ) { next unless (CanUserUseBudget($borrowernumber, $budget, $userflags)); @@ -334,9 +427,31 @@ foreach my $budget ( @{$budgets} ) { push @budgets_loop, $budget; } - $template->param( budgetsloop => \@budgets_loop); -$template->param( "statusselected_$$suggestion_ref{'STATUS'}" =>1) if ($$suggestion_ref{'STATUS'}); + +# Budgets for suggestion add or edition +my $sugg_budget_loop = []; +my $sugg_budgets = GetBudgetHierarchy(); +foreach my $r ( @{$sugg_budgets} ) { + next unless ( CanUserUseBudget( $borrowernumber, $r, $userflags ) ); + my $selected = ( $$suggestion_ref{budgetid} && $r->{budget_id} eq $$suggestion_ref{budgetid} ) ? 1 : 0; + push @{$sugg_budget_loop}, + { + b_id => $r->{budget_id}, + b_txt => $r->{budget_name}, + b_active => $r->{budget_period_active}, + selected => $selected, + }; +} +@{$sugg_budget_loop} = sort { uc( $a->{b_txt} ) cmp uc( $b->{b_txt} ) } @{$sugg_budget_loop}; +$template->param( sugg_budgets => $sugg_budget_loop); + +if( $suggestion_ref->{STATUS} ) { + $template->param( + "statusselected_".$suggestion_ref->{STATUS} => 1, + selected_status => $suggestion_ref->{STATUS}, # We need template var selected_status in the second part of the template where template var suggestion.STATUS is out of scope + ); +} my @currencies = Koha::Acquisition::Currencies->search; $template->param( @@ -368,3 +483,21 @@ $template->param( SuggestionStatuses => GetAuthorisedValues('SUGGEST_STATUS'), ); output_html_with_http_headers $input, $cookie, $template->output; + +sub redirect_with_params { + my ( $input ) = @_; + my $params = ''; + foreach my $key ( + qw( + displayby branchcode title author isbn publishercode copyrightdate + collectiontitle suggestedby suggesteddate_from suggesteddate_to + manageddate_from manageddate_to accepteddate_from + accepteddate_to budgetid filter_archived + ) + ) + { + $params .= $key . '=' . uri_escape(scalar $input->param($key)) . '&' + if defined($input->param($key)); + } + print $input->redirect("/cgi-bin/koha/suggestion/suggestion.pl?$params"); +}