X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/kivitendo-erp.git/blobdiff_plain/4dbb09950c9f5596646537c12d991c99086fe7c1..0a3b8a76933a4be17675ed3de2186e5e4c8ede10:/bin/mozilla/ic.pl diff --git a/bin/mozilla/ic.pl b/bin/mozilla/ic.pl index 3df2e51ed..aa83e5492 100644 --- a/bin/mozilla/ic.pl +++ b/bin/mozilla/ic.pl @@ -30,24 +30,52 @@ # Inventory Control module # #====================================================================== +#$locale->text('ea'); +use POSIX qw(strftime); use SL::IC; +use SL::ReportGenerator; -require "$form->{path}/io.pl"; +#use SL::PE; + +# use strict; +#use warnings; + +# global imports +our ($form, $locale, %myconfig, $lxdebug); + +require "bin/mozilla/io.pl"; +require "bin/mozilla/invoice_io.pl"; +require "bin/mozilla/common.pl"; +require "bin/mozilla/reportgenerator.pl"; 1; + +# Parserhappy(R): +# type=submit $locale->text('Add Part') +# type=submit $locale->text('Add Service') +# type=submit $locale->text('Add Assembly') +# type=submit $locale->text('Edit Part') +# type=submit $locale->text('Edit Service') +# type=submit $locale->text('Edit Assembly') + # end of main sub add { $lxdebug->enter_sub(); + $auth->assert('part_service_assembly_edit'); + $form->{title} = $locale->text('Add ' . ucfirst $form->{item}); - $form->{callback} = "$form->{script}?action=add&item=$form->{item}&path=$form->{path}&login=$form->{login}&password=$form->{password}" unless $form->{callback}; + $form->{callback} = + "$form->{script}?action=add&item=$form->{item}" + unless $form->{callback}; - $form->{unit} = ($form->{item} eq 'service') ? $locale->text('hr') : $locale->text('ea'); + $form->{"unit_changeable"} = 1; + IC->get_pricegroups(\%myconfig, \%$form); &link_part; &display_form; @@ -57,484 +85,200 @@ sub add { sub search { $lxdebug->enter_sub(); - $form->{title} = (ucfirst $form->{searchitems})."s"; - $form->{title} = $locale->text($form->{title}); + $auth->assert('part_service_assembly_edit'); # switch for backward sorting $form->{revers} = 0; + # memory for which table was sort at last time $form->{lastsort} = ""; + # counter for added entries to top100 $form->{ndxs_counter} = 0; -# $locale->text('Parts') -# $locale->text('Services') - - # use JavaScript Calendar or not - $form->{jsscript} = $jscalendar; - $jsscript = ""; - if ($form->{jsscript}) - { - # with JavaScript Calendar - $button1 = qq| - - text('button').qq|> - |; - $button2 = qq| - - text('button').qq|> - |; - #write Trigger - $jsscript = Form->write_trigger(\%myconfig,"2","transdatefrom","BL","trigger1","transdateto","BL","trigger2"); - } - else - { - # without JavaScript Calendar - $button1 = qq| - |; - $button2 = qq| - |; - } - - unless ($form->{searchitems} eq 'service') { - - $onhand = qq| -  |.$locale->text('On Hand').qq| -  |.$locale->text('Short').qq| -|; - - $makemodel = qq| - - |.$locale->text('Make').qq| - - |.$locale->text('Model').qq| - - -|; + # $locale->text('Parts') + # $locale->text('Services') - $serialnumber = qq| - |.$locale->text('Serial Number').qq| - -|; + my $is_service = $form->{searchitems} eq 'service'; + my $is_assembly = $form->{searchitems} eq 'assembly'; - $l_serialnumber = qq| -  |.$locale->text('Serial Number').qq| -|; + $form->{title} = (ucfirst $form->{searchitems}) . "s"; + $form->{title} = $locale->text($form->{title}); + $form->{title} = $locale->text('Assemblies') if $is_assembly; - } + $form->{jsscript} = 1; - if ($form->{searchitems} eq 'assembly') { + $form->header; - $form->{title} = $locale->text('Assemblies'); + print $form->parse_html_template('ic/search', { is_assembly => $is_assembly, + is_service => $is_service, + dateformat => $myconfig{dateformat}, }); - $toplevel = qq| - - - -  |.$locale->text('Top Level').qq| -  |.$locale->text('Individual Items').qq| - - -|; + $lxdebug->leave_sub(); +} #end search() - $bought = qq| - - - - - - - - - $button1 - - $button2 - -
- - - - - - - - - - - - - - - - - - - -
|.$locale->text('Sold').qq|

|.$locale->text('Ordered').qq|

|.$locale->text('Quoted').qq|
-
 |.$locale->text('From').qq||.$locale->text('To').qq|
- - -|; +sub search_update_prices { + $lxdebug->enter_sub(); - } else { + $auth->assert('part_service_assembly_edit'); - $bought = qq| - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - -
|.$locale->text('Bought').qq||.$locale->text('Sold').qq|

|.$locale->text('On Order').qq||.$locale->text('Ordered').qq|

|.$locale->text('RFQ').qq||.$locale->text('Quoted').qq|
-
  - - - - $button1 - - $button2 - -
|.$locale->text('From').qq||.$locale->text('To').qq|
-
- - -|; - } + my $pricegroups = IC->get_pricegroups(\%myconfig, \%$form); $form->header; - print qq| - - -
{script}> + print $form->parse_html_template('ic/search_update_prices', { PRICE_ROWS => $pricegroups }); -{searchitems}> - + $lxdebug->leave_sub(); +} #end search() - - +sub confirm_price_update { + $lxdebug->enter_sub(); - - - - - - - -
$form->{title}
- - - - - - - - - - - - - $serialnumber - - $makemodel - - - - - - - $toplevel - - - - - $bought - - - - - - - - -
|.$locale->text('Part Number').qq|
|.$locale->text('Part Description').qq|
|.$locale->text('Group').qq|
|.$locale->text('Drawing').qq||.$locale->text('Microfiche').qq|
-  |.$locale->text('Active').qq| - $onhand -  |.$locale->text('Obsolete').qq| -  |.$locale->text('Orphaned').qq| -
-
-
|.$locale->text('Include in Report').qq| - - - - - $l_serialnumber - - - - - - - - - - - - - - - - - - - - - - - - -
 |.$locale->text('Part Number').qq| |.$locale->text('Part Description').qq| |.$locale->text('Unit of measure').qq|
 |.$locale->text('List Price').qq| |.$locale->text('Sell Price').qq| |.$locale->text('Last Cost').qq| |.$locale->text('Line Total').qq|
 |.$locale->text('Updated').qq| |.$locale->text('Bin').qq| |.$locale->text('ROP').qq| |.$locale->text('Weight').qq|
 |.$locale->text('Image').qq| |.$locale->text('Drawing').qq| |.$locale->text('Microfiche').qq| |.$locale->text('Group').qq|
 |.$locale->text('Subtotal').qq| |.$locale->text('soldtotal').qq|
-
-

