chiark / gitweb /
Fix stupid optimisation bug (typoed variable name)
[ypp-sc-tools.web-live.git] / yarrg / web / routetrade
index 2438059a170cb1bf124dfd7fffe91b9b98c45f37..58f21a1a581a45ab3ae28a2d6caf4e8d991e07f1 100644 (file)
 ========== TODO ==========
 16:36 <ceb> alpha,byrne,papaya,turtle,jorvik,luthien is my example
 
-16:39 <ceb> Also, maybe colour to highlight the suggested trades?
-
-16:46 <ceb> Also trading plan not functional but I guess you know that :-)
-
 use POST for update.  Hrrm.
 
 LATER OR NOT AT ALL
@@ -47,8 +43,6 @@ adjustable potential cost of losses (rather than fixed 1e-BIG per league)
 
 max volume/mass
 
-16:38 <ceb> I don't know how hard this is, but can you show only the suggested 
-            trades to start ith and have a button to show all?
 ========== TODO ==========
 
 </%doc>
@@ -58,8 +52,13 @@ $dbh
 @archipelagoes
 $qa
 </%args>
+<&| script &>
+  da_pageload= Date.now();
+</&script>
+
 <%perl>
 
+my $now= time;
 my $loss_per_league= 1e-7;
 
 my @flow_conds;
@@ -119,9 +118,11 @@ my $stmt= "
        SELECT  sell_islands.islandname                         org_name,
                sell_islands.islandid                           org_id,
                sell.price                                      org_price,
+               sell_uploads.timestamp                          org_timestamp,
                buy_islands.islandname                          dst_name,
                buy_islands.islandid                            dst_id,
                buy.price                                       dst_price,
+               buy_uploads.timestamp                           dst_timestamp,
 ".($qa->{ShowStalls} ? "
                sell.stallid                                    org_stallid,
                sell_stalls.stallname                           org_stallname,
@@ -140,15 +141,17 @@ my $stmt= "
                dist                                            dist,
                buy.price - sell.price                          unitprofit
        FROM commods
-       JOIN buy  on commods.commodid = buy.commodid
-       JOIN sell on commods.commodid = sell.commodid
-       JOIN islands as sell_islands on sell.islandid = sell_islands.islandid
-       JOIN islands as buy_islands  on buy.islandid  = buy_islands.islandid
+       JOIN buy  ON commods.commodid = buy.commodid
+       JOIN sell ON commods.commodid = sell.commodid
+       JOIN islands AS sell_islands ON sell.islandid = sell_islands.islandid
+       JOIN islands AS buy_islands  ON buy.islandid  = buy_islands.islandid
+       JOIN uploads AS sell_uploads ON sell.islandid = sell_uploads.islandid
+       JOIN uploads AS buy_uploads  ON buy.islandid  = buy_uploads.islandid
 ".($qa->{ShowStalls} ? "
-       JOIN stalls  as sell_stalls  on sell.stallid  = sell_stalls.stallid
-       JOIN stalls  as buy_stalls   on buy.stallid   = buy_stalls.stallid
+       JOIN stalls  AS sell_stalls  ON sell.stallid  = sell_stalls.stallid
+       JOIN stalls  AS buy_stalls   ON buy.stallid   = buy_stalls.stallid
 " : "")."
