#!/usr/bin/perl -w use strict; use Apache::Request; use Apache::Okcomputer qw(:all); use Okcomputer::Qofbux qw(:all); use Okcomputer::User; use HTML::Template; use HTML::Entities; my $form_template = 'add-purchase.html'; my $confirm_template = 'add-purchase-confirm.html'; my $form_title = 'new purchase'; my $r = Apache::Request->new(Apache->request); my $user = Okcomputer::User->new($r->connection->user); my $t_all_users = get_qofbux_users(); # default weight of 1 for (@$t_all_users) { $_->{weight} = 1 } my @groups = $user->groups('qofbux'); my $show_groups = @groups ? 1 : 0; my $group_name = 'all'; # for displaying to the user my $group_id = 0; if ($r->param('final') or $r->param('confirmed') or $r->param('group-select')) { # check submitted form my %bad; # amount my $amount = $r->param('amount'); unless ($amount) { $bad{bad_amount} = 1 } else { $amount =~ s/[^\d\.]//g; # strip everything that's not part of a number # clean up the amount a bit $amount =~ s/\.$//; $amount =~ s/^\./0./; $amount =~ s/\.(.)$/.${1}0/; } # description my $description = $r->param('description'); unless ($description) { $bad{bad_description} = 1; } else { $description = HTML::Entities::encode($description); } # names unless ($r->param('name')) { $bad{bad_name} = 1; } # weights for (grep /^weight-/, $r->param) { $bad{bad_weight} = 1 if $r->param($_) =~ /[^\d\.]/; } if (%bad or $r->param('group-select')) { # display the same page again my $template = HTML::Template->new(filename => $form_template); $r->content_type('text/html'); $r->send_http_header; my @selected_uids = (); if ($r->param('group-select')) { my $gid = $r->param('group'); unless ($gid == 0) { my ($group) = grep { $_->id == $gid } @groups; $group_id = $group->id; # select everyone in the group @selected_uids = $group->uids; } } else { $group_id = $r->param('selected-group'); @selected_uids = $r->param('name'); } # remove foolish warning delete $bad{bad_name} if @selected_uids; # group select my @t_groups = map { { name => $_->name, gid => $_->id } } @groups; my $groups = \@t_groups; unless ($group_id == 0) { my ($group) = grep { $_->id == $group_id } @groups; # redefine all users to be everyone in the group my @users; for my $uid ($group->uids) { push @users, grep { $_->{uid} == $uid } @$t_all_users; } $t_all_users = \@users; $group_name = $group->name; } for my $group (@$groups) { $group->{selected} = 1 if $group->{gid} == $group_id; } # user select and weights for my $user (@$t_all_users) { my $uid = $user->{uid}; $user->{checked} = 1 if (grep {$_ eq $uid} @selected_uids); $user->{weight} = $r->param("weight-$uid") || 1; } $template->param(title => $form_title, name => $user->name, menu => qofbux_menu('add-purchase'), amount => $amount, description => $description, groups => $groups, users => $t_all_users, show_groups => $show_groups, group_name => $group_name, group_id => $group_id, ); $template->param(%bad) unless $r->param('group-select'); print $template->output; exit; } elsif ($r->param('confirmed')) { # stuff it in the database my @uids = $r->param('name'); my @weights = map { $r->param($_) } (grep /^weight-/, $r->param); my $gid = $r->param('selected-group'); add_purchase(amount => $amount, description => $description, uid => $user->uid, realm => $gid, weights => \@weights, uids => \@uids); # back to status page # FIXME domain should not be hardcoded my $url = "http://antiflux.org/qofbux/status"; $r->header_out(Location => $url); $r->status(302); } else { # confirmation form my $template = HTML::Template->new(filename => $confirm_template); $r->content_type('text/html'); $r->send_http_header; my @uids = $r->param('name'); my $uids = [ map { { uid => $_, weight => $r->param("weight-$_") } } @uids ]; my @names; for my $guy (@$t_all_users) { if (grep { $guy->{uid} == $_ } @uids) { push @names, $guy->{name}; } } my $names = nice_list(@names); $template->param(title => 'new purchase confirm', name => $user->name, menu => qofbux_menu('add-purchase'), amount => $amount, description => $description, uids => $uids, names => $names, group_id => $r->param('selected-group') || 0, ); print $template->output; } } else { # new purchase form my $template = HTML::Template->new(filename => $form_template); $r->content_type('text/html'); $r->send_http_header; my @t_groups = map { { name => $_->name, gid => $_->id } } @groups; $template->param(title => $form_title, name => $user->name, menu => qofbux_menu('add-purchase'), amount => $r->param('amount') || "", description => $r->param('description') || "", groups => \@t_groups, users => $t_all_users, show_groups => $show_groups, group_name => $group_name, ); print $template->output; }