Bugzilla – Attachment 10373 Details for
Bug 7304
Working on funds ergonomic display and funds management by multiple librarians
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 7304: More permissions for budgets
0001-Bug-7304-More-permissions-for-budgets.patch (text/plain), 72.90 KB, created by
Julian Maurice
on 2012-06-20 09:56:01 UTC
(
hide
)
Description:
Bug 7304: More permissions for budgets
Filename:
MIME Type:
Creator:
Julian Maurice
Created:
2012-06-20 09:56:01 UTC
Size:
72.90 KB
patch
obsolete
>From c8ff2985835e46048aa0003418c74dc830595bdc Mon Sep 17 00:00:00 2001 >From: Julian Maurice <julian.maurice@biblibre.com> >Date: Fri, 18 May 2012 09:12:43 +0200 >Subject: [PATCH] Bug 7304: More permissions for budgets > >- Possibility to add users to a budget >- Restrictions changed to: > - None > - Owner > - Owner and users > - Owner, users and library >- Restricted users cannot spent on these budgets (they cannot modify them > either) > >Modified pages: > - admin/aqbudgets.pl > - admin/aqplan.pl > - suggestion/suggestion.pl > - acqui/acqui-home.pl > - acqui/addorderiso2709.pl > - acqui/basket.pl > - acqui/neworderempty.pl > >Unit tests in t/Budgets/CanUserUseBudget.t and t/Budgets/CanUserModifyBudget.t > >Bug 7304 tmp >--- > C4/Budgets.pm | 158 +++++++++ > acqui/acqui-home.pl | 12 +- > acqui/addorderiso2709.pl | 20 +- > acqui/basket.pl | 6 +- > acqui/neworderempty.pl | 5 +- > admin/aqbudget_owner_search.pl | 114 ------- > admin/aqbudget_user_search.pl | 89 +++++ > admin/aqbudgets.pl | 95 +++--- > admin/aqplan.pl | 4 + > .../data/mysql/de-DE/mandatory/userpermissions.sql | 1 + > .../data/mysql/en/mandatory/userpermissions.sql | 1 + > .../data/mysql/es-ES/mandatory/userpermissions.sql | 1 + > .../mysql/fr-FR/1-Obligatoire/userpermissions.sql | 1 + > .../data/mysql/it-IT/necessari/userpermissions.sql | 1 + > installer/data/mysql/kohastructure.sql | 16 + > .../mysql/nb-NO/1-Obligatorisk/userpermissions.sql | 1 + > .../data/mysql/pl-PL/mandatory/userpermissions.sql | 1 + > .../ru-RU/mandatory/permissions_and_user_flags.sql | 1 + > .../uk-UA/mandatory/permissions_and_user_flags.sql | 1 + > installer/data/mysql/updatedatabase.pl | 24 ++ > koha-tmpl/intranet-tmpl/prog/en/js/acq.js | 7 - > .../prog/en/modules/admin/aqbudget_owner_search.tt | 77 ----- > .../prog/en/modules/admin/aqbudget_user_search.tt | 111 +++++++ > .../prog/en/modules/admin/aqbudgets.tt | 152 +++++++-- > suggestion/suggestion.pl | 17 +- > t/Budgets/CanUserModifyBudget.t | 340 ++++++++++++++++++++ > t/Budgets/CanUserUseBudget.t | 250 ++++++++++++++ > 27 files changed, 1227 insertions(+), 279 deletions(-) > delete mode 100755 admin/aqbudget_owner_search.pl > create mode 100755 admin/aqbudget_user_search.pl > delete mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudget_owner_search.tt > create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudget_user_search.tt > create mode 100644 t/Budgets/CanUserModifyBudget.t > create mode 100644 t/Budgets/CanUserUseBudget.t > >diff --git a/C4/Budgets.pm b/C4/Budgets.pm >index 7a261d0..e9732ac 100644 >--- a/C4/Budgets.pm >+++ b/C4/Budgets.pm >@@ -44,6 +44,11 @@ BEGIN { > &GetPeriodsCount > &GetChildBudgetsSpent > >+ &GetBudgetUsers >+ &ModBudgetUsers >+ &CanUserUseBudget >+ &CanUserModifyBudget >+ > &GetBudgetPeriod > &GetBudgetPeriods > &ModBudgetPeriod >@@ -652,6 +657,159 @@ sub GetBudgets { > return SearchInTable("aqbudgets",$filters, $orderby, undef,undef, undef, "wide"); > } > >+=head2 GetBudgetUsers >+ >+ my @borrowernumbers = &GetBudgetUsers($budget_id); >+ >+Return the list of borrowernumbers linked to a budget >+ >+=cut >+ >+sub GetBudgetUsers { >+ my ($budget_id) = @_; >+ >+ my $dbh = C4::Context->dbh; >+ my $query = qq{ >+ SELECT borrowernumber >+ FROM aqbudgetborrowers >+ WHERE budget_id = ? >+ }; >+ my $sth = $dbh->prepare($query); >+ $sth->execute($budget_id); >+ >+ my @borrowernumbers; >+ while (my ($borrowernumber) = $sth->fetchrow_array) { >+ push @borrowernumbers, $borrowernumber >+ } >+ >+ return @borrowernumbers; >+} >+ >+=head2 ModBudgetUsers >+ >+ &ModBudgetUsers($budget_id, @borrowernumbers); >+ >+Modify the list of borrowernumbers linked to a budget >+ >+=cut >+ >+sub ModBudgetUsers { >+ my ($budget_id, @budget_users_id) = @_; >+ >+ return unless $budget_id; >+ >+ my $dbh = C4::Context->dbh; >+ my $query = "DELETE FROM aqbudgetborrowers WHERE budget_id = ?"; >+ my $sth = $dbh->prepare($query); >+ $sth->execute($budget_id); >+ >+ $query = qq{ >+ INSERT INTO aqbudgetborrowers (budget_id, borrowernumber) >+ VALUES (?,?) >+ }; >+ $sth = $dbh->prepare($query); >+ foreach my $borrowernumber (@budget_users_id) { >+ next unless $borrowernumber; >+ $sth->execute($budget_id, $borrowernumber); >+ } >+} >+ >+sub CanUserUseBudget { >+ my ($borrower, $budget, $userflags) = @_; >+ >+ if (not ref $borrower) { >+ $borrower = C4::Members::GetMember(borrowernumber => $borrower); >+ } >+ if (not ref $budget) { >+ $budget = GetBudget($budget); >+ } >+ >+ return 0 unless ($borrower and $budget); >+ >+ if (not defined $userflags) { >+ $userflags = C4::Auth::getuserflags($borrower->{flags}, >+ $borrower->{userid}); >+ } >+ >+ unless ($userflags->{superlibrarian} >+ || (ref $userflags->{acquisition} >+ && $userflags->{acquisition}->{budget_manage_all}) >+ || (!ref $userflags->{acquisition} && $userflags->{acquisition})) >+ { >+ if (not exists $userflags->{acquisition}) { >+ return 0; >+ } >+ >+ if (!ref $userflags->{acquisition} && !$userflags->{acquisition}) { >+ return 0; >+ } >+ >+ # Budget restricted to owner >+ if ($budget->{budget_permission} == 1 >+ && $budget->{budget_owner_id} >+ && $budget->{budget_owner_id} != $borrower->{borrowernumber}) { >+ return 0; >+ } >+ >+ my @budget_users = GetBudgetUsers($budget->{budget_id}); >+ >+ # Budget restricted to owner, users and library >+ if ($budget->{budget_permission} == 2 >+ && $budget->{budget_owner_id} >+ && $budget->{budget_owner_id} != $borrower->{borrowernumber} >+ && (0 == grep {$borrower->{borrowernumber} == $_} @budget_users) >+ && defined $budget->{budget_branchcode} >+ && $budget->{budget_branchcode} ne C4::Context->userenv->{branch}) { >+ return 0; >+ } >+ >+ # Budget restricted to owner and users >+ if ($budget->{budget_permission} == 3 >+ && $budget->{budget_owner_id} >+ && $budget->{budget_owner_id} != $borrower->{borrowernumber} >+ && (0 == grep {$borrower->{borrowernumber} == $_} @budget_users)) { >+ return 0; >+ } >+ } >+ >+ return 1; >+} >+ >+sub CanUserModifyBudget { >+ my ($borrower, $budget, $userflags) = @_; >+ >+ if (not ref $borrower) { >+ $borrower = C4::Members::GetMember(borrowernumber => $borrower); >+ } >+ if (not ref $budget) { >+ $budget = GetBudget($budget); >+ } >+ >+ return 0 unless ($borrower and $budget); >+ >+ if (not defined $userflags) { >+ $userflags = C4::Auth::getuserflags($borrower->{flags}, >+ $borrower->{userid}); >+ } >+ >+ unless ($userflags->{superlibrarian} >+ || (ref $userflags->{acquisition} >+ && $userflags->{acquisition}->{budget_manage_all}) >+ || (!ref $userflags->{acquisition} && $userflags->{acquisition})) >+ { >+ if (!CanUserUseBudget($borrower, $budget, $userflags)) { >+ return 0; >+ } >+ >+ if (ref $userflags->{acquisition} >+ && !$userflags->{acquisition}->{budget_modify}) { >+ return 0; >+ } >+ } >+ >+ return 1; >+} >+ > # ------------------------------------------------------------------- > > =head2 GetCurrencies >diff --git a/acqui/acqui-home.pl b/acqui/acqui-home.pl >index 69482a8..8b6c584 100755 >--- a/acqui/acqui-home.pl >+++ b/acqui/acqui-home.pl >@@ -41,7 +41,7 @@ use C4::Debug; > use C4::Suggestions; > > my $query = CGI->new; >-my ( $template, $loggedinuser, $cookie ) = get_template_and_user( >+my ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user( > { template_name => 'acqui/acqui-home.tmpl', > query => $query, > type => 'intranet', >@@ -78,9 +78,7 @@ if ( $cur_format eq 'FR' ) { > my $status = $query->param('status') || "ASKED"; > my $suggestions_count = CountSuggestion($status); > >-my $budget_arr = >- GetBudgetHierarchy( '', $user->{branchcode}, >- $template->{VARS}->{'USER_INFO'}[0]->{'borrowernumber'} ); >+my $budget_arr = GetBudgetHierarchy; > > my $total = 0; > my $totspent = 0; >@@ -93,7 +91,9 @@ my $totspent_active = 0; > my $totordered_active = 0; > my $totavail_active = 0; > >+my @budget_loop; > foreach my $budget ( @{$budget_arr} ) { >+ next unless (CanUserUseBudget($loggedinuser, $budget, $userflags)); > > $budget->{budget_code_indent} =~ s/\ /\ \;/g; > >@@ -136,11 +136,13 @@ foreach my $budget ( @{$budget_arr} ) { > for my $field (qw( budget_amount budget_spent budget_ordered budget_avail ) ) { > $budget->{$field} = $num_formatter->format_price( $budget->{$field} ); > } >+ >+ push @budget_loop, $budget; > } > > $template->param( > type => 'intranet', >- loop_budget => $budget_arr, >+ loop_budget => \@budget_loop, > branchname => $branchname, > total => $num_formatter->format_price($total), > totspent => $num_formatter->format_price($totspent), >diff --git a/acqui/addorderiso2709.pl b/acqui/addorderiso2709.pl >index 23020c7..002fbf5 100755 >--- a/acqui/addorderiso2709.pl >+++ b/acqui/addorderiso2709.pl >@@ -46,14 +46,15 @@ use C4::Branch; # GetBranches > use C4::Members; > > my $input = new CGI; >-my ($template, $loggedinuser, $cookie) = get_template_and_user({ >- template_name => "acqui/addorderiso2709.tmpl", >- query => $input, >- type => "intranet", >- authnotrequired => 0, >- flagsrequired => { acquisition => 'order_manage' }, >- debug => 1, >- }); >+my ($template, $loggedinuser, $cookie, $userflags) = get_template_and_user({ >+ template_name => "acqui/addorderiso2709.tmpl", >+ query => $input, >+ type => "intranet", >+ authnotrequired => 0, >+ flagsrequired => { acquisition => 'order_manage' }, >+ debug => 1, >+}); >+ > my $cgiparams = $input->Vars; > my $op = $cgiparams->{'op'}; > my $booksellerid = $input->param('booksellerid'); >@@ -276,8 +277,9 @@ my $budget = GetBudget($budget_id); > > # build budget list > my $budget_loop = []; >-$budgets = GetBudgetHierarchy( q{}, $borrower->{branchcode}, $borrower->{borrowernumber} ); >+$budgets = GetBudgetHierarchy; > foreach my $r ( @{$budgets} ) { >+ next unless (CanUserUseBudget($borrower, $r, $userflags)); > if ( !defined $r->{budget_amount} || $r->{budget_amount} == 0 ) { > next; > } >diff --git a/acqui/basket.pl b/acqui/basket.pl >index de66891..67ace5c 100755 >--- a/acqui/basket.pl >+++ b/acqui/basket.pl >@@ -68,7 +68,7 @@ my $query = new CGI; > my $basketno = $query->param('basketno'); > my $booksellerid = $query->param('booksellerid'); > >-my ( $template, $loggedinuser, $cookie ) = get_template_and_user( >+my ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user( > { > template_name => "acqui/basket.tmpl", > query => $query, >@@ -351,12 +351,14 @@ my $total_est_gste; > my @orders = GetOrders($basketno); > > my $borrower= GetMember('borrowernumber' => $loggedinuser); >- my $budgets = GetBudgetHierarchy(q{},$borrower->{branchcode},$borrower->{borrowernumber}); >+ my $budgets = GetBudgetHierarchy; > my $has_budgets = 0; > foreach my $r (@{$budgets}) { > if (!defined $r->{budget_amount} || $r->{budget_amount} == 0) { > next; > } >+ next unless (CanUserUseBudget($loggedinuser, $r, $userflags)); >+ > $has_budgets = 1; > last; > } >diff --git a/acqui/neworderempty.pl b/acqui/neworderempty.pl >index 08693d1..a461a1b 100755 >--- a/acqui/neworderempty.pl >+++ b/acqui/neworderempty.pl >@@ -110,7 +110,7 @@ my $new = 'no'; > > my $budget_name; > >-my ( $template, $loggedinuser, $cookie ) = get_template_and_user( >+my ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user( > { > template_name => "acqui/neworderempty.tmpl", > query => $input, >@@ -251,8 +251,9 @@ my ( $flags, $homebranch )= ($borrower->{'flags'},$borrower->{'branchcode'}); > my $budget = GetBudget($budget_id); > # build budget list > my $budget_loop = []; >-my $budgets = GetBudgetHierarchy(q{},$borrower->{branchcode},$borrower->{borrowernumber}); >+my $budgets = GetBudgetHierarchy; > foreach my $r (@{$budgets}) { >+ next unless (CanUserUseBudget($borrower, $r, $userflags)); > if (!defined $r->{budget_amount} || $r->{budget_amount} == 0) { > next; > } >diff --git a/admin/aqbudget_owner_search.pl b/admin/aqbudget_owner_search.pl >deleted file mode 100755 >index 5c73e9e..0000000 >--- a/admin/aqbudget_owner_search.pl >+++ /dev/null >@@ -1,114 +0,0 @@ >-#!/usr/bin/perl >- >-# script to find a guarantor >- >-# Copyright 2008-2009 BibLibre SARL >-# >-# This file is part of Koha. >-# >-# Koha is free software; you can redistribute it and/or modify it under the >-# terms of the GNU General Public License as published by the Free Software >-# Foundation; either version 2 of the License, or (at your option) any later >-# version. >-# >-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY >-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR >-# A PARTICULAR PURPOSE. See the GNU General Public License for more details. >-# >-# You should have received a copy of the GNU General Public License along >-# with Koha; if not, write to the Free Software Foundation, Inc., >-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. >- >-use strict; >-#use warnings; FIXME - Bug 2505 >-use C4::Auth ; >-use C4::Output; >-use CGI; >-use C4::Dates qw/format_date/; >-use C4::Members; >- >-my $input = new CGI; >- >-my $dbh = C4::Context->dbh; >- >-my ( $template, $loggedinuser, $cookie, $staff_flags ) = get_template_and_user( >- { template_name => "admin/aqbudget_owner_search.tmpl", >- query => $input, >- type => "intranet", >- authnotrequired => 0, >- flagsrequired => { acquisition => 'budget_modify' }, >- debug => 1, >- } >-); >- >-my $theme = $input->param('theme') || "default"; >- >-# only used if allowthemeoverride is set >-my $member = $input->param('member'); >-my $orderby = $input->param('orderby'); >- >-my $op = $input->param('op'); >-$template->param( $op || else => 1, ); >- >-$orderby = "surname,firstname" unless $orderby; >-$member =~ s/,//g; #remove any commas from search string >-$member =~ s/\*/%/g; >-if ( $member eq '' ) { >- $template->param( results => 0 ); >-} else { >- $template->param( results => 1 ); >-} >- >-my ( $count, $count2, $results ); >-my @resultsdata; >-my $toggle = 0; >- >-if ( $member ) { >- my $results= Search($member,"surname"); >- >- foreach my $res (@$results) { >- >- my $perms = haspermission( $res->{'userid'} ); >- my $subperms = get_user_subpermissions ($res->{'userid'} ); >- >- >- # if the member has 'acqui' permission set, then display to table. >- if ( $perms->{superlibrarian} == 1 || >- $perms->{acquisition} == 1 || >- $subperms->{acquisition}->{'budget_manage'} || >- $subperms->{acquisition}->{'budget_modify'} || >- $subperms->{acquisition}->{'budget_add_del'} ) { >- >- $count2++; >- #find out stats >-# my ( $od, $issue, $fines ) = GetMemberIssuesAndFines( $res->{'borrowerid'} ); >- #This looks unused and very unuseful >- my $guarantorinfo = uc( $res->{'surname'} ) . " , " . ucfirst( $res->{'firstname'} ); >- my $budget_owner_name = $res->{'firstname'} . ' ' . $res->{'surname'}, my $budget_owner_id = $res->{'borrowernumber'}; >- >- my %row = ( >- borrowernumber => $res->{'borrowernumber'}, >- cardnumber => $res->{'cardnumber'}, >- surname => $res->{'surname'}, >- firstname => $res->{'firstname'}, >- categorycode => $res->{'categorycode'}, >- branchcode => $res->{'branchcode'}, >- guarantorinfo => $guarantorinfo, >- budget_owner_id => $budget_owner_id, >- budget_owner_name => $budget_owner_name, >-# odissue => "$od/$issue", >-# fines => $fines, >-# borrowernotes => $res->{'borrowernotes'} >- ); >- push( @resultsdata, \%row ); >- } >- } >-} >- >-$template->param( >- member => $member, >- numres => $count2, >- resultsloop => \@resultsdata >-); >- >-output_html_with_http_headers $input, $cookie, $template->output; >diff --git a/admin/aqbudget_user_search.pl b/admin/aqbudget_user_search.pl >new file mode 100755 >index 0000000..1bef153 >--- /dev/null >+++ b/admin/aqbudget_user_search.pl >@@ -0,0 +1,89 @@ >+#!/usr/bin/perl >+ >+# script to find owner and users for a budget >+ >+# Copyright 2008-2009 BibLibre SARL >+# >+# This file is part of Koha. >+# >+# Koha is free software; you can redistribute it and/or modify it under the >+# terms of the GNU General Public License as published by the Free Software >+# Foundation; either version 2 of the License, or (at your option) any later >+# version. >+# >+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY >+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR >+# A PARTICULAR PURPOSE. See the GNU General Public License for more details. >+# >+# You should have received a copy of the GNU General Public License along >+# with Koha; if not, write to the Free Software Foundation, Inc., >+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. >+ >+use Modern::Perl; >+ >+use C4::Auth ; >+use C4::Output; >+use CGI; >+use C4::Dates qw/format_date/; >+use C4::Members; >+ >+my $input = new CGI; >+ >+my $dbh = C4::Context->dbh; >+ >+my ( $template, $loggedinuser, $cookie, $staff_flags ) = get_template_and_user( >+ { template_name => "admin/aqbudget_user_search.tt", >+ query => $input, >+ type => "intranet", >+ authnotrequired => 0, >+ flagsrequired => { acquisition => 'budget_modify' }, >+ debug => 1, >+ } >+); >+ >+# only used if allowthemeoverride is set >+my $type = $input->param('type'); >+my $member = $input->param('member') // ''; >+ >+$member =~ s/,//g; #remove any commas from search string >+$member =~ s/\*/%/g; >+if ( $member eq '' ) { >+ $template->param( results => 0 ); >+} else { >+ $template->param( results => 1 ); >+} >+ >+my @resultsdata; >+ >+if ( $member ) { >+ my $results = Search($member, "surname"); >+ >+ foreach my $res (@$results) { >+ my $perms = haspermission( $res->{'userid'} ); >+ my $subperms = get_user_subpermissions( $res->{'userid'} ); >+ >+ # if the member has 'acqui' permission set, then display to table. >+ if ( $perms->{superlibrarian} == 1 || >+ $perms->{acquisition} == 1 || >+ exists $subperms->{acquisition} ) >+ { >+ my %row = ( >+ borrowernumber => $res->{'borrowernumber'}, >+ cardnumber => $res->{'cardnumber'}, >+ surname => $res->{'surname'}, >+ firstname => $res->{'firstname'}, >+ categorycode => $res->{'categorycode'}, >+ branchcode => $res->{'branchcode'}, >+ ); >+ push( @resultsdata, \%row ); >+ } >+ } >+} >+ >+$template->param( >+ type => $type, >+ member => $member, >+ resultsloop => \@resultsdata >+); >+ >+output_html_with_http_headers $input, $cookie, $template->output; >diff --git a/admin/aqbudgets.pl b/admin/aqbudgets.pl >index 39fffdb..c5f99e3 100755 >--- a/admin/aqbudgets.pl >+++ b/admin/aqbudgets.pl >@@ -19,8 +19,8 @@ > # with Koha; if not, write to the Free Software Foundation, Inc., > # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. > >-use strict; >-#use warnings; FIXME - Bug 2505 >+use Modern::Perl; >+ > use CGI; > use List::Util qw/min/; > use Number::Format qw(format_price); >@@ -56,15 +56,17 @@ $template->param( symbol => $cur->{symbol}, > currency => $cur->{currency} > ); > >-my $op = $input->param('op'); >+my $op = $input->param('op') // ''; > > # see if the user want to see all budgets or only owned ones > my $show_mine = 1; #SHOW BY DEFAULT >-my $show = $input->param('show'); # SET TO 1, BY A FORM SUMBIT >+my $show = $input->param('show') // 0; # SET TO 1, BY A FORM SUMBIT > $show_mine = $input->param('show_mine') if $show == 1; > > # IF USER DOESNT HAVE PERM FOR AN 'ADD', THEN REDIRECT TO THE DEFAULT VIEW... >-if ( not defined $template->{VARS}->{'CAN_user_acquisition_budget_add_del'} && $op == 'add_form' ) { >+if (not defined $template->{VARS}->{'CAN_user_acquisition_budget_add_del'} >+ and $op eq 'add_form') >+{ > $op = ''; > } > my $num=FormatNumber; >@@ -73,7 +75,7 @@ my $script_name = "/cgi-bin/koha/admin/aqbudgets.pl"; > my $budget_hash = $input->Vars; > my $budget_id = $$budget_hash{budget_id}; > my $budget_permission = $input->param('budget_permission'); >-my $filter_budgetbranch = $input->param('filter_budgetbranch'); >+my $filter_budgetbranch = $input->param('filter_budgetbranch') // ''; > my $filter_budgetname = $input->param('filter_budgetname'); > #filtering non budget keys > delete $$budget_hash{$_} foreach grep {/filter|^op$|show/} keys %$budget_hash; >@@ -126,7 +128,12 @@ if ($op eq 'add_form') { > # pass the period_id to build the dropbox - because we only want to show budgets from this period > my $dropbox_disabled; > if (defined $budget_id ) { ### MOD >- $budget = GetBudget($budget_id); >+ $budget = GetBudget($budget_id); >+ if (!CanUserModifyBudget($borrowernumber, $budget, $staffflags)) { >+ $template->param(error_not_authorised_to_modify => 1); >+ output_html_with_http_headers $input, $cookie, $template->output; >+ exit; >+ } > $dropbox_disabled = BudgetHasChildren($budget_id); > my $borrower = &GetMember( borrowernumber=>$budget->{budget_owner_id} ); > $budget->{budget_owner_name} = $borrower->{'firstname'} . ' ' . $borrower->{'surname'}; >@@ -189,6 +196,24 @@ if ($op eq 'add_form') { > $template->param($budget_permission => 1); > } > >+ if ($budget) { >+ my @budgetusers = GetBudgetUsers($budget->{budget_id}); >+ my @budgetusers_loop; >+ foreach my $borrowernumber (@budgetusers) { >+ my $member = C4::Members::GetMember( >+ borrowernumber => $borrowernumber); >+ push @budgetusers_loop, { >+ firstname => $member->{firstname}, >+ surname => $member->{surname}, >+ borrowernumber => $borrowernumber >+ }; >+ } >+ $template->param( >+ budget_users => \@budgetusers_loop, >+ budget_users_ids => join ':', @budgetusers >+ ); >+ } >+ > # if no buget_id is passed then its an add > $template->param( > add_validate => 1, >@@ -218,10 +243,24 @@ if ($op eq 'add_form') { > if ( $op eq 'delete_confirmed' ) { > my $rc = DelBudget($budget_id); > }elsif( $op eq 'add_validate' ) { >+ my @budgetusersid; >+ if (defined $$budget_hash{'budget_users_ids'}){ >+ @budgetusersid = split(':', $budget_hash->{'budget_users_ids'}); >+ } >+ > if ( defined $$budget_hash{budget_id} ) { >- ModBudget( $budget_hash ); >+ if (CanUserModifyBudget($borrowernumber, $budget_hash->{budget_id}, >+ $staffflags) >+ ) { >+ ModBudget( $budget_hash ); >+ ModBudgetUsers($budget_hash->{budget_id}, @budgetusersid); >+ } >+ else { >+ $template->param(error_not_authorised_to_modify => 1); >+ } > } else { > AddBudget( $budget_hash ); >+ ModBudgetUsers($budget_hash->{budget_id}, @budgetusersid); > } > } > my $branches = GetBranches(); >@@ -230,8 +269,10 @@ if ($op eq 'add_form') { > %$period, > ); > >- my $moo = GetBudgetHierarchy($$period{budget_period_id}, C4::Context->userenv->{branchcode}, $show_mine?$borrower_id:''); >- my @budgets = @$moo; #FIXME >+ my @budgets = @{ >+ GetBudgetHierarchy($$period{budget_period_id}, >+ C4::Context->userenv->{branchcode}, $show_mine ? $borrower_id : '') >+ }; > > my $toggle = 0; > my @loop; >@@ -245,31 +286,9 @@ if ($op eq 'add_form') { > $budget->{'total_levels_spent'} = GetChildBudgetsSpent($budget->{"budget_id"}); > > # PERMISSIONS >- unless($staffflags->{'superlibrarian'} % 2 == 1 ) { >- #IF NO PERMS, THEN DISABLE EDIT/DELETE >- unless ( $template->{VARS}->{'CAN_user_acquisition_budget_modify'} ) { >- $budget->{'budget_lock'} = 1; >- } >- # check budget permission >- if ( $$period{budget_period_locked} == 1 ) { >- $budget->{'budget_lock'} = 1; >- >- } elsif ( $budget->{budget_permission} == 1 ) { >- >- if ( $borrower_id != $budget->{'budget_owner_id'} ) { >- $budget->{'budget_lock'} = 1; >- } >- # check parent perms too >- my $parents_perm = 0; >- if ( $budget->{depth} > 0 ) { >- $parents_perm = CheckBudgetParentPerm( $budget, $borrower_id ); >- delete $budget->{'budget_lock'} if $parents_perm == '1'; >- } >- } elsif ( $budget->{budget_permission} == 2 ) { >- >- $budget->{'budget_lock'} = 1 if $user_branchcode ne $budget->{budget_branchcode}; >- } >- } # ...SUPER_LIB END >+ unless(CanUserModifyBudget($borrowernumber, $budget, $staffflags)) { >+ $budget->{'budget_lock'} = 1; >+ } > > # if a budget search doesnt match, next > if ($filter_budgetname) { >@@ -288,7 +307,9 @@ if ($op eq 'add_form') { > $budget->{'budget_remaining'} = $budget->{'budget_amount'} - $budget->{'total_levels_spent'}; > > # if amount == 0 dont display... >- delete $budget->{'budget_unalloc_sublevel'} if $budget->{'budget_unalloc_sublevel'} == 0 ; >+ delete $budget->{'budget_unalloc_sublevel'} >+ if (!defined $budget->{'budget_unalloc_sublevel'} >+ or $budget->{'budget_unalloc_sublevel'} == 0); > > $budget->{'remaining_pos'} = 1 if $budget->{'budget_remaining'} > 0; > $budget->{'remaining_neg'} = 1 if $budget->{'budget_remaining'} < 0; >@@ -312,7 +333,7 @@ if ($op eq 'add_form') { > push @budget_hierarchy, { element_name => $parent->{"budget_name"}, element_id => $parent->{"budget_id"} }; > $parent_id = $parent->{"budget_parent_id"}; > } >- push @budget_hierarchy, { element_name => $period->{"budget_period_description"} }; >+ push @budget_hierarchy, { element_name => $period->{"budget_period_description"} }; > @budget_hierarchy = reverse(@budget_hierarchy); > > push( @loop, { %{$budget}, >diff --git a/admin/aqplan.pl b/admin/aqplan.pl >index ffb1145..9cc8c59 100755 >--- a/admin/aqplan.pl >+++ b/admin/aqplan.pl >@@ -354,6 +354,10 @@ my ( @budget_lines, %cell_hash ); > foreach my $budget (@budgets) { > my $budget_lock; > >+ unless (CanUserUseBudget($borrowernumber, $budget, $staff_flags)) { >+ $budget_lock = 1 >+ } >+ > # check budget permission > if ( $period->{budget_period_locked} == 1 ) { > $budget_lock = 1; >diff --git a/installer/data/mysql/de-DE/mandatory/userpermissions.sql b/installer/data/mysql/de-DE/mandatory/userpermissions.sql >index 54fd531..a4bda59 100644 >--- a/installer/data/mysql/de-DE/mandatory/userpermissions.sql >+++ b/installer/data/mysql/de-DE/mandatory/userpermissions.sql >@@ -16,6 +16,7 @@ INSERT INTO permissions (module_bit, code, description) VALUES > (11, 'group_manage', 'Bestellgruppen vewalten'), > (11, 'order_receive', 'Lieferungen verwalten'), > (11, 'budget_add_del', 'Konten hinzufügen/ändern, aber bestehende nicht ändern'), >+ (11, 'budget_manage_all', 'Manage all budgets'), > (13, 'edit_news', 'Nachrichten für OPAC und Dienstoberfläche verfassen'), > (13, 'label_creator', 'Etiketten und Barcodes aus Katalog- und Benutzerdaten erstellen'), > (13, 'edit_calendar', 'SchlieÃtage eintragen'), >diff --git a/installer/data/mysql/en/mandatory/userpermissions.sql b/installer/data/mysql/en/mandatory/userpermissions.sql >index 70f89e2..72cc70f 100644 >--- a/installer/data/mysql/en/mandatory/userpermissions.sql >+++ b/installer/data/mysql/en/mandatory/userpermissions.sql >@@ -16,6 +16,7 @@ INSERT INTO permissions (module_bit, code, description) VALUES > (11, 'group_manage', 'Manage orders & basketgroups'), > (11, 'order_receive', 'Manage orders & basket'), > (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'), >+ (11, 'budget_manage_all', 'Manage all budgets'), > (13, 'edit_news', 'Write news for the OPAC and staff interfaces'), > (13, 'label_creator', 'Create printable labels and barcodes from catalog and patron data'), > (13, 'edit_calendar', 'Define days when the library is closed'), >diff --git a/installer/data/mysql/es-ES/mandatory/userpermissions.sql b/installer/data/mysql/es-ES/mandatory/userpermissions.sql >index 70f89e2..72cc70f 100644 >--- a/installer/data/mysql/es-ES/mandatory/userpermissions.sql >+++ b/installer/data/mysql/es-ES/mandatory/userpermissions.sql >@@ -16,6 +16,7 @@ INSERT INTO permissions (module_bit, code, description) VALUES > (11, 'group_manage', 'Manage orders & basketgroups'), > (11, 'order_receive', 'Manage orders & basket'), > (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'), >+ (11, 'budget_manage_all', 'Manage all budgets'), > (13, 'edit_news', 'Write news for the OPAC and staff interfaces'), > (13, 'label_creator', 'Create printable labels and barcodes from catalog and patron data'), > (13, 'edit_calendar', 'Define days when the library is closed'), >diff --git a/installer/data/mysql/fr-FR/1-Obligatoire/userpermissions.sql b/installer/data/mysql/fr-FR/1-Obligatoire/userpermissions.sql >index d6362e8..c96e9c6 100644 >--- a/installer/data/mysql/fr-FR/1-Obligatoire/userpermissions.sql >+++ b/installer/data/mysql/fr-FR/1-Obligatoire/userpermissions.sql >@@ -33,6 +33,7 @@ INSERT INTO permissions (module_bit, code, description) VALUES > (11, 'group_manage', 'Gérer les commandes et les bons de commande'), > (11, 'order_receive', 'Gérer les réceptions'), > (11, 'budget_add_del', 'Ajouter et supprimer les budgets (mais pas modifier)'), >+ (11, 'budget_manage_all', 'Gérer tous les budgets'), > (13, 'manage_csv_profiles', 'Gérer les profils d''export CSV'), > (13, 'moderate_tags', 'Modérer les tags des adhérents'), > (13, 'rotating_collections', 'Gérer les collections tournantes'), >diff --git a/installer/data/mysql/it-IT/necessari/userpermissions.sql b/installer/data/mysql/it-IT/necessari/userpermissions.sql >index 03dd32c..8be056c 100644 >--- a/installer/data/mysql/it-IT/necessari/userpermissions.sql >+++ b/installer/data/mysql/it-IT/necessari/userpermissions.sql >@@ -18,6 +18,7 @@ INSERT INTO permissions (module_bit, code, description) VALUES > (11, 'group_manage', 'Gestisci ordini e raccoglitori raggruppati'), > (11, 'order_receive', 'Gestisci arrivi'), > (11, 'budget_add_del', 'Aggiungi e cancella budgets (senza modificarli)'), >+ (11, 'budget_manage_all', 'Manage all budgets'), > (13, 'edit_news', 'Scrivi le news per l\'OPAC e per l\'interfaccia staff'), > (13, 'label_creator', 'Crea etichette da stampare e barcodes dal catalogo e dai dati degli utenti'), > (13, 'edit_calendar', 'Definisci i giorni di chiusura della biblioteca'), >diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql >index 54498c3..e1105a5 100644 >--- a/installer/data/mysql/kohastructure.sql >+++ b/installer/data/mysql/kohastructure.sql >@@ -2642,6 +2642,22 @@ CREATE TABLE `aqbudgets` ( > PRIMARY KEY (`budget_id`) > ) ENGINE=InnoDB DEFAULT CHARSET=utf8; > >+-- >+-- Table structure for table aqbudgetborrowers >+-- >+ >+DROP TABLE IF EXISTS aqbudgetborrowers; >+CREATE TABLE aqbudgetborrowers ( >+ budget_id int(11) NOT NULL, >+ borrowernumber int(11) NOT NULL, >+ PRIMARY KEY (budget_id, borrowernumber), >+ CONSTRAINT aqbudgetborrowers_ibfk_1 FOREIGN KEY (budget_id) >+ REFERENCES aqbudgets (budget_id) >+ ON DELETE CASCADE ON UPDATE CASCADE, >+ CONSTRAINT aqbudgetborrowers_ibfk_2 FOREIGN KEY (borrowernumber) >+ REFERENCES borrowers (borrowernumber) >+ ON DELETE CASCADE ON UPDATE CASCADE >+) ENGINE=InnoDB DEFAULT CHARSET=utf8; > > -- > -- Table structure for table `aqbudgetperiods` >diff --git a/installer/data/mysql/nb-NO/1-Obligatorisk/userpermissions.sql b/installer/data/mysql/nb-NO/1-Obligatorisk/userpermissions.sql >index fd3989d..3ef9666 100644 >--- a/installer/data/mysql/nb-NO/1-Obligatorisk/userpermissions.sql >+++ b/installer/data/mysql/nb-NO/1-Obligatorisk/userpermissions.sql >@@ -37,6 +37,7 @@ INSERT INTO permissions (module_bit, code, description) VALUES > (11, 'group_manage', 'Administrere bestillinger og kurv-grupper'), > (11, 'order_receive', 'Administrere bestillinger og kurver'), > (11, 'budget_add_del', 'Legge til og slette budsjetter (men ikke endre budsjetter)'), >+ (11, 'budget_manage_all', 'Manage all budgets'), > (13, 'edit_news', 'Legge ut nyhter i OPACen og det interne grensesnittet'), > (13, 'label_creator', 'Lage etiketter og strekkoder basert pÃ¥ bibliografiske poster og lÃ¥nerdata'), > (13, 'edit_calendar', 'Definere dager da biblioteket er stengt'), >diff --git a/installer/data/mysql/pl-PL/mandatory/userpermissions.sql b/installer/data/mysql/pl-PL/mandatory/userpermissions.sql >index a9629c5..4cd583e 100644 >--- a/installer/data/mysql/pl-PL/mandatory/userpermissions.sql >+++ b/installer/data/mysql/pl-PL/mandatory/userpermissions.sql >@@ -16,6 +16,7 @@ INSERT INTO permissions (module_bit, code, description) VALUES > (11, 'group_manage', 'Manage orders & basketgroups'), > (11, 'order_receive', 'Manage orders & basket'), > (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'), >+ (11, 'budget_manage_all', 'Manage all budgets'), > (13, 'edit_news', 'RTworzeniei publikowanie wiadomoÅci w interfejsie bibliotekarza i OPAC'), > (13, 'label_creator', 'Create printable labels and barcodes from catalog and patron data'), > (13, 'edit_calendar', 'Define days when the library is closed'), >diff --git a/installer/data/mysql/ru-RU/mandatory/permissions_and_user_flags.sql b/installer/data/mysql/ru-RU/mandatory/permissions_and_user_flags.sql >index 07b1545..f77ca01 100644 >--- a/installer/data/mysql/ru-RU/mandatory/permissions_and_user_flags.sql >+++ b/installer/data/mysql/ru-RU/mandatory/permissions_and_user_flags.sql >@@ -40,6 +40,7 @@ INSERT INTO permissions (module_bit, code, description) VALUES > (11, 'group_manage', 'Manage orders & basketgroups'), > (11, 'order_receive', 'Manage orders & basket'), > (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'), >+ (11, 'budget_manage_all', 'Manage all budgets'), > (13, 'edit_news', 'ÐапиÑание новоÑÑей Ð´Ð»Ñ ÑлекÑÑонного каÑалога и инÑеÑÑейÑа библиоÑекаÑей'), > (13, 'label_creator', 'Создание пеÑаÑнÑÑ Ð½Ð°ÐºÐ»ÐµÐµÐº и ÑÑÑиÑкодов из каÑалога и Ñ Ð´Ð°Ð½Ð½Ñми о полÑзоваÑелÑÑ'), > (13, 'edit_calendar', 'ÐпÑеделение дней, когда библиоÑека закÑÑÑа'), >diff --git a/installer/data/mysql/uk-UA/mandatory/permissions_and_user_flags.sql b/installer/data/mysql/uk-UA/mandatory/permissions_and_user_flags.sql >index 40034cf..5e8b6f0 100644 >--- a/installer/data/mysql/uk-UA/mandatory/permissions_and_user_flags.sql >+++ b/installer/data/mysql/uk-UA/mandatory/permissions_and_user_flags.sql >@@ -40,6 +40,7 @@ INSERT INTO permissions (module_bit, code, description) VALUES > (11, 'group_manage', 'Manage orders & basketgroups'), > (11, 'order_receive', 'Manage orders & basket'), > (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'), >+ (11, 'budget_manage_all', 'Manage all budgets'), > (13, 'edit_news', 'ÐапиÑÐ°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¸Ð½ Ð´Ð»Ñ ÐµÐ»ÐµÐºÑÑонного каÑÐ°Ð»Ð¾Ð³Ñ Ñа ÑнÑеÑÑейÑÑ Ð±ÑблÑоÑекаÑÑв'), > (13, 'label_creator', 'СÑвоÑÐµÐ½Ð½Ñ Ð´ÑÑÐºÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð°ÐºÐ»ÐµÐ¹Ð¾Ðº Ñ ÑÑÑиÑ-кодÑв з каÑÐ°Ð»Ð¾Ð³Ñ Ñа з даними пÑо коÑиÑÑÑваÑÑв'), > (13, 'edit_calendar', 'ÐизнаÑÐµÐ½Ð½Ñ Ð´Ð½Ñв, коли бÑблÑоÑека закÑиÑа'), >diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl >index 9b02cb9..b31de2f 100755 >--- a/installer/data/mysql/updatedatabase.pl >+++ b/installer/data/mysql/updatedatabase.pl >@@ -5370,6 +5370,30 @@ if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { > } > > >+$DBversion = "XXX"; >+if (C4::Context->preference("Version") < TransformToNum($DBversion)) { >+ $dbh->do("DROP TABLE IF EXISTS aqbudgetborrowers"); >+ $dbh->do(" >+ CREATE TABLE aqbudgetborrowers ( >+ budget_id int(11) NOT NULL, >+ borrowernumber int(11) NOT NULL, >+ PRIMARY KEY (budget_id, borrowernumber), >+ CONSTRAINT aqbudgetborrowers_ibfk_1 FOREIGN KEY (budget_id) >+ REFERENCES aqbudgets (budget_id) >+ ON DELETE CASCADE ON UPDATE CASCADE, >+ CONSTRAINT aqbudgetborrowers_ibfk_2 FOREIGN KEY (borrowernumber) >+ REFERENCES borrowers (borrowernumber) >+ ON DELETE CASCADE ON UPDATE CASCADE >+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8; >+ "); >+ $dbh->do(" >+ INSERT INTO permissions (module_bit, code, description) >+ VALUES (11, 'budget_manage_all', 'Manage all budgets') >+ "); >+ print "Upgrade to $DBversion done (Add aqbudgetborrowers table)\n"; >+ SetVersion($DBversion); >+} >+ > =head1 FUNCTIONS > > =head2 TableExists($table) >diff --git a/koha-tmpl/intranet-tmpl/prog/en/js/acq.js b/koha-tmpl/intranet-tmpl/prog/en/js/acq.js >index 70e988e..2efeba0 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/js/acq.js >+++ b/koha-tmpl/intranet-tmpl/prog/en/js/acq.js >@@ -531,14 +531,7 @@ function log(message) { > logLine.appendChild(log.window_.document.createTextNode(message)); > log.window_.document.body.appendChild(logLine); > } >-//======================================================================= >- > >- >- function ownerPopup(f) { >- window.open("/cgi-bin/koha/admin/aqbudget_owner_search.pl?op=budget",'PatronPopup','width=740,height=450,location=yes,toolbar=no,scrollbars=yes,resize=yes'); >- } >- // > //======================================================================= > function getElementsByClass( searchClass, domNode, tagName) { > if (domNode == null) domNode = document; >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudget_owner_search.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudget_owner_search.tt >deleted file mode 100644 >index 79ebcd8..0000000 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudget_owner_search.tt >+++ /dev/null >@@ -1,77 +0,0 @@ >-[% INCLUDE 'doc-head-open.inc' %] >-<title>Koha › Budget owner search</title> >-[% INCLUDE 'doc-head-close.inc' %] >- <style type="text/css"> >- #custom-doc { width:44.46em;*width:43.39em;min-width:578px; margin:auto; text-align:left; } >- </style> >- >-<script type="text/javascript"> >-//<![CDATA[ >- >-// modify parent window owner element >-function returnOwner(ownerId, ownerName){ >- var top1 = top.opener; >- top1.document.getElementById('budget_owner_name').innerHTML = ownerName; >- top1.document.getElementById('budget_owner_id').value = ownerId; >- window.close(); >-} >-//]]> >-</script> >- >- >-</head> >-<body id="admin_aqbudget_owner_search" class="admin"> >-<div id="custom-doc" class="yui-t7"> >- <div id="bd"> >- <div class="yui-g"> >- >- >-<h3>Search for budget owner</h3> >- <form action="/cgi-bin/koha/admin/aqbudget_owner_search.pl" method="post"> >- <fieldset> >- <input type="text" name="member" id="member" value="[% member %]" class="focus" /> >- >- >-<!-- >- Ordered by >- <select name="orderby"> >- <option value="surname,firstname">Surname</option> >- <option value="cardnumber">Cardnumber</option> >- </select> >---> >- >-<input type="submit" class="button" value="Search" /></fieldset> >-<div class="hint">Only staff with superlibrarian or acquisitions permissions are returned in the search results</div> >- >- </form> >- >- >-[% IF ( results ) %] >- <p>Searched for <span class="ex">[% member %]</span>, [% numresults %] patron(s) found:</p> >- <table> >- <tr> >- <th>Cardnumber</th> >- <th>Name</th> >- <th>Library</th> >- <th>Categorycode</th> >- <th>Select?</th> >- </tr> >- >- [% FOREACH resultsloo IN resultsloop %] >- [% IF ( resultsloo.toggle ) %]<tr>[% ELSE %]<tr class="highlight">[% END %] >- <td>[% resultsloo.cardnumber %]</td> >- <td>[% resultsloo.surname %], [% resultsloo.firstname %]</td> >- <td>[% resultsloo.branchcode %]</td> >- <td>[% resultsloo.categorycode %]</td> >- <td> >- <input type="button" value="Select" onclick="returnOwner('[% resultsloo.budget_owner_id %]', '[% resultsloo.budget_owner_name %]');" /> >- </td> >- </tr> >- [% END %] >- </table> >-[% END %] >- >-<div id="closewindow"><a href="#" class="close">Cancel</a></div> >-</div> >-</div> >-[% INCLUDE 'intranet-bottom.inc' %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudget_user_search.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudget_user_search.tt >new file mode 100644 >index 0000000..316a00a >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudget_user_search.tt >@@ -0,0 +1,111 @@ >+[% INCLUDE 'doc-head-open.inc' %] >+<title>Koha › Budget >+ [% IF (type == 'owner') %] >+ owner >+ [% ELSE %] >+ user >+ [% END %] >+ search >+</title> >+[% INCLUDE 'doc-head-close.inc' %] >+ <style type="text/css"> >+ #custom-doc { >+ width:44.46em; >+ *width:43.39em; >+ min-width:578px; >+ margin:auto; >+ text-align:left; >+ } >+ </style> >+ >+ <script type="text/javascript"> >+ //<![CDATA[ >+ >+ // modify parent window owner element >+ function add_user(borrowernumber, surname, firstname) { >+ [% IF (type == 'owner') %] >+ top.opener.edit_owner(borrowernumber, surname, firstname); >+ window.close(); >+ [% ELSE %] >+ var ret = top.opener.add_user(borrowernumber, surname, firstname); >+ if (ret != 0) { >+ alert(_("This user is already in the list.")); >+ } >+ [% END %] >+ } >+ >+ //]]> >+ </script> >+</head> >+ >+<body id="admin_aqbudget_owner_search" class="admin"> >+<div id="custom-doc" class="yui-t7"> >+<div id="bd"> >+<div class="yui-g"> >+ >+<h3>Search for budget >+ [% IF (type == 'owner') %] >+ owner >+ [% ELSE %] >+ user >+ [% END %] >+</h3> >+<form action="/cgi-bin/koha/admin/aqbudget_user_search.pl" method="post"> >+ <fieldset> >+ <input type="text" name="member" id="member" value="[% member %]" >+ class="focus" /> >+ >+ <input type="hidden" name="type" value="[% type %]" /> >+ <input type="submit" class="button" value="Search" /> >+ </fieldset> >+ >+ <div class="hint"> >+ Only staff with superlibrarian or acquisitions permissions are returned >+ in the search results. >+ </div> >+</form> >+ >+ >+[% IF ( results ) %] >+ <p>Searched for <span class="ex">[% member %]</span>, >+ [% resultsloop.size || 0 %] patron(s) found:</p> >+ >+ <table> >+ <thead> >+ <tr> >+ <th>Cardnumber</th> >+ <th>Name</th> >+ <th>Library</th> >+ <th>Categorycode</th> >+ <th>Select?</th> >+ </tr> >+ </thead> >+ >+ <tbody> >+ [% FOREACH result IN resultsloop %] >+ <tr> >+ <td>[% result.cardnumber %]</td> >+ <td>[% result.surname %], [% result.firstname %]</td> >+ <td>[% result.branchcode %]</td> >+ <td>[% result.categorycode %]</td> >+ <td> >+ <a style="cursor:pointer" >+ onclick="add_user( >+ '[% result.borrowernumber %]', >+ '[% result.surname %]', >+ '[% result.firstname %]' >+ );" >+ />Select</a> >+ </td> >+ </tr> >+ [% END %] >+ </tbody> >+ </table> >+[% END %] >+ >+<div id="closewindow"> >+ <a href="#" class="close">Close</a> >+</div> >+</div> >+</div> >+[% INCLUDE 'intranet-bottom.inc' %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudgets.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudgets.tt >index bf778c7..ba308b6 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudgets.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudgets.tt >@@ -6,12 +6,66 @@ > [% IF ( add_form ) %] > <script type="text/javascript"> > //<![CDATA[ >-// >- var actTotal =""; > >- function ownerRemove(f) { >- document.getElementById('budget_owner_name').innerHTML = ''; >- document.getElementById('budget_owner_id').value = ''; >+ function userPopup() { >+ window.open("/cgi-bin/koha/admin/aqbudget_user_search.pl?type=user", >+ 'PatronPopup', >+ 'width=740,height=450,location=yes,toolbar=no,' >+ + 'scrollbars=yes,resize=yes' >+ ); >+ } >+ >+ function ownerPopup() { >+ window.open("/cgi-bin/koha/admin/aqbudget_user_search.pl?type=owner", >+ 'PatronPopup', >+ 'width=740,height=450,location=yes,toolbar=no,' >+ + 'scrollbars=yes,resize=yes' >+ ); >+ } >+ >+ function edit_owner(borrowernumber, surname, firstname) { >+ $('#budget_owner_name').empty(); >+ $('#budget_owner_id').val(''); >+ if (borrowernumber) { >+ var ownerlink = '<a href="/cgi-bin/koha/members/moremember.pl' >+ + '?borrowernumber=' + borrowernumber + '">' >+ + firstname + ' ' + surname + '</a>'; >+ $('#budget_owner_name').html(ownerlink); >+ $('#budget_owner_id').val(borrowernumber); >+ } >+ } >+ >+ function ownerRemove() { >+ edit_owner(0); >+ } >+ >+ function add_user(borrowernumber, surname, firstname) { >+ var ids = $("#budget_users_id").val().split(':'); >+ if(borrowernumber && ids.indexOf(borrowernumber) == -1) { >+ var li = '<li id="user_' + borrowernumber + '">' >+ + '<a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=' >+ + borrowernumber + '">' + firstname + ' ' + surname >+ + '</a> [<a style="cursor:pointer"' >+ + 'onclick="del_user(' + borrowernumber +')">Remove</a>]</li>'; >+ $(li).insertBefore("li#add_user_button"); >+ ids.push(borrowernumber); >+ $("#budget_users_id").val(ids.join(':')); >+ } else { >+ return -1; >+ } >+ return 0; >+ } >+ >+ function del_user(borrowernumber) { >+ var ids = $("#budget_users_id").val().split(':'); >+ if (borrowernumber) { >+ var idx = ids.indexOf(borrowernumber+''); >+ if (idx != -1) { >+ ids.splice(idx, 1); >+ $("#budget_users_id").val(ids.join(':')); >+ $("li#user_" + borrowernumber).remove(); >+ } >+ } > } > > function Check(f) { >@@ -19,8 +73,6 @@ > var _alertString=""; > var alertString2; > >- // var actTotal =""; >- > if (!(isNotNull(f.budget_code,1))) { > _alertString += _("- Budget code cannot be blank") + "\n"; > } >@@ -154,7 +206,15 @@ > <div id="yui-main"> > <div class="yui-b" id="content"> > >+ > [% UNLESS ( delete_confirm ) %][% INCLUDE 'budgets-admin-toolbar.inc' %][% END %] >+ >+[% IF (error_not_authorised_to_modify) %] >+ <div class="error"> >+ <p>You are not authorised to modify this fund</p> >+ </div> >+[% END %] >+ > [% IF ( else ) %] > > <h1>Funds for '[% budget_period_description %]'</h1> >@@ -246,7 +306,7 @@ > > <!-- ********************************************************************************************** --> > <!-- create add/mod entry form --> >-[% IF ( add_form ) %] >+[% IF ( add_form && !error_not_authorised_to_modify ) %] > <form action="/cgi-bin/koha/admin/aqbudgets.pl" name="Aform" method="post"> > <fieldset class="rows"> > <legend>[% IF ( budget_id ) %]Modify[% ELSE %]Add[% END %] Fund >@@ -288,21 +348,44 @@ > > <li> > <label for="budget_expend">Expenditure: </label> >- <input type="text" name="budget_expend" id="budget_expend" value="[% budget_expend %]" size="8" /><input type="hidden" name="budget_owner_id" id="budget_owner_id" value="[% budget_owner_id %]" /> >+ <input type="text" name="budget_expend" id="budget_expend" value="[% budget_expend %]" size="8" /> > </li> > > <li> >- <span class="label">Owner: </span> >- <span id="budget_owner_name"> >- <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% budget_owner_id %]">[% budget_owner_name %]</a> >- </span> >- >- <!-- FIXME: hardcoded button positions :/ --> >- <input style="" type="button" id="edit_owner" value="Edit owner" onclick="ownerPopup(); return false;" /> >- <input style="" type="button" id="remove_owner" value="Remove owner" onclick="ownerRemove(this.form); return false;" /> >+ <span class="label">Owner: </span> >+ <span id="budget_owner_name"> >+ <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% budget_owner_id %]"> >+ [% budget_owner_name %] >+ </a> >+ </span> >+ <input type="hidden" name="budget_owner_id" id="budget_owner_id" >+ value="[% budget_owner_id %]" /> >+ >+ <!-- FIXME: hardcoded button positions :/ --> >+ <input type="button" id="edit_owner" value="Edit owner" >+ onclick="ownerPopup(); return false;" /> >+ <input type="button" id="remove_owner" value="Remove owner" >+ onclick="ownerRemove(); return false;" /> > </li> > > <li> >+ <span class="label">Users:</span> >+ <ul style="float:left;" id="budget_users"> >+ [% FOREACH user IN budget_users %] >+ <li id="user_[% user.borrowernumber %]"> >+ <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% user.borrowernumber %]"> >+ [% user.firstname %] [% user.surname %] >+ </a> >+ [<a style="cursor:pointer" >+ onclick="del_user([% user.borrowernumber %])">Remove</a>] >+ </li> >+ [% END %] >+ <li id="add_user_button"> >+ <input type="button" onclick="userPopup()" value="Add users" /> >+ </li> >+ </ul> >+ <input type="hidden" name="budget_users_ids" id="budget_users_id" value="[% budget_users_ids %]" /> >+ <li> > <label for="budget_branchcode">Library: </label> > <select name="budget_branchcode" id="budget_branchcode"> > <option value=""></option> >@@ -315,10 +398,37 @@ > <li> > <label for="budget_permission">Restrict access to: </label> > <select name="budget_permission" id="budget_permission"> >- [% IF ( budget_perm_0 ) %]<option value="0" selected="selected">None</option>[% ELSE %]<option value="0">None</option>[% END %] >- [% IF ( budget_perm_1 ) %]<option value="1" selected="selected">Owner</option>[% ELSE %]<option value="1">Owner</option>[% END %] >- [% IF ( budget_perm_2 ) %]<option value="2" selected="selected">Library</option>[% ELSE %]<option value="2">Library</option>[% END %] >- </option> >+ [% IF ( budget_perm_0 ) %] >+ <option value="0" selected="selected"> >+ [% ELSE %] >+ <option value="0"> >+ [% END %] >+ None >+ </option> >+ >+ [% IF ( budget_perm_1 ) %] >+ <option value="1" selected="selected"> >+ [% ELSE %] >+ <option value="1"> >+ [% END %] >+ Owner >+ </option> >+ >+ [% IF ( budget_perm_3) %] >+ <option value="3" selected="selected"> >+ [% ELSE %] >+ <option value="3"> >+ [% END %] >+ Owner and users >+ </option> >+ >+ [% IF ( budget_perm_2 ) %] >+ <option value="2" selected="selected"> >+ [% ELSE %] >+ <option value="2"> >+ [% END %] >+ Owner, users and library >+ </option> > </select> > </li> > >diff --git a/suggestion/suggestion.pl b/suggestion/suggestion.pl >index f7c50b5..6bf188f 100755 >--- a/suggestion/suggestion.pl >+++ b/suggestion/suggestion.pl >@@ -92,7 +92,7 @@ delete $$suggestion_ref{$_} foreach qw( suggestedbyme op displayby tabcode edit_ > foreach (keys %$suggestion_ref){ > delete $$suggestion_ref{$_} if (!$$suggestion_ref{$_} && ($op eq 'else' || $op eq 'change')); > } >-my ( $template, $borrowernumber, $cookie ) = get_template_and_user( >+my ( $template, $borrowernumber, $cookie, $userflags ) = get_template_and_user( > { > template_name => "suggestion/suggestion.tmpl", > query => $input, >@@ -320,12 +320,19 @@ if ($branchfilter) { > $budgets = GetBudgets(undef); > } > >+my @budgets_loop; > foreach my $budget ( @{$budgets} ) { >-## Please see file perltidy.ERR >- $budget->{'selected'}=1 if ($$suggestion_ref{'budgetid'} && $budget->{'budget_id'} eq $$suggestion_ref{'budgetid'}) >-}; >+ next unless (CanUserUseBudget($borrowernumber, $budget, $userflags)); > >-$template->param( budgetsloop => $budgets); >+ ## Please see file perltidy.ERR >+ $budget->{'selected'} = 1 >+ if ($$suggestion_ref{'budgetid'} >+ && $budget->{'budget_id'} eq $$suggestion_ref{'budgetid'}); >+ >+ push @budgets_loop, $budget; >+} >+ >+$template->param( budgetsloop => \@budgets_loop); > $template->param( "statusselected_$$suggestion_ref{'STATUS'}" =>1) if ($$suggestion_ref{'STATUS'}); > > # get currencies and rates >diff --git a/t/Budgets/CanUserModifyBudget.t b/t/Budgets/CanUserModifyBudget.t >new file mode 100644 >index 0000000..e75a622 >--- /dev/null >+++ b/t/Budgets/CanUserModifyBudget.t >@@ -0,0 +1,340 @@ >+#!/usr/bin/perl >+ >+use Modern::Perl; >+use Test::More tests => 133; >+ >+use C4::Budgets; >+ >+# Avoid "redefined subroutine" warnings >+local $SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /redefined/ }; >+*C4::Budgets::GetBudgetUsers = \&Mock_GetBudgetUsers; >+*C4::Context::userenv = \&Mock_userenv; >+ >+my %budgetusers = ( >+ 1 => [], >+ 2 => [1], >+ 3 => [2], >+ 4 => [3], >+ 5 => [], >+ 6 => [1], >+ 7 => [2], >+ 8 => [3], >+ 9 => [], >+ 10 => [1], >+ 11 => [2], >+ 12 => [3], >+ 13 => [], >+ 14 => [1], >+ 15 => [2], >+ 16 => [3], >+); >+ >+my $borrower1 = { >+ borrowernumber => 1 >+}; >+my $borrower2 = { >+ borrowernumber => 2 >+}; >+ >+my $budget1 = { >+ budget_id => 1, >+ budget_permission => 0, >+ budget_owner_id => undef, >+ budget_branchcode => undef, >+}; >+my $budget2 = { >+ budget_id => 2, >+ budget_permission => 0, >+ budget_owner_id => undef, >+ budget_branchcode => 'B1', >+}; >+my $budget3 = { >+ budget_id => 3, >+ budget_permission => 0, >+ budget_owner_id => 1, >+ budget_branchcode => undef, >+}; >+my $budget4 = { >+ budget_id => 4, >+ budget_permission => 0, >+ budget_owner_id => 1, >+ budget_branchcode => 'B1', >+}; >+my $budget5 = { >+ budget_id => 5, >+ budget_permission => 1, >+ budget_owner_id => undef, >+ budget_branchcode => undef, >+}; >+my $budget6 = { >+ budget_id => 6, >+ budget_permission => 1, >+ budget_owner_id => undef, >+ budget_branchcode => 'B1', >+}; >+my $budget7 = { >+ budget_id => 7, >+ budget_permission => 1, >+ budget_owner_id => 1, >+ budget_branchcode => undef, >+}; >+my $budget8 = { >+ budget_id => 8, >+ budget_permission => 1, >+ budget_owner_id => 1, >+ budget_branchcode => 'B1', >+}; >+my $budget9 = { >+ budget_id => 9, >+ budget_permission => 2, >+ budget_owner_id => undef, >+ budget_branchcode => undef, >+}; >+my $budget10 = { >+ budget_id => 10, >+ budget_permission => 2, >+ budget_owner_id => undef, >+ budget_branchcode => 'B1', >+}; >+my $budget11 = { >+ budget_id => 11, >+ budget_permission => 2, >+ budget_owner_id => 1, >+ budget_branchcode => undef, >+}; >+my $budget12 = { >+ budget_id => 12, >+ budget_permission => 2, >+ budget_owner_id => 1, >+ budget_branchcode => 'B1', >+}; >+my $budget13 = { >+ budget_id => 13, >+ budget_permission => 3, >+ budget_owner_id => undef, >+ budget_branchcode => undef, >+}; >+my $budget14 = { >+ budget_id => 14, >+ budget_permission => 3, >+ budget_owner_id => undef, >+ budget_branchcode => 'B1', >+}; >+my $budget15 = { >+ budget_id => 15, >+ budget_permission => 3, >+ budget_owner_id => 1, >+ budget_branchcode => undef, >+}; >+my $budget16 = { >+ budget_id => 16, >+ budget_permission => 3, >+ budget_owner_id => 1, >+ budget_branchcode => 'B1', >+}; >+ >+my $userenv = {}; >+ >+ >+ok (CanUserModifyBudget($borrower1, $budget1, {superlibrarian => 1})); >+ok (CanUserModifyBudget($borrower1, $budget1, { >+ acquisition => { >+ budget_manage_all => 1 >+ } >+})); >+ok (CanUserModifyBudget($borrower1, $budget1, {acquisition => 1})); >+ >+ok (!CanUserModifyBudget($borrower1, $budget1, {})); >+ok (!CanUserModifyBudget($borrower1, $budget1, {acquisition => 0})); >+ >+my $flags = {acquisition => {budget_modify => 1}}; >+ >+$userenv->{branch} = 'B1'; >+ >+# Restriction is 'none' >+ok (CanUserModifyBudget($borrower1, $budget1, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget2, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget3, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget4, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget1, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget2, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget3, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget4, $flags)); >+ >+# Restriction is 'owner' >+ok (CanUserModifyBudget($borrower1, $budget5, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget6, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget7, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget8, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget5, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget6, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget7, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget8, $flags)); >+ >+# Restriction is 'owner, users and library' >+ok (CanUserModifyBudget($borrower1, $budget9, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget10, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget11, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget12, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget9, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget10, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget11, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget12, $flags)); >+ >+# Restriction is 'owner and users' >+ok (CanUserModifyBudget($borrower1, $budget13, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget14, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget15, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget16, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget13, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget14, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget15, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget16, $flags)); >+ >+ >+$userenv->{branch} = 'B2'; >+ >+# Restriction is 'none' >+ok (CanUserModifyBudget($borrower1, $budget1, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget2, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget3, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget4, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget1, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget2, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget3, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget4, $flags)); >+ >+# Restriction is 'owner' >+ok (CanUserModifyBudget($borrower1, $budget5, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget6, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget7, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget8, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget5, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget6, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget7, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget8, $flags)); >+ >+# Restriction is 'owner, users and library' >+ok (CanUserModifyBudget($borrower1, $budget9, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget10, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget11, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget12, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget9, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget10, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget11, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget12, $flags)); >+ >+# Restriction is 'owner and users' >+ok (CanUserModifyBudget($borrower1, $budget13, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget14, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget15, $flags)); >+ok (CanUserModifyBudget($borrower1, $budget16, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget13, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget14, $flags)); >+ok (CanUserModifyBudget($borrower2, $budget15, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget16, $flags)); >+ >+ >+# Same tests as above, without budget_modify permission >+# All tests should failed >+$flags = {acquisition => {order_manage => 1}}; >+ >+$userenv->{branch} = 'B1'; >+ >+# Restriction is 'none' >+ok (!CanUserModifyBudget($borrower1, $budget1, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget2, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget3, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget4, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget1, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget2, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget3, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget4, $flags)); >+ >+# Restriction is 'owner' >+ok (!CanUserModifyBudget($borrower1, $budget5, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget6, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget7, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget8, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget5, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget6, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget7, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget8, $flags)); >+ >+# Restriction is 'owner, users and library' >+ok (!CanUserModifyBudget($borrower1, $budget9, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget10, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget11, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget12, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget9, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget10, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget11, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget12, $flags)); >+ >+# Restriction is 'owner and users' >+ok (!CanUserModifyBudget($borrower1, $budget13, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget14, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget15, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget16, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget13, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget14, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget15, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget16, $flags)); >+ >+ >+$userenv->{branch} = 'B2'; >+ >+# Restriction is 'none' >+ok (!CanUserModifyBudget($borrower1, $budget1, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget2, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget3, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget4, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget1, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget2, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget3, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget4, $flags)); >+ >+# Restriction is 'owner' >+ok (!CanUserModifyBudget($borrower1, $budget5, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget6, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget7, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget8, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget5, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget6, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget7, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget8, $flags)); >+ >+# Restriction is 'owner, users and library' >+ok (!CanUserModifyBudget($borrower1, $budget9, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget10, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget11, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget12, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget9, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget10, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget11, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget12, $flags)); >+ >+# Restriction is 'owner and users' >+ok (!CanUserModifyBudget($borrower1, $budget13, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget14, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget15, $flags)); >+ok (!CanUserModifyBudget($borrower1, $budget16, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget13, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget14, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget15, $flags)); >+ok (!CanUserModifyBudget($borrower2, $budget16, $flags)); >+ >+ >+# Mocked subs >+ >+# C4::Acquisition::GetBudgetUsers >+sub Mock_GetBudgetUsers { >+ my ($budget_id) = @_; >+ >+ return @{ $budgetusers{$budget_id} }; >+} >+ >+# C4::Context->userenv >+sub Mock_userenv { >+ return $userenv; >+} >diff --git a/t/Budgets/CanUserUseBudget.t b/t/Budgets/CanUserUseBudget.t >new file mode 100644 >index 0000000..8219197 >--- /dev/null >+++ b/t/Budgets/CanUserUseBudget.t >@@ -0,0 +1,250 @@ >+#!/usr/bin/perl >+ >+use Modern::Perl; >+use Test::More tests => 69; >+ >+use C4::Budgets; >+ >+# Avoid "redefined subroutine" warnings >+local $SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /redefined/ }; >+ >+*C4::Budgets::GetBudgetUsers = \&Mock_GetBudgetUsers; >+*C4::Context::userenv = \&Mock_userenv; >+ >+my %budgetusers = ( >+ 1 => [], >+ 2 => [1], >+ 3 => [2], >+ 4 => [3], >+ 5 => [], >+ 6 => [1], >+ 7 => [2], >+ 8 => [3], >+ 9 => [], >+ 10 => [1], >+ 11 => [2], >+ 12 => [3], >+ 13 => [], >+ 14 => [1], >+ 15 => [2], >+ 16 => [3], >+); >+ >+my $borrower1 = { >+ borrowernumber => 1 >+}; >+my $borrower2 = { >+ borrowernumber => 2 >+}; >+ >+my $budget1 = { >+ budget_id => 1, >+ budget_permission => 0, >+ budget_owner_id => undef, >+ budget_branchcode => undef, >+}; >+my $budget2 = { >+ budget_id => 2, >+ budget_permission => 0, >+ budget_owner_id => undef, >+ budget_branchcode => 'B1', >+}; >+my $budget3 = { >+ budget_id => 3, >+ budget_permission => 0, >+ budget_owner_id => 1, >+ budget_branchcode => undef, >+}; >+my $budget4 = { >+ budget_id => 4, >+ budget_permission => 0, >+ budget_owner_id => 1, >+ budget_branchcode => 'B1', >+}; >+my $budget5 = { >+ budget_id => 5, >+ budget_permission => 1, >+ budget_owner_id => undef, >+ budget_branchcode => undef, >+}; >+my $budget6 = { >+ budget_id => 6, >+ budget_permission => 1, >+ budget_owner_id => undef, >+ budget_branchcode => 'B1', >+}; >+my $budget7 = { >+ budget_id => 7, >+ budget_permission => 1, >+ budget_owner_id => 1, >+ budget_branchcode => undef, >+}; >+my $budget8 = { >+ budget_id => 8, >+ budget_permission => 1, >+ budget_owner_id => 1, >+ budget_branchcode => 'B1', >+}; >+my $budget9 = { >+ budget_id => 9, >+ budget_permission => 2, >+ budget_owner_id => undef, >+ budget_branchcode => undef, >+}; >+my $budget10 = { >+ budget_id => 10, >+ budget_permission => 2, >+ budget_owner_id => undef, >+ budget_branchcode => 'B1', >+}; >+my $budget11 = { >+ budget_id => 11, >+ budget_permission => 2, >+ budget_owner_id => 1, >+ budget_branchcode => undef, >+}; >+my $budget12 = { >+ budget_id => 12, >+ budget_permission => 2, >+ budget_owner_id => 1, >+ budget_branchcode => 'B1', >+}; >+my $budget13 = { >+ budget_id => 13, >+ budget_permission => 3, >+ budget_owner_id => undef, >+ budget_branchcode => undef, >+}; >+my $budget14 = { >+ budget_id => 14, >+ budget_permission => 3, >+ budget_owner_id => undef, >+ budget_branchcode => 'B1', >+}; >+my $budget15 = { >+ budget_id => 15, >+ budget_permission => 3, >+ budget_owner_id => 1, >+ budget_branchcode => undef, >+}; >+my $budget16 = { >+ budget_id => 16, >+ budget_permission => 3, >+ budget_owner_id => 1, >+ budget_branchcode => 'B1', >+}; >+ >+my $userenv = {}; >+ >+ok (CanUserUseBudget($borrower1, $budget1, {superlibrarian => 1})); >+ok (CanUserUseBudget($borrower1, $budget1, { >+ acquisition => { >+ budget_manage_all => 1 >+ } >+})); >+ok (CanUserUseBudget($borrower1, $budget1, {acquisition => 1})); >+ >+ok (!CanUserUseBudget($borrower1, $budget1, {})); >+ok (!CanUserUseBudget($borrower1, $budget1, {acquisition => 0})); >+ >+my $flags = {acquisition => {order_manage => 1}}; >+ >+$userenv->{branch} = 'B1'; >+ >+# Restriction is 'none' >+ok (CanUserUseBudget($borrower1, $budget1, $flags)); >+ok (CanUserUseBudget($borrower1, $budget2, $flags)); >+ok (CanUserUseBudget($borrower1, $budget3, $flags)); >+ok (CanUserUseBudget($borrower1, $budget4, $flags)); >+ok (CanUserUseBudget($borrower2, $budget1, $flags)); >+ok (CanUserUseBudget($borrower2, $budget2, $flags)); >+ok (CanUserUseBudget($borrower2, $budget3, $flags)); >+ok (CanUserUseBudget($borrower2, $budget4, $flags)); >+ >+# Restriction is 'owner' >+ok (CanUserUseBudget($borrower1, $budget5, $flags)); >+ok (CanUserUseBudget($borrower1, $budget6, $flags)); >+ok (CanUserUseBudget($borrower1, $budget7, $flags)); >+ok (CanUserUseBudget($borrower1, $budget8, $flags)); >+ok (CanUserUseBudget($borrower2, $budget5, $flags)); >+ok (CanUserUseBudget($borrower2, $budget6, $flags)); >+ok (!CanUserUseBudget($borrower2, $budget7, $flags)); >+ok (!CanUserUseBudget($borrower2, $budget8, $flags)); >+ >+# Restriction is 'owner, users and library' >+ok (CanUserUseBudget($borrower1, $budget9, $flags)); >+ok (CanUserUseBudget($borrower1, $budget10, $flags)); >+ok (CanUserUseBudget($borrower1, $budget11, $flags)); >+ok (CanUserUseBudget($borrower1, $budget12, $flags)); >+ok (CanUserUseBudget($borrower2, $budget9, $flags)); >+ok (CanUserUseBudget($borrower2, $budget10, $flags)); >+ok (CanUserUseBudget($borrower2, $budget11, $flags)); >+ok (CanUserUseBudget($borrower2, $budget12, $flags)); >+ >+# Restriction is 'owner and users' >+ok (CanUserUseBudget($borrower1, $budget13, $flags)); >+ok (CanUserUseBudget($borrower1, $budget14, $flags)); >+ok (CanUserUseBudget($borrower1, $budget15, $flags)); >+ok (CanUserUseBudget($borrower1, $budget16, $flags)); >+ok (CanUserUseBudget($borrower2, $budget13, $flags)); >+ok (CanUserUseBudget($borrower2, $budget14, $flags)); >+ok (CanUserUseBudget($borrower2, $budget15, $flags)); >+ok (!CanUserUseBudget($borrower2, $budget16, $flags)); >+ >+ >+$userenv->{branch} = 'B2'; >+ >+# Restriction is 'none' >+ok (CanUserUseBudget($borrower1, $budget1, $flags)); >+ok (CanUserUseBudget($borrower1, $budget2, $flags)); >+ok (CanUserUseBudget($borrower1, $budget3, $flags)); >+ok (CanUserUseBudget($borrower1, $budget4, $flags)); >+ok (CanUserUseBudget($borrower2, $budget1, $flags)); >+ok (CanUserUseBudget($borrower2, $budget2, $flags)); >+ok (CanUserUseBudget($borrower2, $budget3, $flags)); >+ok (CanUserUseBudget($borrower2, $budget4, $flags)); >+ >+# Restriction is 'owner' >+ok (CanUserUseBudget($borrower1, $budget5, $flags)); >+ok (CanUserUseBudget($borrower1, $budget6, $flags)); >+ok (CanUserUseBudget($borrower1, $budget7, $flags)); >+ok (CanUserUseBudget($borrower1, $budget8, $flags)); >+ok (CanUserUseBudget($borrower2, $budget5, $flags)); >+ok (CanUserUseBudget($borrower2, $budget6, $flags)); >+ok (!CanUserUseBudget($borrower2, $budget7, $flags)); >+ok (!CanUserUseBudget($borrower2, $budget8, $flags)); >+ >+# Restriction is 'owner, users and library' >+ok (CanUserUseBudget($borrower1, $budget9, $flags)); >+ok (CanUserUseBudget($borrower1, $budget10, $flags)); >+ok (CanUserUseBudget($borrower1, $budget11, $flags)); >+ok (CanUserUseBudget($borrower1, $budget12, $flags)); >+ok (CanUserUseBudget($borrower2, $budget9, $flags)); >+ok (CanUserUseBudget($borrower2, $budget10, $flags)); >+ok (CanUserUseBudget($borrower2, $budget11, $flags)); >+ok (!CanUserUseBudget($borrower2, $budget12, $flags)); >+ >+# Restriction is 'owner and users' >+ok (CanUserUseBudget($borrower1, $budget13, $flags)); >+ok (CanUserUseBudget($borrower1, $budget14, $flags)); >+ok (CanUserUseBudget($borrower1, $budget15, $flags)); >+ok (CanUserUseBudget($borrower1, $budget16, $flags)); >+ok (CanUserUseBudget($borrower2, $budget13, $flags)); >+ok (CanUserUseBudget($borrower2, $budget14, $flags)); >+ok (CanUserUseBudget($borrower2, $budget15, $flags)); >+ok (!CanUserUseBudget($borrower2, $budget16, $flags)); >+ >+ >+# Mocked subs >+ >+# C4::Acquisition::GetBudgetUsers >+sub Mock_GetBudgetUsers { >+ my ($budget_id) = @_; >+ >+ return @{ $budgetusers{$budget_id} }; >+} >+ >+# C4::Context->userenv >+sub Mock_userenv { >+ return $userenv; >+} >-- >1.7.10 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 7304
:
9681
|
9783
|
9837
|
9896
| 10373