-       JOIN dists on aiid = sell.islandid AND biid = buy.islandid
+       JOIN dists ON aiid = sell.islandid AND biid = buy.islandid
        WHERE   (
                ".join("
           OR   ", @flow_conds)."
@@ -189,7 +192,12 @@ if ($qa->{ShowStalls}) {
 $addcols->({ Text => 1 }, qw(commodname));
 $addcols->({ DoReverse => 1 },
        qw(     org_price org_qty dst_price dst_qty
-               Margin unitprofit MaxQty
+       ));
+$addcols->({ DoReverse => 1, SortColKey => 'MarginSortKey' },
+       qw(     Margin
+       ));
+$addcols->({ DoReverse => 1 },
+       qw(     unitprofit MaxQty
                MaxCapital MaxProfit
        ));
 
@@ -216,6 +224,8 @@ $addcols->({ DoReverse => 1 },
        $f->{MaxProfit}= $f->{MaxQty} * $f->{'unitprofit'};
        $f->{MaxCapital}= $f->{MaxQty} * $f->{'org_price'};
 
+       $f->{MarginSortKey}= sprintf "%d",
+               $f->{'dst_price'} * 10000 / $f->{'org_price'};
        $f->{Margin}= sprintf "%3.1f%%",
                $f->{'dst_price'} * 100.0 / $f->{'org_price'} - 100.0;
 
@@ -224,7 +234,7 @@ $addcols->({ DoReverse => 1 },
 
        $f->{ExpectedUnitProfit}=
                $f->{'dst_price'} * (1.0 - $loss_per_league) ** $f->{'dist'}
-               - $f->{'src_price'};
+               - $f->{'org_price'};
 
        my @uid= $f->{commodid};
        foreach my $od (qw(org dst)) {
@@ -438,7 +448,7 @@ $addcols->({ Total => 0, DoReverse => 1 }, qw(
 %      if ($optimise) {
 <colgroup span=3>
 %      }
-<tr>
+<tr class="spong">
 <th>
 <th<% $cdspan %>>Collect
 <th<% $cdspan %>>Deliver
@@ -477,9 +487,10 @@ $addcols->({ Total => 0, DoReverse => 1 }, qw(
 <th>
 % }
 
-% foreach my $flow (@flows) {
+% foreach my $flowix (0..$#flows) {
+%      my $flow= $flows[$flowix];
 %      my $rowid= "id_row_$flow->{UidShort}";
-<tr id="<% $rowid %>">
+<tr id="<% $rowid %>" class="datarow<% $flowix & 1 %>">
 <td><input type=hidden   name=R<% $flow->{UidShort} %> value="">
     <input type=checkbox name=T<% $flow->{UidShort} %> value=""
        <% $flow->{Suppress} ? '' : 'checked' %> >
@@ -488,7 +499,9 @@ $addcols->({ Total => 0, DoReverse => 1 }, qw(
 %              my $v= $flow->{$col->{Name}};
 %              $col->{Total} += $v if defined $col->{Total};
 %              $v='' if !$col->{Text} && !$v;
-%              $ts_sortkeys{$ci}{$rowid}= $v;
+%              my $sortkey= $col->{SortColKey} ?
+%                      $flow->{$col->{SortColKey}} : $v;
+%              $ts_sortkeys{$ci}{$rowid}= $sortkey;
 <td <% $col->{Text} ? '' : 'align=right' %>><% $v |h %>
 %      }
 % }
@@ -504,7 +517,7 @@ $addcols->({ Total => 0, DoReverse => 1 }, qw(
 % }
 </table>
 
-<& tabsort, cols => \@cols, table => 'trades',
+<& tabsort, cols => \@cols, table => 'trades', rowclass => 'datarow',
        throw => 'trades_sort', tbrow => 'trades_total' &>
 <&| script &>
   ts_sortkeys= <% to_json_protecttags(\%ts_sortkeys) %>;
@@ -520,11 +533,12 @@ $addcols->({ Total => 0, DoReverse => 1 }, qw(
 %
 % my $iquery= $dbh->prepare('SELECT islandname FROM islands
 %                              WHERE islandid = ?');
+% my %da_ages;
 %
 <h1>Voyage trading plan</h1>
 <table>
 % foreach my $i (0..$#islandids) {
-<tr><td colspan=4><strong>
+<tr><td colspan=<% 2+!!$qa->{ShowStalls} %>><strong>
 %      $iquery->execute($islandids[$i]);
 %      my ($islandname) = $iquery->fetchrow_array();
 %      if (!$i) {
@@ -533,21 +547,69 @@ Start at <% $islandname |h %>
 Sail to <% $islandname |h %>
 %      }
 </strong>
+%    my $age_reported= 0;
 %    foreach my $od (qw(dst org)) {
 %      my $sign= $od eq 'dst' ? -1 : +1;
-%      foreach my $f (sort {
-%                      $a->{'commodname'} cmp $b->{'commodname'}
-%              or $sign * ($a->{"${od}_price"} <=> $b->{"${od}_price"})
-%              or      $a->{"${od}_stallname"} cmp $b->{"${od}_stallname"}
-%              } @flows) {
+%      my %todo;
+%      foreach my $f (@flows) {
 %              next if $f->{Suppress};
 %              next unless $f->{"${od}_id"} == $islandids[$i];
 %              next unless $f->{OptQty};
-<tr><td>Buy or sell flow 
+%              my $price= $f->{"${od}_price"};
+%              my $stallname= $f->{"${od}_stallname"};
+%              my $todo= \$todo{ $f->{'commodname'},
+%                                (sprintf "%07d", $price),
+%                                $stallname };
+%              $$todo= { } unless $$todo;
+%              $$todo->{'commodname'}= $f->{'commodname'};
+%              $$todo->{'stallname'}= $stallname;
+%              $$todo->{Price}= $price;
+%              $$todo->{Timestamp}= $f->{"${od}_timestamp"};
+%              $$todo->{Qty} += $f->{OptQty};
+%              $$todo->{Total}= $$todo->{Price} * $$todo->{Qty};
+%      }
+%      if (%todo && !$age_reported++) {
+<td colspan=2>
+%              my $age= $now - (values %todo)[0]->{Timestamp};
+%              my $cellid= "da_${i}";
+%              $da_ages{$cellid}= $age;
+(Data age: <span id="<% $cellid %>"><% prettyprint_age($age) %></span>)
+%      }
+%      my $total= 0;
+%      my $dline= 0;
+%      foreach my $tkey (sort keys %todo) {
+%              my $t= $todo{$tkey};
+%              $total += $t->{Total};
+<tr class="datarow<% $dline %>"><td>
+%              if ($od eq 'org') {
+Collect
+%              } else {
+Deliver
+%              }
+<td><% $t->{'commodname'} |h %>
+<td align=right><% $t->{Price} |h %> each
+%              if ($qa->{ShowStalls}) {
+<td><% $t->{'stallname'} |h %>
+%              }
+<td align=right><% $t->{Qty} |h %> unit(s)
+<td align=right><% $t->{Total} |h %> total
+%              $dline ^= 1;
+%      }
+%      if (%todo) {
+<tr>
+<td colspan=<% 3+!!$qa->{ShowStalls} %>>
+<td align=right>
+%              if ($od eq 'org') {
+Outlay
+%              } else {
+Proceeds
+%              }
+<td align=right><% $total |h %> total
 %      }
 %    }
 % }
 </table>
+<& query_age:dataages, id2age => \%da_ages &>
 %
 % } # ========== TRADING PLAN ==========