From 023d668753ba677a0f0c260dad49d7a3ab6ae211 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bj=C3=B8rn=20Rustad?= Date: Tue, 20 Aug 2013 19:59:42 +0200 Subject: [PATCH] Director points --- lib/Duplo.pm | 3 ++ lib/Duplo/Manager.pm | 53 +++++++++++++++++----- lib/Duplo/Points.pm | 69 +++++++++++++++++++++++++++++ templates/manager/edit_form.html.ep | 6 +++ templates/manager/team.html.ep | 9 ++-- 5 files changed, 124 insertions(+), 16 deletions(-) diff --git a/lib/Duplo.pm b/lib/Duplo.pm index a66cede..563650e 100644 --- a/lib/Duplo.pm +++ b/lib/Duplo.pm @@ -65,9 +65,12 @@ sub startup { my $user = $c->session('user'); my $is_admin = defined $user ? is_admin($c, $user) : undef; + my $errors = $c->flash('errors'); + $c->stash( user => $user, is_admin => $is_admin, + errors => $errors, ); }); diff --git a/lib/Duplo/Manager.pm b/lib/Duplo/Manager.pm index 2bf9b53..f1e6649 100644 --- a/lib/Duplo/Manager.pm +++ b/lib/Duplo/Manager.pm @@ -124,12 +124,37 @@ sub team { stage_team(?, ?) "); + my $dsth = $dbh->prepare(" + SELECT + mt.director, + t.name, + price, + points + FROM + manager_team AS mt + JOIN + team AS t + ON (mt.director = t.team) + JOIN + director_race AS dr + ON (mt.director = dr.director) + LEFT OUTER JOIN + director_stage AS ds + ON (mt.director = ds.director) + WHERE + (stage = ? OR stage IS NULL) + AND + manager_team = ? + "); + my %stage_team = (); for my $stage (@{ $stages }) { - $stage_team{$stage->{'stage'}} = + $stage_team{$stage->{'stage'}}->{'riders'} = $dbh->selectall_arrayref($sth, { Slice => {} }, $stage->{'stage'}, $team); + $stage_team{$stage->{'stage'}}->{'director'} = $dbh->selectrow_hashref($dsth, undef, $stage->{'stage'}, $team); + } return $self->render( @@ -238,8 +263,8 @@ sub edit { push @errors, "No stage found." unless defined $stage; if (scalar @errors > 0) { - $self->app->log->debug(Dumper \@errors); - return $self->redirect_to('manager_team', team => $team) + $self->flash(errors => \@errors); + return $self->redirect_to('manager_edit_form', team => $team) } my ($max_teams) = $dbh->selectrow_array(" @@ -252,15 +277,18 @@ sub edit { rider_race WHERE race = (SELECT race FROM manager_team WHERE manager_team = ?) + AND + rider IN (@{[join ',', ('?') x @riders]}) GROUP BY team ) AS a - ", undef, $team); + ", undef, $team, @riders); if ($max_teams > 2) { - $self->app->log->debug("More than two riders on one team."); + push @errors, "More than two riders from one team."; - return $self->redirect_to('manager_team', team => $team); + $self->flash(errors => \@errors); + return $self->redirect_to('manager_edit_form', team => $team); } my ($price) = $dbh->selectrow_array(" @@ -275,9 +303,10 @@ sub edit { ", undef, $team, @riders); if ($price > 140) { - $self->app->log->debug("Too expensive!"); + push @errors, "Too expensive! $price > 140"; - return $self->redirect_to('manager_team', team => $team); + $self->flash(errors => \@errors); + return $self->redirect_to('manager_edit_form', team => $team); } $dbh->do(" @@ -299,7 +328,7 @@ sub edit { #FIXME: Not wery pretty if ($switches > 20) { - $self->app->log->debug("Too many switches."); + push @errors, "Too many switches."; $dbh->do(" DELETE FROM rider_manager_team @@ -309,7 +338,8 @@ sub edit { stage = ? ", undef, $team, $stage); - return $self->redirect_to('manager_team', team => $team) + $self->flash(errors => \@errors); + return $self->redirect_to('manager_edit_form', team => $team) } $dbh->do(" @@ -327,7 +357,8 @@ sub edit { $sth->execute($rider, $team, $stage); } - return $self->redirect_to('manager_team', team => $team); + $self->flash(errors => \@errors); + return $self->redirect_to('manager_edit_form', team => $team); } 1; diff --git a/lib/Duplo/Points.pm b/lib/Duplo/Points.pm index 97a41ed..99001c9 100644 --- a/lib/Duplo/Points.pm +++ b/lib/Duplo/Points.pm @@ -107,6 +107,14 @@ our %MULT = ( 'WATER' => 4, ); +our %DIRECTOR = ( + 1 => 160, + 2 => 100, + 3 => 60, + 4 => 40, + 5 => 20, +); + sub get_points { my $self = shift; my $r = shift; @@ -234,6 +242,67 @@ sub calculate { }; } + my $finish_ref = $dbh->selectall_arrayref(" + SELECT + team + FROM ( + SELECT + MIN(rl.\"number\") AS pos, + rr.team + FROM + rider_line AS rl + JOIN + line AS l + ON (rl.line = l.line) + JOIN + stage AS s + ON (l.stage = s.stage) + JOIN + rider_race AS rr + ON (rr.rider = rl.rider AND rr.race = s.race) + WHERE + l.stage = ? + AND + l.\"type\" = 'FINISH' + GROUP BY + rr.team + ) AS foo + ORDER BY pos ASC + ", { Slice => {} }, $stage); + + $insert = $dbh->prepare(" + INSERT INTO + director_stage (points, stage, director) + VALUES (?, ?, ?) + "); + + $update = $dbh->prepare(" + UPDATE + director_stage + SET points = points + ? + WHERE stage = ? + AND director = ? + "); + + my $i = 1; + for my $res (@{ $finish_ref }) { + my $p; + + if (exists $DIRECTOR{$i}) { + $p = $DIRECTOR{$i}; + } else { + last; + } + + eval { + $insert->execute($p, $stage, $res->{'team'}); + } or do { + $update->execute($p, $stage, $res->{'team'}); + }; + + $i++; + } + return $self->redirect_to('stage', stage => $stage); } diff --git a/templates/manager/edit_form.html.ep b/templates/manager/edit_form.html.ep index e77be9e..4126998 100644 --- a/templates/manager/edit_form.html.ep +++ b/templates/manager/edit_form.html.ep @@ -1,6 +1,12 @@ % layout 'default'; % title 'Edit your manager team'; + + % my $rider_select = begin % my $type = shift; % my $name = shift; diff --git a/templates/manager/team.html.ep b/templates/manager/team.html.ep index 42cd959..b216603 100644 --- a/templates/manager/team.html.ep +++ b/templates/manager/team.html.ep @@ -19,7 +19,7 @@ Price Points - % for my $rider (@{ $stage_team->{$stage->{'stage'}} }) { + % for my $rider (@{ $stage_team->{$stage->{'stage'}}->{'riders'} }) { <%= $rider->{'type'} %> <%= $rider->{'name'} %> @@ -28,15 +28,14 @@ <%= $rider->{'points'} %> % } - % if (defined $director->{'team'}) { + % my $director = $stage_team->{$stage->{'stage'}}->{'director'}; DIRECTOR - <%= $director->{'name'} %> + <%= $director->{'name'} %> <%= $director->{'price'} %> - TODO + <%= $director->{'poinst'} %> - % } % } -- 2.47.3