chiark / gitweb /
sort by price by default
authorian <ian>
Wed, 14 Apr 2004 17:04:41 +0000 (17:04 +0000)
committerian <ian>
Wed, 14 Apr 2004 17:04:41 +0000 (17:04 +0000)
farnell/farnell-find

index b5a403445e98e81e4d8d9e6129b64a201968286b..f390a70408e74026a874ae64ebaba635e3fead4b 100755 (executable)
@@ -74,6 +74,14 @@ our(%itemdesc);
 our(%iteminfo);
 # $iteminfo{$item}= by_item(...);
 
+our(%show);
+# $show{$item}{Head}      ) newline terminated
+# $show{$item}{Info}      )  strings ready to print
+# $show{$item}{Price}     calculated value
+
+our($sorthow);
+# desc or price
+
 our($partword1_re)= '\S*[^ \t0-9-]\S*';
 our($partword_re)= '\S*[^ \t0-9/=]\S*';
 our($part_re)= "$partword1_re(?: $partword_re)*";
@@ -178,12 +186,17 @@ sub read_spec () {
 
 sub itemsortmap ($) {
     my ($item) = @_;
-    my ($bi, $title);
+    my ($z, $bi, $title);
+    if ($sorthow eq 'price') {
+       $z= sprintf "%030.20f ", 1.0 / ($show{$item}{Price} + 0.0001);
+    } else {
+       $z= '';
+    }
     $bi= $iteminfo{$item};
-    return "? $item" if !defined $bi;
+    return "? $z $item" if !defined $bi;
     $title= $bi->{Description};
     $title .= "\n".$1 if $title =~ s/^(\[[^][]+\]) //;
-    return $title;
+    return "$z $title";
 }
 
 sub analyse_spec () {
@@ -247,8 +260,7 @@ sub analyse_spec () {
        $bi= by_item($item, $why);
        $iteminfo{$item}= $bi;
     }  
-    foreach $item (sort { itemsortmap($a) cmp itemsortmap($b); }
-                  keys %iteminstances) {
+    foreach $item (keys %iteminstances) {
        undef $qty;
        foreach $ii (@{ $iteminstances{$item} }) {
            if (!defined $qty) {
@@ -264,27 +276,33 @@ sub analyse_spec () {
        $avail= $bi->{Avail};
        $avail{$avail}= 1;
        $avail= ' '.$stockmap{$avail} if exists $stockmap{$avail};
-       printf("%5d%1s %-11s %-.${desclen}s %6.2f %6.2f%1s %s\n",
-              $toorder, $notechar, $item, $bi->{Description},
-              $bi->{Price}, $price, $notechar, $avail)
-           or die $!;
+       $show{$item}{Head}=
+           sprintf("%5d%1s %-11s %-.${desclen}s %6.2f %6.2f%1s %s\n",
+                   $toorder, $notechar, $item, $bi->{Description},
+                   $bi->{Price}, $price, $notechar, $avail);
+       $show{$item}{Info}= '';
        $total += $price;
+       $show{$item}{Price}= $price;
        foreach $desc (@{ $itemdesc{$item} }) {
-           printf("%*s %s\n",
-                  (5+1+1+11),'',
-                  $desc)
-               or die $!;
+           $show{$item}{Info} .=
+               sprintf("%*s %s\n",
+                       (5+1+1+11),'',
+                       $desc);
        }
        foreach $ii (@{ $iteminstances{$item} }) {
            $ql= $ii->{Qty}; $qr= '';
            if ($ql =~ s/\D.*$//) { $qr= $&; }
-           printf("%*s %5s%-2s %s\n",
-                  (5+1+5),'',
-                  $ql,$qr,
-                  $ii->{Use})
-               or die $!;
+           $show{$item}{Info} .=
+               sprintf("%*s %5s%-2s %s\n",
+                       (5+1+5),'',
+                       $ql,$qr,
+                       $ii->{Use});
        }
-       printf "\n" or die $!;
+    }
+    foreach $item (sort { itemsortmap($a) cmp itemsortmap($b); }
+                  keys %show) {
+       print $show{$item}{Head}, $show{$item}{Info}, "\n"
+           or die $!;
     }
     printf("%*s %11s %-*s %6.2f\n",
           (5+1), 'TOTAL',
@@ -371,8 +389,10 @@ if (@ARGV==1 && $ARGV[0] =~ m/^\d\d\d\-/) {
     foreach $k (sort keys %$chr) {
        printf "%-20s %s\n", $k, $chr->{$k} or die $!;
     }
-} elsif (@ARGV==1) {
+} elsif (@ARGV==1 || @ARGV==2) {
     open F, "< $ARGV[0]" or die $!;
+    $sorthow= @ARGV>1 ? $ARGV[1] : 'price';
+    die unless $sorthow !~ m/^(?:cost|desc)$/;
     read_spec();
     close F or die $!;
     analyse_spec();