]> git.rustad.me Git - duplo/commitdiff
TTT points
authorBjørn Rustad <rustadbjornen@gmail.com>
Wed, 21 Aug 2013 18:07:27 +0000 (20:07 +0200)
committerBjørn Rustad <rustadbjornen@gmail.com>
Wed, 21 Aug 2013 18:07:27 +0000 (20:07 +0200)
duplo.sql
lib/Duplo/Line.pm
lib/Duplo/Manager.pm
lib/Duplo/Points.pm
lib/Duplo/Race.pm
lib/Duplo/Stage.pm
templates/manager/edit_form.html.ep

index c2c872761a4f9136c9347fb6c4f7bb0ba67ff48f..18518d33c622e48adcce5365cf85cfdedb7d4877 100644 (file)
--- 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)
index 4a00cebc119256d466ea533ddbb9de30a2caa97d..2191f185178ab023677c5c8491c130de53d72c8a 100644 (file)
@@ -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);
index f1e66490ad6c2cabf8e95f3afac1e8b3eae26432..9b9841bf6d5e09cd6163c62a6c688c27db48a02a 100644 (file)
@@ -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";
 
index 99001c9ed5ae7b5a8bb89f36de3538c2fb5f2d71..f03373ae694ebb58d0c3941421419f1de6e59d4d 100644 (file)
@@ -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++;
        }
index 329fa2aa0c25ff2c25cb850a3c8de803fcd0145c..c9858c258c78e1e02b7a66f3b62c0ed61e76db3f 100644 (file)
@@ -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);
                
index 5c0ef36727fdfe380d142d3f9bb0544d499178f7..786e99ed284a54fedb07da59f34b2917c7f1b2ca 100644 (file)
@@ -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,
index 4126998de18f7399c24225e0c27fe2799636c3fa..0ec162b2571c1e6e98967fb5a1dd4e0fc4944493 100644 (file)
@@ -29,7 +29,7 @@
 <h2>Edit your team</h2>
 <form action="<%== url_for 'manager_edit' %>" method="post">
 
-  %= $rider_select->('TT', 'Time Trialist');
+  %= $rider_select->('CLIMBER', 'Climber');
   %= $rider_select->('CLIMBER', 'Climber');
   %= $rider_select->('CLIMBER', 'Climber');
   %= $rider_select->('WATER', 'Domestique');