From dafd7bf828d28f8b07f51a5d136c1f46c85c4233 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bj=C3=B8rn=20Rustad?= Date: Wed, 21 Aug 2013 20:07:27 +0200 Subject: [PATCH] TTT points --- duplo.sql | 1 + lib/Duplo/Line.pm | 2 +- lib/Duplo/Manager.pm | 29 +++++++++++ lib/Duplo/Points.pm | 80 +++++++++++++++++++++++++---- lib/Duplo/Race.pm | 2 +- lib/Duplo/Stage.pm | 30 +++++++++++ templates/manager/edit_form.html.ep | 2 +- 7 files changed, 132 insertions(+), 14 deletions(-) diff --git a/duplo.sql b/duplo.sql index c2c8727..18518d3 100644 --- a/duplo.sql +++ b/duplo.sql @@ -78,6 +78,7 @@ GRANT SELECT, UPDATE, INSERT, DELETE ON rider_line TO duplo; CREATE TABLE team_line ( team INTEGER REFERENCES team, line INTEGER REFERENCES line, + "number" INTEGER NOT NULL, time INTERVAL, UNIQUE (team, line) diff --git a/lib/Duplo/Line.pm b/lib/Duplo/Line.pm index 4a00ceb..2191f18 100644 --- a/lib/Duplo/Line.pm +++ b/lib/Duplo/Line.pm @@ -12,7 +12,7 @@ sub new_line { $dbh->do(" INSERT INTO line (stage, type, name, category) - VALUES (?, ?, ?) + VALUES (?, ?, ?, ?) ", undef, $stage, $type, $name, $category); return $self->redirect_to('stage', stage => $stage); diff --git a/lib/Duplo/Manager.pm b/lib/Duplo/Manager.pm index f1e6649..9b9841b 100644 --- a/lib/Duplo/Manager.pm +++ b/lib/Duplo/Manager.pm @@ -302,6 +302,35 @@ sub edit { rider IN (@{[join ',', ('?') x @riders]}) ", undef, $team, @riders); + my ($dprice) = $dbh->selectrow_array(" + SELECT + price + FROM + manager_team AS mt + JOIN + director_race AS dr + ON (mt.director = dr.director AND mt.race = dr.race) + WHERE + manager_team = ? + ", undef, $team, $stage); + + my ($nprice) = $dbh->selectrow_array(" + SELECT + price + FROM + director_race + WHERE + director = ? + AND + race = (SELECT race FROM stage WHERE stage = ?) + ", undef, $director, $stage); + + if (defined $dprice) { + $price += $dprice; + } else { + $price += $nprice; + } + if ($price > 140) { push @errors, "Too expensive! $price > 140"; diff --git a/lib/Duplo/Points.pm b/lib/Duplo/Points.pm index 99001c9..f03373a 100644 --- a/lib/Duplo/Points.pm +++ b/lib/Duplo/Points.pm @@ -157,11 +157,58 @@ sub get_points { return $p * $MULT{$r->{'rider_type'}}; } +sub ttt_points { + my $self = shift; + my $stage = shift; + my $dbh = $self->db(); + + #FIXME: Race conditions + $dbh->do(" + DELETE FROM + rider_stage + WHERE + stage = ? + ", undef, $stage); + + my $ref = $dbh->selectcol_arrayref(" + SELECT + team + FROM + team_line AS tl + JOIN + line AS l + ON (tl.line = l.line) + WHERE + stage = ? + ORDER BY \"number\" ASC + ", undef, $stage); + + my $insert = $dbh->prepare(" + INSERT INTO + rider_stage (points, stage, rider) + SELECT ?, ?, rider + FROM + rider_race + WHERE + team = ? + AND + race = (SELECT race FROM stage WHERE stage = ?) + "); + + my $pos = 1; + for my $team (@{ $ref }) { + my $p = $POINTS{'TTT'}->{$pos}; + + $insert->execute($p, $stage, $team, $stage); + + $pos++; + } +} + sub calculate { my $self = shift; my $dbh = $self->db(); my $stage = $self->param('stage'); - my $after_restday = defined $self->param('after_restday') ? 1 : 0; $dbh->do(" UPDATE @@ -172,6 +219,21 @@ sub calculate { stage = ? ", undef, $stage); + my ($stage_type) = $dbh->selectrow_array(" + SELECT + \"type\" + FROM + stage + WHERE + stage = ? + ", undef, $stage); + + if ($stage_type eq 'TTT') { + ttt_points($self, $stage); + return $self->redirect_to('stage', stage => $stage); + } + + # People on winning team get +10 points my ($winner_team) = $dbh->selectrow_array(" SELECT team @@ -192,6 +254,7 @@ sub calculate { \"number\" = 1 ", undef, $stage); + # Get all line crossings my $results_ref = $dbh->selectall_arrayref(" SELECT rl.rider, @@ -235,13 +298,11 @@ sub calculate { for my $res (@{ $results_ref }) { my $p = get_points($self, $res, $winner_team); - eval { - $insert->execute($p, $stage, $res->{'rider'}); - } or do { - $update->execute($p, $stage, $res->{'rider'}); - }; + $insert->execute($p, $stage, $res->{'rider'}) + or $update->execute($p, $stage, $res->{'rider'}); } + # Give points to director my $finish_ref = $dbh->selectall_arrayref(" SELECT team @@ -294,11 +355,8 @@ sub calculate { last; } - eval { - $insert->execute($p, $stage, $res->{'team'}); - } or do { - $update->execute($p, $stage, $res->{'team'}); - }; + $insert->execute($p, $stage, $res->{'team'}) + or $update->execute($p, $stage, $res->{'team'}); $i++; } diff --git a/lib/Duplo/Race.pm b/lib/Duplo/Race.pm index 329fa2a..c9858c2 100644 --- a/lib/Duplo/Race.pm +++ b/lib/Duplo/Race.pm @@ -132,7 +132,7 @@ sub race { JOIN manager_team AS mt ON (foo.manager_team = mt.manager_team) - GROUP BY foo.race, mt.manager_team + GROUP BY foo.race, mt.manager_team, mt.name ORDER BY sum DESC ", { Slice => {} }, $race); diff --git a/lib/Duplo/Stage.pm b/lib/Duplo/Stage.pm index 5c0ef36..786e99e 100644 --- a/lib/Duplo/Stage.pm +++ b/lib/Duplo/Stage.pm @@ -46,6 +46,36 @@ sub stage { stage = ? ", undef, $stage); + #FIXME: NOT PRETTY + if ($stage_ref->{'type'} eq 'TTT') { + my $results_ref = $dbh->selectall_arrayref(" + SELECT + t.team, + tl.\"number\", + tl.time, + t.name + FROM + team_line AS tl + JOIN + line AS l + ON (tl.line = l.line) + JOIN + team AS t + ON (tl.team = t.team) + WHERE + stage = ? + AND + l.\"type\" = 'FINISH' + ", { Slice => {} }, $stage); + + + return $self->render( + template => 'stage/ttt', + stage => $stage_ref, + results => $results_ref, + ); + } + my $results_ref = $dbh->selectall_arrayref(" SELECT r.rider, diff --git a/templates/manager/edit_form.html.ep b/templates/manager/edit_form.html.ep index 4126998..0ec162b 100644 --- a/templates/manager/edit_form.html.ep +++ b/templates/manager/edit_form.html.ep @@ -29,7 +29,7 @@

Edit your team

- %= $rider_select->('TT', 'Time Trialist'); + %= $rider_select->('CLIMBER', 'Climber'); %= $rider_select->('CLIMBER', 'Climber'); %= $rider_select->('CLIMBER', 'Climber'); %= $rider_select->('WATER', 'Domestique'); -- 2.47.3