3 # Copyright 2000-2002 Katipo Communications
5 # This file is part of Koha.
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
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.
16 # You should have received a copy of the GNU General Public License along with
17 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
18 # Suite 330, Boston, MA 02111-1307 USA
22 use C4::Dates qw(format_date format_date_in_iso);
25 use vars qw($VERSION @ISA @EXPORT);
28 # set the version for version checking
48 &GetBudgetPeriodsDropbox
64 &CheckBudgetParentPerm
71 # ----------------------------BUDGETS.PM-----------------------------";
75 my ( $authcat, @hide_cols ) = @_;
76 my $dbh = C4::Context->dbh;
79 my $sth = $dbh->prepare(
81 UPDATE aqbudgets_planning
82 SET display = 1 where authcat = ? |
84 $sth->execute( $authcat );
87 my $sth1 = $dbh->prepare(
89 UPDATE aqbudgets_planning SET display = 0
93 foreach my $authvalue (@hide_cols) {
94 # $sth1->{TraceLevel} = 3;
95 $sth1->execute( $authcat, $authvalue );
100 my ( $authcat, $authvalue ) = @_;
102 my $dbh = C4::Context->dbh;
103 my $sth = $dbh->prepare(
105 SELECT count(display) as cnt from aqbudgets_planning
107 AND authvalue = ? and display = 0 |
110 # $sth->{TraceLevel} = 3;
111 $sth->execute( $authcat, $authvalue );
112 my $res = $sth->fetchrow_hashref;
114 return $res->{cnt} > 0 ? 0: 1
118 sub CheckBudgetParentPerm {
119 my ( $budget, $borrower_id ) = @_;
120 my $depth = $budget->{depth};
121 my $parent_id = $budget->{budget_parent_id};
123 my $parent = GetBudget($parent_id);
124 $parent_id = $parent->{budget_parent_id};
125 if ( $parent->{budget_owner_id} == $borrower_id ) {
133 # -------------------------------------------------------------------
134 sub GetPeriodsCount {
135 my $dbh = C4::Context->dbh;
136 my $sth = $dbh->prepare("
137 SELECT COUNT(*) AS sum FROM aqbudgetperiods ");
139 my $res = $sth->fetchrow_hashref;
140 return $res->{'sum'};
143 # -------------------------------------------------------------------
144 sub CheckBudgetParent {
145 my ( $new_parent, $budget ) = @_;
146 my $new_parent_id = $new_parent->{'budget_id'};
147 my $budget_id = $budget->{'budget_id'};
148 my $dbh = C4::Context->dbh;
149 my $parent_id_tmp = $new_parent_id;
151 # check new-parent is not a child (or a child's child ;)
152 my $sth = $dbh->prepare(qq|
153 SELECT budget_parent_id FROM
154 aqbudgets where budget_id = ? | );
156 $sth->execute($parent_id_tmp);
157 my $res = $sth->fetchrow_hashref;
158 if ( $res->{'budget_parent_id'} == $budget_id ) {
161 if ( not defined $res->{'budget_parent_id'} ) {
164 $parent_id_tmp = $res->{'budget_parent_id'};
168 # -------------------------------------------------------------------
169 sub BudgetHasChildren {
170 my ( $budget_id ) = @_;
171 my $dbh = C4::Context->dbh;
172 my $sth = $dbh->prepare(qq|
173 SELECT count(*) as sum FROM aqbudgets
174 WHERE budget_parent_id = ? | );
175 $sth->execute( $budget_id );
176 my $sum = $sth->fetchrow_hashref;
178 return $sum->{'sum'};
181 # -------------------------------------------------------------------
182 sub GetBudgetsPlanCell {
183 my ( $cell, $period, $budget ) = @_;
185 my $dbh = C4::Context->dbh;
186 if ( $cell->{'authcat'} eq 'MONTHS' ) {
187 # get the actual amount
188 $sth = $dbh->prepare( qq|
190 SELECT SUM(ecost) AS actual FROM aqorders
191 WHERE budget_id = ? AND
192 entrydate like "$cell->{'authvalue'}%" |
194 $sth->execute( $cell->{'budget_id'} );
195 } elsif ( $cell->{'authcat'} eq 'BRANCHES' ) {
196 # get the actual amount
197 $sth = $dbh->prepare( qq|
199 SELECT SUM(ecost) FROM aqorders
200 LEFT JOIN aqorders_items
201 ON (aqorders.ordernumber = aqorders_items.ordernumber)
203 ON (aqorders_items.itemnumber = items.itemnumber)
204 WHERE budget_id = ? AND homebranch = ? | );
206 $sth->execute( $cell->{'budget_id'}, $cell->{'authvalue'} );
207 } elsif ( $cell->{'authcat'} eq 'ITEMTYPES' ) {
208 # get the actual amount
209 $sth = $dbh->prepare( qq|
211 SELECT SUM( ecost * quantity) AS actual
212 FROM aqorders JOIN biblioitems
213 ON (biblioitems.biblionumber = aqorders.biblionumber )
214 WHERE aqorders.budget_id = ? and itemtype = ? |
216 $sth->execute( $cell->{'budget_id'},
217 $cell->{'authvalue'} );
219 # ELSE GENERIC ORDERS SORT1/SORT2 STAT COUNT.
221 # get the actual amount
222 $sth = $dbh->prepare( qq|
224 SELECT SUM(ecost * quantity) AS actual
226 JOIN aqbudgets ON (aqbudgets.budget_id = aqorders.budget_id )
227 WHERE aqorders.budget_id = ? AND
228 ((aqbudgets.sort1_authcat = ? AND sort1 =?) OR
229 (aqbudgets.sort2_authcat = ? AND sort2 =?)) |
231 $sth->{TraceLevel} = 2;
232 $sth->execute( $cell->{'budget_id'},
233 $budget->{'sort1_authcat'},
234 $cell->{'authvalue'},
235 $budget->{'sort2_authcat'},
239 $actual = $sth->fetchrow_array;
241 # get the estimated amount
242 my $sth = $dbh->prepare( qq|
244 SELECT estimated_amount AS estimated, display FROM aqbudgets_planning
245 WHERE budget_period_id = ? AND
250 $sth->execute( $cell->{'budget_period_id'},
251 $cell->{'budget_id'},
252 $cell->{'authvalue'},
257 my $res = $sth->fetchrow_hashref;
258 # my $display = $res->{'display'};
259 my $estimated = $res->{'estimated'};
262 return $actual, $estimated;
265 # -------------------------------------------------------------------
267 my ( $budget_plan, $budget_period_id, $authcat ) = @_;
268 my $dbh = C4::Context->dbh;
269 foreach my $buds (@$budget_plan) {
270 my $lines = $buds->{lines};
271 my $sth = $dbh->prepare( qq|
272 DELETE FROM aqbudgets_planning
273 WHERE budget_period_id = ? AND
277 #delete a aqplan line of cells, then insert new cells,
278 # these could be UPDATES rather than DEL/INSERTS...
279 $sth->execute( $budget_period_id, $lines->[0]{budget_id} , $authcat );
281 foreach my $cell (@$lines) {
282 my $sth = $dbh->prepare( qq|
284 INSERT INTO aqbudgets_planning
286 budget_period_id = ?,
288 estimated_amount = ?,
292 $cell->{'budget_id'},
293 $cell->{'budget_period_id'},
295 $cell->{'estimated_amount'},
296 $cell->{'authvalue'},
302 # -------------------------------------------------------------------
304 my ($budget_id) = @_;
305 my $dbh = C4::Context->dbh;
306 my $sth = $dbh->prepare(qq|
307 SELECT SUM(ecost * quantity ) AS sum FROM aqorders
308 WHERE budget_id = ? AND
309 datecancellationprinted IS NULL
312 $sth->execute($budget_id);
313 my $sum = $sth->fetchrow_array;
314 # $sum = sprintf "%.2f", $sum;
318 # -------------------------------------------------------------------
319 sub GetBudgetPermDropbox {
322 $labels{'0'} = 'None';
323 $labels{'1'} = 'Owner';
324 $labels{'2'} = 'Library';
325 my $radio = CGI::scrolling_list(
326 -name => 'budget_permission',
327 -values => [ '0', '1', '2' ],
335 # -------------------------------------------------------------------
336 sub GetAuthcatDropbox {
337 my ($name, $default ) = @_;
338 my @authorised_values;
340 my $dbh = C4::Context->dbh;
341 my $sth = $dbh->prepare(qq|
342 SELECT distinct(category)
343 FROM authorised_values WHERE category LIKE 'Asort%'
348 push @authorised_values, '';
349 while (my $value = $sth->fetchrow_array) {
350 push @authorised_values, $value;
353 my $budget_authcat_dropbox = CGI::scrolling_list(
355 -values => \@authorised_values,
358 -default => $default,
363 return $budget_authcat_dropbox;
366 # -------------------------------------------------------------------
367 sub GetBudgetAuthCats {
370 my $dbh = C4::Context->dbh;
371 my $sth = $dbh->prepare(
372 "SELECT distinct(category)
373 FROM authorised_values where category like 'Asort%'
377 while ( my $value = $sth->fetchrow_array ) {
378 push @auth_cats, $value;
380 my @loop_data = (); # initialize an array to hold your loop
382 my %row_data; # get a fresh hash for the row data
383 $row_data{authcat} = shift @auth_cats;
384 push( @loop_data, \%row_data );
389 # -------------------------------------------------------------------
390 sub GetAuthvalueDropbox {
391 my ( $name, $authcat, $default ) = @_;
392 my @authorised_values;
395 my $dbh = C4::Context->dbh;
396 my $sth = $dbh->prepare(
397 "SELECT authorised_value,lib
398 FROM authorised_values
402 $sth->execute( $authcat );
404 push @authorised_values, '';
405 while (my ($value, $lib) = $sth->fetchrow_array) {
406 push @authorised_values, $value;
407 $authorised_lib{$value} = $lib;
410 return 0 if keys(%authorised_lib) == 0;
412 my $budget_authvalue_dropbox = CGI::scrolling_list(
413 -values => \@authorised_values,
414 -labels => \%authorised_lib,
415 -default => $default,
423 return $budget_authvalue_dropbox
426 # -------------------------------------------------------------------
427 sub GetBudgetPeriodsDropbox {
428 my ($budget_period_id) = @_;
431 my ($active, $periods) = GetBudgetPeriods();
432 foreach my $r (@$periods) {
433 $labels{"$r->{budget_period_id}"} = $r->{budget_period_description};
434 push @values, $r->{budget_period_id};
437 # if no buget_id is passed then its an add
438 my $budget_period_dropbox = CGI::scrolling_list(
439 -name => 'budget_period_id',
441 -default => $budget_period_id ? $budget_period_id : $active,
445 return $budget_period_dropbox;
448 # -------------------------------------------------------------------
449 sub GetBudgetPeriods {
450 my $dbh = C4::Context->dbh;
451 my $sth = $dbh->prepare(qq|
454 ORDER BY budget_period_startdate, budget_period_enddate |
459 while (my $data = $sth->fetchrow_hashref) {
460 if ($data->{'budget_period_active'} == 1) {
461 $active = $data->{'budget_period_id'};
463 push(@results, $data);
466 return ($active, \@results);
469 # -------------------------------------------------------------------
470 sub GetBudgetPeriod {
471 my ($budget_period_id) = @_;
472 my $dbh = C4::Context->dbh;
473 ## $total = number of records linked to the record that must be deleted
475 ## get information about the record that will be deleted
477 if ($budget_period_id gt 0) {
478 $sth = $dbh->prepare( qq|
481 WHERE budget_period_id=? |
483 $sth->execute($budget_period_id);
484 } else { # ACTIVE BUDGET
485 $sth = $dbh->prepare(qq|
488 WHERE budget_period_active=1 |
492 my $data = $sth->fetchrow_hashref;
497 # -------------------------------------------------------------------
498 sub DelBudgetPeriod() {
499 my ($budget_period_id) = @_;
500 my $dbh = C4::Context->dbh;
501 ; ## $total = number of records linked to the record that must be deleted
504 ## get information about the record that will be deleted
505 my $sth = $dbh->prepare(qq|
506 SELECT budget_period_id
507 , budget_period_startdate
508 , budget_period_enddate
509 , budget_period_amount
511 , budget_period_description
513 WHERE budget_period_id=? |
515 $sth->execute($budget_period_id);
516 my $data = $sth->fetchrow_hashref;
520 # -------------------------------------------------------------------
521 sub ModBudgetPeriod() {
522 my ($budget_period_id) = @_;
523 my $dbh = C4::Context->dbh
524 ; ## $total = number of records linked to the record that must be deleted my $total = 0;
526 ## get information about the record that will be deleted
527 my $sth = $dbh->prepare("
528 SELECT budget_period_id
529 , budget_period_startdate
530 , budget_period_enddate
531 , budget_period_amount
533 , budget_period_description
535 WHERE budget_period_id=?;"
537 $sth->execute($budget_period_id);
538 my $data = $sth->fetchrow_hashref;
542 # -------------------------------------------------------------------
543 sub GetBudgetHierarchy {
544 my ($budget_period_id, $branchcode, $owner) = @_;
546 my $dbh = C4::Context->dbh;
550 JOIN aqbudgetperiods USING (budget_period_id)
551 WHERE budget_period_active=1 |;
552 # show only period X if requested
553 if ($budget_period_id) {
554 $query .= "AND aqbudgets.budget_period_id = ?";
555 push @bind_params, $budget_period_id;
557 # show only budgets owned by me, my branch or everyone
560 $query .= " AND (budget_owner_id = ? OR budget_branchcode = ? OR (budget_branchcode IS NULL AND budget_owner_id IS NULL))";
561 push @bind_params, $owner;
562 push @bind_params, $branchcode;
564 $query .= ' AND budget_owner_id = ? OR budget_owner_id IS NULL';
565 push @bind_params, $owner;
569 $query .= " AND (budget_branchcode =? or budget_branchcode is NULL)";
570 push @bind_params, $branchcode;
573 my $sth = $dbh->prepare($query);
574 $sth->execute(@bind_params);
575 my $results = $sth->fetchall_arrayref({});
580 foreach my $r (@res) {
583 $r->{depth} = '0' if !defined $r->{budget_parent_id};
584 foreach my $r2 (@res) {
585 if (defined $r2->{budget_parent_id}
586 && $r2->{budget_parent_id} == $r->{budget_id}) {
587 push @child, $r2->{budget_id};
588 $r2->{depth} = ($r->{depth} + 1) if defined $r->{depth};
591 $r->{child} = \@child if scalar @child > 0; # add the child
592 $depth_cnt++ if !defined $r->{'depth'};
594 last if ($depth_cnt == 0 || $i == 100);
598 # look for top parents 1st
600 my ($i, $depth_count) = 0;
603 foreach my $r (@res) {
604 if ($r->{depth} == $depth_count) {
605 $children++ if (ref $r->{child} eq 'ARRAY');
607 # find the parent id element_id and insert it after
610 if ($depth_count > 0) {
613 my $depth = $r->{depth} * 2;
614 my $space = pack "A[$depth]";
615 $r->{budget_code_indent} = $space . $r->{budget_code};
616 $r->{budget_name_indent} = $space . $r->{budget_name};
617 foreach my $r3 (@sort) {
618 if ($r3->{budget_id} == $r->{budget_parent_id}) {
625 $r->{budget_code_indent} = $r->{budget_code};
626 $r->{budget_name_indent} = $r->{budget_name};
629 if (defined $parent) {
630 splice @sort, ($parent + 1), 0, $r;
637 } # --------------foreach
639 last if $children == 0;
642 # add budget-percent and allocation, and flags for html-template
643 foreach my $r (@sort) {
644 my $subs_href = $r->{'child'};
645 my @subs_arr = @$subs_href if defined $subs_href;
647 my $moo = $r->{'budget_code_indent'};
648 $moo =~ s/\ /\ \;/g;
649 $r->{'budget_code_indent'} = $moo;
651 my $moo = $r->{'budget_name_indent'};
652 $moo =~ s/\ /\ \;/g;
653 $r->{'budget_name_indent'} = $moo;
655 $r->{'budget_spent'} = GetBudgetSpent( $r->{'budget_id'} );
657 # $budget->{'budget_alloc'} = sprintf( "%.2f", $budget->{'budget_alloc'} - $budget->{'budget_amount alloc'} );
658 # $budget->{'budget_alloc'} = sprintf( "%.2f", $budget->{'budget_alloc'} );
660 $r->{'budget_amount_total'} = $r->{'budget_amount'} + $r->{'budget_amount_sublevel'} ;
661 # $r->{budget_alloc} = $r->{'budget_amount'} - $r->{'budget_amount_sublevel'} ;
663 # $r->{'budget_amount_sublevel'} ;
668 foreach my $sub (@subs_arr) {
669 my $sub_budget = GetBudget($sub);
670 # $r->{budget_spent_sublevel} += $bud->{'budget_amount'} ;
672 $r->{budget_spent_sublevel} += GetBudgetSpent( $sub_budget->{'budget_id'} );
673 $unalloc_count += $sub_budget->{'budget_amount'} + $sub_budget->{'budget_amount_sublevel'};
676 $r->{budget_unalloc_sublevel} = $r->{'budget_amount_sublevel'} - $unalloc_count;
678 # (($r->{'budget_amount'} - $r->{'budget_alloc'}) / $r->{'budget_amount'}) * 100;
681 # my $percent = $r->{'budget_amount'} ? ( $r->{'budget_alloc'} / $r->{'budget_amount'} ) * 100 : 0;
682 # my $spent_percent = ( $r->{'budget_spent'} / $r->{'budget_amount'} ) * 100 if $r->{'budget_amount'};
684 # (($r->{'budget_amount'} - $r->{'budget_alloc'}) / $r->{'budget_amount'}) * 100;
685 # my $percent = ( $r->{'budget_alloc'} / $r->{'budget_amount'} ) * 100 if $r->{'budget_amount'};
686 # my $spent_percent = ( $r->{'budget_spent'} / $r->{'budget_amount'} ) * 100 if $r->{'budget_amount'};
688 $r->{budget_alloc_none} = 1;
689 } elsif ($percent == 100) {
690 $r->{budget_alloc_full} = 1
693 $r->{budget_alloc_percent} = sprintf("%00d", $percent);
697 if ( scalar @subs_arr == 0 && $r->{budget_amount_sublevel} > 0 ) {
698 $r->{warn_no_subs} = 1;
704 # -------------------------------------------------------------------
707 my $dbh = C4::Context->dbh;
709 INSERT INTO aqbudgets
711 budget_period_id = ?,
712 budget_parent_id = ?,
714 budget_branchcode = ?,
716 budget_amount_sublevel = ?,
723 budget_permission = ?
725 my $sth = $dbh->prepare($query);
727 $budget->{'budget_code'} ? $budget->{'budget_code'} : undef,
728 $budget->{'budget_period_id'} ? $budget->{'budget_period_id'} : undef,
729 $budget->{'budget_parent_id'} ? $budget->{'budget_parent_id'} : undef,
730 $budget->{'budget_name'} ? $budget->{'budget_name'} : undef,
731 $budget->{'budget_branchcode'} ? $budget->{'budget_branchcode'} : undef,
732 $budget->{'budget_amount'} ? $budget->{'budget_amount'} : undef,
733 $budget->{'budget_amount_sublevel'} ? $budget->{'budget_amount_sublevel'} : undef,
734 $budget->{'budget_encumb'} ? $budget->{'budget_encumb'} : undef,
735 $budget->{'budget_expend'} ? $budget->{'budget_expend'} : undef,
736 $budget->{'budget_notes'} ? $budget->{'budget_notes'} : undef,
737 $budget->{'sort1_authcat'} ? $budget->{'sort1_authcat'} : undef,
738 $budget->{'sort2_authcat'} ? $budget->{'sort2_authcat'} : undef,
739 $budget->{'budget_owner_id'} ? $budget->{'budget_owner_id'} : undef,
740 $budget->{'budget_permission'} ? $budget->{'budget_permission'} : undef,
745 # -------------------------------------------------------------------
748 my $dbh = C4::Context->dbh;
752 budget_period_id = ?,
753 budget_parent_id = ?,
755 budget_branchcode = ?,
757 budget_amount_sublevel = ?,
764 budget_permission = ?
768 my $sth = $dbh->prepare($query);
770 $budget->{'budget_code'} ? $budget->{'budget_code'} : undef,
771 $budget->{'budget_period_id'} ? $budget->{'budget_period_id'} : undef,
772 $budget->{'budget_parent_id'} ? $budget->{'budget_parent_id'} : undef,
773 $budget->{'budget_name'} ? $budget->{'budget_name'} : undef,
774 $budget->{'budget_branchcode'} ? $budget->{'budget_branchcode'} : undef,
775 $budget->{'budget_amount'} ? $budget->{'budget_amount'} : undef,
776 $budget->{'budget_amount_sublevel'} ? $budget->{'budget_amount_sublevel'} : undef,
777 $budget->{'budget_encumb'} ? $budget->{'budget_encumb'} : undef,
778 $budget->{'budget_expend'} ? $budget->{'budget_expend'} : undef,
779 $budget->{'budget_notes'} ? $budget->{'budget_notes'} : undef,
780 $budget->{'sort1_authcat'} ? $budget->{'sort1_authcat'} : undef,
781 $budget->{'sort2_authcat'} ? $budget->{'sort2_authcat'} : undef,
782 $budget->{'budget_owner_id'} ? $budget->{'budget_owner_id'} : undef,
783 $budget->{'budget_permission'} ? $budget->{'budget_permission'} : undef,
784 $budget->{'budget_id'},
789 # -------------------------------------------------------------------
791 my ($budget_id) = @_;
792 my $dbh = C4::Context->dbh;
793 my $sth = $dbh->prepare("delete from aqbudgets where budget_id=?");
794 my $rc = $sth->execute($budget_id);
801 =head2 FUNCTIONS ABOUT BUDGETS
811 &GetBudget($budget_id);
813 get a specific budget
819 # -------------------------------------------------------------------
821 my ( $budget_id ) = @_;
822 my $dbh = C4::Context->dbh;
829 my $sth = $dbh->prepare($query);
830 $sth->execute( $budget_id );
831 my $result = $sth->fetchrow_hashref;
839 &GetBudget($budget_id);
847 # -------------------------------------------------------------------
850 my $dbh = C4::Context->dbh;
851 my $q = "SELECT * from aqbudgets";
855 $sth = $dbh->prepare($q);
858 $q = "select budget_period_id from aqbudgetperiods where budget_period_active = 1 ";
859 $sth = $dbh->prepare($q);
861 $row = $sth->fetchrow_hashref();
862 $q = "select * from aqbudgets WHERE budget_period_id =? ";
863 $sth = $dbh->prepare($q);
864 $sth->execute( $row->{'budget_period_id'} );
866 my $results = $sth->fetchall_arrayref( {} );
871 # -------------------------------------------------------------------
875 @currencies = &GetCurrencies;
877 Returns the list of all known currencies.
879 C<$currencies> is a array; its elements are references-to-hash, whose
880 keys are the fields from the currency table in the Koha database.
885 my $dbh = C4::Context->dbh;
890 my $sth = $dbh->prepare($query);
893 while ( my $data = $sth->fetchrow_hashref ) {
894 push( @results, $data );
900 # -------------------------------------------------------------------
903 my $dbh = C4::Context->dbh;
905 SELECT * FROM currency where active = '1' ";
906 my $sth = $dbh->prepare($query);
908 my $r = $sth->fetchrow_hashref;
915 &ModCurrencies($currency, $newrate);
917 Sets the exchange rate for C<$currency> to be C<$newrate>.
922 my ( $currency, $rate ) = @_;
923 my $dbh = C4::Context->dbh;
928 my $sth = $dbh->prepare($query);
929 $sth->execute( $rate, $currency );
932 # -------------------------------------------------------------------
934 =head3 ConvertCurrency
936 $foreignprice = &ConvertCurrency($currency, $localprice);
938 Converts the price C<$localprice> to foreign currency C<$currency> by
939 dividing by the exchange rate, and returns the result.
941 If no exchange rate is found,e is one
946 sub ConvertCurrency {
947 my ( $currency, $price ) = @_;
948 my $dbh = C4::Context->dbh;
954 my $sth = $dbh->prepare($query);
955 $sth->execute($currency);
956 my $cur = ( $sth->fetchrow_array() )[0];
960 return ( $price / $cur );
963 END { } # module clean-up code here (global destructor)
972 Koha Developement team <info@koha.org>