chiark / gitweb /
Minimum trade value feature
[ypp-sc-tools.web-test.git] / yarrg / web / routetrade
index 7db07721efa2b04da634b27eaef3ade6cab34621..9cd57122d66b8fd421fd040dc00ee45abbf66422 100644 (file)
@@ -39,6 +39,7 @@ $dbh
 @archipelagoes
 $qa
 $routeparams
+$reset_suppressions
 </%args>
 <& query_age:pageload &>
 
@@ -48,6 +49,8 @@ my $loss_per_league= defined $routeparams->{LossPerLeaguePct}
        ? $routeparams->{LossPerLeaguePct}*0.01 : 1e-7;
 my $loss_per_delay_slot= 1e-8;
 
+my $minprofit= $routeparams->{MinProfit} || 0;
+
 my $now= time;
 
 my @flow_conds;
@@ -140,6 +143,9 @@ my $stmt= "
                commods.commodid                                commodid,
                commods.unitmass                                unitmass,
                commods.unitvolume                              unitvolume,
+               commods.ordval                                  ordval,
+               commods.posinclass                              posinclass,
+               commods.commodclassid                           commodclassid,
                dist                                            dist,
                buy.price - sell.price                          unitprofit
        FROM commods
@@ -272,13 +278,19 @@ Searched for arbitrage trades only, in <% $archipelagoes[0] |h %>
 
 <%perl>
 
-my @sail_total;
-
 if (!@flows) {
        print 'No profitable trading opportunities were found.';
        return;
 }
 
