This Mason component is the core trade planner for a specific route.
+========== TODO ==========
+16:36 <ceb> alpha,byrne,papaya,turtle,jorvik,luthien is my example
+
+16:37 <ceb> if tehre are 2 rows which take the same object and sell it for the
+ same profit at two other islands, choose the shortest route as the
+ preferred one
+16:37 <ceb> coconut buy 10 sell 16, at luthien or jorvik, in that example
+16:38 <ceb> Do you see what I mean?
+
+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?
+16:39 <ceb> Also, maybe colour to highlight the suggested trades?
+
+16:40 <ceb> columns should be sortable with the small arrows as before
+
+16:51 <ceb> YPP interfaces have price then qty. You have qty then price. This
+ is confusing!
+16:51 <ceb> the max column ordering is OK
+16:51 <ceb> (alo profit and suggested are OK)
+16:52 <Diziet> Err, you want qty on the left in those two but on the right in
+ collect and deliver ?
+16:53 <ceb> Yes (price and capital are not the same thing)
+16:53 <Diziet> OK
+16:53 <ceb> for max the order in which you want to think about it is 'I need to
+ buy ten of them and that will cost me $total price)
+16:54 <ceb> s/)/'/
+
+16:46 <ceb> Also trading plan not functional but I guess you know that :-)
+
+Also:
+- potential cost of losses
+- max volume/mass
+- use POST for update. Hrrm.
+
+========== TODO ==========
+
</%doc>
<%args>
$dbh
$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>
$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'
die "$f->{UidLong} = $f->{UidShort} = $recons_long ?";
}
- if ($qa->{"R$f->{UidShort}"} && !$qa->{"T$f->{UidShort}"}) {
+ if (defined $qa->{"R$f->{UidShort}"} &&
+ !defined $qa->{"T$f->{UidShort}"}) {
$f->{Suppress}= 1;
}
die unless $found_section;
};
-push @columns, qw(OptQty OptCapital OptProfit);
+$addcols->({}, qw(
+ OptQty
+ ));
+$addcols->({ Total => 0 }, qw(
+ OptCapital OptProfit
+ ));
</%perl>
% {
% my $cdspan= $qa->{ShowStalls} ? ' colspan=2' : '';
% my $cdstall= $qa->{ShowStalls} ? '<th>Stall</th>' : '';
-<table>
+<table rules=groups>
+<colgroup span=1>
+<colgroup span=2>
+<% $qa->{ShowStalls} ? '<colgroup span=2>' : '' %>
+<colgroup span=1>
+<colgroup span=2>
+<colgroup span=2>
+<colgroup span=2>
+<colgroup span=3>
+% if ($optimise) {
+<colgroup span=3>
+% }
<tr>
<th>
<th<% $cdspan %>>Collect
<th>Island <% $cdstall %>
<th>Island <% $cdstall %>
<th>Commodity
-<th>Price
<th>Qty
<th>Price
<th>Qty
-<th>Unit
+<th>Price
<th>Margin
+<th>Unit
<th>Qty
<th>Capital
<th>Profit
<td><input type=hidden name=R<% $flow->{UidShort} %> value="">
<input type=checkbox name=T<% $flow->{UidShort} %> value=""
<% $flow->{Suppress} ? '' : 'checked' %> >
-% foreach my $col (@columns) {
-<td><% $flow->{$col} |h %>
+% foreach my $ci (0..$#cols) {
+% my $col= $cols[$ci];
+% my $v= $flow->{$col->{Name}};
+% $col->{Total} += $v if defined $col->{Total};
+% $v='' if !$col->{Text} && !$v;
+<td <% $col->{Text} ? '' : 'align=right' %>><% $v |h %>
+% }
+% }
+<tr>
+<th>
+<th colspan=2>Total
+% foreach my $ci (2..$#cols) {
+% my $col= $cols[$ci];
+<td align=right>
+% if (defined $col->{Total}) {
+<% $col->{Total} |h %>
% }
% }
</table>
<input type=submit name=update value="Update">
+% if ($optimise) { # ========== TRADING PLAN ==========
+%
+% my $iquery= $dbh->prepare('SELECT islandname FROM islands
+% WHERE islandid = ?');
+%
+<h1>Voyage trading plan</h1>
+<table>
+% foreach my $i (0..$#islandids) {
+<tr><td colspan=4><strong>
+% $iquery->execute($islandids[$i]);
+% my ($islandname) = $iquery->fetchrow_array();
+% if (!$i) {
+Start at <% $islandname |h %>
+% } else {
+Sail to <% $islandname |h %>
+% }
+</strong>
+% 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) {
+% next if $f->{Suppress};
+% next unless $f->{"${od}_id"} == $islandids[$i];
+% next unless $f->{OptQty};
+<tr>Buy or sell flow
+% }
+% }
+% }
+</table>
+%
+% } # ========== TRADING PLAN ==========
+
<%init>
use CommodsWeb;
use Commods;