X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=yarrg%2Fweb%2Froutetrade;h=6bc7277d341a69049358dbb40176700657674187;hb=f41b94c1ec31bbff084b7429c1aec495aca2ab1e;hp=dcf3671620f32b8680c7375b6d714e911442ed0d;hpb=4311ae355f0a94637c94d1d02a6edcbe65bebaa7;p=ypp-sc-tools.web-live.git
diff --git a/yarrg/web/routetrade b/yarrg/web/routetrade
index dcf3671..6bc7277 100644
--- a/yarrg/web/routetrade
+++ b/yarrg/web/routetrade
@@ -142,16 +142,31 @@ my $sth= $dbh->prepare($stmt);
$sth->execute(@query_params);
my @flows;
-my @columns;
+my @cols;
+
+my $addcols= sub {
+ my $base= shift @_;
+ foreach my $name (@_) {
+ push @cols, { Name => $name, %$base };
+ }
+};
+
if ($qa->{ShowStalls}) {
- push @columns, qw(org_name org_stallname dst_name dst_stallname);
+ $addcols->({ Text => 1 }, qw(
+ org_name org_stallname
+ dst_name dst_stallname
+ ));
} else {
- push @columns, qw(org_name dst_name);
+ $addcols->({Text => 1 }, qw(
+ org_name dst_name
+ ));
}
-push @columns, qw(commodname
- org_price org_qty dst_price dst_qty
- unitprofit PctProfit
- MaxQty MaxCapital MaxProfit);
+$addcols->({ Text => 1 }, qw(commodname));
+$addcols->({},
+ qw( org_qty org_price dst_qty dst_price
+ Margin unitprofit MaxQty
+ MaxCapital MaxProfit
+ ));
%perl>
@@ -176,7 +191,7 @@ push @columns, qw(commodname
$f->{MaxProfit}= $f->{MaxQty} * $f->{'unitprofit'};
$f->{MaxCapital}= $f->{MaxQty} * $f->{'org_price'};
- $f->{PctProfit}= sprintf "%3.1f%%",
+ $f->{Margin}= sprintf "%3.1f%%",
$f->{'dst_price'} * 100.0 / $f->{'org_price'} - 100.0;
$f->{"org_stallid"}= $f->{"dst_stallid"}= 'all'
@@ -186,13 +201,66 @@ push @columns, qw(commodname
foreach my $od (qw(org dst)) {
push @uid,
$f->{"${od}_id"},
- $f->{"${od}_price"},
- $f->{"${od}_stallid"};
+ $f->{"${od}_price"};
+ push @uid,
+ $f->{"${od}_stallid"}
+ if $qa->{ShowStalls};
+ }
+ $f->{UidLong}= join '_', @uid;
+
+ my $base= 31;
+ my $cmpu= '';
+ map {
+ my $uue= $_;
+ my $first= $base;
+ do {
+ my $this= $uue % $base;
+print STDERR "uue=$uue this=$this ";
+ $uue -= $this;
+ $uue /= $base;
+ $this += $first;
+ $first= 0;
+ $cmpu .= chr($this + ($this < 26 ? ord('a') :
+ $this < 52 ? ord('A')-26
+ : ord('0')-52));
+print STDERR " uue=$uue this=$this cmpu=$cmpu\n";
+die "$cmpu $uue ?" if length $cmpu > 20;
+ } while ($uue);
+ $cmpu;
+ } @uid;
+ $f->{UidShort}= $cmpu;
+
+ if ($qa->{'debug'}) {
+ my @outuid;
+ $_= $f->{UidShort};
+ my $mul;
+ while (m/./) {
+ my $v= m/^[a-z]/ ? ord($&)-ord('a') :
+ m/^[A-Z]/ ? ord($&)-ord('A')+26 :
+ m/^[0-9]/ ? ord($&)-ord('0')+52 :
+ die "$_ ?";
+ if ($v >= $base) {
+ push @outuid, 0;
+ $v -= $base;
+ $mul= 1;
+#print STDERR "(next)\n";
+ }
+ die "$f->{UidShort} $_ ?" unless defined $mul;
+ $outuid[$#outuid] += $v * $mul;
+
+#print STDERR "$f->{UidShort} $_ $& v=$v mul=$mul ord()=".ord($&).
+# "[vs.".ord('a').",".ord('A').",".ord('0')."]".
+# " outuid=@outuid\n";
+
+ $mul *= $base;
+ s/^.//;
+ }
+ my $recons_long= join '_', @outuid;
+ $f->{UidLong} eq $recons_long or
+ die "$f->{UidLong} = $f->{UidShort} = $recons_long ?";
}
- $f->{Uid}= join '_', @uid;
- if ($qa->{"rtsela_$f->{Uid}"} &&
- !$qa->{"rtselg_$f->{Uid}"}) {
+ if ($qa->{"R$f->{UidShort}"} && !$qa->{"T$f->{UidShort}"}) {
$f->{Suppress}= 1;
}
@@ -228,7 +296,7 @@ Maximize
totalprofit:
".(join " +
- ", map { "$_->{unit_profit} $_->{Var}" } @flows)."
+ ", map { "$_->{unitprofit} $_->{Var}" } @flows)."
Subject To
";
@@ -311,9 +379,12 @@ if ($qa->{'debug'}) {
die unless $found_section;
};
-print join ' ', map { $_->{Optimal} } @flows;
-
-push @columns, qw(OptQty OptCapital OptProfit);
+$addcols->({}, qw(
+ OptQty
+ ));
+$addcols->({ Total => 0 }, qw(
+ OptCapital OptProfit
+ ));
%perl>
@@ -322,7 +393,18 @@ push @columns, qw(OptQty OptCapital OptProfit);
% {
% my $cdspan= $qa->{ShowStalls} ? ' colspan=2' : '';
% my $cdstall= $qa->{ShowStalls} ? '
Stall | ' : '';
-