| File: | C4/Budgets.pm |
| Coverage: | 7.3% |
| line | stmt | bran | cond | sub | time | code |
|---|---|---|---|---|---|---|
| 1 | package C4::Budgets; | |||||
| 2 | ||||||
| 3 | # Copyright 2000-2002 Katipo Communications | |||||
| 4 | # | |||||
| 5 | # This file is part of Koha. | |||||
| 6 | # | |||||
| 7 | # Koha is free software; you can redistribute it and/or modify it under the | |||||
| 8 | # terms of the GNU General Public License as published by the Free Software | |||||
| 9 | # Foundation; either version 2 of the License, or (at your option) any later | |||||
| 10 | # version. | |||||
| 11 | # | |||||
| 12 | # Koha is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
| 13 | # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||||
| 14 | # A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||||
| 15 | # | |||||
| 16 | # You should have received a copy of the GNU General Public License along | |||||
| 17 | # with Koha; if not, write to the Free Software Foundation, Inc., | |||||
| 18 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |||||
| 19 | ||||||
| 20 | 4 4 4 | 19876 15 96 | use strict; | |||
| 21 | #use warnings; FIXME - Bug 2505 | |||||
| 22 | 4 4 4 | 234 16 52 | use C4::Context; | |||
| 23 | 4 4 4 | 215 10 209 | use C4::Dates qw(format_date format_date_in_iso); | |||
| 24 | 4 4 4 | 532 19 595 | use C4::SQLHelper qw<:all>; | |||
| 25 | 4 4 4 | 31 18 343 | use C4::Debug; | |||
| 26 | ||||||
| 27 | 4 4 4 | 29 64 536 | use vars qw($VERSION @ISA @EXPORT); | |||
| 28 | ||||||
| 29 | BEGIN { | |||||
| 30 | # set the version for version checking | |||||
| 31 | 4 | 18 | $VERSION = 3.01; | |||
| 32 | 4 | 28 | require Exporter; | |||
| 33 | 4 | 49 | @ISA = qw(Exporter); | |||
| 34 | 4 | 16311 | @EXPORT = qw( | |||
| 35 | ||||||
| 36 | &GetBudget | |||||
| 37 | &GetBudgets | |||||
| 38 | &GetBudgetHierarchy | |||||
| 39 | &AddBudget | |||||
| 40 | &ModBudget | |||||
| 41 | &DelBudget | |||||
| 42 | &GetBudgetSpent | |||||
| 43 | &GetBudgetOrdered | |||||
| 44 | &GetPeriodsCount | |||||
| 45 | &GetChildBudgetsSpent | |||||
| 46 | ||||||
| 47 | &GetBudgetPeriod | |||||
| 48 | &GetBudgetPeriods | |||||
| 49 | &ModBudgetPeriod | |||||
| 50 | &AddBudgetPeriod | |||||
| 51 | &DelBudgetPeriod | |||||
| 52 | ||||||
| 53 | &GetAuthvalueDropbox | |||||
| 54 | ||||||
| 55 | &ModBudgetPlan | |||||
| 56 | ||||||
| 57 | &GetCurrency | |||||
| 58 | &GetCurrencies | |||||
| 59 | &ModCurrencies | |||||
| 60 | &ConvertCurrency | |||||
| 61 | ||||||
| 62 | &GetBudgetsPlanCell | |||||
| 63 | &AddBudgetPlanValue | |||||
| 64 | &GetBudgetAuthCats | |||||
| 65 | &BudgetHasChildren | |||||
| 66 | &CheckBudgetParent | |||||
| 67 | &CheckBudgetParentPerm | |||||
| 68 | ||||||
| 69 | &HideCols | |||||
| 70 | &GetCols | |||||
| 71 | ); | |||||
| 72 | } | |||||
| 73 | ||||||
| 74 | # ----------------------------BUDGETS.PM-----------------------------"; | |||||
| 75 | ||||||
| 76 | ||||||
| 77 - 79 | =head1 FUNCTIONS ABOUT BUDGETS =cut | |||||
| 80 | ||||||
| 81 | sub HideCols { | |||||
| 82 | 0 | my ( $authcat, @hide_cols ) = @_; | ||||
| 83 | 0 | my $dbh = C4::Context->dbh; | ||||
| 84 | ||||||
| 85 | 0 | my $sth1 = $dbh->prepare( | ||||
| 86 | qq| | |||||
| 87 | UPDATE aqbudgets_planning SET display = 0 | |||||
| 88 | WHERE authcat = ? | |||||
| 89 | AND authvalue = ? | | |||||
| 90 | ); | |||||
| 91 | 0 | foreach my $authvalue (@hide_cols) { | ||||
| 92 | # $sth1->{TraceLevel} = 3; | |||||
| 93 | 0 | $sth1->execute( $authcat, $authvalue ); | ||||
| 94 | } | |||||
| 95 | } | |||||
| 96 | ||||||
| 97 | sub GetCols { | |||||
| 98 | 0 | my ( $authcat, $authvalue ) = @_; | ||||
| 99 | ||||||
| 100 | 0 | my $dbh = C4::Context->dbh; | ||||
| 101 | 0 | my $sth = $dbh->prepare( | ||||
| 102 | qq| | |||||
| 103 | SELECT count(display) as cnt from aqbudgets_planning | |||||
| 104 | WHERE authcat = ? | |||||
| 105 | AND authvalue = ? and display = 0 | | |||||
| 106 | ); | |||||
| 107 | ||||||
| 108 | # $sth->{TraceLevel} = 3; | |||||
| 109 | 0 | $sth->execute( $authcat, $authvalue ); | ||||
| 110 | 0 | my $res = $sth->fetchrow_hashref; | ||||
| 111 | ||||||
| 112 | 0 | return $res->{cnt} > 0 ? 0: 1 | ||||
| 113 | ||||||
| 114 | } | |||||
| 115 | ||||||
| 116 | sub CheckBudgetParentPerm { | |||||
| 117 | 0 | my ( $budget, $borrower_id ) = @_; | ||||
| 118 | 0 | my $depth = $budget->{depth}; | ||||
| 119 | 0 | my $parent_id = $budget->{budget_parent_id}; | ||||
| 120 | 0 | while ($depth) { | ||||
| 121 | 0 | my $parent = GetBudget($parent_id); | ||||
| 122 | 0 | $parent_id = $parent->{budget_parent_id}; | ||||
| 123 | 0 | if ( $parent->{budget_owner_id} == $borrower_id ) { | ||||
| 124 | 0 | return 1; | ||||
| 125 | } | |||||
| 126 | 0 | $depth-- | ||||
| 127 | } | |||||
| 128 | 0 | return 0; | ||||
| 129 | } | |||||
| 130 | ||||||
| 131 | sub AddBudgetPeriod { | |||||
| 132 | 0 | my ($budgetperiod) = @_; | ||||
| 133 | 0 | return InsertInTable("aqbudgetperiods",$budgetperiod); | ||||
| 134 | } | |||||
| 135 | # ------------------------------------------------------------------- | |||||
| 136 | sub GetPeriodsCount { | |||||
| 137 | 0 | my $dbh = C4::Context->dbh; | ||||
| 138 | 0 | my $sth = $dbh->prepare(" | ||||
| 139 | SELECT COUNT(*) AS sum FROM aqbudgetperiods "); | |||||
| 140 | 0 | $sth->execute(); | ||||
| 141 | 0 | my $res = $sth->fetchrow_hashref; | ||||
| 142 | 0 | return $res->{'sum'}; | ||||
| 143 | } | |||||
| 144 | ||||||
| 145 | # ------------------------------------------------------------------- | |||||
| 146 | sub CheckBudgetParent { | |||||
| 147 | 0 | my ( $new_parent, $budget ) = @_; | ||||
| 148 | 0 | my $new_parent_id = $new_parent->{'budget_id'}; | ||||
| 149 | 0 | my $budget_id = $budget->{'budget_id'}; | ||||
| 150 | 0 | my $dbh = C4::Context->dbh; | ||||
| 151 | 0 | my $parent_id_tmp = $new_parent_id; | ||||
| 152 | ||||||
| 153 | # check new-parent is not a child (or a child's child ;) | |||||
| 154 | 0 | my $sth = $dbh->prepare(qq| | ||||
| 155 | SELECT budget_parent_id FROM | |||||
| 156 | aqbudgets where budget_id = ? | ); | |||||
| 157 | 0 | while (1) { | ||||
| 158 | 0 | $sth->execute($parent_id_tmp); | ||||
| 159 | 0 | my $res = $sth->fetchrow_hashref; | ||||
| 160 | 0 | if ( $res->{'budget_parent_id'} == $budget_id ) { | ||||
| 161 | 0 | return 1; | ||||
| 162 | } | |||||
| 163 | 0 | if ( not defined $res->{'budget_parent_id'} ) { | ||||
| 164 | 0 | return 0; | ||||
| 165 | } | |||||
| 166 | 0 | $parent_id_tmp = $res->{'budget_parent_id'}; | ||||
| 167 | } | |||||
| 168 | } | |||||
| 169 | ||||||
| 170 | # ------------------------------------------------------------------- | |||||
| 171 | sub BudgetHasChildren { | |||||
| 172 | 0 | my ( $budget_id ) = @_; | ||||
| 173 | 0 | my $dbh = C4::Context->dbh; | ||||
| 174 | 0 | my $sth = $dbh->prepare(qq| | ||||
| 175 | SELECT count(*) as sum FROM aqbudgets | |||||
| 176 | WHERE budget_parent_id = ? | ); | |||||
| 177 | 0 | $sth->execute( $budget_id ); | ||||
| 178 | 0 | my $sum = $sth->fetchrow_hashref; | ||||
| 179 | 0 | return $sum->{'sum'}; | ||||
| 180 | } | |||||
| 181 | ||||||
| 182 | # ------------------------------------------------------------------- | |||||
| 183 | sub GetBudgetsPlanCell { | |||||
| 184 | 0 | my ( $cell, $period, $budget ) = @_; | ||||
| 185 | 0 | my ($actual, $sth); | ||||
| 186 | 0 | my $dbh = C4::Context->dbh; | ||||
| 187 | 0 | if ( $cell->{'authcat'} eq 'MONTHS' ) { | ||||
| 188 | # get the actual amount | |||||
| 189 | 0 | $sth = $dbh->prepare( qq| | ||||
| 190 | ||||||
| 191 | SELECT SUM(ecost) AS actual FROM aqorders | |||||
| 192 | WHERE budget_id = ? AND | |||||
| 193 | entrydate like "$cell->{'authvalue'}%" | | |||||
| 194 | ); | |||||
| 195 | 0 | $sth->execute( $cell->{'budget_id'} ); | ||||
| 196 | } elsif ( $cell->{'authcat'} eq 'BRANCHES' ) { | |||||
| 197 | # get the actual amount | |||||
| 198 | 0 | $sth = $dbh->prepare( qq| | ||||
| 199 | ||||||
| 200 | SELECT SUM(ecost) FROM aqorders | |||||
| 201 | LEFT JOIN aqorders_items | |||||
| 202 | ON (aqorders.ordernumber = aqorders_items.ordernumber) | |||||
| 203 | LEFT JOIN items | |||||
| 204 | ON (aqorders_items.itemnumber = items.itemnumber) | |||||
| 205 | WHERE budget_id = ? AND homebranch = ? | ); | |||||
| 206 | ||||||
| 207 | 0 | $sth->execute( $cell->{'budget_id'}, $cell->{'authvalue'} ); | ||||
| 208 | } elsif ( $cell->{'authcat'} eq 'ITEMTYPES' ) { | |||||
| 209 | # get the actual amount | |||||
| 210 | 0 | $sth = $dbh->prepare( qq| | ||||
| 211 | ||||||
| 212 | SELECT SUM( ecost * quantity) AS actual | |||||
| 213 | FROM aqorders JOIN biblioitems | |||||
| 214 | ON (biblioitems.biblionumber = aqorders.biblionumber ) | |||||
| 215 | WHERE aqorders.budget_id = ? and itemtype = ? | | |||||
| 216 | ); | |||||
| 217 | 0 | $sth->execute( $cell->{'budget_id'}, | ||||
| 218 | $cell->{'authvalue'} ); | |||||
| 219 | } | |||||
| 220 | # ELSE GENERIC ORDERS SORT1/SORT2 STAT COUNT. | |||||
| 221 | else { | |||||
| 222 | # get the actual amount | |||||
| 223 | 0 | $sth = $dbh->prepare( qq| | ||||
| 224 | ||||||
| 225 | SELECT SUM(ecost * quantity) AS actual | |||||
| 226 | FROM aqorders | |||||
| 227 | JOIN aqbudgets ON (aqbudgets.budget_id = aqorders.budget_id ) | |||||
| 228 | WHERE aqorders.budget_id = ? AND | |||||
| 229 | ((aqbudgets.sort1_authcat = ? AND sort1 =?) OR | |||||
| 230 | (aqbudgets.sort2_authcat = ? AND sort2 =?)) | | |||||
| 231 | ); | |||||
| 232 | 0 | $sth->execute( $cell->{'budget_id'}, | ||||
| 233 | $budget->{'sort1_authcat'}, | |||||
| 234 | $cell->{'authvalue'}, | |||||
| 235 | $budget->{'sort2_authcat'}, | |||||
| 236 | $cell->{'authvalue'} | |||||
| 237 | ); | |||||
| 238 | } | |||||
| 239 | 0 | $actual = $sth->fetchrow_array; | ||||
| 240 | ||||||
| 241 | # get the estimated amount | |||||
| 242 | 0 | $sth = $dbh->prepare( qq| | ||||
| 243 | ||||||
| 244 | SELECT estimated_amount AS estimated, display FROM aqbudgets_planning | |||||
| 245 | WHERE budget_period_id = ? AND | |||||
| 246 | budget_id = ? AND | |||||
| 247 | authvalue = ? AND | |||||
| 248 | authcat = ? | | |||||
| 249 | ); | |||||
| 250 | 0 | $sth->execute( $cell->{'budget_period_id'}, | ||||
| 251 | $cell->{'budget_id'}, | |||||
| 252 | $cell->{'authvalue'}, | |||||
| 253 | $cell->{'authcat'}, | |||||
| 254 | ); | |||||
| 255 | ||||||
| 256 | ||||||
| 257 | 0 | my $res = $sth->fetchrow_hashref; | ||||
| 258 | # my $display = $res->{'display'}; | |||||
| 259 | 0 | my $estimated = $res->{'estimated'}; | ||||
| 260 | ||||||
| 261 | ||||||
| 262 | 0 | return $actual, $estimated; | ||||
| 263 | } | |||||
| 264 | ||||||
| 265 | # ------------------------------------------------------------------- | |||||
| 266 | sub ModBudgetPlan { | |||||
| 267 | 0 | my ( $budget_plan, $budget_period_id, $authcat ) = @_; | ||||
| 268 | 0 | my $dbh = C4::Context->dbh; | ||||
| 269 | 0 | foreach my $buds (@$budget_plan) { | ||||
| 270 | 0 | my $lines = $buds->{lines}; | ||||
| 271 | 0 | my $sth = $dbh->prepare( qq| | ||||
| 272 | DELETE FROM aqbudgets_planning | |||||
| 273 | WHERE budget_period_id = ? AND | |||||
| 274 | budget_id = ? AND | |||||
| 275 | authcat = ? | | |||||
| 276 | ); | |||||
| 277 | #delete a aqplan line of cells, then insert new cells, | |||||
| 278 | # these could be UPDATES rather than DEL/INSERTS... | |||||
| 279 | 0 | $sth->execute( $budget_period_id, $lines->[0]{budget_id} , $authcat ); | ||||
| 280 | ||||||
| 281 | 0 | foreach my $cell (@$lines) { | ||||
| 282 | 0 | my $sth = $dbh->prepare( qq| | ||||
| 283 | ||||||
| 284 | INSERT INTO aqbudgets_planning | |||||
| 285 | SET budget_id = ?, | |||||
| 286 | budget_period_id = ?, | |||||
| 287 | authcat = ?, | |||||
| 288 | estimated_amount = ?, | |||||
| 289 | authvalue = ? | | |||||
| 290 | ); | |||||
| 291 | 0 | $sth->execute( | ||||
| 292 | $cell->{'budget_id'}, | |||||
| 293 | $cell->{'budget_period_id'}, | |||||
| 294 | $cell->{'authcat'}, | |||||
| 295 | $cell->{'estimated_amount'}, | |||||
| 296 | $cell->{'authvalue'}, | |||||
| 297 | ); | |||||
| 298 | } | |||||
| 299 | } | |||||
| 300 | } | |||||
| 301 | ||||||
| 302 | # ------------------------------------------------------------------- | |||||
| 303 | sub GetBudgetSpent { | |||||
| 304 | 0 | my ($budget_id) = @_; | ||||
| 305 | 0 | my $dbh = C4::Context->dbh; | ||||
| 306 | 0 | my $sth = $dbh->prepare(qq| | ||||
| 307 | SELECT SUM( COALESCE(unitprice, ecost) * quantity ) AS sum FROM aqorders | |||||
| 308 | WHERE budget_id = ? AND | |||||
| 309 | quantityreceived > 0 AND | |||||
| 310 | datecancellationprinted IS NULL | |||||
| 311 | |); | |||||
| 312 | ||||||
| 313 | 0 | $sth->execute($budget_id); | ||||
| 314 | 0 | my $sum = $sth->fetchrow_array; | ||||
| 315 | 0 | return $sum; | ||||
| 316 | } | |||||
| 317 | ||||||
| 318 | # ------------------------------------------------------------------- | |||||
| 319 | sub GetBudgetOrdered { | |||||
| 320 | 0 | my ($budget_id) = @_; | ||||
| 321 | 0 | my $dbh = C4::Context->dbh; | ||||
| 322 | 0 | my $sth = $dbh->prepare(qq| | ||||
| 323 | SELECT SUM(ecost * quantity) AS sum FROM aqorders | |||||
| 324 | WHERE budget_id = ? AND | |||||
| 325 | quantityreceived = 0 AND | |||||
| 326 | datecancellationprinted IS NULL | |||||
| 327 | |); | |||||
| 328 | ||||||
| 329 | 0 | $sth->execute($budget_id); | ||||
| 330 | 0 | my $sum = $sth->fetchrow_array; | ||||
| 331 | 0 | return $sum; | ||||
| 332 | } | |||||
| 333 | ||||||
| 334 | # ------------------------------------------------------------------- | |||||
| 335 | sub GetBudgetAuthCats { | |||||
| 336 | 0 | my ($budget_period_id) = shift; | ||||
| 337 | # now, populate the auth_cats_loop used in the budget planning button | |||||
| 338 | # we must retrieve all auth values used by at least one budget | |||||
| 339 | 0 | my $dbh = C4::Context->dbh; | ||||
| 340 | 0 | my $sth=$dbh->prepare("SELECT sort1_authcat,sort2_authcat FROM aqbudgets WHERE budget_period_id=?"); | ||||
| 341 | 0 | $sth->execute($budget_period_id); | ||||
| 342 | 0 | my %authcats; | ||||
| 343 | 0 | while (my ($sort1_authcat,$sort2_authcat) = $sth->fetchrow) { | ||||
| 344 | 0 | $authcats{$sort1_authcat}=1; | ||||
| 345 | 0 | $authcats{$sort2_authcat}=1; | ||||
| 346 | } | |||||
| 347 | 0 | my @auth_cats_loop; | ||||
| 348 | 0 | foreach (sort keys %authcats) { | ||||
| 349 | 0 | push @auth_cats_loop,{ authcat => $_ }; | ||||
| 350 | } | |||||
| 351 | 0 | return \@auth_cats_loop; | ||||
| 352 | } | |||||
| 353 | ||||||
| 354 | # ------------------------------------------------------------------- | |||||
| 355 | sub GetAuthvalueDropbox { | |||||
| 356 | 0 | my ( $authcat, $default ) = @_; | ||||
| 357 | 0 | my $dbh = C4::Context->dbh; | ||||
| 358 | 0 | my $sth = $dbh->prepare( | ||||
| 359 | 'SELECT authorised_value,lib FROM authorised_values | |||||
| 360 | WHERE category = ? ORDER BY lib' | |||||
| 361 | ); | |||||
| 362 | 0 | $sth->execute( $authcat ); | ||||
| 363 | 0 | my $option_list = []; | ||||
| 364 | 0 | my @authorised_values = ( q{} ); | ||||
| 365 | 0 | while (my ($value, $lib) = $sth->fetchrow_array) { | ||||
| 366 | 0 0 | push @{$option_list}, { | ||||
| 367 | value => $value, | |||||
| 368 | label => $lib, | |||||
| 369 | default => ($default eq $value), | |||||
| 370 | }; | |||||
| 371 | } | |||||
| 372 | ||||||
| 373 | 0 0 | if ( @{$option_list} ) { | ||||
| 374 | 0 | return $option_list; | ||||
| 375 | } | |||||
| 376 | 0 | return; | ||||
| 377 | } | |||||
| 378 | ||||||
| 379 | # ------------------------------------------------------------------- | |||||
| 380 | sub GetBudgetPeriods { | |||||
| 381 | 0 | my ($filters,$orderby) = @_; | ||||
| 382 | 0 | return SearchInTable("aqbudgetperiods",$filters, $orderby, undef,undef, undef, "wide"); | ||||
| 383 | } | |||||
| 384 | # ------------------------------------------------------------------- | |||||
| 385 | sub GetBudgetPeriod { | |||||
| 386 | 0 | my ($budget_period_id) = @_; | ||||
| 387 | 0 | my $dbh = C4::Context->dbh; | ||||
| 388 | ## $total = number of records linked to the record that must be deleted | |||||
| 389 | 0 | my $total = 0; | ||||
| 390 | ## get information about the record that will be deleted | |||||
| 391 | 0 | my $sth; | ||||
| 392 | 0 | if ($budget_period_id) { | ||||
| 393 | 0 | $sth = $dbh->prepare( qq| | ||||
| 394 | SELECT * | |||||
| 395 | FROM aqbudgetperiods | |||||
| 396 | WHERE budget_period_id=? | | |||||
| 397 | ); | |||||
| 398 | 0 | $sth->execute($budget_period_id); | ||||
| 399 | } else { # ACTIVE BUDGET | |||||
| 400 | 0 | $sth = $dbh->prepare(qq| | ||||
| 401 | SELECT * | |||||
| 402 | FROM aqbudgetperiods | |||||
| 403 | WHERE budget_period_active=1 | | |||||
| 404 | ); | |||||
| 405 | 0 | $sth->execute(); | ||||
| 406 | } | |||||
| 407 | 0 | my $data = $sth->fetchrow_hashref; | ||||
| 408 | 0 | return $data; | ||||
| 409 | } | |||||
| 410 | ||||||
| 411 | # ------------------------------------------------------------------- | |||||
| 412 | sub DelBudgetPeriod{ | |||||
| 413 | 0 | my ($budget_period_id) = @_; | ||||
| 414 | 0 | my $dbh = C4::Context->dbh; | ||||
| 415 | ; ## $total = number of records linked to the record that must be deleted | |||||
| 416 | 0 | my $total = 0; | ||||
| 417 | ||||||
| 418 | ## get information about the record that will be deleted | |||||
| 419 | 0 | my $sth = $dbh->prepare(qq| | ||||
| 420 | DELETE | |||||
| 421 | FROM aqbudgetperiods | |||||
| 422 | WHERE budget_period_id=? | | |||||
| 423 | ); | |||||
| 424 | 0 | return $sth->execute($budget_period_id); | ||||
| 425 | } | |||||
| 426 | ||||||
| 427 | # ------------------------------------------------------------------- | |||||
| 428 | sub ModBudgetPeriod { | |||||
| 429 | 0 | my ($budget_period_information) = @_; | ||||
| 430 | 0 | return UpdateInTable("aqbudgetperiods",$budget_period_information); | ||||
| 431 | } | |||||
| 432 | ||||||
| 433 | # ------------------------------------------------------------------- | |||||
| 434 | sub GetBudgetHierarchy { | |||||
| 435 | 0 | my ( $budget_period_id, $branchcode, $owner ) = @_; | ||||
| 436 | 0 | my @bind_params; | ||||
| 437 | 0 | my $dbh = C4::Context->dbh; | ||||
| 438 | 0 | my $query = qq| | ||||
| 439 | SELECT aqbudgets.*, aqbudgetperiods.budget_period_active | |||||
| 440 | FROM aqbudgets | |||||
| 441 | JOIN aqbudgetperiods USING (budget_period_id)|; | |||||
| 442 | ||||||
| 443 | 0 | my @where_strings; | ||||
| 444 | # show only period X if requested | |||||
| 445 | 0 | if ($budget_period_id) { | ||||
| 446 | 0 | push @where_strings," aqbudgets.budget_period_id = ?"; | ||||
| 447 | 0 | push @bind_params, $budget_period_id; | ||||
| 448 | } | |||||
| 449 | # show only budgets owned by me, my branch or everyone | |||||
| 450 | 0 | if ($owner) { | ||||
| 451 | 0 | if ($branchcode) { | ||||
| 452 | 0 | push @where_strings, | ||||
| 453 | qq{ (budget_owner_id = ? OR budget_branchcode = ? OR ((budget_branchcode IS NULL or budget_branchcode="") AND (budget_owner_id IS NULL OR budget_owner_id="")))}; | |||||
| 454 | 0 | push @bind_params, ( $owner, $branchcode ); | ||||
| 455 | } else { | |||||
| 456 | 0 | push @where_strings, ' (budget_owner_id = ? OR budget_owner_id IS NULL or budget_owner_id ="") '; | ||||
| 457 | 0 | push @bind_params, $owner; | ||||
| 458 | } | |||||
| 459 | } else { | |||||
| 460 | 0 | if ($branchcode) { | ||||
| 461 | 0 | push @where_strings," (budget_branchcode =? or budget_branchcode is NULL)"; | ||||
| 462 | 0 | push @bind_params, $branchcode; | ||||
| 463 | } | |||||
| 464 | } | |||||
| 465 | 0 | $query.=" WHERE ".join(' AND ', @where_strings) if @where_strings; | ||||
| 466 | 0 | $debug && warn $query,join(",",@bind_params); | ||||
| 467 | 0 | my $sth = $dbh->prepare($query); | ||||
| 468 | 0 | $sth->execute(@bind_params); | ||||
| 469 | 0 | my $results = $sth->fetchall_arrayref({}); | ||||
| 470 | 0 | my @res = @$results; | ||||
| 471 | 0 | my $i = 0; | ||||
| 472 | 0 | while (1) { | ||||
| 473 | 0 | my $depth_cnt = 0; | ||||
| 474 | 0 | foreach my $r (@res) { | ||||
| 475 | 0 | my @child; | ||||
| 476 | # look for children | |||||
| 477 | 0 | $r->{depth} = '0' if !defined $r->{budget_parent_id}; | ||||
| 478 | 0 | foreach my $r2 (@res) { | ||||
| 479 | 0 | if (defined $r2->{budget_parent_id} | ||||
| 480 | && $r2->{budget_parent_id} == $r->{budget_id}) { | |||||
| 481 | 0 | push @child, $r2->{budget_id}; | ||||
| 482 | 0 | $r2->{depth} = ($r->{depth} + 1) if defined $r->{depth}; | ||||
| 483 | } | |||||
| 484 | } | |||||
| 485 | 0 | $r->{child} = \@child if scalar @child > 0; # add the child | ||||
| 486 | 0 | $depth_cnt++ if !defined $r->{'depth'}; | ||||
| 487 | } | |||||
| 488 | 0 | last if ($depth_cnt == 0 || $i == 100); | ||||
| 489 | 0 | $i++; | ||||
| 490 | } | |||||
| 491 | ||||||
| 492 | # look for top parents 1st | |||||
| 493 | 0 | my (@sort, $depth_count); | ||||
| 494 | 0 | ($i, $depth_count) = 0; | ||||
| 495 | 0 | while (1) { | ||||
| 496 | 0 | my $children = 0; | ||||
| 497 | 0 | foreach my $r (@res) { | ||||
| 498 | 0 | if ($r->{depth} == $depth_count) { | ||||
| 499 | 0 | $children++ if (ref $r->{child} eq 'ARRAY'); | ||||
| 500 | ||||||
| 501 | # find the parent id element_id and insert it after | |||||
| 502 | 0 | my $i2 = 0; | ||||
| 503 | 0 | my $parent; | ||||
| 504 | 0 | if ($depth_count > 0) { | ||||
| 505 | ||||||
| 506 | # add indent | |||||
| 507 | 0 | my $depth = $r->{depth} * 2; | ||||
| 508 | 0 | $r->{budget_code_indent} = $r->{budget_code}; | ||||
| 509 | 0 | $r->{budget_name_indent} = $r->{budget_name}; | ||||
| 510 | 0 | foreach my $r3 (@sort) { | ||||
| 511 | 0 | if ($r3->{budget_id} == $r->{budget_parent_id}) { | ||||
| 512 | 0 | $parent = $i2; | ||||
| 513 | 0 | last; | ||||
| 514 | } | |||||
| 515 | 0 | $i2++; | ||||
| 516 | } | |||||
| 517 | } else { | |||||
| 518 | 0 | $r->{budget_code_indent} = $r->{budget_code}; | ||||
| 519 | 0 | $r->{budget_name_indent} = $r->{budget_name}; | ||||
| 520 | } | |||||
| 521 | ||||||
| 522 | 0 | if (defined $parent) { | ||||
| 523 | 0 | splice @sort, ($parent + 1), 0, $r; | ||||
| 524 | } else { | |||||
| 525 | 0 | push @sort, $r; | ||||
| 526 | } | |||||
| 527 | } | |||||
| 528 | ||||||
| 529 | 0 | $i++; | ||||
| 530 | } # --------------foreach | |||||
| 531 | 0 | $depth_count++; | ||||
| 532 | 0 | last if $children == 0; | ||||
| 533 | } | |||||
| 534 | ||||||
| 535 | # add budget-percent and allocation, and flags for html-template | |||||
| 536 | 0 | foreach my $r (@sort) { | ||||
| 537 | 0 | my $subs_href = $r->{'child'}; | ||||
| 538 | 0 | my @subs_arr = (); | ||||
| 539 | 0 | if ( defined $subs_href ) { | ||||
| 540 | 0 0 | @subs_arr = @{$subs_href}; | ||||
| 541 | } | |||||
| 542 | ||||||
| 543 | 0 | my $moo = $r->{'budget_code_indent'}; | ||||
| 544 | 0 | $moo =~ s/\ /\ \;/g; | ||||
| 545 | 0 | $r->{'budget_code_indent'} = $moo; | ||||
| 546 | ||||||
| 547 | 0 | $moo = $r->{'budget_name_indent'}; | ||||
| 548 | 0 | $moo =~ s/\ /\ \;/g; | ||||
| 549 | 0 | $r->{'budget_name_indent'} = $moo; | ||||
| 550 | ||||||
| 551 | 0 | $r->{'budget_spent'} = GetBudgetSpent( $r->{'budget_id'} ); | ||||
| 552 | ||||||
| 553 | 0 | $r->{'budget_amount_total'} = $r->{'budget_amount'}; | ||||
| 554 | ||||||
| 555 | # foreach sub-levels | |||||
| 556 | 0 | my $unalloc_count ; | ||||
| 557 | ||||||
| 558 | 0 | foreach my $sub (@subs_arr) { | ||||
| 559 | 0 | my $sub_budget = GetBudget($sub); | ||||
| 560 | ||||||
| 561 | 0 | $r->{budget_spent_sublevel} += GetBudgetSpent( $sub_budget->{'budget_id'} ); | ||||
| 562 | 0 | $unalloc_count += $sub_budget->{'budget_amount'}; | ||||
| 563 | } | |||||
| 564 | } | |||||
| 565 | 0 | return \@sort; | ||||
| 566 | } | |||||
| 567 | ||||||
| 568 | # ------------------------------------------------------------------- | |||||
| 569 | ||||||
| 570 | sub AddBudget { | |||||
| 571 | 0 | my ($budget) = @_; | ||||
| 572 | 0 | return InsertInTable("aqbudgets",$budget); | ||||
| 573 | } | |||||
| 574 | ||||||
| 575 | # ------------------------------------------------------------------- | |||||
| 576 | sub ModBudget { | |||||
| 577 | 0 | my ($budget) = @_; | ||||
| 578 | 0 | return UpdateInTable("aqbudgets",$budget); | ||||
| 579 | } | |||||
| 580 | ||||||
| 581 | # ------------------------------------------------------------------- | |||||
| 582 | sub DelBudget { | |||||
| 583 | 0 | my ($budget_id) = @_; | ||||
| 584 | 0 | my $dbh = C4::Context->dbh; | ||||
| 585 | 0 | my $sth = $dbh->prepare("delete from aqbudgets where budget_id=?"); | ||||
| 586 | 0 | my $rc = $sth->execute($budget_id); | ||||
| 587 | 0 | return $rc; | ||||
| 588 | } | |||||
| 589 | ||||||
| 590 | ||||||
| 591 - 597 | =head2 GetBudget &GetBudget($budget_id); get a specific budget =cut | |||||
| 598 | ||||||
| 599 | # ------------------------------------------------------------------- | |||||
| 600 | sub GetBudget { | |||||
| 601 | 0 | my ( $budget_id ) = @_; | ||||
| 602 | 0 | my $dbh = C4::Context->dbh; | ||||
| 603 | 0 | my $query = " | ||||
| 604 | SELECT * | |||||
| 605 | FROM aqbudgets | |||||
| 606 | WHERE budget_id=? | |||||
| 607 | "; | |||||
| 608 | 0 | my $sth = $dbh->prepare($query); | ||||
| 609 | 0 | $sth->execute( $budget_id ); | ||||
| 610 | 0 | my $result = $sth->fetchrow_hashref; | ||||
| 611 | 0 | return $result; | ||||
| 612 | } | |||||
| 613 | ||||||
| 614 - 620 | =head2 GetChildBudgetsSpent &GetChildBudgetsSpent($budget-id); gets the total spent of the level and sublevels of $budget_id =cut | |||||
| 621 | ||||||
| 622 | # ------------------------------------------------------------------- | |||||
| 623 | sub GetChildBudgetsSpent { | |||||
| 624 | 0 | my ( $budget_id ) = @_; | ||||
| 625 | 0 | my $dbh = C4::Context->dbh; | ||||
| 626 | 0 | my $query = " | ||||
| 627 | SELECT * | |||||
| 628 | FROM aqbudgets | |||||
| 629 | WHERE budget_parent_id=? | |||||
| 630 | "; | |||||
| 631 | 0 | my $sth = $dbh->prepare($query); | ||||
| 632 | 0 | $sth->execute( $budget_id ); | ||||
| 633 | 0 | my $result = $sth->fetchall_arrayref({}); | ||||
| 634 | 0 | my $total_spent = GetBudgetSpent($budget_id); | ||||
| 635 | 0 | if ($result){ | ||||
| 636 | 0 0 | $total_spent += GetChildBudgetsSpent($_->{"budget_id"}) foreach @$result; | ||||
| 637 | } | |||||
| 638 | 0 | return $total_spent; | ||||
| 639 | } | |||||
| 640 | ||||||
| 641 - 647 | =head2 GetBudgets &GetBudgets($filter, $order_by); gets all budgets =cut | |||||
| 648 | ||||||
| 649 | # ------------------------------------------------------------------- | |||||
| 650 | sub GetBudgets { | |||||
| 651 | 0 | my ($filters,$orderby) = @_; | ||||
| 652 | 0 | return SearchInTable("aqbudgets",$filters, $orderby, undef,undef, undef, "wide"); | ||||
| 653 | } | |||||
| 654 | ||||||
| 655 | # ------------------------------------------------------------------- | |||||
| 656 | ||||||
| 657 - 666 | =head2 GetCurrencies @currencies = &GetCurrencies; Returns the list of all known currencies. C<$currencies> is a array; its elements are references-to-hash, whose keys are the fields from the currency table in the Koha database. =cut | |||||
| 667 | ||||||
| 668 | sub GetCurrencies { | |||||
| 669 | 0 | my $dbh = C4::Context->dbh; | ||||
| 670 | 0 | my $query = " | ||||
| 671 | SELECT * | |||||
| 672 | FROM currency | |||||
| 673 | "; | |||||
| 674 | 0 | my $sth = $dbh->prepare($query); | ||||
| 675 | 0 | $sth->execute; | ||||
| 676 | 0 | my @results = (); | ||||
| 677 | 0 | while ( my $data = $sth->fetchrow_hashref ) { | ||||
| 678 | 0 | push( @results, $data ); | ||||
| 679 | } | |||||
| 680 | 0 | return @results; | ||||
| 681 | } | |||||
| 682 | ||||||
| 683 | # ------------------------------------------------------------------- | |||||
| 684 | ||||||
| 685 | sub GetCurrency { | |||||
| 686 | 0 | my $dbh = C4::Context->dbh; | ||||
| 687 | 0 | my $query = " | ||||
| 688 | SELECT * FROM currency where active = '1' "; | |||||
| 689 | 0 | my $sth = $dbh->prepare($query); | ||||
| 690 | 0 | $sth->execute; | ||||
| 691 | 0 | my $r = $sth->fetchrow_hashref; | ||||
| 692 | 0 | return $r; | ||||
| 693 | } | |||||
| 694 | ||||||
| 695 - 701 | =head2 ModCurrencies &ModCurrencies($currency, $newrate); Sets the exchange rate for C<$currency> to be C<$newrate>. =cut | |||||
| 702 | ||||||
| 703 | sub ModCurrencies { | |||||
| 704 | 0 | my ( $currency, $rate ) = @_; | ||||
| 705 | 0 | my $dbh = C4::Context->dbh; | ||||
| 706 | 0 | my $query = qq| | ||||
| 707 | UPDATE currency | |||||
| 708 | SET rate=? | |||||
| 709 | WHERE currency=? |; | |||||
| 710 | 0 | my $sth = $dbh->prepare($query); | ||||
| 711 | 0 | $sth->execute( $rate, $currency ); | ||||
| 712 | } | |||||
| 713 | ||||||
| 714 | # ------------------------------------------------------------------- | |||||
| 715 | ||||||
| 716 - 725 | =head2 ConvertCurrency $foreignprice = &ConvertCurrency($currency, $localprice); Converts the price C<$localprice> to foreign currency C<$currency> by dividing by the exchange rate, and returns the result. If no exchange rate is found, e is one to one. =cut | |||||
| 726 | ||||||
| 727 | sub ConvertCurrency { | |||||
| 728 | 0 | my ( $currency, $price ) = @_; | ||||
| 729 | 0 | my $dbh = C4::Context->dbh; | ||||
| 730 | 0 | my $query = " | ||||
| 731 | SELECT rate | |||||
| 732 | FROM currency | |||||
| 733 | WHERE currency=? | |||||
| 734 | "; | |||||
| 735 | 0 | my $sth = $dbh->prepare($query); | ||||
| 736 | 0 | $sth->execute($currency); | ||||
| 737 | 0 | my $cur = ( $sth->fetchrow_array() )[0]; | ||||
| 738 | 0 | unless ($cur) { | ||||
| 739 | 0 | $cur = 1; | ||||
| 740 | } | |||||
| 741 | 0 | return ( $price / $cur ); | ||||
| 742 | } | |||||
| 743 | ||||||
| 744 - 748 | =head2 _columns returns an array containing fieldname followed by PRI as value if PRIMARY Key =cut | |||||
| 749 | ||||||
| 750 | sub _columns(;$) { | |||||
| 751 | 0 | my $tablename=shift||"aqbudgets"; | ||||
| 752 | 0 0 | return @{C4::Context->dbh->selectcol_arrayref("SHOW columns from $tablename",{Columns=>[1,4]})}; | ||||
| 753 | } | |||||
| 754 | ||||||
| 755 | sub _filter_fields{ | |||||
| 756 | 0 | my $budget=shift; | ||||
| 757 | 0 | my $tablename=shift; | ||||
| 758 | 0 | my @keys; | ||||
| 759 | 0 | my @values; | ||||
| 760 | 0 | my %columns= _columns($tablename); | ||||
| 761 | #Filter Primary Keys of table | |||||
| 762 | 0 0 | my $elements=join "|",grep {$columns{$_} ne "PRI"} keys %columns; | ||||
| 763 | 0 0 | foreach my $field (grep {/\b($elements)\b/} keys %$budget){ | ||||
| 764 | 0 | $$budget{$field}=format_date_in_iso($$budget{$field}) if ($field=~/date/ && $$budget{$field} !~C4::Dates->regexp("iso")); | ||||
| 765 | 0 | my $strkeys= " $field = ? "; | ||||
| 766 | 0 | if ($field=~/branch/){ | ||||
| 767 | 0 | $strkeys="( $strkeys OR $field='' OR $field IS NULL) "; | ||||
| 768 | } | |||||
| 769 | 0 | push @values, $$budget{$field}; | ||||
| 770 | 0 | push @keys, $strkeys; | ||||
| 771 | } | |||||
| 772 | 0 | return (\@keys,\@values); | ||||
| 773 | } | |||||
| 774 | ||||||
| 775 | 4 | 376221 | END { } # module clean-up code here (global destructor) | |||
| 776 | ||||||
| 777 | 1; | |||||