use strict;
use POSIX;
+use IO::Handle;
our(@warn);
our(@fault);
# $parts{"$circuit\n$sper"}[]{Part} or item
# $parts{"$circuit\n$sper"}[]{Qty}
# $parts{"$circuit\n$sper"}[]{Use}
+# $parts{"$circuit\n$sper"}[]{LineNo}
our(%partdef);
# $partdef{"part name"}= $item;
# $iteminstances{$item}[]{Use} includes circuit
# $iteminstances{$item}[]{Qty}
# $iteminstances{$item}[]{Mult} number in this circuit/sper
+# $iteminstances{$item}[]{LineNo}
our(%itemdesc);
# $itemdesc{$item}[]= $desc;
our(%stockmap)= ('In Stock' => 'Y',
'Awaiting Delivery' => 'A');
-sub by_item ($) {
- my ($itemcode) = @_;
+sub by_item ($;$) {
+ my ($itemcode,$why) = @_;
# looks up $itemcode (ddd-d...) at Farnell and returns
# cat hash ref
local ($_);
die "wrong results $sc2 ?\n" unless $sc2 eq $chr->{Shortcode};
1;
}) {
+ my ($emsg);
$@ =~ s/\n$//;
- push @warn, "item $itemcode: $@";
+ $emsg= "item $itemcode: $@";
+ $emsg.= " ($why)" if defined $why;
+ push @warn, $emsg;
return undef;
}
$chr->{Description}= snarf('Description');
die "$_ ?";
} elsif (m,^\s+($part_re|$item_re)\s+([0-9/=]+)(?:\s+(\S.*))?$,) {
push @{ $parts{"$circuit\n$iteratable"} }, {
- Part => $1, Qty => $2, Use => $3
+ Part => $1, Qty => $2, Use => $3, LineNo => $.
};
} elsif (m/^($part_re)\s+\?\s+\=\s+(\S.*)$/) {
die if exists $pkinddesc{$1};
sub analyse_spec () {
my ($part,$pd,$try,@rhs,$sp,$circuit,$iteratable,$count,$pe,$use);
my ($item,$qty,$ii,$bi,$toorder,$price,$total,$notechar,$desc,$ql,$qr);
- my ($avail,%avail);
+ my ($avail,%avail,$desclen,$why);
foreach $part (keys %partdef) {
$item= $partdef{$part};
next if exists $itemdesc{$item};
} elsif (exists $partdef{$part}) {
$item= $partdef{$part};
} else {
- push @fault, "unknown part $part";
+ push @fault, "unknown part $part (line $pe->{LineNo})";
next;
}
push @{ $iteminstances{$item} }, {
Use => $use,
Qty => $pe->{Qty},
Mult => $count,
+ LineNo => $pe->{LineNo}
};
}
}
$total= 0;
- my ($desclen)= 43;
+ $desclen= 43;
foreach $item (keys %iteminstances) {
- $bi= by_item($item);
+ $why= defined $itemdesc{$item} ? $itemdesc{$item}[0].'; ' : '';
+ $why .= "line ".(join ",", map { $_->{LineNo} }
+ @{ $iteminstances{$item} });
+ $bi= by_item($item, $why);
$iteminfo{$item}= $bi;
}
foreach $item (sort { itemsortmap($a) cmp itemsortmap($b); }
my (%r);
foreach $w (@fault) { next if $r{$w}++; print("ERROR: $w\n") or die $!; }
foreach $w (@warn) { next if $r{$w}++; print("WARNING: $w\n") or die $!; }
+ STDOUT->flush or die $!;
die "errors\n" if @fault;
}