chiark / gitweb /
Rationalise various ids
[ypp-sc-tools.main.git] / yarrg / web / routetrade
index a52531c57758a8e5fff6d1cbc66802b483d1cfba..597f9eea3f7fc937a921e6056348064e1a041d66 100644 (file)
@@ -98,30 +98,43 @@ my $stmt= "
        SELECT  sell_islands.islandname                         org_name,
                sell_islands.islandid                           org_id,
                sell.price                                      org_price,
-               sum(sell.qty)                                   org_qty,
                buy_islands.islandname                          dst_name,
                buy_islands.islandid                            dst_id,
                buy.price                                       dst_price,
+".($qa->{ShowStalls} ? "
+               sell.stallid                                    org_stallid,
+               sell_stalls.stallname                           org_stallname,
+               sell.qty                                        org_qty,
+               buy.stallid                                     dst_stallid,
+               buy_stalls.stallname                            dst_stallname,
+               buy.qty                                         dst_qty,
+" : "
+               sum(sell.qty)                                   org_qty,
                sum(buy.qty)                                    dst_qty,
+")."
                commods.commodname                              commodname,
                commods.commodid                                commodid,
                commods.unitmass                                unitmass,
                commods.unitvolume                              unitvolume,
-               buy.price - sell.price                          unitprofit,
-               min(sell.qty,buy.qty)                           tqty,
-               min(sell.qty,buy.qty) * (buy.price-sell.price)  profit
+               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
+".($qa->{ShowStalls} ? "
+       JOIN stalls  as sell_stalls  on sell.stallid  = sell_stalls.stallid
+       JOIN stalls  as buy_stalls   on buy.stallid   = buy_stalls.stallid
+" : "")."
        WHERE   (
                ".join("
           OR   ", @flow_conds)."
        )
          AND   buy.price > sell.price
+".($qa->{ShowStalls} ? "" : "
        GROUP BY commods.commodid, org_id, org_price, dst_id, dst_price
-       ORDER BY org_name, dst_name, profit DESC, commodname,
+")."
+       ORDER BY org_name, dst_name, commodname, unitprofit DESC,
                 org_price, dst_price DESC
      ";
 
@@ -129,6 +142,17 @@ my $sth= $dbh->prepare($stmt);
 $sth->execute(@query_params);
 my @flows;
 
+my @columns;
+if ($qa->{ShowStalls}) {
+       push @columns,       qw(org_name org_stallname dst_name dst_stallname);
+} else {
+       push @columns,       qw(org_name dst_name);
+}
+push @columns,              qw(commodname
+                               org_price org_qty dst_price dst_qty
+                               unitprofit PctProfit
+                               MaxQty MaxCapital MaxProfit);
+
 </%perl>
 
 % if ($qa->{'debug'}) {
@@ -138,19 +162,45 @@ my @flows;
 </pre>
 % }
 
