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; |