d399ff3494
This big patch, fix xhtml code, and user interface. It Delete the term of budget period and use it as "Root Budget". It add improvment on UI, adding tooltip, and table tree.
321 lines
12 KiB
Perl
Executable file
321 lines
12 KiB
Perl
Executable file
#!/usr/bin/perl
|
|
|
|
#script to administer the aqbudget table
|
|
|
|
# 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., 59 Temple Place,
|
|
# Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
use strict;
|
|
use CGI;
|
|
use List::Util qw/min/;
|
|
use Number::Format qw(format_price);
|
|
|
|
use C4::Auth qw/get_user_subpermissions/;
|
|
use C4::Branch; # GetBranches
|
|
use C4::Dates qw/format_date format_date_in_iso/;
|
|
use C4::Auth;
|
|
use C4::Acquisition;
|
|
use C4::Budgets; #
|
|
use C4::Members; # calls GetSortDetails()
|
|
use C4::Context;
|
|
use C4::Output;
|
|
use C4::Koha;
|
|
use C4::Debug;
|
|
#use POSIX qw(locale_h);
|
|
|
|
my $input = new CGI;
|
|
my $dbh = C4::Context->dbh;
|
|
|
|
my ($template, $borrowernumber, $cookie, $staffflags ) = get_template_and_user(
|
|
{ template_name => "admin/aqbudgets.tmpl",
|
|
query => $input,
|
|
type => "intranet",
|
|
authnotrequired => 0,
|
|
flagsrequired => { acquisition => 'budget_manage' },
|
|
debug => 0,
|
|
}
|
|
);
|
|
|
|
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
|
|
$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->{param_map}->{'CAN_user_acquisition_budget_add_del'} && $op == 'add_form' ) {
|
|
$op = '';
|
|
}
|
|
|
|
my $num=FormatNumber;
|
|
|
|
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 $budget_period_dropbox = $input->param('budget_period_dropbox');
|
|
#filtering non budget keys
|
|
delete $$budget_hash{$_} foreach grep {/filter|^op$|show/} keys %$budget_hash;
|
|
my $filter_budgetbranch = $input->param('filter_budgetbranch');
|
|
my $filter_budgetname = $input->param('filter_budgetname');
|
|
$template->param(
|
|
notree => ($filter_budgetbranch or $show_mine)
|
|
);
|
|
# ' ------- get periods stuff ------------------'
|
|
# IF PERIODID IS DEFINED, GET THE PERIOD - ELSE JUST GET THE ACTIVE PERIOD BY DEFAULT
|
|
my $period = GetBudgetPeriod($$budget_hash{budget_period_id});
|
|
|
|
$template->param(
|
|
%$period
|
|
);
|
|
# ------- get periods stuff ------------------
|
|
|
|
# USED FOR PERMISSION COMPARISON LATER
|
|
my $borrower_id = $template->{param_map}->{'USER_INFO'}[0]->{'borrowernumber'};
|
|
my $user = GetMemberDetails($borrower_id);
|
|
my $user_branchcode = $user->{'branchcode'};
|
|
|
|
$template->param(
|
|
action => $script_name,
|
|
script_name => $script_name,
|
|
show_mine => $show_mine,
|
|
$op || else => 1,
|
|
);
|
|
|
|
|
|
# retrieve branches
|
|
my ( $budget, );
|
|
|
|
my $branches = GetBranches($show_mine);
|
|
my @branchloop2;
|
|
foreach my $thisbranch (keys %$branches) {
|
|
my %row = (
|
|
value => $thisbranch,
|
|
branchname => $branches->{$thisbranch}->{'branchname'},
|
|
);
|
|
$row{selected} = 1 if $thisbranch eq $filter_budgetbranch;
|
|
push @branchloop2, \%row;
|
|
}
|
|
|
|
$template->param(auth_cats_loop => GetBudgetAuthCats($$period{budget_period_id}) );
|
|
|
|
# Used to create form to add or modify a record
|
|
if ($op eq 'add_form') {
|
|
#### ------------------- ADD_FORM -------------------------
|
|
|
|
# if no buget_id is passed then its an add
|
|
# 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);
|
|
$dropbox_disabled = BudgetHasChildren($budget_id);
|
|
my $borrower = &GetMember( borrowernumber=>$budget->{budget_owner_id} );
|
|
$budget->{budget_owner_name} = $borrower->{'firstname'} . ' ' . $borrower->{'surname'};
|
|
$$budget{$_}= sprintf("%.2f", $budget->{$_}) for grep{/amount/} keys %$budget;
|
|
}
|
|
|
|
# build budget hierarchy
|
|
my %labels;
|
|
my @values;
|
|
my $hier = GetBudgetHierarchy($$period{budget_period_id});
|
|
foreach my $r (@$hier) {
|
|
$r->{budget_code_indent} =~ s/ /\~/g; #
|
|
$labels{"$r->{budget_id}"} = $r->{budget_code_indent};
|
|
push @values, $r->{budget_id};
|
|
}
|
|
push @values, '';
|
|
# if no buget_id is passed then its an add
|
|
my $budget_parent;
|
|
my $budget_parent_id;
|
|
if ($budget){
|
|
$budget_parent_id = $budget->{'budget_parent_id'} ;
|
|
}else{
|
|
$budget_parent_id = $input->param('budget_parent_id');
|
|
}
|
|
$budget_parent = GetBudget($budget_parent_id);
|
|
|
|
# build branches select
|
|
my $branches = GetBranches;
|
|
my @branchloop_select;
|
|
foreach my $thisbranch ( keys %$branches ) {
|
|
my %row = (
|
|
value => $thisbranch,
|
|
branchname => $branches->{$thisbranch}->{'branchname'},
|
|
);
|
|
$row{selected} = 1 if $thisbranch eq $budget->{'budget_branchcode'};
|
|
push @branchloop_select, \%row;
|
|
}
|
|
|
|
# populates the YUI planning button
|
|
my $categories = GetAuthorisedValueCategories();
|
|
my @auth_cats_loop1 = ();
|
|
foreach my $category (@$categories) {
|
|
my $entry = { category => $category,
|
|
selected => $budget->{sort1_authcat} eq $category ?1:0,
|
|
};
|
|
push @auth_cats_loop1, $entry;
|
|
}
|
|
my @auth_cats_loop2 = ();
|
|
foreach my $category (@$categories) {
|
|
my $entry = { category => $category,
|
|
selected => $budget->{sort2_authcat} eq $category ?1:0,
|
|
};
|
|
push @auth_cats_loop2, $entry;
|
|
}
|
|
$template->param(authorised_value_categories1 => \@auth_cats_loop1);
|
|
$template->param(authorised_value_categories2 => \@auth_cats_loop2);
|
|
|
|
my $budget_perm_dropbox =
|
|
GetBudgetPermDropbox($budget->{'budget_permission'});
|
|
|
|
# if no buget_id is passed then its an add
|
|
$template->param(
|
|
add_validate => 1,
|
|
dateformat => C4::Dates->new()->visual(),
|
|
budget_parent_id => $budget_parent->{'budget_id'},
|
|
budget_parent_name => $budget_parent->{'budget_name'},
|
|
budget_perm_dropbox => $budget_perm_dropbox,
|
|
branchloop_select => \@branchloop_select,
|
|
%$period,
|
|
%$budget,
|
|
);
|
|
# END $OP eq ADD_FORM
|
|
#---------------------- DEFAULT DISPLAY BELOW ---------------------
|
|
|
|
# called by default form, used to confirm deletion of data in DB
|
|
} elsif ($op eq 'delete_confirm') {
|
|
|
|
my $budget = GetBudget($budget_id);
|
|
$template->param(
|
|
budget_id => $budget->{'budget_id'},
|
|
budget_code => $budget->{'budget_code'},
|
|
budget_name => $budget->{'budget_name'},
|
|
budget_amount => $num->format_price( $budget->{'budget_amount'} ),
|
|
);
|
|
# END $OP eq DELETE_CONFIRM
|
|
# called by delete_confirm, used to effectively confirm deletion of data in DB
|
|
} else{
|
|
if ( $op eq 'delete_confirmed' ) {
|
|
my $rc = DelBudget($budget_id);
|
|
}elsif( $op eq 'add_validate' ) {
|
|
if ( defined $$budget_hash{budget_id} ) {
|
|
ModBudget( $budget_hash );
|
|
} else {
|
|
AddBudget( $budget_hash );
|
|
}
|
|
}
|
|
my $branches = GetBranches();
|
|
my $budget_period_dropbox = GetBudgetPeriodsDropbox($$period{budget_period_id} );
|
|
$template->param(
|
|
budget_period_dropbox => $budget_period_dropbox,
|
|
budget_id => $budget_id,
|
|
%$period,
|
|
);
|
|
|
|
my $moo = GetBudgetHierarchy($$period{budget_period_id}, C4::Context->userenv->{branchcode}, $show_mine?$borrower_id:'');
|
|
my @budgets = @$moo; #FIXME
|
|
|
|
my $toggle = 0;
|
|
my @loop;
|
|
my $period_total = 0;
|
|
my ( $period_alloc_total, $base_alloc_total, $base_spent_total, $base_remaining_total );
|
|
|
|
use YAML;
|
|
$debug && warn Dump(@budgets);
|
|
#This Looks WEIRD to me : should budgets be filtered in such a way ppl who donot own it would not see the amount spent on the budget by others ?
|
|
|
|
foreach my $budget (@budgets) {
|
|
# PERMISSIONS
|
|
unless($staffflags->{'superlibrarian'} % 2 == 1 ) {
|
|
#IF NO PERMS, THEN DISABLE EDIT/DELETE
|
|
unless ( $template->{param_map}->{'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
|
|
|
|
# if a budget search doesnt match, next
|
|
if ($filter_budgetname ) {
|
|
next unless $budget->{budget_code} =~ m/$filter_budgetname/ ||
|
|
$budget->{name} =~ m/$filter_budgetname/ ;
|
|
}
|
|
if ($filter_budgetbranch ) {
|
|
next unless $budget->{budget_branchcode} =~ m/$filter_budgetbranch/;
|
|
}
|
|
|
|
## TOTALS
|
|
# adds to total - only if budget is a 'top-level' budget
|
|
$period_alloc_total += $budget->{'budget_amount_total'} if $budget->{'depth'} == 0;
|
|
$base_alloc_total += $budget->{'budget_amount'};
|
|
$base_spent_total += $budget->{'budget_spent'};
|
|
$budget->{'budget_remaining'} = $budget->{'budget_amount'} - $budget->{'budget_spent'};
|
|
$base_remaining_total += $budget->{'budget_remaining'};
|
|
|
|
# if amount == 0 dont display...
|
|
delete $budget->{'budget_unalloc_sublevel'} if $budget->{'budget_unalloc_sublevel'} == 0 ;
|
|
|
|
$budget->{'remaining_pos'} = 1 if $budget->{'budget_remaining'} > 0;
|
|
$budget->{'remaining_neg'} = 1 if $budget->{'budget_remaining'} < 0;
|
|
for (grep {/budget_spent|budget_amount|budget_remaining|budget_unalloc/} keys %$budget){
|
|
$$budget{$_} = $num->format_price( $$budget{$_} ) if defined($$budget{$_})
|
|
}
|
|
|
|
my $borrower = &GetMember( borrowernumber=>$budget->{budget_owner_id} );
|
|
$budget->{"budget_owner_name"} = $borrower->{'firstname'} . ' ' . $borrower->{'surname'};
|
|
$budget->{"budget_borrowernumber"} = $borrower->{'borrowernumber'};
|
|
|
|
push( @loop, { %{$budget},
|
|
branchname => $branches->{ $budget->{branchcode} }->{branchname},
|
|
}
|
|
);
|
|
}
|
|
|
|
my $budget_period_total = $num->format_price($$period{budget_period_total}) if $$period{budget_period_total};
|
|
$template->param(
|
|
else => 1,
|
|
budget => \@loop,
|
|
budget_period_total => $budget_period_total,
|
|
period_alloc_total => $num->format_price($period_alloc_total),
|
|
base_alloc_total => $num->format_price($base_alloc_total),
|
|
base_spent_total => $num->format_price($base_spent_total),
|
|
base_remaining_total => $num->format_price($base_remaining_total),
|
|
period_remaining_total => $num->format_price( $period_alloc_total - $base_alloc_total ),
|
|
branchloop => \@branchloop2,
|
|
);
|
|
|
|
} #---- END $OP eq DEFAULT
|
|
|
|
output_html_with_http_headers $input, $cookie, $template->output;
|