X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-live.git;a=blobdiff_plain;f=yarrg%2Fweb%2Fquery_commod;h=8d55f2686130568ba92d2c578dd787d2362e368e;hp=eddc0975d05f067358c6835a81710d97f8039b8d;hb=3dbb2f33eae3a509123ffc99e48e35f858a8292a;hpb=72587d0d7358ca77ecd0ede859abba7f89b1d9d2 diff --git a/yarrg/web/query_commod b/yarrg/web/query_commod index eddc097..8d55f26 100644 --- a/yarrg/web/query_commod +++ b/yarrg/web/query_commod @@ -35,38 +35,33 @@ <%args> $quri +$dbh +$commodid => undef; $commodstring => ''; +$prselector $someresults $emsgokorprint <%perl> my $emsg; -my ($commodname,$commodid); +my ($commodname,$cmid); my $qa= \%ARGS; -

Select commodity

+
+

Commodity enquiry

-%#---------- textbox, user enters route as string ---------- -% if (!$qa->{Dropdowns}) { - -Enter commodity (abbreviations are OK):
+% $prselector->('BuySell'); +% $prselector->('ShowBlank');
-<&| qtextstring, qa => $qa, thingstring => 'commodstring', emsgstore => \$emsg, - perresult => sub { ($commodname,$commodid)= @_; } +<& enter_commod, qa => $qa, dbh => $dbh, emsg_r => \$emsg, + commodname_r => \$commodname, + cmid_r => \$cmid &> - size=80 - - -% } else { #---------- dropdowns, user selects from menus ---------- - -Not yet implemented. - -% } #---------- end of dropdowns, now common middle of page code ---------- % my $ours= sub { $_[0] =~ m/^commodstring|^commodid/; }; @@ -75,10 +70,150 @@ Not yet implemented.
%#========== results ========== -% $emsgokorprint->($emsg) or $commodid=undef; +
+
+<%perl> -% if (defined $commodid) { -% $someresults->(); -COMMODITY <% $commodid %> named <% $commodname |h %> +$emsgokorprint->($emsg) or $cmid=undef; +print("
"), return + unless defined $cmid; +$someresults->(); + +#---------- actually compute the results and print them ---------- + +foreach my $bs (split /_/, $ARGS{BuySell}) { + $bs =~ m/^(buy|sell)$/ or die; + $bs= $1; + my ($ascdesc) = ($bs eq 'buy') + ? ('DESC') + : ('ASC'); + my $joinkind= $ARGS{ShowBlank} ? 'LEFT OUTER JOIN' : 'INNER JOIN'; + my $islands= $dbh->prepare( + "SELECT islands.islandid AS islandid, archipelago, islandname, + sum(qty) as tqty + FROM islands $joinkind $bs offers + ON islands.islandid == offers.islandid AND commodid == ? + GROUP BY islands.islandid + ORDER BY archipelago, islandname" + ); + + my $offers= $dbh->prepare( + "SELECT stallname, price, qty + FROM $bs NATURAL JOIN stalls + WHERE commodid = ? AND islandid = ? + ORDER BY price $ascdesc" + ); -% } + + +

Offers to <% uc $bs |h %> <% $commodname |h %>

+% $islands->execute($cmid); +% my $island; +% my %ts_sortkeys; +% my $rowix= 0; +% while ($island= $islands->fetchrow_hashref) { +% if (!$rowix) { + +++++ + + +% } +% my $islandid= $island->{'islandid'}; +% $offers->execute($cmid, $islandid); +% my ($offer, $bestprice, $marginal, @beststalls); +% my $tqty= $island->{'tqty'}; +% my $cqty= ''; +% my $bestqty= ''; +% my $approxqty= ''; +% my $median= '-'; +% while ($offer= $offers->fetchrow_hashref) { +% my $price= $offer->{'price'}; +% my $qty= $offer->{'qty'}; +% length $bestqty or $bestprice= $price; +% if ($price == $bestprice) { +% $bestqty += $qty; +% push @beststalls, $offer->{'stallname'}; +% } +% $cqty += $qty; +% if ($cqty*2 >= $tqty && $median eq '-') { +% $median= $price; +% } +% if ($bestprice*9 <= $price*10 and +% $price*10 <= $bestprice*11) { +% $approxqty += $qty; +% } +% } +% my $stallname; +% +% my $rowid= "id_${bs}_$islandid"; +% my $s= [ ]; +% +% $s->[2]= sprintf "%06d", scalar @beststalls; +% if (!@beststalls) { +% $stallname= '-'; +% } elsif (@beststalls==1) { +% $stallname= $beststalls[0]; +% $s->[2] .= " $stallname"; +% } else { +% $stallname= sprintf "%d offers", scalar @beststalls; +% } +% +% $cqty == $tqty or die "$bs $cqty $tqty $cmid $islandid "; + class="<% 'datarow'.($rowix & 1) %>"> + +% for my $cix (0..$#$s) { +% $ts_sortkeys{$cix}{$rowid}= $s->[$cix]; +% } +% $rowix++; +% } +% if ($rowix) { +
+ +Prices +Quantity at price +
Archipelago +Island +Stall(s) +Best +Median +Best ++/-10% +Any +
<% $s->[0]= $island->{'archipelago'} |h %> + <% $s->[1]= $island->{'islandname'} |h %> + <% $stallname |h %> + <% $s->[3]= (length $bestqty ? $bestprice : '-') %> + <% $s->[4]= $median %> + <% $s->[5]= $bestqty %> + <% $s->[6]= $approxqty %> + <% $s->[7]= $cqty %> +
+ +<&| tabsort, table => "${bs}_table", sortkeys => "${bs}_sortkeys", + throw => "${bs}_table_thr", rowclass => 'datarow', cols => [ + {}, {}, + { DoReverse => 1 }, + { DoReverse => 1, Numeric => 1, MapFn => "ts_Pricemap_${bs}" }, + { DoReverse => 1, Numeric => 1, MapFn => "ts_Pricemap_${bs}" }, + { DoReverse => 1, Numeric => 1 }, + { DoReverse => 1, Numeric => 1 }, + { DoReverse => 1, Numeric => 1 }, + ] &> + <% $bs %>_sortkeys= <% to_json_protecttags(\%ts_sortkeys) %>; + function ts_Pricemap_<% $bs %>(price) { + if (price=='-') { return <% $bs eq 'buy' ? '-1' : '99999999' %>; } + return price; + } + +% } else { +No offers. +% } + +<%perl> +} + +