$auth->assert('part_service_assembly_edit');
+ # update checks whether pricegroups, makemodels or assembly items have been changed/added
+ # new items might have been added (and the original form might have been stored and restored)
+ # so at the end the ic form is run through check_form in io.pl
+ # The various combination of events can lead to problems with the order of parse_amount and format_amount
+ # Currently check_form parses some variables in assembly mode, but not in article or service mode
+ # This will only ever really be sanely resolved with a rewrite...
+
# parse pricegroups. and no, don't rely on check_form for this...
map { $form->{"price_$_"} = $form->parse_amount(\%myconfig, $form->{"price_$_"}) } 1 .. $form->{price_rows};
- $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) for qw(sellprice listprice ve gv);
+
+ unless ($form->{item} eq 'assembly') {
+ # for assemblies check_form will parse sellprice and listprice, but not for parts or services
+ $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) for qw(sellprice listprice ve gv);
+ };
if ($form->{item} eq 'part') {
$form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) for qw(weight rop);
if ( ($form->{"partnumber_$i"} eq "")
&& ($form->{"description_$i"} eq "")
&& ($form->{"partsgroup_$i"} eq "")) {
+ # no new assembly item was added
&check_form;
} else {
-
+ # search db for newly added assemblyitems, via partnumber or description
IC->assembly_item(\%myconfig, \%$form);
+ # form->{item_list} contains the possible matches, next check whether the
+ # match is unique or we need to call the page to select the item
my $rows = scalar @{ $form->{item_list} };
if ($rows) {
print $::form->parse_html_template('io/select_item', { PREVIOUS_FORM => $previous_form,
MODE => $mode,
ITEM_LIST => \@item_list,
+ IS_ASSEMBLY => $mode eq 'IC',
IS_PURCHASE => $mode eq 'IS' });
$main::lxdebug->leave_sub();
}
sub item_selected {
+
+ # this function is used for adding parts to records (mode = IR/IS)
+ # and to assemblies (mode = IC)
+
$main::lxdebug->enter_sub();
my $form = $main::form;
my $id = delete($form->{select_item_id}) || croak 'Missing item selection ID';
my $i = $form->{ $mode eq 'IC' ? 'assembly_rows' : 'rowcount' };
+ if ( $mode eq 'IC' ) {
+ # assembly mode:
+ # the qty variables of the existing assembly items are all still formatted, so we parse them here (1 .. $i-1)
+ # including the qty of the just added part ($i)
+ $form->{"qty_$_"} = $form->parse_amount(\%myconfig, $form->{"qty_$_"}) for (1 .. $i);
+ };
+
$form->{"id_${i}"} = $id;
if ($mode eq 'IS') {
map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) }
qw(sellprice listprice weight);
+ # at this stage qty of newly added part needs to be have been parsed
$form->{weight} += ($form->{"weight_$i"} * $form->{"qty_$i"});
if ($form->{"not_discountable_$i"}) {