+<& dumptable:start, qa => $qa, sth => $sth &>
 % {
-<& dumpqueryresults:start, sth => $sth &>
-%   my $flow;
-%   while ($flow= $sth->fetchrow_hashref()) {
-%      $flow->{Ix}= @flows;
-%      $flow->{Var}= "f$flow->{Ix}";
-%      push @flows, $flow;
-<& dumpqueryresults:row, sth => $sth, row => $flow &>
+%   my $f;
+%   while ($f= $sth->fetchrow_hashref()) {
+<%perl>
+
+       $f->{Ix}= @flows;
+       $f->{Var}= "f$f->{Ix}";
+
+       $f->{MaxQty}= $f->{'org_qty'} < $f->{'dst_qty'}
+               ? $f->{'org_qty'} : $f->{'dst_qty'};
+       $f->{MaxProfit}= $f->{MaxQty} * $f->{'unitprofit'};
+       $f->{MaxCapital}= $f->{MaxQty} * $f->{'org_price'};
+
+       $f->{PctProfit}= sprintf "%3.1f%%",
+               $f->{'dst_price'} * 100.0 / $f->{'org_price'} - 100.0;
+
+       $f->{"org_stallid"}= $f->{"dst_stallid"}= 'all'
+               if !$qa->{ShowStalls};
+
+       my @uid= $f->{commodid};
+       foreach my $od (qw(org dst)) {
+               push @uid,
+                       $f->{"${od}_id"},
+                       $f->{"${od}_price"},
+                       $f->{"${od}_stallid"};
+       }
+       $f->{Uid}= join '_', @uid;
+
+       push @flows, $f;
+
+</%perl>
+<& dumptable:row, qa => $qa, sth => $sth, row => $f &>
 %   }
-<& dumpqueryresults:end &>
+<& dumptable:end, qa => $qa &>
 % }
 
-% if (!$specific || $confusing || @islandids<=1) {
+% my $optimise= $specific && !$confusing && @islandids>1;
+% if (!$optimise) {
 
 <p>
 % if (@islandids<=1) {
@@ -173,7 +223,7 @@ Maximize
 
   totalprofit:
                   ".(join " +
-                  ", map { "$_->{profit} $_->{Var}" } @flows)."
+                  ", map { "$_->{unit_profit} $_->{Var}" } @flows)."
 
 Subject To
 ";
@@ -181,12 +231,15 @@ Subject To
 my %avail_csts;
 foreach my $flow (@flows) {
        foreach my $od (qw(org dst)) {
-               my $cstname= join '_',
+               my $cstname= join '_', (
                        'avail',
                        $flow->{'commodid'},
                        $od,
                        $flow->{"${od}_id"},
-                       $flow->{"${od}_price"};
+                       $flow->{"${od}_price"},
+                       $flow->{"${od}_stallid"},
+               );
+                       
                push @{ $avail_csts{$cstname}{Flows} }, $flow->{Var};
                $avail_csts{$cstname}{Qty}= $flow->{"${od}_qty"};
        }
@@ -235,9 +288,12 @@ if ($qa->{'debug'}) {
                        $found_section= 2;
                        next;
                }
-               m/^\s*\d+\s+f(\d+)\s+\S+\s+(\d+)\s/ or die "$_ ?";
-               die if $1 >= @flows;
-               $flows[$1]{Optimal}= $2;
+               my ($ix, $qty) =
+                       m/^\s*\d+\s+f(\d+)\s+\S+\s+(\d+)\s/ or die "$_ ?";
+               my $flow= $flows[$ix] or die;
+               $flow->{OptQty}= $qty;
+               $flow->{OptProfit}= $flow->{'unitprofit'} * $qty;
+               $flow->{OptCapital}= $flow->{OptQty} * $flow->{'org_price'};
        }
        print "</pre>\n" if $qa->{'debug'};
        pipethrough_run_finish($output, 'glpsol');
@@ -246,9 +302,56 @@ if ($qa->{'debug'}) {
 
 print join ' ', map { $_->{Optimal} } @flows;
 
+push @columns, qw(OptQty OptCapital OptProfit);
+
 </%perl>
+
 % } # ========== OPTIMISATION ==========
 
+% {
+%      my $cdspan= $qa->{ShowStalls} ? ' colspan=2' : '';
+%      my $cdstall= $qa->{ShowStalls} ? '<th>Stall</th>' : '';
+<table>
+<tr>
+<th<% $cdspan %>>Collect
+<th<% $cdspan %>>Deliver
+<th>
+<th colspan=2>Collect
+<th colspan=2>Deliver
+<th colspan=2>Profit
+<th colspan=3>Max
+%      if ($optimise) {
+<th colspan=3>Suggested
+%      }
+
+<tr>
+<th>Island <% $cdstall %>
+<th>Island <% $cdstall %>
+<th>Commodity
+<th>Price
+<th>Qty
+<th>Price
+<th>Qty
+<th>Unit
+<th>Margin
+<th>Qty
+<th>Capital
+<th>Profit
+%      if ($optimise) {
+<th>Qty
+<th>Capital
+<th>Profit
+%      }
+% }
+
+% foreach my $flow (@flows) {
+<tr>
+%      foreach my $col (@columns) {
+<td><% $flow->{$col} |h %>
+%      }
+% }
+</table>
+
 <%init>
 use CommodsWeb;
 use Commods;