+ $auth->assert('part_service_assembly_edit'); -$jsscript + $form->{nextsub} = "update_prices"; + $form->header; - + map { delete $form->{$_} } qw(action header); + + print $form->parse_html_template('ic/confirm_price_update', { HIDDENS => [ map { name => $_, value => $form->{$_} }, keys %$form ] }); -{path}> -{login}> -{password}> + $lxdebug->leave_sub(); +} - - +sub update_prices { + $lxdebug->enter_sub(); - + $auth->assert('part_service_assembly_edit'); -
- - -
+ if (IC->update_prices(\%myconfig, \%$form)) { + $form->redirect($form->{update_count} . $locale->text('prices updated!')); + } else { + $form->error($locale->text('Could not update prices!')); + } - - -|; $lxdebug->leave_sub(); -}#end search() - +} sub choice { $lxdebug->enter_sub(); - $form->{title} = $locale->text('Top 100 hinzufuegen'); - - $form->header; - -print qq| - - -
{script}> - - {searchitems}> - - - - |; + $auth->assert('part_service_assembly_edit'); - -print qq| - - - - - - - - - -
|.$locale->text('Part Number').qq||.$locale->text('Part Description').qq|
-
|; - -print qq| - -{path}> -{login}> -{password}> - - - - - - - - - - - - + our ($j, $lastndx); + my ($totop100); - - - - - - - - - - - - -{ndxs_counter}> - -{extras}>|; + $form->{title} = $locale->text('Top 100 hinzufuegen'); -# if choice set data -if ($form->{ndx}) - { - for($i=0;$i<$form->{ndxs_counter};$i++) - { - # prepeare data - $partnumber=$form->{"totop100_partnumber_$j"}; - $description=$form->{"totop100_description_$j"}; - $unit=$form->{"totop100_unit_$j"}; - $sellprice=$form->{"totop100_sellprice_$j"}; - $soldtotal=$form->{"totop100_soldtotal_$j"}; + $form->header; - # insert data into top100 - push @{$form->{parts}},{number => "",partnumber => "$partnumber",description => "$description",unit => "$unit",sellprice => "$sellprice", soldtotal => "$soldtotal"}; - }#rof - }#fi + push @custom_hiddens, qw(searchitems title bom titel revers lastsort sort ndxs_counter extras); + push @custom_hiddens, qw(itemstatus l_linetotal l_partnumber l_description l_onhand l_unit l_sellprice l_linetotalsellprice); + my @HIDDENS = ( + +{ name => 'row', value => $j }, + +{ name => 'nextsub', value => 'item_selected' }, + +{ name => 'test', value => 'item_selected' }, + +{ name => 'lastndx', value => $lastndx }, + map(+{ name => $_, value => $form->{$_} }, @custom_hiddens), + ); + + my ($partnumber, $description, $unit, $sellprice, $soldtotal); + # if choice set data +# if ($form->{ndx}) { +# for my $i (0 .. $form->{ndxs_counter}) { +# +# # insert data into top100 +# push @{ $form->{parts} }, +# { number => "", +# partnumber => $form->{"totop100_partnumber_$j"}, +# description => $form->{"totop100_description_$j"}, +# unit => $form->{"totop100_unit_$j"}, +# sellprice => $form->{"totop100_sellprice_$j"}, +# soldtotal => $form->{"totop100_soldtotal_$j"}, +# }; +# } #rof +# } #fi $totop100 = ""; # set data for next page - if (($form->{ndxs_counter})>0) - { - for($i=1;($i<$form->{ndxs_counter}+1);$i++) - { - $partnumber=$form->{"totop100_partnumber_$i"}; - $description=$form->{"totop100_description_$i"}; - $unit=$form->{"totop100_unit_$i"}; - $sellprice=$form->{"totop100_sellprice_$i"}; - $soldtotal=$form->{"totop100_soldtotal_$i"}; - - $totop100 .= qq| -{"totop100_partnumber_$i"}> -{"totop100_description_$i"}> -{"totop100_unit_$i"}> -{"totop100_sellprice_$i"}> -{"totop100_soldtotal_$i"}> - |; - }#rof - }#fi - -print $totop100; - -print qq| - -
+ for my $i (1 .. $form->{ndxs_counter}) { + $partnumber = $form->{"totop100_partnumber_$i"}; + $description = $form->{"totop100_description_$i"}; + $unit = $form->{"totop100_unit_$i"}; + $sellprice = $form->{"totop100_sellprice_$i"}; + $soldtotal = $form->{"totop100_soldtotal_$i"}; + + push @PARTS, { + totop100_partnumber => $form->{"totop100_partnumber_$i"}, + totop100_description => $form->{"totop100_description_$i"}, + totop100_unit => $form->{"totop100_unit_$i"}, + totop100_sellprice => $form->{"totop100_sellprice_$i"}, + totop100_soldtotal => $form->{"totop100_soldtotal_$i"}, + } + +# $totop100 .= qq| +#{"totop100_partnumber_$i"}> +#{"totop100_description_$i"}> +#{"totop100_unit_$i"}> +#{"totop100_sellprice_$i"}> +#{"totop100_soldtotal_$i"}> +# |; + } #rof + + print $form->parse_html_template('ic/choice', +{ HIDDENS => \@HIDDENS, PARTS => \@PARTS }); - - |; $lxdebug->leave_sub(); -}#end choice - - +} #end choice sub list { $lxdebug->enter_sub(); - # get parts for - if (($form->{partnumber} eq "") and ($form->{description} eq "")) - { - IC->get_parts(\%myconfig, \%$form, ""); - } - else - { - if ((!($form->{partnumber} eq "")) and ($form->{description} eq "")) - { - IC->get_parts(\%myconfig, \%$form, "partnumber"); - } - else - { - if (($form->{partnumber} eq "") and (!($form->{description} eq ""))) - { - IC->get_parts(\%myconfig, \%$form, "description"); - } - else - { - IC->get_parts(\%myconfig, \%$form, "all"); - }#fi - }#fi - }#fi - + $auth->assert('part_service_assembly_edit'); + + our ($lastndx); + our ($partnumber, $description, $unit, $sellprice, $soldtotal); + + my @sortorders = ("", "partnumber", "description", "all"); + my $sortorder = $sortorders[($form->{description} ? 2 : 0) + ($form->{partnumber} ? 1 : 0)]; + IC->get_parts(\%myconfig, \%$form, $sortorder); + $form->{title} = $locale->text('Top 100 hinzufuegen'); - + $form->header; -print qq| + print qq|
- + - - - - - + + + + + |; - - my $j=0; - my $i=$form->{rows}; - for ($j=1; $j<=$i; $j++){ + my $j = 0; + my $i = $form->{rows}; + + for ($j = 1; $j <= $i; $j++) { print qq| |; - if ($j==1) { - print qq| + if ($j == 1) { + print qq| |; - } - else { - print qq| + } else { + print qq| |; - } - print qq| + } + print qq| @@ -545,17 +289,13 @@ print qq| |; } -print qq| + print qq|
|.$locale->text('choice part').qq|| . $locale->text('choice part') . qq|
 |.$locale->text('Part Number').qq||.$locale->text('Part Description').qq||.$locale->text('Unit of measure').qq||.$locale->text('Sell Price').qq||.$locale->text('soldtotal').qq|| . $locale->text('Part Number') . qq|| . $locale->text('Part Description') . qq|| . $locale->text('Unit of measure') . qq|| . $locale->text('Sell Price') . qq|| . $locale->text('soldtotal') . qq|
$form->{"partnumber_$j"} $form->{"description_$j"} $form->{"unit_$j"}

-{path}> -{login}> -{password}> - @@ -580,24 +320,16 @@ print qq| {ndxs_counter}>|; + my $totop100 = ""; + + if (($form->{ndxs_counter}) > 0) { + for ($i = 1; ($i < $form->{ndxs_counter} + 1); $i++) { -$totop100 = ""; - -if (($form->{ndxs_counter})>0) - { - for($i=1;($i<$form->{ndxs_counter}+1);$i++) - { - $j1=$form->{"totop100_partnumber_$i"}; - $j2=$form->{"totop100_description_$i"}; - $j3=$form->{"totop100_unit_$i"}; - $j4=$form->{"totop100_sellprice_$i"}; - $j5=$form->{"totop100_soldtotal_$i"}; - - $partnumber=$j1; - $description=$j2; - $unit=$j3; - $sellprice=$j4; - $soldtotal=$j5; + $partnumber = $form->{"totop100_partnumber_$i"}; + $description = $form->{"totop100_description_$i"}; + $unit = $form->{"totop100_unit_$i"}; + $sellprice = $form->{"totop100_sellprice_$i"}; + $soldtotal = $form->{"totop100_soldtotal_$i"}; $totop100 .= qq| {"totop100_partnumber_$i"}> @@ -606,146 +338,163 @@ if (($form->{ndxs_counter})>0) {"totop100_sellprice_$i"}> {"totop100_soldtotal_$i"}> |; - }#rof - }#fi + } #rof + } #fi -print $totop100; + print $totop100; -print qq| - + print qq| +
|; $lxdebug->leave_sub(); -}#end list() - +} #end list() sub top100 { $lxdebug->enter_sub(); - if ($form->{ndx}){ + $auth->assert('part_service_assembly_edit'); + + if ($form->{ndx}) { $form->{ndxs_counter}++; - - if ($form->{ndxs_counter}>0){ - - $index = $form->{ndx}; - - $j1 = $form->{"new_partnumber_$index"}; - $form->{"totop100_partnumber_$form->{ndxs_counter}"} =$j1; - $j2 = $form->{"new_description_$index"}; - $form->{"totop100_description_$form->{ndxs_counter}"} = $j2; - $j3 = $form->{"new_unit_$index"}; - $form->{"totop100_unit_$form->{ndxs_counter}"} = $j3; - $j4 = $form->{"new_sellprice_$index"}; - $form->{"totop100_sellprice_$form->{ndxs_counter}"} = $j4; - $j5 = $form->{"new_soldtotal_$index"}; - $form->{"totop100_soldtotal_$form->{ndxs_counter}"} = $j5; - }#fi - }#fi + + if ($form->{ndxs_counter} > 0) { + + my $index = $form->{ndx}; + + $form->{"totop100_partnumber_$form->{ndxs_counter}"} = $form->{"new_partnumber_$index"}; + $form->{"totop100_description_$form->{ndxs_counter}"} = $form->{"new_description_$index"}; + $form->{"totop100_unit_$form->{ndxs_counter}"} = $form->{"new_unit_$index"}; + $form->{"totop100_sellprice_$form->{ndxs_counter}"} = $form->{"new_sellprice_$index"}; + $form->{"totop100_soldtotal_$form->{ndxs_counter}"} = $form->{"new_soldtotal_$index"}; + } #fi + } #fi &addtop100(); $lxdebug->leave_sub(); -}#end top100 - +} #end top100 sub addtop100 { $lxdebug->enter_sub(); - $form->{top100} = "top100"; + $auth->assert('part_service_assembly_edit'); + + my ($revers, $lastsort, $callback, $option, $description, $sameitem, + $partnumber, $unit, $sellprice, $soldtotal, $totop100, $onhand, $align); + my (@column_index, %column_header, %column_data); + my ($totalsellprice, $totallastcost, $totallistprice, $subtotalonhand, $subtotalsellprice, $subtotallastcost, $subtotallistprice); + + $form->{top100} = "top100"; $form->{l_soldtotal} = "Y"; - $form->{soldtotal} = "soldtotal"; - $form->{sort} = "soldtotal"; - $form->{l_qty} = "N"; - $callback .= "&form->{top100}=$form->{top100}"; +# $form->{soldtotal} = "soldtotal"; + $form->{sort} = "soldtotal"; + $form->{l_qty} = "N"; $form->{l_linetotal} = ""; - $form->{revers} = 1; - $form->{number} = "position"; - $form->{l_number} = "Y"; - - my $totop100 = ""; + $form->{revers} = 1; + $form->{number} = "position"; + $form->{l_number} = "Y"; + + $totop100 = ""; $form->{title} = $locale->text('Top 100'); - - $revers = $form->{revers}; + + $revers = $form->{revers}; $lastsort = $form->{lastsort}; - if (($form->{lastsort} eq "")&&($form->{sort} eq undef)) - { - $form->{revers} = 0; - $form->{lastsort} = "partnumber"; - $form->{sort} = "partnumber"; - }#fi + if (($form->{lastsort} eq "") && ($form->{sort} eq undef)) { + $form->{revers} = 0; + $form->{lastsort} = "partnumber"; + $form->{sort} = "partnumber"; + } #fi - $callback = "$form->{script}?action=top100&path=$form->{path}&login=$form->{login}&password=$form->{password}&searchitems=$form->{searchitems}&itemstatus=$form->{itemstatus}&bom=$form->{bom}&l_linetotal=$form->{l_linetotal}&title=".$form->escape($form->{title},1); + $callback = + "$form->{script}?action=top100&searchitems=$form->{searchitems}&itemstatus=$form->{itemstatus}&bom=$form->{bom}&l_linetotal=$form->{l_linetotal}&title=" + . $form->escape($form->{title}, 1); # if we have a serialnumber limit search if ($form->{serialnumber} || $form->{l_serialnumber}) { $form->{l_serialnumber} = "Y"; - unless ($form->{bought} || $form->{sold} || $form->{rfq} || $form->{quoted}) { + unless ( $form->{bought} + || $form->{sold} + || $form->{rfq} + || $form->{quoted}) { $form->{bought} = $form->{sold} = 1; } } IC->all_parts(\%myconfig, \%$form); if ($form->{itemstatus} eq 'active') { - $option .= $locale->text('Active')." : "; + $option .= $locale->text('Active') . " : "; } if ($form->{itemstatus} eq 'obsolete') { - $option .= $locale->text('Obsolete')." : "; + $option .= $locale->text('Obsolete') . " : "; } if ($form->{itemstatus} eq 'orphaned') { - $option .= $locale->text('Orphaned')." : "; + $option .= $locale->text('Orphaned') . " : "; } if ($form->{itemstatus} eq 'onhand') { - $option .= $locale->text('On Hand')." : "; + $option .= $locale->text('On Hand') . " : "; $form->{l_onhand} = "Y"; } if ($form->{itemstatus} eq 'short') { - $option .= $locale->text('Short')." : "; + $option .= $locale->text('Short') . " : "; $form->{l_onhand} = "Y"; } if ($form->{onorder}) { $form->{l_ordnumber} = "Y"; $callback .= "&onorder=$form->{onorder}"; - $option .= $locale->text('On Order')." : "; + $option .= $locale->text('On Order') . " : "; } if ($form->{ordered}) { $form->{l_ordnumber} = "Y"; $callback .= "&ordered=$form->{ordered}"; - $option .= $locale->text('Ordered')." : "; + $option .= $locale->text('Ordered') . " : "; } if ($form->{rfq}) { $form->{l_quonumber} = "Y"; $callback .= "&rfq=$form->{rfq}"; - $option .= $locale->text('RFQ')." : "; + $option .= $locale->text('RFQ') . " : "; } if ($form->{quoted}) { $form->{l_quonumber} = "Y"; $callback .= ""ed=$form->{quoted}"; - $option .= $locale->text('Quoted')." : "; + $option .= $locale->text('Quoted') . " : "; } if ($form->{bought}) { $form->{l_invnumber} = "Y"; $callback .= "&bought=$form->{bought}"; - $option .= $locale->text('Bought')." : "; + $option .= $locale->text('Bought') . " : "; } if ($form->{sold}) { $form->{l_invnumber} = "Y"; $callback .= "&sold=$form->{sold}"; - $option .= $locale->text('Sold')." : "; + $option .= $locale->text('Sold') . " : "; } - if ($form->{bought} || $form->{sold} || $form->{onorder} || $form->{ordered} || $form->{rfq} || $form->{quoted}) { + if ( $form->{bought} + || $form->{sold} + || $form->{onorder} + || $form->{ordered} + || $form->{rfq} + || $form->{quoted}) { $form->{l_lastcost} = ""; - $form->{l_name} = "Y"; + $form->{l_name} = "Y"; if ($form->{transdatefrom}) { $callback .= "&transdatefrom=$form->{transdatefrom}"; - $option .= "\n
".$locale->text('From')." ".$locale->date(\%myconfig, $form->{transdatefrom}, 1); + $option .= "\n
" + . $locale->text('From') + . " " + . $locale->date(\%myconfig, $form->{transdatefrom}, 1); } if ($form->{transdateto}) { $callback .= "&transdateto=$form->{transdateto}"; - $option .= "\n
".$locale->text('To')." ".$locale->date(\%myconfig, $form->{transdateto}, 1); + $option .= "\n
" + . $locale->text('To') + . " " + . $locale->date(\%myconfig, $form->{transdateto}, 1); } } @@ -753,46 +502,50 @@ sub addtop100 { if ($form->{partnumber}) { $callback .= "&partnumber=$form->{partnumber}"; - $option .= $locale->text('Part Number').qq| : $form->{partnumber}
|; + $option .= $locale->text('Part Number') . qq| : $form->{partnumber}
|; + } + if ($form->{ean}) { + $callback .= "&partnumber=$form->{ean}"; + $option .= $locale->text('EAN') . qq| : $form->{ean}
|; } if ($form->{partsgroup}) { $callback .= "&partsgroup=$form->{partsgroup}"; - $option .= $locale->text('Group').qq| : $form->{partsgroup}
|; + $option .= $locale->text('Group') . qq| : $form->{partsgroup}
|; } if ($form->{serialnumber}) { $callback .= "&serialnumber=$form->{serialnumber}"; - $option .= $locale->text('Serial Number').qq| : $form->{serialnumber}
|; + $option .= $locale->text('Serial Number') . qq| : $form->{serialnumber}
|; } if ($form->{description}) { - $callback .= "&description=$form->{description}"; + $callback .= "&description=$form->{description}"; $description = $form->{description}; - $description =~ s/ -/
/g; - $option .= $locale->text('Part Description').qq| : $form->{description}
|; + $description =~ s/\n/
/g; + $option .= $locale->text('Part Description') . qq| : $form->{description}
|; } if ($form->{make}) { $callback .= "&make=$form->{make}"; - $option .= $locale->text('Make').qq| : $form->{make}
|; + $option .= $locale->text('Make') . qq| : $form->{make}
|; } if ($form->{model}) { $callback .= "&model=$form->{model}"; - $option .= $locale->text('Model').qq| : $form->{model}
|; + $option .= $locale->text('Model') . qq| : $form->{model}
|; } if ($form->{drawing}) { $callback .= "&drawing=$form->{drawing}"; - $option .= $locale->text('Drawing').qq| : $form->{drawing}
|; + $option .= $locale->text('Drawing') . qq| : $form->{drawing}
|; } if ($form->{microfiche}) { $callback .= "µfiche=$form->{microfiche}"; - $option .= $locale->text('Microfiche').qq| : $form->{microfiche}
|; + $option .= $locale->text('Microfiche') . qq| : $form->{microfiche}
|; } - if ($form->{l_soldtotal}) - { + if ($form->{l_soldtotal}) { $callback .= "&soldtotal=$form->{soldtotal}"; - $option .= $locale->text('soldtotal').qq| : $form->{soldtotal}
|; + $option .= $locale->text('soldtotal') . qq| : $form->{soldtotal}
|; } - @columns = $form->sort_columns(qw(number partnumber description partsgroup bin onhand rop unit listprice linetotallistprice sellprice linetotalsellprice lastcost linetotallastcost priceupdate weight image drawing microfiche invnumber ordnumber quonumber name serialnumber soldtotal)); + my @columns = $form->sort_columns( + qw(number partnumber ean description partsgroup bin onhand rop unit listprice linetotallistprice sellprice linetotalsellprice lastcost linetotallastcost priceupdate weight image drawing microfiche invnumber ordnumber quonumber name serialnumber soldtotal) + ); if ($form->{l_linetotal}) { $form->{l_onhand} = "Y"; @@ -800,30 +553,37 @@ sub addtop100 { if ($form->{l_lastcost}) { $form->{l_linetotallastcost} = "Y"; if (($form->{searchitems} eq 'assembly') && !$form->{bom}) { - $form->{l_linetotallastcost} = ""; + $form->{l_linetotallastcost} = ""; } } $form->{l_linetotallistprice} = "Y" if $form->{l_listprice}; } if ($form->{searchitems} eq 'service') { + # remove bin, weight and rop from list map { $form->{"l_$_"} = "" } qw(bin weight rop); $form->{l_onhand} = ""; + # qty is irrelevant unless bought or sold - if ($form->{bought} || $form->{sold} || $form->{onorder} || - $form->{ordered} || $form->{rfq} || $form->{quoted}) { + if ( $form->{bought} + || $form->{sold} + || $form->{onorder} + || $form->{ordered} + || $form->{rfq} + || $form->{quoted}) { $form->{l_onhand} = "Y"; } else { $form->{l_linetotalsellprice} = ""; - $form->{l_linetotallastcost} = ""; + $form->{l_linetotallastcost} = ""; } } - $form->{l_lastcost} = "" if ($form->{searchitems} eq 'assembly' && !$form->{bom}); + $form->{l_lastcost} = "" + if ($form->{searchitems} eq 'assembly' && !$form->{bom}); - foreach $item (@columns) { + foreach my $item (@columns) { if ($form->{"l_$item"} eq "Y") { push @column_index, $item; @@ -836,39 +596,96 @@ sub addtop100 { $callback .= "&l_subtotal=Y"; } - $column_header{number} = qq||.$locale->text('number').qq||; - $column_header{partnumber} = qq|{revers}&lastsort=$form->{lastsort}>|.$locale->text('Part Number').qq||; - $column_header{description} = qq|{revers}&lastsort=$form->{lastsort}>|.$locale->text('Part Description').qq||; - $column_header{partsgroup} = qq||.$locale->text('Group').qq||; - $column_header{bin} = qq||.$locale->text('Bin').qq||; - $column_header{priceupdate} = qq||.$locale->text('Updated').qq||; - $column_header{onhand} = qq|{revers}&lastsort=$form->{lastsort}>|.$locale->text('Qty').qq||; - $column_header{unit} = qq||.$locale->text('Unit').qq||; - $column_header{listprice} = qq||.$locale->text('List Price').qq||; - $column_header{lastcost} = qq||.$locale->text('Last Cost').qq||; - $column_header{rop} = qq||.$locale->text('ROP').qq||; - $column_header{weight} = qq||.$locale->text('Weight').qq||; - - $column_header{invnumber} = qq||.$locale->text('Invoice Number').qq||; - $column_header{ordnumber} = qq||.$locale->text('Order Number').qq||; - $column_header{quonumber} = qq||.$locale->text('Quotation').qq||; - - $column_header{name} = qq||.$locale->text('Name').qq||; - - $column_header{sellprice} = qq||.$locale->text('Sell Price').qq||; - $column_header{linetotalsellprice} = qq||.$locale->text('Extended').qq||; - $column_header{linetotallastcost} = qq||.$locale->text('Extended').qq||; - $column_header{linetotallistprice} = qq||.$locale->text('Extended').qq||; - - $column_header{image} = qq||.$locale->text('Image').qq||; - $column_header{drawing} = qq||.$locale->text('Drawing').qq||; - $column_header{microfiche} = qq||.$locale->text('Microfiche').qq||; - - $column_header{serialnumber} = qq||.$locale->text('Serial Number').qq||; - $column_header{soldtotal} = qq|{revers}&lastsort=$form->{lastsort}>|.$locale->text('soldtotal').qq||; + $column_header{number} = + qq|| . $locale->text('number') . qq||; + $column_header{partnumber} = + qq|{revers}&lastsort=$form->{lastsort}>| + . $locale->text('Part Number') + . qq||; + $column_header{description} = + qq|{revers}&lastsort=$form->{lastsort}>| + . $locale->text('Part Description') + . qq||; + $column_header{partsgroup} = + qq|| + . $locale->text('Group') + . qq||; + $column_header{bin} = + qq|| + . $locale->text('Bin') + . qq||; + $column_header{priceupdate} = + qq|| + . $locale->text('Updated') + . qq||; + $column_header{onhand} = + qq|{revers}&lastsort=$form->{lastsort}>| + . $locale->text('Qty') + . qq||; + $column_header{unit} = + qq|| . $locale->text('Unit') . qq||; + $column_header{listprice} = + qq|| + . $locale->text('List Price') + . qq||; + $column_header{lastcost} = + qq|| . $locale->text('Last Cost') . qq||; + $column_header{rop} = + qq|| . $locale->text('ROP') . qq||; + $column_header{weight} = + qq|| . $locale->text('Weight') . qq||; + + $column_header{invnumber} = + qq|| + . $locale->text('Invoice Number') + . qq||; + $column_header{ordnumber} = + qq|| + . $locale->text('Order Number') + . qq||; + $column_header{quonumber} = + qq|| + . $locale->text('Quotation') + . qq||; + + $column_header{name} = + qq|| + . $locale->text('Name') + . qq||; + + $column_header{sellprice} = + qq|| + . $locale->text('Sell Price') + . qq||; + $column_header{linetotalsellprice} = + qq|| . $locale->text('Extended') . qq||; + $column_header{linetotallastcost} = + qq|| . $locale->text('Extended') . qq||; + $column_header{linetotallistprice} = + qq|| . $locale->text('Extended') . qq||; + + $column_header{image} = + qq|| . $locale->text('Image') . qq||; + $column_header{drawing} = + qq|| + . $locale->text('Drawing') + . qq||; + $column_header{microfiche} = + qq|| + . $locale->text('Microfiche') + . qq||; + + $column_header{serialnumber} = + qq|| + . $locale->text('Serial Number') + . qq||; + $column_header{soldtotal} = + qq|{revers}&lastsort=$form->{lastsort}>| + . $locale->text('soldtotal') + . qq||; $form->header; - $colspan = $#column_index + 1; + my $colspan = $#column_index + 1; print qq| @@ -897,25 +714,25 @@ sub addtop100 { $callback = $form->escape($callback); if (@{ $form->{parts} }) { - $sameitem = $form->{parts}->[0]->{$form->{sort}}; + $sameitem = $form->{parts}->[0]->{ $form->{sort} }; } + # insert numbers for top100 - my $j=0; - foreach $ref (@{ $form->{parts} }) { + my $j = 0; + foreach my $ref (@{ $form->{parts} }) { $j++; $ref->{number} = $j; - } + } + # if avaible -> insert choice here - if (($form->{ndxs_counter})>0) - { - for($i=1;($i<$form->{ndxs_counter}+1);$i++) - { - $partnumber=$form->{"totop100_partnumber_$i"}; - $description=$form->{"totop100_description_$i"}; - $unit=$form->{"totop100_unit_$i"}; - $sellprice=$form->{"totop100_sellprice_$i"}; - $soldtotal=$form->{"totop100_soldtotal_$i"}; - + if (($form->{ndxs_counter}) > 0) { + for (my $i = 1; ($i < $form->{ndxs_counter} + 1); $i++) { + $partnumber = $form->{"totop100_partnumber_$i"}; + $description = $form->{"totop100_description_$i"}; + $unit = $form->{"totop100_unit_$i"}; + $sellprice = $form->{"totop100_sellprice_$i"}; + $soldtotal = $form->{"totop100_soldtotal_$i"}; + $totop100 .= qq| {"totop100_partnumber_$i"}> {"totop100_description_$i"}> @@ -923,24 +740,32 @@ sub addtop100 { {"totop100_sellprice_$i"}> {"totop100_soldtotal_$i"}> |; + # insert into list - push @{$form->{parts}},{number => "",partnumber => "$partnumber",description => "$description",unit => "$unit",sellprice => "$sellprice", soldtotal => "$soldtotal"}; - }#rof - }#fi - # build data for columns - foreach $ref (@{ $form->{parts} }) { + push @{ $form->{parts} }, + { number => "", + partnumber => "$partnumber", + description => "$description", + unit => "$unit", + sellprice => "$sellprice", + soldtotal => "$soldtotal" }; + } #rof + } #fi + # build data for columns + foreach my $ref (@{ $form->{parts} }) { + my $i = 0; if ($form->{l_subtotal} eq 'Y' && !$ref->{assemblyitem}) { - if ($sameitem ne $ref->{$form->{sort}}) { - &parts_subtotal; - $sameitem = $ref->{$form->{sort}}; + if ($sameitem ne $ref->{ $form->{sort} }) { + &parts_subtotal; + $sameitem = $ref->{ $form->{sort} }; } } - + $ref->{exchangerate} = 1 unless $ref->{exchangerate}; $ref->{sellprice} *= $ref->{exchangerate}; $ref->{listprice} *= $ref->{exchangerate}; - $ref->{lastcost} *= $ref->{exchangerate}; + $ref->{lastcost} *= $ref->{exchangerate}; # use this for assemblies $onhand = $ref->{onhand}; @@ -951,55 +776,100 @@ sub addtop100 { $onhand = 0 if ($form->{sold}); } - $ref->{description} =~ s/ -/
/g; + $ref->{description} =~ s/\n/
/g; - $column_data{number} = "".$form->format_amount(\%myconfig, $ref->{number}, '', " ").""; - $column_data{partnumber} = "$ref->{partnumber} "; + $column_data{number} = + "" + . $form->format_amount(\%myconfig, $ref->{number}) + . ""; + $column_data{partnumber} = + "$ref->{partnumber} "; $column_data{description} = "$ref->{description} "; - $column_data{partsgroup} = "$ref->{partsgroup} "; - - $column_data{onhand} = "".$form->format_amount(\%myconfig, $ref->{onhand}, '', " ").""; - $column_data{sellprice} = "".$form->format_amount(\%myconfig, $ref->{sellprice}, 2, " ") . ""; - $column_data{listprice} = "".$form->format_amount(\%myconfig, $ref->{listprice}, 2, " ") . ""; - $column_data{lastcost} = "".$form->format_amount(\%myconfig, $ref->{lastcost}, 2, " ") . ""; - - $column_data{linetotalsellprice} = "".$form->format_amount(\%myconfig, $ref->{onhand} * $ref->{sellprice}, 2, " ").""; - $column_data{linetotallastcost} = "".$form->format_amount(\%myconfig, $ref->{onhand} * $ref->{lastcost}, 2, " ").""; - $column_data{linetotallistprice} = "".$form->format_amount(\%myconfig, $ref->{onhand} * $ref->{listprice}, 2, " ").""; + $column_data{partsgroup} = "$ref->{partsgroup} "; + + $column_data{onhand} = + "" + . $form->format_amount(\%myconfig, $ref->{onhand}) + . ""; + $column_data{sellprice} = + "" + . $form->format_amount(\%myconfig, $ref->{sellprice}) + . ""; + $column_data{listprice} = + "" + . $form->format_amount(\%myconfig, $ref->{listprice}) + . ""; + $column_data{lastcost} = + "" + . $form->format_amount(\%myconfig, $ref->{lastcost}) + . ""; + + $column_data{linetotalsellprice} = "" + . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{sellprice}, 2) + . ""; + $column_data{linetotallastcost} = "" + . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{lastcost}, 2) + . ""; + $column_data{linetotallistprice} = "" + . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{listprice}, 2) + . ""; if (!$ref->{assemblyitem}) { $totalsellprice += $onhand * $ref->{sellprice}; - $totallastcost += $onhand * $ref->{lastcost}; + $totallastcost += $onhand * $ref->{lastcost}; $totallistprice += $onhand * $ref->{listprice}; - $subtotalonhand += $onhand; + $subtotalonhand += $onhand; $subtotalsellprice += $onhand * $ref->{sellprice}; - $subtotallastcost += $onhand * $ref->{lastcost}; + $subtotallastcost += $onhand * $ref->{lastcost}; $subtotallistprice += $onhand * $ref->{listprice}; } - $column_data{rop} = "".$form->format_amount(\%myconfig, $ref->{rop}, '', " ").""; - $column_data{weight} = "".$form->format_amount(\%myconfig, $ref->{weight}, '', " ").""; - $column_data{unit} = "$ref->{unit} "; - $column_data{bin} = "$ref->{bin} "; + $column_data{rop} = + "" + . $form->format_amount(\%myconfig, $ref->{rop}) . ""; + $column_data{weight} = + "" + . $form->format_amount(\%myconfig, $ref->{weight}) + . ""; + $column_data{unit} = "$ref->{unit} "; + $column_data{bin} = "$ref->{bin} "; $column_data{priceupdate} = "$ref->{priceupdate} "; - $column_data{invnumber} = ($ref->{module} ne 'oe') ? "{module}.pl?action=edit&type=invoice&id=$ref->{trans_id}&path=$form->{path}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{invnumber}" : "$ref->{invnumber}"; - $column_data{ordnumber} = ($ref->{module} eq 'oe') ? "{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&path=$form->{path}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{ordnumber}" : "$ref->{ordnumber}"; - $column_data{quonumber} = ($ref->{module} eq 'oe' && !$ref->{ordnumber}) ? "{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&path=$form->{path}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{quonumber}" : "$ref->{quonumber}"; + $column_data{invnumber} = + ($ref->{module} ne 'oe') + ? "{module}.pl?action=edit&type=invoice&id=$ref->{trans_id}&callback=$callback>$ref->{invnumber}" + : "$ref->{invnumber}"; + $column_data{ordnumber} = + ($ref->{module} eq 'oe') + ? "{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&callback=$callback>$ref->{ordnumber}" + : "$ref->{ordnumber}"; + $column_data{quonumber} = + ($ref->{module} eq 'oe' && !$ref->{ordnumber}) + ? "{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&callback=$callback>$ref->{quonumber}" + : "$ref->{quonumber}"; $column_data{name} = "$ref->{name}"; - $column_data{image} = ($ref->{image}) ? "{image}>{image} height=32 border=0>" : " "; - $column_data{drawing} = ($ref->{drawing}) ? "{drawing}>$ref->{drawing}" : " "; - $column_data{microfiche} = ($ref->{microfiche}) ? "{microfiche}>$ref->{microfiche}" : " "; + $column_data{image} = + ($ref->{image}) + ? "{image}>{image} height=32 border=0>" + : " "; + $column_data{drawing} = + ($ref->{drawing}) + ? "{drawing}>$ref->{drawing}" + : " "; + $column_data{microfiche} = + ($ref->{microfiche}) + ? "{microfiche}>$ref->{microfiche}" + : " "; $column_data{serialnumber} = "$ref->{serialnumber}"; $column_data{soldtotal} = "$ref->{soldtotal}"; - $i++; $i %= 2; + $i++; + $i %= 2; print ""; map { print "\n$column_data{$_}" } @column_index; @@ -1011,13 +881,22 @@ sub addtop100 { if ($form->{l_subtotal} eq 'Y') { &parts_subtotal; - }#fi + } #fi if ($form->{"l_linetotal"}) { map { $column_data{$_} = " " } @column_index; - $column_data{linetotalsellprice} = "".$form->format_amount(\%myconfig, $totalsellprice, 2, " ").""; - $column_data{linetotallastcost} = "".$form->format_amount(\%myconfig, $totallastcost, 2, " ").""; - $column_data{linetotallistprice} = "".$form->format_amount(\%myconfig, $totallistprice, 2, " ").""; + $column_data{linetotalsellprice} = + "" + . $form->format_amount(\%myconfig, $totalsellprice, 2) + . ""; + $column_data{linetotallastcost} = + "" + . $form->format_amount(\%myconfig, $totallastcost, 2) + . ""; + $column_data{linetotallistprice} = + "" + . $form->format_amount(\%myconfig, $totallistprice, 2) + . ""; print ""; @@ -1039,10 +918,6 @@ sub addtop100 {
{script}> -{path}> -{login}> -{password}> - @@ -1064,16 +939,10 @@ sub addtop100 { print qq| - - |; - - if ($form->{menubar}) { - require "$form->{path}/menu.pl"; - &menubar; - } + - print qq|
@@ -1081,426 +950,388 @@ sub addtop100 { |; $lxdebug->leave_sub(); -}# end addtop100 - +} # end addtop100 +# +# Report for Wares. +# Warning, deep magic ahead. +# This function parses the requested details, sanity checks them, and converts them into a format thats usable for IC->all_parts +# +# flags coming from the form: +# hardcoded: +# searchitems=part revers=0 lastsort='' +# +# filter: +# partnumber ean description partsgroup serialnumber make model drawing microfiche +# transdatefrom transdateto +# +# radio: +# itemstatus = active | onhand | short | obsolete | orphaned +# action = continue | top100 +# +# checkboxes: +# bought sold onorder ordered rfq quoted +# l_partnumber l_description l_serialnumber l_unit l_listprice l_sellprice l_lastcost +# l_linetotal l_priceupdate l_bin l_rop l_weight l_image l_drawing l_microfiche +# l_partsgroup l_subtotal l_soldtotal l_deliverydate +# +# hiddens: +# nextsub revers lastsort sort ndxs_counter +# sub generate_report { $lxdebug->enter_sub(); - $revers = $form->{revers}; - $lastsort = $form->{lastsort}; + $auth->assert('part_service_assembly_edit'); + + my ($revers, $lastsort, $description); + + $form->{title} = (ucfirst $form->{searchitems}) . "s"; + $form->{title} = $locale->text($form->{title}); - if (($form->{lastsort} eq "")&&($form->{sort} eq undef)) - { + my $revers = $form->{revers}; + my $lastsort = $form->{lastsort}; + + # sorting and direction of sorting + # ToDO: change this to the simpler field+direction method + if (($form->{lastsort} eq "") && ($form->{sort} eq undef)) { + $form->{revers} = 0; + $form->{lastsort} = "partnumber"; + $form->{sort} = "partnumber"; + } else { + if ($form->{lastsort} eq $form->{sort}) { + $form->{revers} = 1 - $form->{revers}; + } else { $form->{revers} = 0; - $form->{lastsort} = "partnumber"; - $form->{sort} = "partnumber"; - } - else - { - # switch between backward sorting of tables - if ($form->{lastsort} eq $form->{sort}) - { - if ($form->{revers}==0) - { - $form->{revers} = 1; + $form->{lastsort} = $form->{sort}; + } #fi + } #fi + + # special case if we have a serialnumber limit search + # serialnumbers are only given in invoices and orders, + # so they can only pop up in bought, sold, rfq, and quoted stuff + $form->{no_sn_joins} = 'Y' if ( !$form->{bought} && !$form->{sold} + && !$form->{rfq} && !$form->{quoted} + && ($form->{l_serialnumber} || $form->{serialnumber})); + + # special case for any checkbox of bought | sold | onorder | ordered | rfq | quoted. + # if any of these are ticked the behavior changes slightly for lastcost + # since all those are aggregation checks for the legder tables this is an internal switch + # refered to as ledgerchecks + $form->{ledgerchecks} = 'Y' if ( $form->{bought} || $form->{sold} || $form->{onorder} + || $form->{ordered} || $form->{rfq} || $form->{quoted}); + + # if something should be activated if something else is active, enter it here + my %dependencies = ( + onhand => [ qw(l_onhand) ], + short => [ qw(l_onhand) ], + onorder => [ qw(l_ordnumber) ], + ordered => [ qw(l_ordnumber) ], + rfq => [ qw(l_quonumber) ], + quoted => [ qw(l_quonumber) ], + bought => [ qw(l_invnumber) ], + sold => [ qw(l_invnumber) ], + ledgerchecks => [ qw(l_name) ], + serialnumber => [ qw(l_serialnumber) ], + no_sn_joins => [ qw(bought sold) ], + ); + + # these strings get displayed at the top of the results to indicate the user which switches were used + my %optiontexts = ( + active => $locale->text('Active'), + obsolete => $locale->text('Obsolete'), + orphaned => $locale->text('Orphaned'), + onhand => $locale->text('On Hand'), + short => $locale->text('Short'), + onorder => $locale->text('On Order'), + ordered => $locale->text('Ordered'), + rfq => $locale->text('RFQ'), + quoted => $locale->text('Quoted'), + bought => $locale->text('Bought'), + sold => $locale->text('Sold'), + transdatefrom => $locale->text('From') . " " . $locale->date(\%myconfig, $form->{transdatefrom}, 1), + transdateto => $locale->text('To (time)') . " " . $locale->date(\%myconfig, $form->{transdateto}, 1), + partnumber => $locale->text('Part Number') . ": '$form->{partnumber}'", + partsgroup => $locale->text('Group') . ": '$form->{partsgroup}'", + serialnumber => $locale->text('Serial Number') . ": '$form->{serialnumber}'", + description => $locale->text('Part Description') . ": '$form->{description}'", + make => $locale->text('Make') . ": '$form->{make}'", + model => $locale->text('Model') . ": '$form->{model}'", + drawing => $locale->text('Drawing') . ": '$form->{drawing}'", + microfiche => $locale->text('Microfiche') . ": '$form->{microfiche}'", + l_soldtotal => $locale->text('soldtotal'), + ); + + my @itemstatus_keys = qw(active obsolete orphaned onhand short); + my @callback_keys = qw(onorder ordered rfq quoted bought sold partnumber partsgroup serialnumber description make model + drawing microfiche l_soldtotal l_deliverydate transdatefrom transdateto ean); + + # calculate dependencies + for (@itemstatus_keys, @callback_keys) { + next if ($form->{itemstatus} ne $_ && !$form->{$_}); + map { $form->{$_} = 'Y' } @{ $dependencies{$_} } if $dependencies{$_}; + } + + # generate callback and optionstrings + my @options; + for my $key (@itemstatus_keys, @callback_keys) { + next if ($form->{itemstatus} ne $key && !$form->{$key}); + push @options, $optiontexts{$key}; + } + + # special case for lastcost + $form->{l_lastcost} = "" if $form->{ledgerchecks}; + + if ($form->{description}) { + $description = $form->{description}; + $description =~ s/\n/
/g; + } + + if ($form->{l_linetotal}) { + $form->{l_onhand} = "Y"; + $form->{l_linetotalsellprice} = "Y" if $form->{l_sellprice}; + if ($form->{l_lastcost}) { + $form->{l_linetotallastcost} = "Y"; + if (($form->{searchitems} eq 'assembly') && !$form->{bom}) { + $form->{l_linetotallastcost} = ""; } - else - { - $form->{revers} = 0; - }#fi } - else - { - $form->{revers}== 0; - $form->{lastsort} = $form->{sort}; - }#fi - }#fi + $form->{l_linetotallistprice} = "Y" if $form->{l_listprice}; + } + + if ($form->{searchitems} eq 'service') { - $callback = "$form->{script}?action=generate_report&path=$form->{path}&login=$form->{login}&password=$form->{password}&searchitems=$form->{searchitems}&itemstatus=$form->{itemstatus}&bom=$form->{bom}&l_linetotal=$form->{l_linetotal}&title=".$form->escape($form->{title},1); + # remove bin, weight and rop from list + map { $form->{"l_$_"} = "" } qw(bin weight rop); + $form->{l_onhand} = ""; - # if we have a serialnumber limit search - if ($form->{serialnumber} || $form->{l_serialnumber}) { - $form->{l_serialnumber} = "Y"; - unless ($form->{bought} || $form->{sold} || $form->{rfq} || $form->{quoted}) { - $form->{bought} = $form->{sold} = 1; + # qty is irrelevant unless bought or sold + if ( $form->{bought} + || $form->{sold} + || $form->{onorder} + || $form->{ordered} + || $form->{rfq} + || $form->{quoted}) { + $form->{l_onhand} = "Y"; + } else { + $form->{l_linetotalsellprice} = ""; + $form->{l_linetotallastcost} = ""; } } + $form->{l_lastcost} = "" if ($form->{searchitems} eq 'assembly' && !$form->{bom}); + IC->all_parts(\%myconfig, \%$form); + my @columns = + qw(partnumber description partsgroup bin onhand rop unit listprice linetotallistprice sellprice linetotalsellprice lastcost linetotallastcost + priceupdate weight image drawing microfiche invnumber ordnumber quonumber name serialnumber soldtotal deliverydate); + + my %column_defs = ( + 'bin' => { 'text' => $locale->text('Bin'), }, + 'deliverydate' => { 'text' => $locale->text('deliverydate'), }, + 'description' => { 'text' => $locale->text('Part Description'), }, + 'drawing' => { 'text' => $locale->text('Drawing'), }, + 'image' => { 'text' => $locale->text('Image'), }, + 'invnumber' => { 'text' => $locale->text('Invoice Number'), }, + 'lastcost' => { 'text' => $locale->text('Last Cost'), }, + 'linetotallastcost' => { 'text' => $locale->text('Extended'), }, + 'linetotallistprice' => { 'text' => $locale->text('Extended'), }, + 'linetotalsellprice' => { 'text' => $locale->text('Extended'), }, + 'listprice' => { 'text' => $locale->text('List Price'), }, + 'microfiche' => { 'text' => $locale->text('Microfiche'), }, + 'name' => { 'text' => $locale->text('Name'), }, + 'onhand' => { 'text' => $locale->text('Qty'), }, + 'ordnumber' => { 'text' => $locale->text('Order Number'), }, + 'partnumber' => { 'text' => $locale->text('Part Number'), }, + 'partsgroup' => { 'text' => $locale->text('Group'), }, + 'priceupdate' => { 'text' => $locale->text('Updated'), }, + 'quonumber' => { 'text' => $locale->text('Quotation'), }, + 'rop' => { 'text' => $locale->text('ROP'), }, + 'sellprice' => { 'text' => $locale->text('Sell Price'), }, + 'serialnumber' => { 'text' => $locale->text('Serial Number'), }, + 'soldtotal' => { 'text' => $locale->text('soldtotal'), }, + 'unit' => { 'text' => $locale->text('Unit'), }, + 'weight' => { 'text' => $locale->text('Weight'), }, + ); + + map { $column_defs{$_}->{visible} = $form->{"l_$_"} ? 1 : 0 } @columns; + map { $column_defs{$_}->{align} = 'right' } qw(onhand sellprice listprice lastcost linetotalsellprice linetotallastcost linetotallistprice rop weight soldtotal); + + my @hidden_variables = (qw(l_subtotal l_linetotal searchitems itemstatus bom), @itemstatus_keys, @callback_keys, map { "l_$_" } @columns); + my $callback = build_std_url('action=generate_report', grep { $form->{$_} } @hidden_variables); + + my @sort_full = qw(partnumber description onhand soldtotal deliverydate); + my @sort_no_revers = qw(partsgroup bin priceupdate invnumber ordnumber quonumber name image drawing serialnumber); + + foreach my $col (@sort_full) { + $column_defs{$col}->{link} = join '&', $callback, "sort=$col", map { "$_=" . E($form->{$_}) } qw(revers lastsort); + } + map { $column_defs{$_}->{link} = "${callback}&sort=$_" } @sort_no_revers; - if ($form->{itemstatus} eq 'active') { - $option .= $locale->text('Active')." : "; - } - if ($form->{itemstatus} eq 'obsolete') { - $option .= $locale->text('Obsolete')." : "; - } - if ($form->{itemstatus} eq 'orphaned') { - $option .= $locale->text('Orphaned')." : "; - } - if ($form->{itemstatus} eq 'onhand') { - $option .= $locale->text('On Hand')." : "; - $form->{l_onhand} = "Y"; - } - if ($form->{itemstatus} eq 'short') { - $option .= $locale->text('Short')." : "; - $form->{l_onhand} = "Y"; - } - if ($form->{onorder}) { - $form->{l_ordnumber} = "Y"; - $callback .= "&onorder=$form->{onorder}"; - $option .= $locale->text('On Order')." : "; - } - if ($form->{ordered}) { - $form->{l_ordnumber} = "Y"; - $callback .= "&ordered=$form->{ordered}"; - $option .= $locale->text('Ordered')." : "; - } - if ($form->{rfq}) { - $form->{l_quonumber} = "Y"; - $callback .= "&rfq=$form->{rfq}"; - $option .= $locale->text('RFQ')." : "; - } - if ($form->{quoted}) { - $form->{l_quonumber} = "Y"; - $callback .= ""ed=$form->{quoted}"; - $option .= $locale->text('Quoted')." : "; - } - if ($form->{bought}) { - $form->{l_invnumber} = "Y"; - $callback .= "&bought=$form->{bought}"; - $option .= $locale->text('Bought')." : "; - } - if ($form->{sold}) { - $form->{l_invnumber} = "Y"; - $callback .= "&sold=$form->{sold}"; - $option .= $locale->text('Sold')." : "; - } - if ($form->{bought} || $form->{sold} || $form->{onorder} || $form->{ordered} || $form->{rfq} || $form->{quoted}) { - - $form->{l_lastcost} = ""; - $form->{l_name} = "Y"; - if ($form->{transdatefrom}) { - $callback .= "&transdatefrom=$form->{transdatefrom}"; - $option .= "\n
".$locale->text('From')." ".$locale->date(\%myconfig, $form->{transdatefrom}, 1); - } - if ($form->{transdateto}) { - $callback .= "&transdateto=$form->{transdateto}"; - $option .= "\n
".$locale->text('To')." ".$locale->date(\%myconfig, $form->{transdateto}, 1); - } - } - - $option .= "
"; - - if ($form->{partnumber}) { - $callback .= "&partnumber=$form->{partnumber}"; - $option .= $locale->text('Part Number').qq| : $form->{partnumber}
|; - } - if ($form->{partsgroup}) { - $callback .= "&partsgroup=$form->{partsgroup}"; - $option .= $locale->text('Group').qq| : $form->{partsgroup}
|; - } - if ($form->{serialnumber}) { - $callback .= "&serialnumber=$form->{serialnumber}"; - $option .= $locale->text('Serial Number').qq| : $form->{serialnumber}
|; - } - if ($form->{description}) { - $callback .= "&description=$form->{description}"; - $description = $form->{description}; - $description =~ s/ -/
/g; - $option .= $locale->text('Part Description').qq| : $form->{description}
|; - } - if ($form->{make}) { - $callback .= "&make=$form->{make}"; - $option .= $locale->text('Make').qq| : $form->{make}
|; - } - if ($form->{model}) { - $callback .= "&model=$form->{model}"; - $option .= $locale->text('Model').qq| : $form->{model}
|; - } - if ($form->{drawing}) { - $callback .= "&drawing=$form->{drawing}"; - $option .= $locale->text('Drawing').qq| : $form->{drawing}
|; - } - if ($form->{microfiche}) { - $callback .= "µfiche=$form->{microfiche}"; - $option .= $locale->text('Microfiche').qq| : $form->{microfiche}
|; - } - # table soldtotal aktive - if ($form->{l_soldtotal}) - { - $callback .= "&soldtotal=$form->{soldtotal}"; - $option .= $locale->text('soldtotal').qq| : $form->{soldtotal}
|; - } - - @columns = $form->sort_columns(qw(partnumber description partsgroup bin onhand rop unit listprice linetotallistprice sellprice linetotalsellprice lastcost linetotallastcost priceupdate weight image drawing microfiche invnumber ordnumber quonumber name serialnumber soldtotal)); - - if ($form->{l_linetotal}) { - $form->{l_onhand} = "Y"; - $form->{l_linetotalsellprice} = "Y" if $form->{l_sellprice}; - if ($form->{l_lastcost}) { - $form->{l_linetotallastcost} = "Y"; - if (($form->{searchitems} eq 'assembly') && !$form->{bom}) { - $form->{l_linetotallastcost} = ""; - } - } - $form->{l_linetotallistprice} = "Y" if $form->{l_listprice}; - } - - if ($form->{searchitems} eq 'service') { - # remove bin, weight and rop from list - map { $form->{"l_$_"} = "" } qw(bin weight rop); - - $form->{l_onhand} = ""; - # qty is irrelevant unless bought or sold - if ($form->{bought} || $form->{sold} || $form->{onorder} || - $form->{ordered} || $form->{rfq} || $form->{quoted}) { - $form->{l_onhand} = "Y"; - } else { - $form->{l_linetotalsellprice} = ""; - $form->{l_linetotallastcost} = ""; - } - } - - $form->{l_lastcost} = "" if ($form->{searchitems} eq 'assembly' && !$form->{bom}); - - foreach $item (@columns) { - if ($form->{"l_$item"} eq "Y") { - push @column_index, $item; - - # add column to callback - $callback .= "&l_$item=Y"; - } - } + # add order to callback + $form->{callback} = join '&', ($callback, map { "${_}=" . E($form->{$_}) } qw(sort revers)); - if ($form->{l_subtotal} eq 'Y') { - $callback .= "&l_subtotal=Y"; - } - $column_header{partnumber} = qq|{revers}&lastsort=$form->{lastsort}>|.$locale->text('Part Number').qq||; - $column_header{description} = qq|{revers}&lastsort=$form->{lastsort}>|.$locale->text('Part Description').qq||; - $column_header{partsgroup} = qq||.$locale->text('Group').qq||; - $column_header{bin} = qq||.$locale->text('Bin').qq||; - $column_header{priceupdate} = qq||.$locale->text('Updated').qq||; - $column_header{onhand} = qq|{revers}&lastsort=$form->{lastsort}>|.$locale->text('Qty').qq||; - $column_header{unit} = qq||.$locale->text('Unit').qq||; - $column_header{listprice} = qq||.$locale->text('List Price').qq||; - $column_header{lastcost} = qq||.$locale->text('Last Cost').qq||; - $column_header{rop} = qq||.$locale->text('ROP').qq||; - $column_header{weight} = qq||.$locale->text('Weight').qq||; + my $report = SL::ReportGenerator->new(\%myconfig, $form); - $column_header{invnumber} = qq||.$locale->text('Invoice Number').qq||; - $column_header{ordnumber} = qq||.$locale->text('Order Number').qq||; - $column_header{quonumber} = qq||.$locale->text('Quotation').qq||; + my %attachment_basenames = ( + 'part' => $locale->text('part_list'), + 'service' => $locale->text('service_list'), + 'assembly' => $locale->text('assembly_list'), + ); - $column_header{name} = qq||.$locale->text('Name').qq||; + $report->set_options('top_info_text' => $locale->text('Options') . ': ' . join(', ', grep $_, @options), + 'raw_bottom_info_text' => $form->parse_html_template('ic/generate_report_bottom'), + 'output_format' => 'HTML', + 'title' => $form->{title}, + 'attachment_basename' => $attachment_basenames{$form->{searchitems}} . strftime('_%Y%m%d', localtime time), + ); + $report->set_options_from_form(); - $column_header{sellprice} = qq||.$locale->text('Sell Price').qq||; - $column_header{linetotalsellprice} = qq||.$locale->text('Extended').qq||; - $column_header{linetotallastcost} = qq||.$locale->text('Extended').qq||; - $column_header{linetotallistprice} = qq||.$locale->text('Extended').qq||; + $report->set_columns(%column_defs); + $report->set_column_order(@columns); - $column_header{image} = qq||.$locale->text('Image').qq||; - $column_header{drawing} = qq||.$locale->text('Drawing').qq||; - $column_header{microfiche} = qq||.$locale->text('Microfiche').qq||; + $report->set_export_options('generate_report', @hidden_variables, qw(sort revers)); - $column_header{serialnumber} = qq||.$locale->text('Serial Number').qq||; - $column_header{soldtotal} = qq|{revers}&lastsort=$form->{lastsort}>|.$locale->text('soldtotal').qq||; + $report->set_sort_indicator($form->{sort}, $form->{revers} ? 0 : 1); - $form->header; - $colspan = $#column_index + 1; + my @subtotal_columns = qw(sellprice listprice lastcost); + my %subtotals = map { $_ => 0 } ('onhand', @subtotal_columns); + my %totals = map { $_ => 0 } @subtotal_columns; + my $idx = 0; + my $same_item = $form->{parts}[0]{ $form->{sort} } if (scalar @{ $form->{parts} }); - print qq| - + # postprocess parts + foreach my $ref (@{ $form->{parts} }) { - - - - - + # fresh row, for inserting later + my $row = { map { $_ => { 'data' => $ref->{$_} } } @columns }; - - - -|; - - map { print "\n$column_header{$_}" } @column_index; - - print qq| - - |; - - - # add order to callback - $form->{callback} = $callback .= "&sort=$form->{sort}"; - - # escape callback for href - $callback = $form->escape($callback); - - if (@{ $form->{parts} }) { - $sameitem = $form->{parts}->[0]->{$form->{sort}}; - } - - foreach $ref (@{ $form->{parts} }) { - - if ($form->{l_subtotal} eq 'Y' && !$ref->{assemblyitem}) { - if ($sameitem ne $ref->{$form->{sort}}) { - &parts_subtotal; - $sameitem = $ref->{$form->{sort}}; - } - } - - $ref->{exchangerate} = 1 unless $ref->{exchangerate}; - $ref->{sellprice} *= $ref->{exchangerate}; - $ref->{listprice} *= $ref->{exchangerate}; - $ref->{lastcost} *= $ref->{exchangerate}; + $ref->{exchangerate} ||= 1; + $ref->{price_factor} ||= 1; + $ref->{sellprice} *= $ref->{exchangerate} / $ref->{price_factor}; + $ref->{listprice} *= $ref->{exchangerate} / $ref->{price_factor}; + $ref->{lastcost} *= $ref->{exchangerate} / $ref->{price_factor}; # use this for assemblies - $onhand = $ref->{onhand}; + my $onhand = $ref->{onhand}; - $align = "left"; if ($ref->{assemblyitem}) { - $align = "right"; - $onhand = 0 if ($form->{sold}); + $row->{partnumber}{align} = 'right'; + $row->{onhand}{data} = 0; + $onhand = 0 if ($form->{sold}); } - $ref->{description} =~ s/ -/
/g; - - $column_data{partnumber} = ""; - $column_data{description} = ""; - $column_data{partsgroup} = ""; + my $edit_link = build_std_url('action=edit', 'id=' . E($ref->{id}), 'callback'); + $row->{partnumber}->{link} = $edit_link; + $row->{description}->{link} = $edit_link; - $column_data{onhand} = ""; - $column_data{sellprice} = ""; - $column_data{listprice} = ""; - $column_data{lastcost} = ""; + foreach (qw(sellprice listprice lastcost)) { + $row->{$_}{data} = $form->format_amount(\%myconfig, $ref->{$_}, -2); + $row->{"linetotal$_"}{data} = $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{$_}, 2); + } - $column_data{linetotalsellprice} = ""; - $column_data{linetotallastcost} = ""; - $column_data{linetotallistprice} = ""; + map { $row->{$_}{data} = $form->format_amount(\%myconfig, $ref->{$_}); } qw(onhand rop weight soldtotal); if (!$ref->{assemblyitem}) { - $totalsellprice += $onhand * $ref->{sellprice}; - $totallastcost += $onhand * $ref->{lastcost}; - $totallistprice += $onhand * $ref->{listprice}; + foreach my $col (@subtotal_columns) { + $totals{$col} += $onhand * $ref->{$col}; + $subtotals{$col} += $onhand * $ref->{$col}; + } - $subtotalonhand += $onhand; - $subtotalsellprice += $onhand * $ref->{sellprice}; - $subtotallastcost += $onhand * $ref->{lastcost}; - $subtotallistprice += $onhand * $ref->{listprice}; + $subtotals{onhand} += $onhand; } - $column_data{rop} = ""; - $column_data{weight} = ""; - $column_data{unit} = ""; - $column_data{bin} = ""; - $column_data{priceupdate} = ""; - - $column_data{invnumber} = ($ref->{module} ne 'oe') ? "" : ""; - $column_data{ordnumber} = ($ref->{module} eq 'oe') ? "" : ""; - $column_data{quonumber} = ($ref->{module} eq 'oe' && !$ref->{ordnumber}) ? "" : ""; + # set module stuff + if ($ref->{module} eq 'oe') { + my $edit_oe_link = build_std_url("script=oe.pl", 'action=edit', 'type=' . E($ref->{type}), 'id=' . E($ref->{trans_id}), 'callback'); + $row->{ordnumber}{link} = $edit_oe_link; + $row->{quonumber}{link} = $edit_oe_link if (!$ref->{ordnumber}); - $column_data{name} = ""; + } else { + $row->{invnumber}{link} = build_std_url("script=$ref->{module}.pl", 'action=edit', 'type=invoice', 'id=' . E($ref->{trans_id}), 'callback'); + } - $column_data{image} = ($ref->{image}) ? "" : ""; - $column_data{drawing} = ($ref->{drawing}) ? "" : ""; - $column_data{microfiche} = ($ref->{microfiche}) ? "" : ""; + # set properties of images + if ($ref->{image} && (lc $report->{options}->{output_format} eq 'html')) { + $row->{image}{data} = ''; + $row->{image}{raw_data} = ''; + } + map { $row->{$_}{link} = $ref->{$_} } qw(drawing microfiche); - $column_data{serialnumber} = ""; + $report->add_data($row); - $column_data{soldtotal} = ""; + my $next_ref = $form->{parts}[$idx + 1]; - $i++; $i %= 2; - print ""; + # insert subtotal rows + if (($form->{l_subtotal} eq 'Y') && + (!$next_ref || + (!$next_ref->{assemblyitem} && ($same_item ne $next_ref->{ $form->{sort} })))) { + my $row = { map { $_ => { 'class' => 'listsubtotal', } } @columns }; - map { print "\n$column_data{$_}" } @column_index; + if (($form->{searchitems} ne 'assembly') || !$form->{bom}) { + $row->{onhand}->{data} = $form->format_amount(\%myconfig, $subtotals{onhand}); + } - print qq| - -|; + map { $row->{"linetotal$_"}->{data} = $form->format_amount(\%myconfig, $subtotals{$_}, 2) } @subtotal_columns; + map { $subtotals{$_} = 0 } ('onhand', @subtotal_columns); - } + $report->add_data($row); + $same_item = $next_ref->{ $form->{sort} }; + } - if ($form->{l_subtotal} eq 'Y') { - &parts_subtotal; + $idx++; } if ($form->{"l_linetotal"}) { - map { $column_data{$_} = "" } @column_index; - $column_data{linetotalsellprice} = ""; - $column_data{linetotallastcost} = ""; - $column_data{linetotallistprice} = ""; - - print ""; + my $row = { map { $_ => { 'class' => 'listtotal', } } @columns }; - map { print "\n$column_data{$_}" } @column_index; + map { $row->{"linetotal$_"}->{data} = $form->format_amount(\%myconfig, $totals{$_}, 2) } @subtotal_columns; - print qq| - |; + $report->add_separator(); + $report->add_data($row); } - print qq| - -
$form->{title}
$option
{script}?action=edit&id=$ref->{id}&path=$form->{path}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{partnumber} $ref->{description} $ref->{partsgroup} ".$form->format_amount(\%myconfig, $ref->{onhand}, '', " ")."".$form->format_amount(\%myconfig, $ref->{sellprice}, 2, " ") . "".$form->format_amount(\%myconfig, $ref->{listprice}, 2, " ") . "".$form->format_amount(\%myconfig, $ref->{lastcost}, 2, " ") . "".$form->format_amount(\%myconfig, $ref->{onhand} * $ref->{sellprice}, 2, " ")."".$form->format_amount(\%myconfig, $ref->{onhand} * $ref->{lastcost}, 2, " ")."".$form->format_amount(\%myconfig, $ref->{onhand} * $ref->{listprice}, 2, " ")."".$form->format_amount(\%myconfig, $ref->{rop}, '', " ")."".$form->format_amount(\%myconfig, $ref->{weight}, '', " ")."$ref->{unit} $ref->{bin} $ref->{priceupdate} {module}.pl?action=edit&type=invoice&id=$ref->{trans_id}&path=$form->{path}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{invnumber}$ref->{invnumber}{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&path=$form->{path}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{ordnumber}$ref->{ordnumber}{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&path=$form->{path}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{quonumber}$ref->{quonumber}$ref->{name}{image}>{image} height=32 border=0> {drawing}>$ref->{drawing} {microfiche}>$ref->{microfiche} $ref->{serialnumber}".$form->format_amount(\%myconfig, $ref->{soldtotal}, '', " ")."
 ".$form->format_amount(\%myconfig, $totalsellprice, 2, " ")."".$form->format_amount(\%myconfig, $totallastcost, 2, " ")."".$form->format_amount(\%myconfig, $totallistprice, 2, " ")."

- -|; - - - print qq| - -
- -
{script}> - - - -{searchitems}> - -{path}> -{login}> -{password}>|; - - print qq| - |; - - - if ($form->{menubar}) { - require "$form->{path}/menu.pl"; - &menubar; - } - - print qq| -
- - - -|; + $report->generate_with_headers(); $lxdebug->leave_sub(); -}#end generate_report - - +} #end generate_report sub parts_subtotal { $lxdebug->enter_sub(); + + $auth->assert('part_service_assembly_edit'); + + # imports + our (%column_data, @column_index); + our ($subtotalonhand, $totalsellprice, $totallastcost, $totallistprice, $subtotalsellprice, $subtotallastcost, $subtotallistprice); map { $column_data{$_} = " " } @column_index; $subtotalonhand = 0 if ($form->{searchitems} eq 'assembly' && $form->{bom}); - $column_data{onhand} = "".$form->format_amount(\%myconfig, $subtotalonhand, '', " ").""; - - $column_data{linetotalsellprice} = "".$form->format_amount(\%myconfig, $subtotalsellprice, 2, " ").""; - $column_data{linetotallistprice} = "".$form->format_amount(\%myconfig, $subtotallistprice, 2, " ").""; - $column_data{linetotallastcost} = "".$form->format_amount(\%myconfig, $subtotallastcost, 2, " ").""; - - $subtotalonhand = 0; + $column_data{onhand} = + "" + . $form->format_amount(\%myconfig, $subtotalonhand) + . ""; + + $column_data{linetotalsellprice} = + "" + . $form->format_amount(\%myconfig, $subtotalsellprice, 2) + . ""; + $column_data{linetotallistprice} = + "" + . $form->format_amount(\%myconfig, $subtotallistprice, 2) + . ""; + $column_data{linetotallastcost} = + "" + . $form->format_amount(\%myconfig, $subtotallastcost, 2) + . ""; + + $subtotalonhand = 0; $subtotalsellprice = 0; $subtotallistprice = 0; - $subtotallastcost = 0; + $subtotallastcost = 0; print ""; @@ -1513,14 +1344,19 @@ sub parts_subtotal { $lxdebug->leave_sub(); } - - sub edit { $lxdebug->enter_sub(); + $auth->assert('part_service_assembly_edit'); + + # show history button + $form->{javascript} = qq||; + #/show hhistory button IC->get_part(\%myconfig, \%$form); - $form->{title} = $locale->text('Edit '.ucfirst $form->{item}); + $form->{"original_partnumber"} = $form->{"partnumber"}; + + $form->{title} = $locale->text('Edit ' . ucfirst $form->{item}); &link_part; &display_form; @@ -1528,45 +1364,50 @@ sub edit { $lxdebug->leave_sub(); } - - sub link_part { $lxdebug->enter_sub(); + $auth->assert('part_service_assembly_edit'); + IC->create_links("IC", \%myconfig, \%$form); - # currencies - map { $form->{selectcurrency} .= "