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

(-)a/C4/Budgets.pm (-76 / +47 lines)
Lines 528-625 sub GetBudgetHierarchy { Link Here
528
	$debug && warn $query,join(",",@bind_params);
528
	$debug && warn $query,join(",",@bind_params);
529
	my $sth = $dbh->prepare($query);
529
	my $sth = $dbh->prepare($query);
530
	$sth->execute(@bind_params);
530
	$sth->execute(@bind_params);
531
	my $results = $sth->fetchall_arrayref({});
532
	my @res     = @$results;
533
	my $i = 0;
534
	while (1) {
535
		my $depth_cnt = 0;
536
		foreach my $r (@res) {
537
			my @child;
538
			# look for children
539
			$r->{depth} = '0' if !defined $r->{budget_parent_id};
540
			foreach my $r2 (@res) {
541
				if (defined $r2->{budget_parent_id}
542
					&& $r2->{budget_parent_id} == $r->{budget_id}) {
543
					push @child, $r2->{budget_id};
544
					$r2->{depth} = ($r->{depth} + 1) if defined $r->{depth};
545
				}
546
			}
547
			$r->{child} = \@child if scalar @child > 0;    # add the child
548
			$depth_cnt++ if !defined $r->{'depth'};
549
		}
550
		last if ($depth_cnt == 0 || $i == 100);
551
		$i++;
552
	}
553
531
554
	# look for top parents 1st
532
    my %links;
555
	my (@sort, $depth_count);
533
    # create hash with budget_id has key
556
	($i, $depth_count) = 0;
534
    while ( my $data = $sth->fetchrow_hashref ) {
557
	while (1) {
535
        $links{ $data->{'budget_id'} } = $data;
558
		my $children = 0;
536
    }
559
		foreach my $r (@res) {
560
			if ($r->{depth} == $depth_count) {
561
				$children++ if (ref $r->{child} eq 'ARRAY');
562
563
				# find the parent id element_id and insert it after
564
				my $i2 = 0;
565
				my $parent;
566
				if ($depth_count > 0) {
567
568
					# add indent
569
					my $depth = $r->{depth} * 2;
570
					$r->{budget_code_indent} = $r->{budget_code};
571
					$r->{budget_name_indent} = $r->{budget_name};
572
					foreach my $r3 (@sort) {
573
						if ($r3->{budget_id} == $r->{budget_parent_id}) {
574
							$parent = $i2;
575
							last;
576
						}
577
						$i2++;
578
					}
579
				} else {
580
					$r->{budget_code_indent} = $r->{budget_code};
581
					$r->{budget_name_indent} = $r->{budget_name};
582
				}
583
                
584
				if (defined $parent) {
585
					splice @sort, ($parent + 1), 0, $r;
586
				} else {
587
					push @sort, $r;
588
				}
589
			}
590
591
			$i++;
592
		}    # --------------foreach
593
		$depth_count++;
594
		last if $children == 0;
595
	}
596
537
597
# add budget-percent and allocation, and flags for html-template
538
    # link child to parent
598
	foreach my $r (@sort) {
539
    my @first_parents;
599
		my $subs_href = $r->{'child'};
540
    foreach ( sort keys %links ) {
600
        my @subs_arr = ();
541
        my $child = $links{$_};
601
        if ( defined $subs_href ) {
542
	    if ( $child->{'budget_parent_id'} ) {
602
            @subs_arr = @{$subs_href};
543
            my $parent = $links{ $child->{'budget_parent_id'} };
544
            if ($parent) {
545
                unless ( $parent->{'children'} ) {
546
                    # init child arrayref
547
                    $parent->{'children'} = [];
548
                }
549
                # add as child
550
                push @{ $parent->{'children'} }, $child;
551
            }
552
        } else {
553
            push @first_parents, $child;
603
        }
554
        }
555
    }
604
556
605
        my $moo = $r->{'budget_code_indent'};
557
    my @sort = ();
558
    foreach my $first_parent (@first_parents) {
559
        _add_budget_children(\@sort, $first_parent);
560
    }
561
562
    # add budget-percent and allocation, and flags for html-template
563
	foreach my $r (@sort) {
564
        my $subs = $r->{'children'} || [];
565
566
        my $moo = $r->{'budget_code'};
606
        $moo =~ s/\ /\&nbsp\;/g;
567
        $moo =~ s/\ /\&nbsp\;/g;
607
        $r->{'budget_code_indent'} =  $moo;
568
        $r->{'budget_code_indent'} =  $moo;
608
569
609
        $moo = $r->{'budget_name_indent'};
570
        $moo = $r->{'budget_name'};
610
        $moo =~ s/\ /\&nbsp\;/g;
571
        $moo =~ s/\ /\&nbsp\;/g;
611
        $r->{'budget_name_indent'} = $moo;
572
        $r->{'budget_name_indent'} = $moo;
612
573
613
        $r->{'budget_spent'}       = GetBudgetSpent( $r->{'budget_id'} );
574
        $r->{'budget_spent'} = GetBudgetSpent( $r->{'budget_id'} );
614
575
615
        $r->{'budget_amount_total'} =  $r->{'budget_amount'};
576
        $r->{'budget_amount_total'} =  $r->{'budget_amount'};
616
577
617
        # foreach sub-levels
578
        # foreach sub-levels
618
        my $unalloc_count ;
579
        my $unalloc_count ;
619
580
620
		foreach my $sub (@subs_arr) {
581
		foreach my $sub (@$subs) {
621
			my $sub_budget = GetBudget($sub);
582
			my $sub_budget = GetBudget($sub);
622
623
			$r->{budget_spent_sublevel} +=    GetBudgetSpent( $sub_budget->{'budget_id'} );
583
			$r->{budget_spent_sublevel} +=    GetBudgetSpent( $sub_budget->{'budget_id'} );
624
			$unalloc_count +=   $sub_budget->{'budget_amount'};
584
			$unalloc_count +=   $sub_budget->{'budget_amount'};
625
		}
585
		}
Lines 627-632 sub GetBudgetHierarchy { Link Here
627
	return \@sort;
587
	return \@sort;
628
}
588
}
629
589
590
# Recursive method to add a budget and its chidren to an array
591
sub _add_budget_children {
592
    my $res = shift;
593
    my $budget = shift;
594
    push @$res, $budget;
595
    my $children = $budget->{'children'} || [];
596
    return unless @$children; # break recursivity
597
    foreach my $child (@$children) {
598
        _add_budget_children($res, $child);
599
    }
600
}
601
630
# -------------------------------------------------------------------
602
# -------------------------------------------------------------------
631
603
632
sub AddBudget {
604
sub AddBudget {
633
- 

Return to bug 11714