+my @sail_total;
+my %opportunity_value;
+
+my $oppo_key= sub {
+       my ($f) = @_;
+       return join '_', map { $f->{$_} } qw(org_id dst_id commodid);
+};
+
 foreach my $f (@flows) {
 
        $f->{MaxQty}= $f->{'org_qty_agg'} < $f->{'dst_qty_agg'}
@@ -303,6 +315,8 @@ foreach my $f (@flows) {
 
        $dists{'org_id'}{'dst_id'}= $f->{'dist'};
 
+       $opportunity_value{ $oppo_key->($f) } += $f->{MaxProfit};
+
        my @uid= $f->{commodid};
        foreach my $od (qw(org dst)) {
                push @uid,
@@ -365,11 +379,20 @@ foreach my $f (@flows) {
                $f->{UidLong} eq $recons_long or
                        die "$f->{UidLong} = $f->{UidShort} = $recons_long ?";
        }
+}
+
+foreach my $f (@flows) {
 
-       if (defined $qa->{"R$f->{UidShort}"} &&
-           !defined $qa->{"T$f->{UidShort}"}) {
-               $f->{Suppress}= 1;
+       if ($reset_suppressions || !defined $qa->{"R$f->{UidShort}"}) {
+               if ($opportunity_value{ $oppo_key->($f) } < $minprofit) {
+                       $f->{Suppress}= 1;
+               }
        } else {
+               if (!defined $qa->{"T$f->{UidShort}"}) {
+                       $f->{Suppress}= 1;
+               }
+       }
+       if (!$f->{Suppress}) {
                my $sfis= $ipair2subflowinfs{$f->{'org_id'},$f->{'dst_id'}};
                foreach my $sfi (@$sfis) {
                        my $subflow= {
@@ -659,14 +682,18 @@ Generated by YARRG at <strong><%
 %
 % foreach my $i (0..$#islandids) {
 <% $tbody->(1) %>
-<tr><td colspan=4>
+<tr>
 %      $iquery->execute($islandids[$i]);
 %      my ($islandname) = $iquery->fetchrow_array();
 %      if (!$i) {
+<td colspan=2>
 <strong>Start at <% $islandname |h %></strong>
+<td colspan=2><a href="docs#posinclass">[what are these codes?]</a>
+<td>
 %      } else {
 %              my $this_dist= $distance->($islandids[$i-1],$islandids[$i]);
 %              $total_dist += $this_dist;
+<td colspan=5>
 <%perl>
                my $total_value= 0;
                foreach my $sf (@subflows) {
@@ -683,7 +710,7 @@ Generated by YARRG at <strong><%
 <%perl>
      my $age_reported= 0;
      my %flowlists;
-     #print "<tr><td colspan=6>" if $qa->{'debug'};
+     #print "<tr><td colspan=7>" if $qa->{'debug'};
      foreach my $od (qw(org dst)) {
        #print " [[ i $i od $od " if $qa->{'debug'};
        foreach my $sf (@subflows) {
@@ -697,6 +724,7 @@ Generated by YARRG at <strong><%
                my $price= $f->{"${od}_price"};
                my $stallname= $f->{"${od}_stallname"};
                my $todo= \$flowlists{$od}{
+                               (sprintf "%010d", $f->{'ordval'}),
                                $f->{'commodname'},
                                (sprintf "%07d", ($od eq 'dst' ?
                                                9999999-$price : $price)),
@@ -708,6 +736,33 @@ Generated by YARRG at <strong><%
                        dstArbitrage => 0,
                } unless $$todo;
                $$todo->{'commodname'}= $f->{'commodname'};
+               $$todo->{'posinclass'}= '';
+               my $incl= $f->{'posinclass'};
+
+               my $findclass= $dbh->prepare(<<END);
+SELECT commodclass, maxposinclass FROM commodclasses WHERE commodclassid = ?
+END
+               $findclass->execute($f->{'commodclassid'});
+               my $classinfo= $findclass->fetchrow_hashref();
+               if ($classinfo) {
+                       my $clname= $classinfo->{'commodclass'};
+                       my $desc= encode_entities(sprintf "%s is under %s",
+                                       $f->{'commodname'}, $clname);
+                       my $abbrev= substr($clname,0,1);
+                       if ($incl) {
+                               my $maxpic= $classinfo->{'maxposinclass'};
+                               $desc.= (sprintf ", commodity %d of %d",
+                                       $incl, $maxpic);
+                               if ($classinfo->{'maxposinclass'} >= 8) {
+                                       my @tmbs= qw(0 1 2 3 4 5 6 7 8 9);
+                                       my $tmbi= ($incl+0.5)*$#tmbs/$maxpic;
+                                       $abbrev.= " ".$tmbs[$tmbi]."&nbsp;";
+                               }
+                       }
+                       $$todo->{'posinclass'}=
+                               "<div class=mouseover title=\"$desc\">"
+                               .$abbrev."</div>";
+               }
                $$todo->{'stallname'}= $stallname;
                $$todo->{Price}= $price;
                $$todo->{Timestamp}= $f->{"${od}_timestamp"};
@@ -739,7 +794,7 @@ Generated by YARRG at <strong><%
 </%perl>
 <tr>
 <td colspan=1>
-<td colspan=2><% $xinfo %>
+<td colspan=3><% $xinfo %>
 <td colspan=2 align=right><% $totaldesc %>
 <td align=right><% $totalwas |h %> total
 <%perl>
@@ -770,6 +825,7 @@ Generated by YARRG at <strong><%
 % tr_datarow($m,$dline);
 <<% $td %>><% $collectdeliver %>
 <<% $td %>><% $t->{'commodname'} |h %>
+<<% $td %>><% $t->{'posinclass'} %>
 %
 %              my @stalls= sort keys %{ $t->{Stalls} };
 %              my $pstall= sub {
@@ -816,7 +872,7 @@ Generated by YARRG at <strong><%
 }
 </%perl><a name="summary"></a>
 <% $tbody->(1) %><tr>
-<td colspan=2>Total distance: <% $total_dist %> leagues.
+<td colspan=3>Total distance: <% $total_dist %> leagues.
 <td colspan=3 align=right>Overall net cash flow
 <td align=right><strong><%
   $total_total < 0 ? -$total_total." loss" : $total_total." gain"