chiark / gitweb /
Fix spurious ARRAY in deststring (due to erroneous multiple deststring inputs)
[ypp-sc-tools.db-live.git] / yarrg / web / routetrade
index 9660094532aa1544fb5db23092546991c098ee75..21f4711cebfe0498d72f70ec7a2e66b7b25c49b0 100644 (file)
@@ -39,6 +39,8 @@ $dbh
 @archipelagoes
 $qa
 $routeparams
+$reset_suppressions
+$quri
 </%args>
 <& query_age:pageload &>
 
@@ -48,6 +50,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;
@@ -275,13 +279,21 @@ 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);
+};
+
+my $any_previous_suppression= 0;
+
 foreach my $f (@flows) {
 
        $f->{MaxQty}= $f->{'org_qty_agg'} < $f->{'dst_qty_agg'}
@@ -306,6 +318,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,
@@ -368,11 +382,21 @@ 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}"}) {
+                       $any_previous_suppression= 1;
+                       $f->{Suppress}= 1;
+               }
+       }
+       if (!$f->{Suppress}) {
                my $sfis= $ipair2subflowinfs{$f->{'org_id'},$f->{'dst_id'}};
                foreach my $sfi (@$sfis) {
                        my $subflow= {
@@ -392,13 +416,24 @@ foreach my $f (@flows) {
 }
 </%perl>
 
-% my $optimise= $specific;
-% if (!$optimise) {
+% my $optimise= 1;
 
-<p>
 % if (!$specific) {
+%      $optimise= 0;
 Route contains archipelago(es), not just specific islands.
+% } elsif (!@subflows) {
+%      $optimise= 0;
+%      if ($any_previous_suppression) {
+All available trades deselected.
+%      } else {
+No available trades meet the specified minimum trade value, so
+all available trades deselected.
+%      }
 % }
+
+% if (!$optimise) {
+
+<p>
 Therefore, optimal voyage trade plan not calculated.
 
 % } else { # ========== OPTMISATION ==========
@@ -715,6 +750,7 @@ Generated by YARRG at <strong><%
                        orgArbitrage => 0,
                        dstArbitrage => 0,
                } unless $$todo;
+               $$todo->{'commodid'}= $f->{'commodid'};
                $$todo->{'commodname'}= $f->{'commodname'};
                $$todo->{'posinclass'}= '';
                my $incl= $f->{'posinclass'};
@@ -802,9 +838,13 @@ END
 %              $total += $t->{Total};
 %              my $span= 0 + keys %{ $t->{Stalls} };
 %              my $td= "td rowspan=$span";
+%              my %linkqf= (%{ $qa->{'baseqf'} }, %{ $qa->{'queryqf'} });
+%              $linkqf{'query'}= 'commod';
+%              $linkqf{'commodstring'}= $t->{'commodname'};
+%              $linkqf{'commodid'}= $t->{'commodid'};
 % tr_datarow($m,$dline);
 <<% $td %>><% $collectdeliver %>
-<<% $td %>><% $t->{'commodname'} |h %>
+<<% $td %>><a href="<% $quri->(%linkqf) %>"><% $t->{'commodname'} |h %></a>
 <<% $td %>><% $t->{'posinclass'} %>
 %
 %              my @stalls= sort keys %{ $t->{Stalls} };