View | Details | Raw Unified | Return to bug 7304
Collapse All | Expand All

(-)a/C4/Budgets.pm (+158 lines)
Lines 44-49 BEGIN { Link Here
44
        &GetPeriodsCount
44
        &GetPeriodsCount
45
        &GetChildBudgetsSpent
45
        &GetChildBudgetsSpent
46
46
47
        &GetBudgetUsers
48
        &ModBudgetUsers
49
        &CanUserUseBudget
50
        &CanUserModifyBudget
51
47
	    &GetBudgetPeriod
52
	    &GetBudgetPeriod
48
        &GetBudgetPeriods
53
        &GetBudgetPeriods
49
        &ModBudgetPeriod
54
        &ModBudgetPeriod
Lines 652-657 sub GetBudgets { Link Here
652
    return SearchInTable("aqbudgets",$filters, $orderby, undef,undef, undef, "wide");
657
    return SearchInTable("aqbudgets",$filters, $orderby, undef,undef, undef, "wide");
653
}
658
}
654
659
660
=head2 GetBudgetUsers
661
662
    my @borrowernumbers = &GetBudgetUsers($budget_id);
663
664
Return the list of borrowernumbers linked to a budget
665
666
=cut
667
668
sub GetBudgetUsers {
669
    my ($budget_id) = @_;
670
671
    my $dbh = C4::Context->dbh;
672
    my $query = qq{
673
        SELECT borrowernumber
674
        FROM aqbudgetborrowers
675
        WHERE budget_id = ?
676
    };
677
    my $sth = $dbh->prepare($query);
678
    $sth->execute($budget_id);
679
680
    my @borrowernumbers;
681
    while (my ($borrowernumber) = $sth->fetchrow_array) {
682
        push @borrowernumbers, $borrowernumber
683
    }
684
685
    return @borrowernumbers;
686
}
687
688
=head2 ModBudgetUsers
689
690
    &ModBudgetUsers($budget_id, @borrowernumbers);
691
692
Modify the list of borrowernumbers linked to a budget
693
694
=cut
695
696
sub ModBudgetUsers {
697
    my ($budget_id, @budget_users_id) = @_;
698
699
    return unless $budget_id;
700
701
    my $dbh = C4::Context->dbh;
702
    my $query = "DELETE FROM aqbudgetborrowers WHERE budget_id = ?";
703
    my $sth = $dbh->prepare($query);
704
    $sth->execute($budget_id);
705
706
    $query = qq{
707
        INSERT INTO aqbudgetborrowers (budget_id, borrowernumber)
708
        VALUES (?,?)
709
    };
710
    $sth = $dbh->prepare($query);
711
    foreach my $borrowernumber (@budget_users_id) {
712
        next unless $borrowernumber;
713
        $sth->execute($budget_id, $borrowernumber);
714
    }
715
}
716
717
sub CanUserUseBudget {
718
    my ($borrower, $budget, $userflags) = @_;
719
720
    if (not ref $borrower) {
721
        $borrower = C4::Members::GetMember(borrowernumber => $borrower);
722
    }
723
    if (not ref $budget) {
724
        $budget = GetBudget($budget);
725
    }
726
727
    return 0 unless ($borrower and $budget);
728
729
    if (not defined $userflags) {
730
        $userflags = C4::Auth::getuserflags($borrower->{flags},
731
            $borrower->{userid});
732
    }
733
734
    unless ($userflags->{superlibrarian}
735
    || (ref $userflags->{acquisition}
736
        && $userflags->{acquisition}->{budget_manage_all})
737
    || (!ref $userflags->{acquisition} && $userflags->{acquisition}))
738
    {
739
        if (not exists $userflags->{acquisition}) {
740
            return 0;
741
        }
742
743
        if (!ref $userflags->{acquisition} && !$userflags->{acquisition}) {
744
            return 0;
745
        }
746
747
        # Budget restricted to owner
748
        if ($budget->{budget_permission} == 1
749
        && $budget->{budget_owner_id}
750
        && $budget->{budget_owner_id} != $borrower->{borrowernumber}) {
751
            return 0;
752
        }
753
754
        my @budget_users = GetBudgetUsers($budget->{budget_id});
755
756
        # Budget restricted to owner, users and library
757
        if ($budget->{budget_permission} == 2
758
        && $budget->{budget_owner_id}
759
        && $budget->{budget_owner_id} != $borrower->{borrowernumber}
760
        && (0 == grep {$borrower->{borrowernumber} == $_} @budget_users)
761
        && defined $budget->{budget_branchcode}
762
        && $budget->{budget_branchcode} ne C4::Context->userenv->{branch}) {
763
            return 0;
764
        }
765
766
        # Budget restricted to owner and users
767
        if ($budget->{budget_permission} == 3
768
        && $budget->{budget_owner_id}
769
        && $budget->{budget_owner_id} != $borrower->{borrowernumber}
770
        && (0 == grep {$borrower->{borrowernumber} == $_} @budget_users)) {
771
            return 0;
772
        }
773
    }
774
775
    return 1;
776
}
777
778
sub CanUserModifyBudget {
779
    my ($borrower, $budget, $userflags) = @_;
780
781
    if (not ref $borrower) {
782
        $borrower = C4::Members::GetMember(borrowernumber => $borrower);
783
    }
784
    if (not ref $budget) {
785
        $budget = GetBudget($budget);
786
    }
787
788
    return 0 unless ($borrower and $budget);
789
790
    if (not defined $userflags) {
791
        $userflags = C4::Auth::getuserflags($borrower->{flags},
792
            $borrower->{userid});
793
    }
794
795
    unless ($userflags->{superlibrarian}
796
    || (ref $userflags->{acquisition}
797
        && $userflags->{acquisition}->{budget_manage_all})
798
    || (!ref $userflags->{acquisition} && $userflags->{acquisition}))
799
    {
800
        if (!CanUserUseBudget($borrower, $budget, $userflags)) {
801
            return 0;
802
        }
803
804
        if (ref $userflags->{acquisition}
805
        && !$userflags->{acquisition}->{budget_modify}) {
806
            return 0;
807
        }
808
    }
809
810
    return 1;
811
}
812
655
# -------------------------------------------------------------------
813
# -------------------------------------------------------------------
656
814
657
=head2 GetCurrencies
815
=head2 GetCurrencies
(-)a/acqui/acqui-home.pl (-2 / +6 lines)
Lines 41-47 use C4::Debug; Link Here
41
use C4::Suggestions;
41
use C4::Suggestions;
42
42
43
my $query = CGI->new;
43
my $query = CGI->new;
44
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
44
my ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user(
45
    {   template_name   => 'acqui/acqui-home.tmpl',
45
    {   template_name   => 'acqui/acqui-home.tmpl',
46
        query           => $query,
46
        query           => $query,
47
        type            => 'intranet',
47
        type            => 'intranet',
Lines 93-99 my $totspent_active = 0; Link Here
93
my $totordered_active   = 0;
93
my $totordered_active   = 0;
94
my $totavail_active     = 0;
94
my $totavail_active     = 0;
95
95
96
my @budget_loop;
96
foreach my $budget ( @{$budget_arr} ) {
97
foreach my $budget ( @{$budget_arr} ) {
98
    next unless (CanUserUseBudget($loggedinuser, $budget, $userflags));
97
99
98
    $budget->{budget_code_indent} =~ s/\ /\&nbsp\;/g;
100
    $budget->{budget_code_indent} =~ s/\ /\&nbsp\;/g;
99
101
Lines 136-146 foreach my $budget ( @{$budget_arr} ) { Link Here
136
    for my $field (qw( budget_amount budget_spent budget_ordered budget_avail ) ) {
138
    for my $field (qw( budget_amount budget_spent budget_ordered budget_avail ) ) {
137
        $budget->{$field} = $num_formatter->format_price( $budget->{$field} );
139
        $budget->{$field} = $num_formatter->format_price( $budget->{$field} );
138
    }
140
    }
141
142
    push @budget_loop, $budget;
139
}
143
}
140
144
141
$template->param(
145
$template->param(
142
    type          => 'intranet',
146
    type          => 'intranet',
143
    loop_budget   => $budget_arr,
147
    loop_budget   => \@budget_loop,
144
    branchname    => $branchname,
148
    branchname    => $branchname,
145
    total         => $num_formatter->format_price($total),
149
    total         => $num_formatter->format_price($total),
146
    totspent      => $num_formatter->format_price($totspent),
150
    totspent      => $num_formatter->format_price($totspent),
(-)a/acqui/addorderiso2709.pl (-8 / +10 lines)
Lines 46-59 use C4::Branch; # GetBranches Link Here
46
use C4::Members;
46
use C4::Members;
47
47
48
my $input = new CGI;
48
my $input = new CGI;
49
my ($template, $loggedinuser, $cookie) = get_template_and_user({
49
my ($template, $loggedinuser, $cookie, $userflags) = get_template_and_user({
50
                                        template_name => "acqui/addorderiso2709.tmpl",
50
    template_name => "acqui/addorderiso2709.tmpl",
51
                                        query => $input,
51
    query => $input,
52
                                        type => "intranet",
52
    type => "intranet",
53
                                        authnotrequired => 0,
53
    authnotrequired => 0,
54
                                        flagsrequired   => { acquisition => 'order_manage' },
54
    flagsrequired   => { acquisition => 'order_manage' },
55
                                        debug => 1,
55
    debug => 1,
56
                                        });
56
});
57
57
my $cgiparams = $input->Vars;
58
my $cgiparams = $input->Vars;
58
my $op = $cgiparams->{'op'};
59
my $op = $cgiparams->{'op'};
59
my $booksellerid  = $input->param('booksellerid');
60
my $booksellerid  = $input->param('booksellerid');
Lines 282-287 my $budget = GetBudget($budget_id); Link Here
282
my $budget_loop = [];
283
my $budget_loop = [];
283
$budgets = GetBudgetHierarchy( q{}, $borrower->{branchcode}, $borrower->{borrowernumber} );
284
$budgets = GetBudgetHierarchy( q{}, $borrower->{branchcode}, $borrower->{borrowernumber} );
284
foreach my $r ( @{$budgets} ) {
285
foreach my $r ( @{$budgets} ) {
286
    next unless (CanUserUseBudget($borrower, $r, $userflags));
285
    if ( !defined $r->{budget_amount} || $r->{budget_amount} == 0 ) {
287
    if ( !defined $r->{budget_amount} || $r->{budget_amount} == 0 ) {
286
        next;
288
        next;
287
    }
289
    }
(-)a/acqui/neworderempty.pl (-1 / +2 lines)
Lines 110-116 my $new = 'no'; Link Here
110
110
111
my $budget_name;
111
my $budget_name;
112
112
113
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
113
my ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user(
114
    {
114
    {
115
        template_name   => "acqui/neworderempty.tmpl",
115
        template_name   => "acqui/neworderempty.tmpl",
116
        query           => $input,
116
        query           => $input,
Lines 253-258 my $budget = GetBudget($budget_id); Link Here
253
my $budget_loop = [];
253
my $budget_loop = [];
254
my $budgets = GetBudgetHierarchy(q{},$borrower->{branchcode},$borrower->{borrowernumber});
254
my $budgets = GetBudgetHierarchy(q{},$borrower->{branchcode},$borrower->{borrowernumber});
255
foreach my $r (@{$budgets}) {
255
foreach my $r (@{$budgets}) {
256
    next unless (CanUserUseBudget($borrower, $r, $userflags));
256
    if (!defined $r->{budget_amount} || $r->{budget_amount} == 0) {
257
    if (!defined $r->{budget_amount} || $r->{budget_amount} == 0) {
257
        next;
258
        next;
258
    }
259
    }
(-)a/admin/aqbudget_owner_search.pl (-114 lines)
Lines 1-114 Link Here
1
#!/usr/bin/perl
2
3
# script to find a guarantor
4
5
# Copyright 2008-2009 BibLibre SARL
6
#
7
# This file is part of Koha.
8
#
9
# Koha is free software; you can redistribute it and/or modify it under the
10
# terms of the GNU General Public License as published by the Free Software
11
# Foundation; either version 2 of the License, or (at your option) any later
12
# version.
13
#
14
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
15
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
16
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
17
#
18
# You should have received a copy of the GNU General Public License along
19
# with Koha; if not, write to the Free Software Foundation, Inc.,
20
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21
22
use strict;
23
#use warnings; FIXME - Bug 2505
24
use C4::Auth ;
25
use C4::Output;
26
use CGI;
27
use C4::Dates qw/format_date/;
28
use C4::Members;
29
30
my $input = new CGI;
31
32
my $dbh = C4::Context->dbh;
33
34
my ( $template, $loggedinuser, $cookie, $staff_flags ) = get_template_and_user(
35
    {   template_name   => "admin/aqbudget_owner_search.tmpl",
36
        query           => $input,
37
        type            => "intranet",
38
        authnotrequired => 0,
39
        flagsrequired   => { acquisition => 'budget_modify'  },
40
        debug           => 1,
41
    }
42
);
43
44
my $theme = $input->param('theme') || "default";
45
46
# only used if allowthemeoverride is set
47
my $member  = $input->param('member');
48
my $orderby = $input->param('orderby');
49
50
my $op = $input->param('op');
51
$template->param( $op || else => 1, );
52
53
$orderby = "surname,firstname" unless $orderby;
54
$member =~ s/,//g;     #remove any commas from search string
55
$member =~ s/\*/%/g;
56
if ( $member eq '' ) {
57
    $template->param( results => 0 );
58
} else {
59
    $template->param( results => 1 );
60
}
61
62
my ( $count, $count2, $results );
63
my @resultsdata;
64
my $toggle = 0;
65
66
if ( $member ) {
67
	my $results= Search($member,"surname");
68
69
    foreach my $res (@$results) {
70
71
        my $perms = haspermission( $res->{'userid'} );
72
        my $subperms =  get_user_subpermissions  ($res->{'userid'} );
73
74
75
        # if the member has 'acqui' permission set, then display to table.
76
        if (    $perms->{superlibrarian} == 1  || 
77
                $perms->{acquisition} == 1  || 
78
                $subperms->{acquisition}->{'budget_manage'} || 
79
                $subperms->{acquisition}->{'budget_modify'} || 
80
                $subperms->{acquisition}->{'budget_add_del'}  ) {
81
82
            $count2++;
83
            #find out stats
84
#            my ( $od, $issue, $fines ) = GetMemberIssuesAndFines( $res->{'borrowerid'} );
85
			#This looks unused and very unuseful
86
            my $guarantorinfo = uc( $res->{'surname'} ) . " , " . ucfirst( $res->{'firstname'} );
87
            my $budget_owner_name = $res->{'firstname'} . ' ' . $res->{'surname'}, my $budget_owner_id = $res->{'borrowernumber'};
88
89
            my %row = (
90
                borrowernumber    => $res->{'borrowernumber'},
91
                cardnumber        => $res->{'cardnumber'},
92
                surname           => $res->{'surname'},
93
                firstname         => $res->{'firstname'},
94
                categorycode      => $res->{'categorycode'},
95
                branchcode        => $res->{'branchcode'},
96
                guarantorinfo     => $guarantorinfo,
97
                budget_owner_id   => $budget_owner_id,
98
                budget_owner_name => $budget_owner_name,
99
#                odissue           => "$od/$issue",
100
#                fines             => $fines,
101
#                borrowernotes     => $res->{'borrowernotes'}
102
            );
103
            push( @resultsdata, \%row );
104
        }
105
    }
106
}
107
108
$template->param(
109
    member => $member,
110
    numres => $count2,
111
    resultsloop => \@resultsdata
112
);
113
114
output_html_with_http_headers $input, $cookie, $template->output;
(-)a/admin/aqbudget_user_search.pl (+91 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
# script to find a guarantor
4
5
# Copyright 2008-2009 BibLibre SARL
6
#
7
# This file is part of Koha.
8
#
9
# Koha is free software; you can redistribute it and/or modify it under the
10
# terms of the GNU General Public License as published by the Free Software
11
# Foundation; either version 2 of the License, or (at your option) any later
12
# version.
13
#
14
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
15
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
16
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
17
#
18
# You should have received a copy of the GNU General Public License along
19
# with Koha; if not, write to the Free Software Foundation, Inc.,
20
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21
22
use Modern::Perl;
23
24
use C4::Auth ;
25
use C4::Output;
26
use CGI;
27
use C4::Dates qw/format_date/;
28
use C4::Members;
29
30
my $input = new CGI;
31
32
my $dbh = C4::Context->dbh;
33
34
my ( $template, $loggedinuser, $cookie, $staff_flags ) = get_template_and_user(
35
    {   template_name   => "admin/aqbudget_user_search.tt",
36
        query           => $input,
37
        type            => "intranet",
38
        authnotrequired => 0,
39
        flagsrequired   => { acquisition => 'budget_modify'  },
40
        debug           => 1,
41
    }
42
);
43
44
# only used if allowthemeoverride is set
45
my $type = $input->param('type');
46
my $member  = $input->param('member') // '';
47
48
$member =~ s/,//g;     #remove any commas from search string
49
$member =~ s/\*/%/g;
50
if ( $member eq '' ) {
51
    $template->param( results => 0 );
52
} else {
53
    $template->param( results => 1 );
54
}
55
56
my @resultsdata;
57
58
if ( $member ) {
59
    my $results = Search($member, "surname");
60
61
    foreach my $res (@$results) {
62
        my $perms = haspermission( $res->{'userid'} );
63
        my $subperms = get_user_subpermissions( $res->{'userid'} );
64
65
        # if the member has 'acqui' permission set, then display to table.
66
        if ( $perms->{superlibrarian} == 1  ||
67
             $perms->{acquisition} == 1  ||
68
             $subperms->{acquisition}->{'budget_manage'} ||
69
             $subperms->{acquisition}->{'budget_modify'} ||
70
             $subperms->{acquisition}->{'budget_add_del'} )
71
        {
72
            my %row = (
73
                borrowernumber    => $res->{'borrowernumber'},
74
                cardnumber        => $res->{'cardnumber'},
75
                surname           => $res->{'surname'},
76
                firstname         => $res->{'firstname'},
77
                categorycode      => $res->{'categorycode'},
78
                branchcode        => $res->{'branchcode'},
79
            );
80
            push( @resultsdata, \%row );
81
        }
82
    }
83
}
84
85
$template->param(
86
    type => $type,
87
    member => $member,
88
    resultsloop => \@resultsdata
89
);
90
91
output_html_with_http_headers $input, $cookie, $template->output;
(-)a/admin/aqbudgets.pl (-37 / +58 lines)
Lines 19-26 Link Here
19
# with Koha; if not, write to the Free Software Foundation, Inc.,
19
# with Koha; if not, write to the Free Software Foundation, Inc.,
20
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21
21
22
use strict;
22
use Modern::Perl;
23
#use warnings; FIXME - Bug 2505
23
24
use CGI;
24
use CGI;
25
use List::Util qw/min/;
25
use List::Util qw/min/;
26
use Number::Format qw(format_price);
26
use Number::Format qw(format_price);
Lines 56-70 $template->param( symbol => $cur->{symbol}, Link Here
56
                  currency => $cur->{currency}
56
                  currency => $cur->{currency}
57
               );
57
               );
58
58
59
my $op = $input->param('op');
59
my $op = $input->param('op') // '';
60
60
61
# see if the user want to see all budgets or only owned ones
61
# see if the user want to see all budgets or only owned ones
62
my $show_mine    = 1; #SHOW BY DEFAULT
62
my $show_mine    = 1; #SHOW BY DEFAULT
63
my $show         = $input->param('show'); # SET TO 1, BY A FORM SUMBIT
63
my $show         = $input->param('show') // 0; # SET TO 1, BY A FORM SUMBIT
64
$show_mine       = $input->param('show_mine') if $show == 1;
64
$show_mine       = $input->param('show_mine') if $show == 1;
65
65
66
# IF USER DOESNT HAVE PERM FOR AN 'ADD', THEN REDIRECT TO THE DEFAULT VIEW...
66
# IF USER DOESNT HAVE PERM FOR AN 'ADD', THEN REDIRECT TO THE DEFAULT VIEW...
67
if  (  not defined $template->{VARS}->{'CAN_user_acquisition_budget_add_del'}  &&  $op ==  'add_form'  )   {
67
if (not defined $template->{VARS}->{'CAN_user_acquisition_budget_add_del'}
68
    and $op eq 'add_form')
69
{
68
    $op = '';
70
    $op = '';
69
}
71
}
70
my $num=FormatNumber;
72
my $num=FormatNumber;
Lines 73-79 my $script_name = "/cgi-bin/koha/admin/aqbudgets.pl"; Link Here
73
my $budget_hash               = $input->Vars;
75
my $budget_hash               = $input->Vars;
74
my $budget_id                 = $$budget_hash{budget_id};
76
my $budget_id                 = $$budget_hash{budget_id};
75
my $budget_permission         = $input->param('budget_permission');
77
my $budget_permission         = $input->param('budget_permission');
76
my $filter_budgetbranch       = $input->param('filter_budgetbranch');
78
my $filter_budgetbranch       = $input->param('filter_budgetbranch') // '';
77
my $filter_budgetname         = $input->param('filter_budgetname');
79
my $filter_budgetname         = $input->param('filter_budgetname');
78
#filtering non budget keys
80
#filtering non budget keys
79
delete $$budget_hash{$_} foreach grep {/filter|^op$|show/} keys %$budget_hash;
81
delete $$budget_hash{$_} foreach grep {/filter|^op$|show/} keys %$budget_hash;
Lines 126-132 if ($op eq 'add_form') { Link Here
126
    #  pass the period_id to build the dropbox - because we only want to show  budgets from this period
128
    #  pass the period_id to build the dropbox - because we only want to show  budgets from this period
127
    my $dropbox_disabled;
129
    my $dropbox_disabled;
128
    if (defined $budget_id ) {    ### MOD
130
    if (defined $budget_id ) {    ### MOD
129
        $budget           = GetBudget($budget_id);
131
        $budget = GetBudget($budget_id);
132
        if (!CanUserModifyBudget($borrowernumber, $budget, $staffflags)) {
133
            $template->param(error_not_authorised_to_modify => 1);
134
            output_html_with_http_headers $input, $cookie, $template->output;
135
            exit;
136
        }
130
        $dropbox_disabled = BudgetHasChildren($budget_id);
137
        $dropbox_disabled = BudgetHasChildren($budget_id);
131
        my $borrower = &GetMember( borrowernumber=>$budget->{budget_owner_id} );
138
        my $borrower = &GetMember( borrowernumber=>$budget->{budget_owner_id} );
132
        $budget->{budget_owner_name} = $borrower->{'firstname'} . ' ' . $borrower->{'surname'};
139
        $budget->{budget_owner_name} = $borrower->{'firstname'} . ' ' . $borrower->{'surname'};
Lines 189-194 if ($op eq 'add_form') { Link Here
189
        $template->param($budget_permission => 1);
196
        $template->param($budget_permission => 1);
190
    }
197
    }
191
198
199
    if ($budget) {
200
        my @budgetusers = GetBudgetUsers($budget->{budget_id});
201
        my @budgetusers_loop;
202
        foreach my $borrowernumber (@budgetusers) {
203
            my $member = C4::Members::GetMember(
204
                borrowernumber => $borrowernumber);
205
            push @budgetusers_loop, {
206
                firstname => $member->{firstname},
207
                surname => $member->{surname},
208
                borrowernumber => $borrowernumber
209
            };
210
        }
211
        $template->param(
212
            budget_users => \@budgetusers_loop,
213
            budget_users_ids => join ':', @budgetusers
214
        );
215
    }
216
192
    # if no buget_id is passed then its an add
217
    # if no buget_id is passed then its an add
193
    $template->param(
218
    $template->param(
194
        add_validate                  => 1,
219
        add_validate                  => 1,
Lines 218-227 if ($op eq 'add_form') { Link Here
218
    if ( $op eq 'delete_confirmed' ) {
243
    if ( $op eq 'delete_confirmed' ) {
219
        my $rc = DelBudget($budget_id);
244
        my $rc = DelBudget($budget_id);
220
    }elsif( $op eq 'add_validate' ) {
245
    }elsif( $op eq 'add_validate' ) {
246
        my @budgetusersid;
247
        if (defined $$budget_hash{'budget_users_ids'}){
248
            @budgetusersid = split(':', $budget_hash->{'budget_users_ids'});
249
        }
250
221
        if ( defined $$budget_hash{budget_id} ) {
251
        if ( defined $$budget_hash{budget_id} ) {
222
            ModBudget( $budget_hash );
252
            if (CanUserModifyBudget($borrowernumber, $budget_hash->{budget_id},
253
                $staffflags)
254
            ) {
255
                ModBudget( $budget_hash );
256
                ModBudgetUsers($budget_hash->{budget_id}, @budgetusersid);
257
            }
258
            else {
259
                $template->param(error_not_authorised_to_modify => 1);
260
            }
223
        } else {
261
        } else {
224
            AddBudget( $budget_hash );
262
            AddBudget( $budget_hash );
263
            ModBudgetUsers($budget_hash->{budget_id}, @budgetusersid);
225
        }
264
        }
226
    }
265
    }
227
    my $branches = GetBranches();
266
    my $branches = GetBranches();
Lines 230-237 if ($op eq 'add_form') { Link Here
230
        %$period,
269
        %$period,
231
    );
270
    );
232
271
233
    my $moo = GetBudgetHierarchy($$period{budget_period_id}, C4::Context->userenv->{branchcode}, $show_mine?$borrower_id:'');
272
    my @budgets = @{
234
    my @budgets = @$moo; #FIXME
273
        GetBudgetHierarchy($$period{budget_period_id},
274
            C4::Context->userenv->{branchcode}, $show_mine ? $borrower_id : '')
275
    };
235
276
236
    my $toggle = 0;
277
    my $toggle = 0;
237
    my @loop;
278
    my @loop;
Lines 245-275 if ($op eq 'add_form') { Link Here
245
        $budget->{'total_levels_spent'} = GetChildBudgetsSpent($budget->{"budget_id"});
286
        $budget->{'total_levels_spent'} = GetChildBudgetsSpent($budget->{"budget_id"});
246
287
247
        # PERMISSIONS
288
        # PERMISSIONS
248
        unless($staffflags->{'superlibrarian'} % 2   == 1 ) {
289
        unless(CanUserModifyBudget($borrowernumber, $budget, $staffflags)) {
249
            #IF NO PERMS, THEN DISABLE EDIT/DELETE
290
            $budget->{'budget_lock'} = 1;
250
            unless ( $template->{VARS}->{'CAN_user_acquisition_budget_modify'} ) {
291
        }
251
                $budget->{'budget_lock'} = 1;
252
            }
253
            # check budget permission
254
            if ( $$period{budget_period_locked} == 1 ) {
255
                $budget->{'budget_lock'} = 1;
256
257
            } elsif ( $budget->{budget_permission} == 1 ) {
258
259
                if ( $borrower_id != $budget->{'budget_owner_id'} ) {
260
                    $budget->{'budget_lock'} = 1;
261
                }
262
                # check parent perms too
263
                my $parents_perm = 0;
264
                if ( $budget->{depth} > 0 ) {
265
                    $parents_perm = CheckBudgetParentPerm( $budget, $borrower_id );
266
                    delete $budget->{'budget_lock'} if $parents_perm == '1';
267
                }
268
            } elsif ( $budget->{budget_permission} == 2 ) {
269
270
                $budget->{'budget_lock'} = 1 if $user_branchcode ne $budget->{budget_branchcode};
271
            }
272
        }    # ...SUPER_LIB END
273
292
274
        # if a budget search doesnt match, next
293
        # if a budget search doesnt match, next
275
        if ($filter_budgetname) {
294
        if ($filter_budgetname) {
Lines 288-294 if ($op eq 'add_form') { Link Here
288
        $budget->{'budget_remaining'} = $budget->{'budget_amount'} - $budget->{'total_levels_spent'};
307
        $budget->{'budget_remaining'} = $budget->{'budget_amount'} - $budget->{'total_levels_spent'};
289
308
290
# if amount == 0 dont display...
309
# if amount == 0 dont display...
291
        delete  $budget->{'budget_unalloc_sublevel'} if  $budget->{'budget_unalloc_sublevel'} == 0 ;
310
        delete $budget->{'budget_unalloc_sublevel'}
311
            if (!defined $budget->{'budget_unalloc_sublevel'}
312
            or $budget->{'budget_unalloc_sublevel'} == 0);
292
313
293
        $budget->{'remaining_pos'} = 1 if $budget->{'budget_remaining'} > 0;
314
        $budget->{'remaining_pos'} = 1 if $budget->{'budget_remaining'} > 0;
294
        $budget->{'remaining_neg'} = 1 if $budget->{'budget_remaining'} < 0;
315
        $budget->{'remaining_neg'} = 1 if $budget->{'budget_remaining'} < 0;
Lines 312-318 if ($op eq 'add_form') { Link Here
312
            push @budget_hierarchy, { element_name => $parent->{"budget_name"}, element_id => $parent->{"budget_id"} };
333
            push @budget_hierarchy, { element_name => $parent->{"budget_name"}, element_id => $parent->{"budget_id"} };
313
            $parent_id = $parent->{"budget_parent_id"};
334
            $parent_id = $parent->{"budget_parent_id"};
314
        }
335
        }
315
        push  @budget_hierarchy, { element_name => $period->{"budget_period_description"} }; 
336
        push  @budget_hierarchy, { element_name => $period->{"budget_period_description"} };
316
        @budget_hierarchy = reverse(@budget_hierarchy);
337
        @budget_hierarchy = reverse(@budget_hierarchy);
317
338
318
        push( @loop, {  %{$budget},
339
        push( @loop, {  %{$budget},
(-)a/admin/aqplan.pl (+4 lines)
Lines 354-359 my ( @budget_lines, %cell_hash ); Link Here
354
foreach my $budget (@budgets) {
354
foreach my $budget (@budgets) {
355
    my $budget_lock;
355
    my $budget_lock;
356
356
357
    unless (CanUserUseBudget($borrowernumber, $budget, $staff_flags)) {
358
        $budget_lock = 1
359
    }
360
357
    # check budget permission
361
    # check budget permission
358
    if ( $period->{budget_period_locked} == 1 ) {
362
    if ( $period->{budget_period_locked} == 1 ) {
359
        $budget_lock = 1;
363
        $budget_lock = 1;
(-)a/installer/data/mysql/de-DE/mandatory/userpermissions.sql (+1 lines)
Lines 16-21 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
16
   (11, 'group_manage', 'Bestellgruppen vewalten'),
16
   (11, 'group_manage', 'Bestellgruppen vewalten'),
17
   (11, 'order_receive', 'Lieferungen verwalten'),
17
   (11, 'order_receive', 'Lieferungen verwalten'),
18
   (11, 'budget_add_del', 'Konten hinzufügen/ändern, aber bestehende nicht ändern'),
18
   (11, 'budget_add_del', 'Konten hinzufügen/ändern, aber bestehende nicht ändern'),
19
   (11, 'budget_manage_all', 'Manage all budgets'),
19
   (13, 'edit_news', 'Nachrichten für OPAC und Dienstoberfläche verfassen'),
20
   (13, 'edit_news', 'Nachrichten für OPAC und Dienstoberfläche verfassen'),
20
   (13, 'label_creator', 'Etiketten und Barcodes aus Katalog- und Benutzerdaten erstellen'),
21
   (13, 'label_creator', 'Etiketten und Barcodes aus Katalog- und Benutzerdaten erstellen'),
21
   (13, 'edit_calendar', 'Schließtage eintragen'),
22
   (13, 'edit_calendar', 'Schließtage eintragen'),
(-)a/installer/data/mysql/en/mandatory/userpermissions.sql (+1 lines)
Lines 16-21 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
16
   (11, 'group_manage', 'Manage orders & basketgroups'),
16
   (11, 'group_manage', 'Manage orders & basketgroups'),
17
   (11, 'order_receive', 'Manage orders & basket'),
17
   (11, 'order_receive', 'Manage orders & basket'),
18
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
18
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
19
   (11, 'budget_manage_all', 'Manage all budgets'),
19
   (13, 'edit_news', 'Write news for the OPAC and staff interfaces'),
20
   (13, 'edit_news', 'Write news for the OPAC and staff interfaces'),
20
   (13, 'label_creator', 'Create printable labels and barcodes from catalog and patron data'),
21
   (13, 'label_creator', 'Create printable labels and barcodes from catalog and patron data'),
21
   (13, 'edit_calendar', 'Define days when the library is closed'),
22
   (13, 'edit_calendar', 'Define days when the library is closed'),
(-)a/installer/data/mysql/es-ES/mandatory/userpermissions.sql (+1 lines)
Lines 16-21 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
16
   (11, 'group_manage', 'Manage orders & basketgroups'),
16
   (11, 'group_manage', 'Manage orders & basketgroups'),
17
   (11, 'order_receive', 'Manage orders & basket'),
17
   (11, 'order_receive', 'Manage orders & basket'),
18
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
18
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
19
   (11, 'budget_manage_all', 'Manage all budgets'),
19
   (13, 'edit_news', 'Write news for the OPAC and staff interfaces'),
20
   (13, 'edit_news', 'Write news for the OPAC and staff interfaces'),
20
   (13, 'label_creator', 'Create printable labels and barcodes from catalog and patron data'),
21
   (13, 'label_creator', 'Create printable labels and barcodes from catalog and patron data'),
21
   (13, 'edit_calendar', 'Define days when the library is closed'),
22
   (13, 'edit_calendar', 'Define days when the library is closed'),
(-)a/installer/data/mysql/fr-FR/1-Obligatoire/userpermissions.sql (+1 lines)
Lines 32-37 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
32
   (11, 'group_manage', 'Gérer les commandes et les bons de commande'),
32
   (11, 'group_manage', 'Gérer les commandes et les bons de commande'),
33
   (11, 'order_receive', 'Gérer les réceptions'),
33
   (11, 'order_receive', 'Gérer les réceptions'),
34
   (11, 'budget_add_del', 'Ajouter et supprimer les budgets (mais pas modifier)'),
34
   (11, 'budget_add_del', 'Ajouter et supprimer les budgets (mais pas modifier)'),
35
   (11, 'budget_manage_all', 'Gérer tous les budgets'),
35
   (13, 'manage_csv_profiles', 'Gérer les profils d''export CSV'),
36
   (13, 'manage_csv_profiles', 'Gérer les profils d''export CSV'),
36
   (13, 'moderate_tags', 'Modérer les tags des adhérents'),
37
   (13, 'moderate_tags', 'Modérer les tags des adhérents'),
37
   (13, 'rotating_collections', 'Gérer les collections tournantes'),
38
   (13, 'rotating_collections', 'Gérer les collections tournantes'),
(-)a/installer/data/mysql/it-IT/necessari/userpermissions.sql (+1 lines)
Lines 18-23 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
18
   (11, 'group_manage', 'Gestisci ordini e raccoglitori raggruppati'),
18
   (11, 'group_manage', 'Gestisci ordini e raccoglitori raggruppati'),
19
   (11, 'order_receive', 'Gestisci arrivi'),
19
   (11, 'order_receive', 'Gestisci arrivi'),
20
   (11, 'budget_add_del', 'Aggiungi e cancella budgets (senza modificarli)'),
20
   (11, 'budget_add_del', 'Aggiungi e cancella budgets (senza modificarli)'),
21
   (11, 'budget_manage_all', 'Manage all budgets'),
21
   (13, 'edit_news', 'Scrivi le news per l\'OPAC e per l\'interfaccia staff'),
22
   (13, 'edit_news', 'Scrivi le news per l\'OPAC e per l\'interfaccia staff'),
22
   (13, 'label_creator', 'Crea etichette da stampare e barcodes dal catalogo e dai dati degli utenti'),
23
   (13, 'label_creator', 'Crea etichette da stampare e barcodes dal catalogo e dai dati degli utenti'),
23
   (13, 'edit_calendar', 'Definisci i giorni di chiusura della biblioteca'),
24
   (13, 'edit_calendar', 'Definisci i giorni di chiusura della biblioteca'),
(-)a/installer/data/mysql/kohastructure.sql (+14 lines)
Lines 2640-2645 CREATE TABLE `aqbudgets` ( Link Here
2640
  PRIMARY KEY  (`budget_id`)
2640
  PRIMARY KEY  (`budget_id`)
2641
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2641
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2642
2642
2643
--
2644
-- Table structure for table aqbudgetborrowers
2645
--
2646
2647
DROP TABLE IF EXISTS aqbudgetborrowers;
2648
CREATE TABLE aqbudgetborrowers (
2649
  budget_id int(11) NOT NULL,
2650
  borrowernumber int(11) NOT NULL,
2651
  PRIMARY KEY (budget_id, borrowernumber),
2652
  CONSTRAINT aqbudgetborrowers_ibfk_1 FOREIGN KEY (budget_id)
2653
    REFERENCES aqbudgets (budget_id),
2654
  CONSTRAINT aqbudgetborrowers_ibfk_2 FOREIGN KEY (borrowernumber)
2655
    REFERENCES borrowers (borrowernumber)
2656
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2643
2657
2644
--
2658
--
2645
-- Table structure for table `aqbudgetperiods`
2659
-- Table structure for table `aqbudgetperiods`
(-)a/installer/data/mysql/nb-NO/1-Obligatorisk/userpermissions.sql (+1 lines)
Lines 37-42 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
37
   (11, 'group_manage', 'Administrere bestillinger og kurv-grupper'),
37
   (11, 'group_manage', 'Administrere bestillinger og kurv-grupper'),
38
   (11, 'order_receive', 'Administrere bestillinger og kurver'),
38
   (11, 'order_receive', 'Administrere bestillinger og kurver'),
39
   (11, 'budget_add_del', 'Legge til og slette budsjetter (men ikke endre budsjetter)'),
39
   (11, 'budget_add_del', 'Legge til og slette budsjetter (men ikke endre budsjetter)'),
40
   (11, 'budget_manage_all', 'Manage all budgets'),
40
   (13, 'edit_news', 'Legge ut nyhter i OPACen og det interne grensesnittet'),
41
   (13, 'edit_news', 'Legge ut nyhter i OPACen og det interne grensesnittet'),
41
   (13, 'label_creator', 'Lage etiketter og strekkoder basert på bibliografiske poster og lånerdata'),
42
   (13, 'label_creator', 'Lage etiketter og strekkoder basert på bibliografiske poster og lånerdata'),
42
   (13, 'edit_calendar', 'Definere dager da biblioteket er stengt'),
43
   (13, 'edit_calendar', 'Definere dager da biblioteket er stengt'),
(-)a/installer/data/mysql/pl-PL/mandatory/userpermissions.sql (+1 lines)
Lines 16-21 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
16
   (11, 'group_manage', 'Manage orders & basketgroups'),
16
   (11, 'group_manage', 'Manage orders & basketgroups'),
17
   (11, 'order_receive', 'Manage orders & basket'),
17
   (11, 'order_receive', 'Manage orders & basket'),
18
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
18
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
19
   (11, 'budget_manage_all', 'Manage all budgets'),
19
   (13, 'edit_news', 'RTworzeniei publikowanie wiadomości w interfejsie bibliotekarza i OPAC'),
20
   (13, 'edit_news', 'RTworzeniei publikowanie wiadomości w interfejsie bibliotekarza i OPAC'),
20
   (13, 'label_creator', 'Create printable labels and barcodes from catalog and patron data'),
21
   (13, 'label_creator', 'Create printable labels and barcodes from catalog and patron data'),
21
   (13, 'edit_calendar', 'Define days when the library is closed'),
22
   (13, 'edit_calendar', 'Define days when the library is closed'),
(-)a/installer/data/mysql/ru-RU/mandatory/permissions_and_user_flags.sql (+1 lines)
Lines 40-45 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
40
   (11, 'group_manage', 'Manage orders & basketgroups'),
40
   (11, 'group_manage', 'Manage orders & basketgroups'),
41
   (11, 'order_receive', 'Manage orders & basket'),
41
   (11, 'order_receive', 'Manage orders & basket'),
42
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
42
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
43
   (11, 'budget_manage_all', 'Manage all budgets'),
43
   (13, 'edit_news',                   'Написание новостей для электронного каталога и интерфейса библиотекарей'),
44
   (13, 'edit_news',                   'Написание новостей для электронного каталога и интерфейса библиотекарей'),
44
   (13, 'label_creator',               'Создание печатных наклеек и штрихкодов из каталога и с данными о пользователях'),
45
   (13, 'label_creator',               'Создание печатных наклеек и штрихкодов из каталога и с данными о пользователях'),
45
   (13, 'edit_calendar',               'Определение дней, когда библиотека закрыта'),
46
   (13, 'edit_calendar',               'Определение дней, когда библиотека закрыта'),
(-)a/installer/data/mysql/uk-UA/mandatory/permissions_and_user_flags.sql (+1 lines)
Lines 40-45 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
40
   (11, 'group_manage', 'Manage orders & basketgroups'),
40
   (11, 'group_manage', 'Manage orders & basketgroups'),
41
   (11, 'order_receive', 'Manage orders & basket'),
41
   (11, 'order_receive', 'Manage orders & basket'),
42
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
42
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
43
   (11, 'budget_manage_all', 'Manage all budgets'),
43
   (13, 'edit_news',                   'Написання новин для електронного каталогу та інтерфейсу бібліотекарів'),
44
   (13, 'edit_news',                   'Написання новин для електронного каталогу та інтерфейсу бібліотекарів'),
44
   (13, 'label_creator',               'Створення друкованих наклейок і штрих-кодів з каталогу та з даними про користувачів'),
45
   (13, 'label_creator',               'Створення друкованих наклейок і штрих-кодів з каталогу та з даними про користувачів'),
45
   (13, 'edit_calendar',               'Визначення днів, коли бібліотека закрита'),
46
   (13, 'edit_calendar',               'Визначення днів, коли бібліотека закрита'),
(-)a/installer/data/mysql/updatedatabase.pl (+22 lines)
Lines 5246-5251 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { Link Here
5246
    SetVersion($DBversion);
5246
    SetVersion($DBversion);
5247
}
5247
}
5248
5248
5249
$DBversion = "XXX";
5250
if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5251
    $dbh->do("DROP TABLE IF EXISTS aqbudgetborrowers");
5252
    $dbh->do("
5253
        CREATE TABLE aqbudgetborrowers (
5254
          budget_id int(11) NOT NULL,
5255
          borrowernumber int(11) NOT NULL,
5256
          PRIMARY KEY (budget_id, borrowernumber),
5257
          CONSTRAINT aqbudgetborrowers_ibfk_1 FOREIGN KEY (budget_id)
5258
            REFERENCES aqbudgets (budget_id),
5259
          CONSTRAINT aqbudgetborrowers_ibfk_2 FOREIGN KEY (borrowernumber)
5260
            REFERENCES borrowers (borrowernumber)
5261
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
5262
    ");
5263
    $dbh->do("
5264
        INSERT INTO permissions (module_bit, code, description)
5265
        VALUES (11, 'budget_manage_all', 'Manage all budgets')
5266
    ");
5267
    print "Upgrade to $DBversion done (Add aqbudgetborrowers table)\n";
5268
    SetVersion($DBversion);
5269
}
5270
5249
=head1 FUNCTIONS
5271
=head1 FUNCTIONS
5250
5272
5251
=head2 TableExists($table)
5273
=head2 TableExists($table)
(-)a/koha-tmpl/intranet-tmpl/prog/en/js/acq.js (-7 lines)
Lines 531-544 function log(message) { Link Here
531
    logLine.appendChild(log.window_.document.createTextNode(message));
531
    logLine.appendChild(log.window_.document.createTextNode(message));
532
    log.window_.document.body.appendChild(logLine);
532
    log.window_.document.body.appendChild(logLine);
533
}
533
}
534
//=======================================================================
535
536
534
537
538
    function ownerPopup(f) {
539
    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');
540
    }
541
        //
542
//=======================================================================
535
//=======================================================================
543
function getElementsByClass( searchClass, domNode, tagName) {
536
function getElementsByClass( searchClass, domNode, tagName) {
544
    if (domNode == null) domNode = document;
537
    if (domNode == null) domNode = document;
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudget_owner_search.tt (-77 lines)
Lines 1-77 Link Here
1
[% INCLUDE 'doc-head-open.inc' %]
2
<title>Koha &rsaquo; Budget owner search</title>
3
[% INCLUDE 'doc-head-close.inc' %]
4
    <style type="text/css">
5
    #custom-doc { width:44.46em;*width:43.39em;min-width:578px; margin:auto; text-align:left; }
6
    </style>
7
8
<script type="text/javascript">
9
//<![CDATA[
10
11
// modify parent window owner element
12
function returnOwner(ownerId, ownerName){
13
    var top1 = top.opener;
14
    top1.document.getElementById('budget_owner_name').innerHTML = ownerName;
15
    top1.document.getElementById('budget_owner_id').value = ownerId;
16
    window.close();
17
}
18
//]]>
19
</script>
20
21
22
</head>
23
<body id="admin_aqbudget_owner_search" class="admin">
24
<div id="custom-doc" class="yui-t7">
25
   <div id="bd">
26
	<div class="yui-g">
27
28
29
<h3>Search for budget owner</h3>
30
	<form action="/cgi-bin/koha/admin/aqbudget_owner_search.pl" method="post">
31
		<fieldset>
32
		<input type="text" name="member" id="member" value="[% member %]" class="focus" />
33
34
35
<!--
36
 Ordered by
37
		<select name="orderby">
38
			<option value="surname,firstname">Surname</option>
39
			<option value="cardnumber">Cardnumber</option>
40
		</select>
41
-->
42
43
<input type="submit" class="button" value="Search" /></fieldset>
44
<div class="hint">Only staff with superlibrarian or acquisitions permissions are returned in the search results</div>
45
46
	</form>
47
48
49
[% IF ( results ) %]
50
	<p>Searched for <span class="ex">[% member %]</span>, [% numresults %] patron(s) found:</p>
51
	<table>
52
		<tr>
53
			<th>Cardnumber</th>
54
			<th>Name</th>
55
			<th>Library</th>
56
			<th>Categorycode</th>
57
            <th>Select?</th>
58
		</tr>
59
60
		[% FOREACH resultsloo IN resultsloop %]
61
            [% IF ( resultsloo.toggle ) %]<tr>[% ELSE %]<tr class="highlight">[% END %]
62
				<td>[% resultsloo.cardnumber %]</td>
63
                <td>[% resultsloo.surname %], [% resultsloo.firstname %]</td>
64
				<td>[% resultsloo.branchcode %]</td>
65
				<td>[% resultsloo.categorycode %]</td>
66
                <td>
67
                 <input type="button" value="Select" onclick="returnOwner('[% resultsloo.budget_owner_id %]', '[% resultsloo.budget_owner_name %]');"  />
68
                </td>
69
			</tr>
70
		[% END %]
71
	</table>
72
[% END %]
73
74
<div id="closewindow"><a href="#" class="close">Cancel</a></div>
75
</div>
76
</div>
77
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudget_user_search.tt (+111 lines)
Line 0 Link Here
1
[% INCLUDE 'doc-head-open.inc' %]
2
<title>Koha &rsaquo; Budget
3
    [% IF (type == 'owner') %]
4
        owner
5
    [% ELSE %]
6
        user
7
    [% END %]
8
    search
9
</title>
10
[% INCLUDE 'doc-head-close.inc' %]
11
    <style type="text/css">
12
    #custom-doc {
13
        width:44.46em;
14
        *width:43.39em;
15
        min-width:578px;
16
        margin:auto;
17
        text-align:left;
18
    }
19
    </style>
20
21
    <script type="text/javascript">
22
    //<![CDATA[
23
24
    // modify parent window owner element
25
    function add_user(borrowernumber, surname, firstname) {
26
        [% IF (type == 'owner') %]
27
            top.opener.edit_owner(borrowernumber, surname, firstname);
28
            window.close();
29
        [% ELSE %]
30
            var ret = top.opener.add_user(borrowernumber, surname, firstname);
31
            if (ret != 0) {
32
                alert(_("This user is already in the list."));
33
            }
34
        [% END %]
35
    }
36
37
    //]]>
38
    </script>
39
</head>
40
41
<body id="admin_aqbudget_owner_search" class="admin">
42
<div id="custom-doc" class="yui-t7">
43
<div id="bd">
44
<div class="yui-g">
45
46
<h3>Search for budget
47
    [% IF (type == 'owner') %]
48
        owner
49
    [% ELSE %]
50
        user
51
    [% END %]
52
</h3>
53
<form action="/cgi-bin/koha/admin/aqbudget_user_search.pl" method="post">
54
    <fieldset>
55
        <input type="text" name="member" id="member" value="[% member %]"
56
            class="focus" />
57
58
        <input type="hidden" name="type" value="[% type %]" />
59
        <input type="submit" class="button" value="Search" />
60
    </fieldset>
61
62
    <div class="hint">
63
        Only staff with superlibrarian or acquisitions permissions are returned
64
        in the search results.
65
    </div>
66
</form>
67
68
69
[% IF ( results ) %]
70
    <p>Searched for <span class="ex">[% member %]</span>,
71
    [% resultsloop.size || 0 %] patron(s) found:</p>
72
73
    <table>
74
        <thead>
75
            <tr>
76
                <th>Cardnumber</th>
77
                <th>Name</th>
78
                <th>Library</th>
79
                <th>Categorycode</th>
80
                <th>Select?</th>
81
            </tr>
82
        </thead>
83
84
        <tbody>
85
            [% FOREACH result IN resultsloop %]
86
                <tr>
87
                    <td>[% result.cardnumber %]</td>
88
                    <td>[% result.surname %], [% result.firstname %]</td>
89
                    <td>[% result.branchcode %]</td>
90
                    <td>[% result.categorycode %]</td>
91
                    <td>
92
                    <a style="cursor:pointer"
93
                        onclick="add_user(
94
                            '[% result.borrowernumber %]',
95
                            '[% result.surname %]',
96
                            '[% result.firstname %]'
97
                        );"
98
                    />Select</a>
99
                    </td>
100
                </tr>
101
            [% END %]
102
        </tbody>
103
    </table>
104
[% END %]
105
106
<div id="closewindow">
107
    <a href="#" class="close">Close</a>
108
</div>
109
</div>
110
</div>
111
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/aqbudgets.tt (-21 / +131 lines)
Lines 6-17 Link Here
6
[% IF ( add_form ) %]
6
[% IF ( add_form ) %]
7
<script type="text/javascript">
7
<script type="text/javascript">
8
//<![CDATA[
8
//<![CDATA[
9
//
10
     var actTotal ="";
11
9
12
    function ownerRemove(f) {
10
    function userPopup() {
13
        document.getElementById('budget_owner_name').innerHTML = '';
11
        window.open("/cgi-bin/koha/admin/aqbudget_user_search.pl?type=user",
14
        document.getElementById('budget_owner_id').value = '';
12
            'PatronPopup',
13
            'width=740,height=450,location=yes,toolbar=no,'
14
            + 'scrollbars=yes,resize=yes'
15
        );
16
    }
17
18
    function ownerPopup() {
19
        window.open("/cgi-bin/koha/admin/aqbudget_user_search.pl?type=owner",
20
            'PatronPopup',
21
            'width=740,height=450,location=yes,toolbar=no,'
22
            + 'scrollbars=yes,resize=yes'
23
        );
24
    }
25
26
    function edit_owner(borrowernumber, surname, firstname) {
27
        $('#budget_owner_name').empty();
28
        $('#budget_owner_id').val('');
29
        if (borrowernumber) {
30
            var ownerlink = '<a href="/cgi-bin/koha/members/moremember.pl'
31
                + '?borrowernumber=' + borrowernumber + '">'
32
                + firstname + ' ' + surname + '</a>';
33
            $('#budget_owner_name').html(ownerlink);
34
            $('#budget_owner_id').val(borrowernumber);
35
        }
36
    }
37
38
    function ownerRemove() {
39
        edit_owner(0);
40
    }
41
42
    function add_user(borrowernumber, surname, firstname) {
43
        var ids = $("#budget_users_id").val().split(':');
44
        if(borrowernumber && ids.indexOf(borrowernumber) == -1) {
45
            var li = '<li id="user_' + borrowernumber + '">'
46
                + '<a href="/cgi-bin/koha/members/moremember.pl?borrowernumber='
47
                + borrowernumber + '">' + firstname + ' ' + surname
48
                + '</a> [<a style="cursor:pointer"'
49
                + 'onclick="del_user(' + borrowernumber +')">Remove</a>]</li>';
50
            $(li).insertBefore("li#add_user_button");
51
            ids.push(borrowernumber);
52
            $("#budget_users_id").val(ids.join(':'));
53
        } else {
54
            return -1;
55
        }
56
        return 0;
57
    }
58
59
    function del_user(borrowernumber) {
60
        var ids = $("#budget_users_id").val().split(':');
61
        if (borrowernumber) {
62
            var idx = ids.indexOf(borrowernumber+'');
63
            if (idx != -1) {
64
                ids.splice(idx, 1);
65
                $("#budget_users_id").val(ids.join(':'));
66
                $("li#user_" + borrowernumber).remove();
67
            }
68
        }
15
    }
69
    }
16
70
17
    function Check(f) {
71
    function Check(f) {
Lines 19-26 Link Here
19
        var _alertString="";
73
        var _alertString="";
20
        var alertString2;
74
        var alertString2;
21
75
22
        // var actTotal ="";
23
24
        if (!(isNotNull(f.budget_code,1))) {
76
        if (!(isNotNull(f.budget_code,1))) {
25
            _alertString += _("- Budget code cannot be blank") + "\n";
77
            _alertString += _("- Budget code cannot be blank") + "\n";
26
        }
78
        }
Lines 154-160 Link Here
154
<div id="yui-main">
206
<div id="yui-main">
155
<div class="yui-b" id="content">
207
<div class="yui-b" id="content">
156
208
209
157
[% UNLESS ( delete_confirm ) %][% INCLUDE 'budgets-admin-toolbar.inc' %][% END %]
210
[% UNLESS ( delete_confirm ) %][% INCLUDE 'budgets-admin-toolbar.inc' %][% END %]
211
212
[% IF (error_not_authorised_to_modify) %]
213
    <div class="error">
214
        <p>You are not authorised to modify this fund</p>
215
    </div>
216
[% END %]
217
158
[% IF ( else ) %]
218
[% IF ( else ) %]
159
219
160
<h1>Funds for '[% budget_period_description %]'</h1>
220
<h1>Funds for '[% budget_period_description %]'</h1>
Lines 246-252 Link Here
246
306
247
<!-- ********************************************************************************************** -->
307
<!-- ********************************************************************************************** -->
248
<!-- create add/mod entry form -->
308
<!-- create add/mod entry form -->
249
[% IF ( add_form ) %]
309
[% IF ( add_form && !error_not_authorised_to_modify ) %]
250
<form action="/cgi-bin/koha/admin/aqbudgets.pl" name="Aform" method="post">
310
<form action="/cgi-bin/koha/admin/aqbudgets.pl" name="Aform" method="post">
251
    <fieldset class="rows">
311
    <fieldset class="rows">
252
    <legend>[% IF ( budget_id ) %]Modify[% ELSE %]Add[% END %] Fund
312
    <legend>[% IF ( budget_id ) %]Modify[% ELSE %]Add[% END %] Fund
Lines 288-308 Link Here
288
348
289
    <li>
349
    <li>
290
    <label for="budget_expend">Expenditure: </label>
350
    <label for="budget_expend">Expenditure: </label>
291
    <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 %]" />
351
    <input type="text" name="budget_expend" id="budget_expend" value="[% budget_expend %]" size="8" />
292
    </li>
352
    </li>
293
353
294
    <li>
354
    <li>
295
    <span class="label">Owner: </span>
355
        <span class="label">Owner: </span>
296
    <span  id="budget_owner_name">
356
        <span  id="budget_owner_name">
297
    <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% budget_owner_id %]">[% budget_owner_name %]</a>
357
        <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% budget_owner_id %]">
298
    </span>
358
            [% budget_owner_name %]
299
359
        </a>
300
    <!-- FIXME: hardcoded button positions :/ -->
360
        </span>
301
    <input style="" type="button" id="edit_owner" value="Edit owner" onclick="ownerPopup(); return false;" />
361
        <input type="hidden" name="budget_owner_id" id="budget_owner_id"
302
    <input style=""  type="button" id="remove_owner" value="Remove owner" onclick="ownerRemove(this.form); return false;" />
362
            value="[% budget_owner_id %]" />
363
364
        <!-- FIXME: hardcoded button positions :/ -->
365
        <input type="button" id="edit_owner" value="Edit owner"
366
            onclick="ownerPopup(); return false;" />
367
        <input type="button" id="remove_owner" value="Remove owner"
368
            onclick="ownerRemove(); return false;" />
303
    </li>
369
    </li>
304
370
305
    <li>
371
    <li>
372
        <span class="label">Users:</span>
373
        <ul style="float:left;" id="budget_users">
374
            [% FOREACH user IN budget_users %]
375
                <li id="user_[% user.borrowernumber %]">
376
                    <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% user.borrowernumber %]">
377
                        [% user.firstname %] [% user.surname %]
378
                    </a>
379
                    [<a style="cursor:pointer"
380
                    onclick="del_user([% user.borrowernumber %])">Remove</a>]
381
                </li>
382
            [% END %]
383
            <li id="add_user_button">
384
                <input type="button" onclick="userPopup()" value="Add users" />
385
            </li>
386
        </ul>
387
        <input type="hidden" name="budget_users_ids" id="budget_users_id" value="[% budget_users_ids %]" />
388
    <li>
306
    <label for="budget_branchcode">Library: </label>
389
    <label for="budget_branchcode">Library: </label>
307
    <select name="budget_branchcode" id="budget_branchcode">
390
    <select name="budget_branchcode" id="budget_branchcode">
308
    <option value=""></option>
391
    <option value=""></option>
Lines 315-324 Link Here
315
    <li>
398
    <li>
316
    <label for="budget_permission">Restrict access to: </label>
399
    <label for="budget_permission">Restrict access to: </label>
317
    <select name="budget_permission" id="budget_permission">
400
    <select name="budget_permission" id="budget_permission">
318
    [% IF ( budget_perm_0 ) %]<option value="0" selected="selected">None</option>[% ELSE %]<option value="0">None</option>[% END %]
401
        [% IF ( budget_perm_0 ) %]
319
    [% IF ( budget_perm_1 ) %]<option value="1" selected="selected">Owner</option>[% ELSE %]<option value="1">Owner</option>[% END %]
402
            <option value="0" selected="selected">
320
    [% IF ( budget_perm_2 ) %]<option value="2" selected="selected">Library</option>[% ELSE %]<option value="2">Library</option>[% END %]
403
        [% ELSE %]
321
    </option>
404
            <option value="0">
405
        [% END %]
406
            None
407
        </option>
408
409
        [% IF ( budget_perm_1 ) %]
410
            <option value="1" selected="selected">
411
        [% ELSE %]
412
            <option value="1">
413
        [% END %]
414
            Owner
415
        </option>
416
417
        [% IF ( budget_perm_3) %]
418
            <option value="3" selected="selected">
419
        [% ELSE %]
420
            <option value="3">
421
        [% END %]
422
            Owner and users
423
        </option>
424
425
        [% IF ( budget_perm_2 ) %]
426
            <option value="2" selected="selected">
427
        [% ELSE %]
428
            <option value="2">
429
        [% END %]
430
            Owner, users and library
431
        </option>
322
    </select>
432
    </select>
323
    </li>
433
    </li>
324
434
(-)a/suggestion/suggestion.pl (-5 / +12 lines)
Lines 92-98 delete $$suggestion_ref{$_} foreach qw( suggestedbyme op displayby tabcode edit_ Link Here
92
foreach (keys %$suggestion_ref){
92
foreach (keys %$suggestion_ref){
93
    delete $$suggestion_ref{$_} if (!$$suggestion_ref{$_} && ($op eq 'else' || $op eq 'change'));
93
    delete $$suggestion_ref{$_} if (!$$suggestion_ref{$_} && ($op eq 'else' || $op eq 'change'));
94
}
94
}
95
my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
95
my ( $template, $borrowernumber, $cookie, $userflags ) = get_template_and_user(
96
        {
96
        {
97
            template_name   => "suggestion/suggestion.tmpl",
97
            template_name   => "suggestion/suggestion.tmpl",
98
            query           => $input,
98
            query           => $input,
Lines 320-331 if ($branchfilter) { Link Here
320
    $budgets = GetBudgets(undef);
320
    $budgets = GetBudgets(undef);
321
}
321
}
322
322
323
my @budgets_loop;
323
foreach my $budget ( @{$budgets} ) {
324
foreach my $budget ( @{$budgets} ) {
324
## Please see file perltidy.ERR
325
    next unless (CanUserUseBudget($borrowernumber, $budget, $userflags));
325
    $budget->{'selected'}=1 if ($$suggestion_ref{'budgetid'} && $budget->{'budget_id'} eq $$suggestion_ref{'budgetid'})
326
};
327
326
328
$template->param( budgetsloop => $budgets);
327
    ## Please see file perltidy.ERR
328
    $budget->{'selected'} = 1
329
        if ($$suggestion_ref{'budgetid'}
330
        && $budget->{'budget_id'} eq $$suggestion_ref{'budgetid'});
331
332
    push @budgets_loop, $budget;
333
}
334
335
$template->param( budgetsloop => \@budgets_loop);
329
$template->param( "statusselected_$$suggestion_ref{'STATUS'}" =>1) if ($$suggestion_ref{'STATUS'});
336
$template->param( "statusselected_$$suggestion_ref{'STATUS'}" =>1) if ($$suggestion_ref{'STATUS'});
330
337
331
# get currencies and rates
338
# get currencies and rates
(-)a/t/Budgets/CanUserModifyBudget.t (+341 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
use Modern::Perl;
4
use Test::MockModule;
5
use Test::More tests => 133;
6
7
use C4::Budgets;
8
9
my $C4_Budgets_module = new Test::MockModule('C4::Budgets');
10
$C4_Budgets_module->mock('GetBudgetUsers', \&Mock_GetBudgetUsers);
11
my $C4_Context_module = new Test::MockModule('C4::Context');
12
$C4_Context_module->mock('userenv', \&Mock_userenv);
13
14
my %budgetusers = (
15
    1 => [],
16
    2 => [1],
17
    3 => [2],
18
    4 => [3],
19
    5 => [],
20
    6 => [1],
21
    7 => [2],
22
    8 => [3],
23
    9 => [],
24
    10 => [1],
25
    11 => [2],
26
    12 => [3],
27
    13 => [],
28
    14 => [1],
29
    15 => [2],
30
    16 => [3],
31
);
32
33
my $borrower1 = {
34
    borrowernumber => 1
35
};
36
my $borrower2 = {
37
    borrowernumber => 2
38
};
39
40
my $budget1 = {
41
    budget_id => 1,
42
    budget_permission => 0,
43
    budget_owner_id => undef,
44
    budget_branchcode => undef,
45
};
46
my $budget2 = {
47
    budget_id => 2,
48
    budget_permission => 0,
49
    budget_owner_id => undef,
50
    budget_branchcode => 'B1',
51
};
52
my $budget3 = {
53
    budget_id => 3,
54
    budget_permission => 0,
55
    budget_owner_id => 1,
56
    budget_branchcode => undef,
57
};
58
my $budget4 = {
59
    budget_id => 4,
60
    budget_permission => 0,
61
    budget_owner_id => 1,
62
    budget_branchcode => 'B1',
63
};
64
my $budget5 = {
65
    budget_id => 5,
66
    budget_permission => 1,
67
    budget_owner_id => undef,
68
    budget_branchcode => undef,
69
};
70
my $budget6 = {
71
    budget_id => 6,
72
    budget_permission => 1,
73
    budget_owner_id => undef,
74
    budget_branchcode => 'B1',
75
};
76
my $budget7 = {
77
    budget_id => 7,
78
    budget_permission => 1,
79
    budget_owner_id => 1,
80
    budget_branchcode => undef,
81
};
82
my $budget8 = {
83
    budget_id => 8,
84
    budget_permission => 1,
85
    budget_owner_id => 1,
86
    budget_branchcode => 'B1',
87
};
88
my $budget9 = {
89
    budget_id => 9,
90
    budget_permission => 2,
91
    budget_owner_id => undef,
92
    budget_branchcode => undef,
93
};
94
my $budget10 = {
95
    budget_id => 10,
96
    budget_permission => 2,
97
    budget_owner_id => undef,
98
    budget_branchcode => 'B1',
99
};
100
my $budget11 = {
101
    budget_id => 11,
102
    budget_permission => 2,
103
    budget_owner_id => 1,
104
    budget_branchcode => undef,
105
};
106
my $budget12 = {
107
    budget_id => 12,
108
    budget_permission => 2,
109
    budget_owner_id => 1,
110
    budget_branchcode => 'B1',
111
};
112
my $budget13 = {
113
    budget_id => 13,
114
    budget_permission => 3,
115
    budget_owner_id => undef,
116
    budget_branchcode => undef,
117
};
118
my $budget14 = {
119
    budget_id => 14,
120
    budget_permission => 3,
121
    budget_owner_id => undef,
122
    budget_branchcode => 'B1',
123
};
124
my $budget15 = {
125
    budget_id => 15,
126
    budget_permission => 3,
127
    budget_owner_id => 1,
128
    budget_branchcode => undef,
129
};
130
my $budget16 = {
131
    budget_id => 16,
132
    budget_permission => 3,
133
    budget_owner_id => 1,
134
    budget_branchcode => 'B1',
135
};
136
137
my $userenv = {};
138
139
140
ok (CanUserModifyBudget($borrower1, $budget1, {superlibrarian => 1}));
141
ok (CanUserModifyBudget($borrower1, $budget1, {
142
    acquisition => {
143
        budget_manage_all => 1
144
    }
145
}));
146
ok (CanUserModifyBudget($borrower1, $budget1, {acquisition => 1}));
147
148
ok (!CanUserModifyBudget($borrower1, $budget1, {}));
149
ok (!CanUserModifyBudget($borrower1, $budget1, {acquisition => 0}));
150
151
my $flags = {acquisition => {budget_modify => 1}};
152
153
$userenv->{branch} = 'B1';
154
155
# Restriction is 'none'
156
ok (CanUserModifyBudget($borrower1, $budget1, $flags));
157
ok (CanUserModifyBudget($borrower1, $budget2, $flags));
158
ok (CanUserModifyBudget($borrower1, $budget3, $flags));
159
ok (CanUserModifyBudget($borrower1, $budget4, $flags));
160
ok (CanUserModifyBudget($borrower2, $budget1, $flags));
161
ok (CanUserModifyBudget($borrower2, $budget2, $flags));
162
ok (CanUserModifyBudget($borrower2, $budget3, $flags));
163
ok (CanUserModifyBudget($borrower2, $budget4, $flags));
164
165
# Restriction is 'owner'
166
ok (CanUserModifyBudget($borrower1, $budget5, $flags));
167
ok (CanUserModifyBudget($borrower1, $budget6, $flags));
168
ok (CanUserModifyBudget($borrower1, $budget7, $flags));
169
ok (CanUserModifyBudget($borrower1, $budget8, $flags));
170
ok (CanUserModifyBudget($borrower2, $budget5, $flags));
171
ok (CanUserModifyBudget($borrower2, $budget6, $flags));
172
ok (!CanUserModifyBudget($borrower2, $budget7, $flags));
173
ok (!CanUserModifyBudget($borrower2, $budget8, $flags));
174
175
# Restriction is 'owner, users and library'
176
ok (CanUserModifyBudget($borrower1, $budget9, $flags));
177
ok (CanUserModifyBudget($borrower1, $budget10, $flags));
178
ok (CanUserModifyBudget($borrower1, $budget11, $flags));
179
ok (CanUserModifyBudget($borrower1, $budget12, $flags));
180
ok (CanUserModifyBudget($borrower2, $budget9, $flags));
181
ok (CanUserModifyBudget($borrower2, $budget10, $flags));
182
ok (CanUserModifyBudget($borrower2, $budget11, $flags));
183
ok (CanUserModifyBudget($borrower2, $budget12, $flags));
184
185
# Restriction is 'owner and users'
186
ok (CanUserModifyBudget($borrower1, $budget13, $flags));
187
ok (CanUserModifyBudget($borrower1, $budget14, $flags));
188
ok (CanUserModifyBudget($borrower1, $budget15, $flags));
189
ok (CanUserModifyBudget($borrower1, $budget16, $flags));
190
ok (CanUserModifyBudget($borrower2, $budget13, $flags));
191
ok (CanUserModifyBudget($borrower2, $budget14, $flags));
192
ok (CanUserModifyBudget($borrower2, $budget15, $flags));
193
ok (!CanUserModifyBudget($borrower2, $budget16, $flags));
194
195
196
$userenv->{branch} = 'B2';
197
198
# Restriction is 'none'
199
ok (CanUserModifyBudget($borrower1, $budget1, $flags));
200
ok (CanUserModifyBudget($borrower1, $budget2, $flags));
201
ok (CanUserModifyBudget($borrower1, $budget3, $flags));
202
ok (CanUserModifyBudget($borrower1, $budget4, $flags));
203
ok (CanUserModifyBudget($borrower2, $budget1, $flags));
204
ok (CanUserModifyBudget($borrower2, $budget2, $flags));
205
ok (CanUserModifyBudget($borrower2, $budget3, $flags));
206
ok (CanUserModifyBudget($borrower2, $budget4, $flags));
207
208
# Restriction is 'owner'
209
ok (CanUserModifyBudget($borrower1, $budget5, $flags));
210
ok (CanUserModifyBudget($borrower1, $budget6, $flags));
211
ok (CanUserModifyBudget($borrower1, $budget7, $flags));
212
ok (CanUserModifyBudget($borrower1, $budget8, $flags));
213
ok (CanUserModifyBudget($borrower2, $budget5, $flags));
214
ok (CanUserModifyBudget($borrower2, $budget6, $flags));
215
ok (!CanUserModifyBudget($borrower2, $budget7, $flags));
216
ok (!CanUserModifyBudget($borrower2, $budget8, $flags));
217
218
# Restriction is 'owner, users and library'
219
ok (CanUserModifyBudget($borrower1, $budget9, $flags));
220
ok (CanUserModifyBudget($borrower1, $budget10, $flags));
221
ok (CanUserModifyBudget($borrower1, $budget11, $flags));
222
ok (CanUserModifyBudget($borrower1, $budget12, $flags));
223
ok (CanUserModifyBudget($borrower2, $budget9, $flags));
224
ok (CanUserModifyBudget($borrower2, $budget10, $flags));
225
ok (CanUserModifyBudget($borrower2, $budget11, $flags));
226
ok (!CanUserModifyBudget($borrower2, $budget12, $flags));
227
228
# Restriction is 'owner and users'
229
ok (CanUserModifyBudget($borrower1, $budget13, $flags));
230
ok (CanUserModifyBudget($borrower1, $budget14, $flags));
231
ok (CanUserModifyBudget($borrower1, $budget15, $flags));
232
ok (CanUserModifyBudget($borrower1, $budget16, $flags));
233
ok (CanUserModifyBudget($borrower2, $budget13, $flags));
234
ok (CanUserModifyBudget($borrower2, $budget14, $flags));
235
ok (CanUserModifyBudget($borrower2, $budget15, $flags));
236
ok (!CanUserModifyBudget($borrower2, $budget16, $flags));
237
238
239
# Same tests as above, without budget_modify permission
240
# All tests should failed
241
$flags = {acquisition => {order_manage => 1}};
242
243
$userenv->{branch} = 'B1';
244
245
# Restriction is 'none'
246
ok (!CanUserModifyBudget($borrower1, $budget1, $flags));
247
ok (!CanUserModifyBudget($borrower1, $budget2, $flags));
248
ok (!CanUserModifyBudget($borrower1, $budget3, $flags));
249
ok (!CanUserModifyBudget($borrower1, $budget4, $flags));
250
ok (!CanUserModifyBudget($borrower2, $budget1, $flags));
251
ok (!CanUserModifyBudget($borrower2, $budget2, $flags));
252
ok (!CanUserModifyBudget($borrower2, $budget3, $flags));
253
ok (!CanUserModifyBudget($borrower2, $budget4, $flags));
254
255
# Restriction is 'owner'
256
ok (!CanUserModifyBudget($borrower1, $budget5, $flags));
257
ok (!CanUserModifyBudget($borrower1, $budget6, $flags));
258
ok (!CanUserModifyBudget($borrower1, $budget7, $flags));
259
ok (!CanUserModifyBudget($borrower1, $budget8, $flags));
260
ok (!CanUserModifyBudget($borrower2, $budget5, $flags));
261
ok (!CanUserModifyBudget($borrower2, $budget6, $flags));
262
ok (!CanUserModifyBudget($borrower2, $budget7, $flags));
263
ok (!CanUserModifyBudget($borrower2, $budget8, $flags));
264
265
# Restriction is 'owner, users and library'
266
ok (!CanUserModifyBudget($borrower1, $budget9, $flags));
267
ok (!CanUserModifyBudget($borrower1, $budget10, $flags));
268
ok (!CanUserModifyBudget($borrower1, $budget11, $flags));
269
ok (!CanUserModifyBudget($borrower1, $budget12, $flags));
270
ok (!CanUserModifyBudget($borrower2, $budget9, $flags));
271
ok (!CanUserModifyBudget($borrower2, $budget10, $flags));
272
ok (!CanUserModifyBudget($borrower2, $budget11, $flags));
273
ok (!CanUserModifyBudget($borrower2, $budget12, $flags));
274
275
# Restriction is 'owner and users'
276
ok (!CanUserModifyBudget($borrower1, $budget13, $flags));
277
ok (!CanUserModifyBudget($borrower1, $budget14, $flags));
278
ok (!CanUserModifyBudget($borrower1, $budget15, $flags));
279
ok (!CanUserModifyBudget($borrower1, $budget16, $flags));
280
ok (!CanUserModifyBudget($borrower2, $budget13, $flags));
281
ok (!CanUserModifyBudget($borrower2, $budget14, $flags));
282
ok (!CanUserModifyBudget($borrower2, $budget15, $flags));
283
ok (!CanUserModifyBudget($borrower2, $budget16, $flags));
284
285
286
$userenv->{branch} = 'B2';
287
288
# Restriction is 'none'
289
ok (!CanUserModifyBudget($borrower1, $budget1, $flags));
290
ok (!CanUserModifyBudget($borrower1, $budget2, $flags));
291
ok (!CanUserModifyBudget($borrower1, $budget3, $flags));
292
ok (!CanUserModifyBudget($borrower1, $budget4, $flags));
293
ok (!CanUserModifyBudget($borrower2, $budget1, $flags));
294
ok (!CanUserModifyBudget($borrower2, $budget2, $flags));
295
ok (!CanUserModifyBudget($borrower2, $budget3, $flags));
296
ok (!CanUserModifyBudget($borrower2, $budget4, $flags));
297
298
# Restriction is 'owner'
299
ok (!CanUserModifyBudget($borrower1, $budget5, $flags));
300
ok (!CanUserModifyBudget($borrower1, $budget6, $flags));
301
ok (!CanUserModifyBudget($borrower1, $budget7, $flags));
302
ok (!CanUserModifyBudget($borrower1, $budget8, $flags));
303
ok (!CanUserModifyBudget($borrower2, $budget5, $flags));
304
ok (!CanUserModifyBudget($borrower2, $budget6, $flags));
305
ok (!CanUserModifyBudget($borrower2, $budget7, $flags));
306
ok (!CanUserModifyBudget($borrower2, $budget8, $flags));
307
308
# Restriction is 'owner, users and library'
309
ok (!CanUserModifyBudget($borrower1, $budget9, $flags));
310
ok (!CanUserModifyBudget($borrower1, $budget10, $flags));
311
ok (!CanUserModifyBudget($borrower1, $budget11, $flags));
312
ok (!CanUserModifyBudget($borrower1, $budget12, $flags));
313
ok (!CanUserModifyBudget($borrower2, $budget9, $flags));
314
ok (!CanUserModifyBudget($borrower2, $budget10, $flags));
315
ok (!CanUserModifyBudget($borrower2, $budget11, $flags));
316
ok (!CanUserModifyBudget($borrower2, $budget12, $flags));
317
318
# Restriction is 'owner and users'
319
ok (!CanUserModifyBudget($borrower1, $budget13, $flags));
320
ok (!CanUserModifyBudget($borrower1, $budget14, $flags));
321
ok (!CanUserModifyBudget($borrower1, $budget15, $flags));
322
ok (!CanUserModifyBudget($borrower1, $budget16, $flags));
323
ok (!CanUserModifyBudget($borrower2, $budget13, $flags));
324
ok (!CanUserModifyBudget($borrower2, $budget14, $flags));
325
ok (!CanUserModifyBudget($borrower2, $budget15, $flags));
326
ok (!CanUserModifyBudget($borrower2, $budget16, $flags));
327
328
329
# Mocked subs
330
331
# C4::Acquisition::GetBudgetUsers
332
sub Mock_GetBudgetUsers {
333
    my ($budget_id) = @_;
334
335
    return @{ $budgetusers{$budget_id} };
336
}
337
338
# C4::Context->userenv
339
sub Mock_userenv {
340
    return $userenv;
341
}
(-)a/t/Budgets/CanUserUseBudget.t (-1 / +250 lines)
Line 0 Link Here
0
- 
1
#!/usr/bin/perl
2
3
use Modern::Perl;
4
use Test::MockModule;
5
use Test::More tests => 69;
6
7
use C4::Budgets;
8
9
my $C4_Budgets_module = new Test::MockModule('C4::Budgets');
10
$C4_Budgets_module->mock('GetBudgetUsers', \&Mock_GetBudgetUsers);
11
my $C4_Context_module = new Test::MockModule('C4::Context');
12
$C4_Context_module->mock('userenv', \&Mock_userenv);
13
14
my %budgetusers = (
15
    1 => [],
16
    2 => [1],
17
    3 => [2],
18
    4 => [3],
19
    5 => [],
20
    6 => [1],
21
    7 => [2],
22
    8 => [3],
23
    9 => [],
24
    10 => [1],
25
    11 => [2],
26
    12 => [3],
27
    13 => [],
28
    14 => [1],
29
    15 => [2],
30
    16 => [3],
31
);
32
33
my $borrower1 = {
34
    borrowernumber => 1
35
};
36
my $borrower2 = {
37
    borrowernumber => 2
38
};
39
40
my $budget1 = {
41
    budget_id => 1,
42
    budget_permission => 0,
43
    budget_owner_id => undef,
44
    budget_branchcode => undef,
45
};
46
my $budget2 = {
47
    budget_id => 2,
48
    budget_permission => 0,
49
    budget_owner_id => undef,
50
    budget_branchcode => 'B1',
51
};
52
my $budget3 = {
53
    budget_id => 3,
54
    budget_permission => 0,
55
    budget_owner_id => 1,
56
    budget_branchcode => undef,
57
};
58
my $budget4 = {
59
    budget_id => 4,
60
    budget_permission => 0,
61
    budget_owner_id => 1,
62
    budget_branchcode => 'B1',
63
};
64
my $budget5 = {
65
    budget_id => 5,
66
    budget_permission => 1,
67
    budget_owner_id => undef,
68
    budget_branchcode => undef,
69
};
70
my $budget6 = {
71
    budget_id => 6,
72
    budget_permission => 1,
73
    budget_owner_id => undef,
74
    budget_branchcode => 'B1',
75
};
76
my $budget7 = {
77
    budget_id => 7,
78
    budget_permission => 1,
79
    budget_owner_id => 1,
80
    budget_branchcode => undef,
81
};
82
my $budget8 = {
83
    budget_id => 8,
84
    budget_permission => 1,
85
    budget_owner_id => 1,
86
    budget_branchcode => 'B1',
87
};
88
my $budget9 = {
89
    budget_id => 9,
90
    budget_permission => 2,
91
    budget_owner_id => undef,
92
    budget_branchcode => undef,
93
};
94
my $budget10 = {
95
    budget_id => 10,
96
    budget_permission => 2,
97
    budget_owner_id => undef,
98
    budget_branchcode => 'B1',
99
};
100
my $budget11 = {
101
    budget_id => 11,
102
    budget_permission => 2,
103
    budget_owner_id => 1,
104
    budget_branchcode => undef,
105
};
106
my $budget12 = {
107
    budget_id => 12,
108
    budget_permission => 2,
109
    budget_owner_id => 1,
110
    budget_branchcode => 'B1',
111
};
112
my $budget13 = {
113
    budget_id => 13,
114
    budget_permission => 3,
115
    budget_owner_id => undef,
116
    budget_branchcode => undef,
117
};
118
my $budget14 = {
119
    budget_id => 14,
120
    budget_permission => 3,
121
    budget_owner_id => undef,
122
    budget_branchcode => 'B1',
123
};
124
my $budget15 = {
125
    budget_id => 15,
126
    budget_permission => 3,
127
    budget_owner_id => 1,
128
    budget_branchcode => undef,
129
};
130
my $budget16 = {
131
    budget_id => 16,
132
    budget_permission => 3,
133
    budget_owner_id => 1,
134
    budget_branchcode => 'B1',
135
};
136
137
my $userenv = {};
138
139
ok (CanUserUseBudget($borrower1, $budget1, {superlibrarian => 1}));
140
ok (CanUserUseBudget($borrower1, $budget1, {
141
    acquisition => {
142
        budget_manage_all => 1
143
    }
144
}));
145
ok (CanUserUseBudget($borrower1, $budget1, {acquisition => 1}));
146
147
ok (!CanUserUseBudget($borrower1, $budget1, {}));
148
ok (!CanUserUseBudget($borrower1, $budget1, {acquisition => 0}));
149
150
my $flags = {acquisition => {order_manage => 1}};
151
152
$userenv->{branch} = 'B1';
153
154
# Restriction is 'none'
155
ok (CanUserUseBudget($borrower1, $budget1, $flags));
156
ok (CanUserUseBudget($borrower1, $budget2, $flags));
157
ok (CanUserUseBudget($borrower1, $budget3, $flags));
158
ok (CanUserUseBudget($borrower1, $budget4, $flags));
159
ok (CanUserUseBudget($borrower2, $budget1, $flags));
160
ok (CanUserUseBudget($borrower2, $budget2, $flags));
161
ok (CanUserUseBudget($borrower2, $budget3, $flags));
162
ok (CanUserUseBudget($borrower2, $budget4, $flags));
163
164
# Restriction is 'owner'
165
ok (CanUserUseBudget($borrower1, $budget5, $flags));
166
ok (CanUserUseBudget($borrower1, $budget6, $flags));
167
ok (CanUserUseBudget($borrower1, $budget7, $flags));
168
ok (CanUserUseBudget($borrower1, $budget8, $flags));
169
ok (CanUserUseBudget($borrower2, $budget5, $flags));
170
ok (CanUserUseBudget($borrower2, $budget6, $flags));
171
ok (!CanUserUseBudget($borrower2, $budget7, $flags));
172
ok (!CanUserUseBudget($borrower2, $budget8, $flags));
173
174
# Restriction is 'owner, users and library'
175
ok (CanUserUseBudget($borrower1, $budget9, $flags));
176
ok (CanUserUseBudget($borrower1, $budget10, $flags));
177
ok (CanUserUseBudget($borrower1, $budget11, $flags));
178
ok (CanUserUseBudget($borrower1, $budget12, $flags));
179
ok (CanUserUseBudget($borrower2, $budget9, $flags));
180
ok (CanUserUseBudget($borrower2, $budget10, $flags));
181
ok (CanUserUseBudget($borrower2, $budget11, $flags));
182
ok (CanUserUseBudget($borrower2, $budget12, $flags));
183
184
# Restriction is 'owner and users'
185
ok (CanUserUseBudget($borrower1, $budget13, $flags));
186
ok (CanUserUseBudget($borrower1, $budget14, $flags));
187
ok (CanUserUseBudget($borrower1, $budget15, $flags));
188
ok (CanUserUseBudget($borrower1, $budget16, $flags));
189
ok (CanUserUseBudget($borrower2, $budget13, $flags));
190
ok (CanUserUseBudget($borrower2, $budget14, $flags));
191
ok (CanUserUseBudget($borrower2, $budget15, $flags));
192
ok (!CanUserUseBudget($borrower2, $budget16, $flags));
193
194
195
$userenv->{branch} = 'B2';
196
197
# Restriction is 'none'
198
ok (CanUserUseBudget($borrower1, $budget1, $flags));
199
ok (CanUserUseBudget($borrower1, $budget2, $flags));
200
ok (CanUserUseBudget($borrower1, $budget3, $flags));
201
ok (CanUserUseBudget($borrower1, $budget4, $flags));
202
ok (CanUserUseBudget($borrower2, $budget1, $flags));
203
ok (CanUserUseBudget($borrower2, $budget2, $flags));
204
ok (CanUserUseBudget($borrower2, $budget3, $flags));
205
ok (CanUserUseBudget($borrower2, $budget4, $flags));
206
207
# Restriction is 'owner'
208
ok (CanUserUseBudget($borrower1, $budget5, $flags));
209
ok (CanUserUseBudget($borrower1, $budget6, $flags));
210
ok (CanUserUseBudget($borrower1, $budget7, $flags));
211
ok (CanUserUseBudget($borrower1, $budget8, $flags));
212
ok (CanUserUseBudget($borrower2, $budget5, $flags));
213
ok (CanUserUseBudget($borrower2, $budget6, $flags));
214
ok (!CanUserUseBudget($borrower2, $budget7, $flags));
215
ok (!CanUserUseBudget($borrower2, $budget8, $flags));
216
217
# Restriction is 'owner, users and library'
218
ok (CanUserUseBudget($borrower1, $budget9, $flags));
219
ok (CanUserUseBudget($borrower1, $budget10, $flags));
220
ok (CanUserUseBudget($borrower1, $budget11, $flags));
221
ok (CanUserUseBudget($borrower1, $budget12, $flags));
222
ok (CanUserUseBudget($borrower2, $budget9, $flags));
223
ok (CanUserUseBudget($borrower2, $budget10, $flags));
224
ok (CanUserUseBudget($borrower2, $budget11, $flags));
225
ok (!CanUserUseBudget($borrower2, $budget12, $flags));
226
227
# Restriction is 'owner and users'
228
ok (CanUserUseBudget($borrower1, $budget13, $flags));
229
ok (CanUserUseBudget($borrower1, $budget14, $flags));
230
ok (CanUserUseBudget($borrower1, $budget15, $flags));
231
ok (CanUserUseBudget($borrower1, $budget16, $flags));
232
ok (CanUserUseBudget($borrower2, $budget13, $flags));
233
ok (CanUserUseBudget($borrower2, $budget14, $flags));
234
ok (CanUserUseBudget($borrower2, $budget15, $flags));
235
ok (!CanUserUseBudget($borrower2, $budget16, $flags));
236
237
238
# Mocked subs
239
240
# C4::Acquisition::GetBudgetUsers
241
sub Mock_GetBudgetUsers {
242
    my ($budget_id) = @_;
243
244
    return @{ $budgetusers{$budget_id} };
245
}
246
247
# C4::Context->userenv
248
sub Mock_userenv {
249
    return $userenv;
250
}

Return to bug 7304