X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/792d1cf7bf650a84b7a82956cdfeda5ae0fbaf86..76592c8a3:/bin/mozilla/ic.pl?ds=sidebyside diff --git a/bin/mozilla/ic.pl b/bin/mozilla/ic.pl index df6e2cab6..e6b1ff33f 100644 --- a/bin/mozilla/ic.pl +++ b/bin/mozilla/ic.pl @@ -24,1413 +24,388 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1335, USA. #====================================================================== # # Inventory Control module # #====================================================================== -#$locale->text('ea'); -use SL::IC; -#use SL::PE; +use POSIX qw(strftime); +use List::Util qw(first max); +use List::MoreUtils qw(any); -require "$form->{path}/io.pl"; +use SL::AM; +use SL::CVar; +use SL::IC; +use SL::Helper::Flash qw(flash); +use SL::HTML::Util; +use SL::ReportGenerator; -1; +#use SL::PE; -# end of main +use strict; +#use warnings; -sub add { - $lxdebug->enter_sub(); +# global imports +our ($form, $locale, %myconfig, $lxdebug, $auth); - $form->{title} = $locale->text('Add ' . ucfirst $form->{item}); +require "bin/mozilla/io.pl"; +require "bin/mozilla/common.pl"; +require "bin/mozilla/reportgenerator.pl"; - $form->{callback} = - "$form->{script}?action=add&item=$form->{item}&path=$form->{path}&login=$form->{login}&password=$form->{password}" - unless $form->{callback}; +1; - $form->{unit} = - ($form->{item} eq 'service') ? $locale->text('hr') : $locale->text('ea'); - IC->get_pricegroups(\%myconfig, \%$form); - &link_part; - &display_form; +# 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') +# $locale->text('Parts') +# $locale->text('Services') +# $locale->text('Inventory quantity must be zero before you can set this part obsolete!') +# $locale->text('Inventory quantity must be zero before you can set this assembly obsolete!') +# $locale->text('Part Number missing!') +# $locale->text('Service Number missing!') +# $locale->text('Assembly Number missing!') +# $locale->text('ea'); - $lxdebug->leave_sub(); -} +# end of main sub search { $lxdebug->enter_sub(); - $form->{title} = (ucfirst $form->{searchitems}) . "s"; - $form->{title} = $locale->text($form->{title}); - - # 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| - - -|; - - $serialnumber = qq| - | . $locale->text('Serial Number') . qq| - -|; - - $l_serialnumber = qq| -  | - . $locale->text('Serial Number') . qq| -|; + $auth->assert('part_service_assembly_details'); - } + $form->{revers} = 0; # switch for backward sorting + $form->{lastsort} = ""; # memory for which table was sort at last time + $form->{ndxs_counter} = 0; # counter for added entries to top100 - if ($form->{searchitems} eq 'assembly') { - - $form->{title} = $locale->text('Assemblies'); - - $toplevel = qq| - - - -  | - . $locale->text('Top Level') . qq| -  | - . $locale->text('Individual Items') . qq| - - -|; - - $bought = qq| - - - - - - - - - $button1 - - $button2 - -
- - - - - - - - - - - - - - - - - - - -
| . $locale->text('Sold') . qq|

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

| . $locale->text('Quoted') . qq|
-
 | . $locale->text('From') . qq|| . $locale->text('To') . qq|
- - -|; + my %is_xyz = map { +"is_$_" => ($form->{searchitems} eq $_) } qw(part service assembly); - } else { + $form->{title} = (ucfirst $form->{searchitems}) . "s"; + $form->{title} = $locale->text($form->{title}); + $form->{title} = $locale->text('Assemblies') if ($is_xyz{is_assembly}); - $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|
-
- - -|; - } + $form->{CUSTOM_VARIABLES} = CVar->get_configs('module' => 'IC'); + ($form->{CUSTOM_VARIABLES_FILTER_CODE}, + $form->{CUSTOM_VARIABLES_INCLUSION_CODE}) = CVar->render_search_options('variables' => $form->{CUSTOM_VARIABLES}, + 'include_prefix' => 'l_', + 'include_value' => 'Y'); $form->header; - print qq| - - -
{script}> - -{searchitems}> - - - - - - - - - - - - -
$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|
-
-

- -$jsscript - - - -{path}> -{login}> -{password}> - - - - - - -
- - -
- - - -|; + $form->get_lists('partsgroup' => 'ALL_PARTSGROUPS'); + print $form->parse_html_template('ic/search', { %is_xyz, }); + $lxdebug->leave_sub(); } #end search() -sub choice { +sub search_update_prices { $lxdebug->enter_sub(); - $form->{title} = $locale->text('Top 100 hinzufuegen'); + $auth->assert('part_service_assembly_edit'); - $form->header; - - print qq| - - -
{script}> - - {searchitems}> - - - - |; - - print qq| - - - - - - - - - -
| - . $locale->text('Part Number') . qq|| - . $locale->text('Part Description') . qq|
-
|; - - print qq| - -{path}> -{login}> -{password}> - - - - - - - - - - - - - - - - - - - - - - - - - -{ndxs_counter}> - -{extras}>|; - - # 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"}; - - # insert data into top100 - push @{ $form->{parts} }, - { number => "", - partnumber => "$partnumber", - description => "$description", - unit => "$unit", - sellprice => "$sellprice", - soldtotal => "$soldtotal" }; - } #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; + my $pricegroups = IC->get_pricegroups(\%myconfig, \%$form); - print qq| - -
- - - |; - $lxdebug->leave_sub(); -} #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 - - $form->{title} = $locale->text('Top 100 hinzufuegen'); + $form->{title} = $locale->text('Update Prices'); $form->header; - print qq| - -
- - - - - - - - - - - - - |; - - my $j = 0; - my $i = $form->{rows}; - - for ($j = 1; $j <= $i; $j++) { - - print qq| - |; - if ($j == 1) { - print qq| - |; - } else { - print qq| - |; - } - print qq| - - - - - - - - |; - } - - print 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|
$form->{"partnumber_$j"}$form->{"description_$j"}$form->{"unit_$j"}$form->{"sellprice_$j"}$form->{"soldtotal_$j"}
- -
- - -{path}> -{login}> -{password}> + print $form->parse_html_template('ic/search_update_prices', { PRICE_ROWS => $pricegroups }); - - - - - - - - - - - - - - - - - - - - - - -{ndxs_counter}>|; - - $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; - - $totop100 .= qq| -{"totop100_partnumber_$i"}> -{"totop100_description_$i"}> -{"totop100_unit_$i"}> -{"totop100_sellprice_$i"}> -{"totop100_soldtotal_$i"}> - |; - } #rof - } #fi - - print $totop100; - - print qq| - - -
- - -|; $lxdebug->leave_sub(); -} #end list() - -sub top100 { - $lxdebug->enter_sub(); - - 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 - &addtop100(); - $lxdebug->leave_sub(); -} #end top100 +} #end search() -sub addtop100 { +sub confirm_price_update { $lxdebug->enter_sub(); - $form->{top100} = "top100"; - $form->{l_soldtotal} = "Y"; - $form->{soldtotal} = "soldtotal"; - $form->{sort} = "soldtotal"; - $form->{l_qty} = "N"; - $callback .= "&form->{top100}=$form->{top100}"; - $form->{l_linetotal} = ""; - $form->{revers} = 1; - $form->{number} = "position"; - $form->{l_number} = "Y"; - - my $totop100 = ""; - - $form->{title} = $locale->text('Top 100'); - - $revers = $form->{revers}; - $lastsort = $form->{lastsort}; - - 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); - - # 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; - } - } - IC->all_parts(\%myconfig, \%$form); - - 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 .= "
"; + $auth->assert('part_service_assembly_edit'); - 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}
|; - } - if ($form->{l_soldtotal}) { - $callback .= "&soldtotal=$form->{soldtotal}"; - $option .= $locale->text('soldtotal') . qq| : $form->{soldtotal}
|; - } + my @errors = (); + my $value_found = undef; - @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) - ); + foreach my $idx (qw(sellprice listprice), (1..$form->{price_rows})) { + my $name = $idx =~ m/\d/ ? $form->{"pricegroup_${idx}"} : $idx eq 'sellprice' ? $locale->text('Sell Price') : $locale->text('List Price'); + my $type = $idx =~ m/\d/ ? $form->{"pricegroup_type_${idx}"} : $form->{"${idx}_type"}; + my $value_idx = $idx =~ m/\d/ ? "price_${idx}" : $idx; + my $value = $form->parse_amount(\%myconfig, $form->{$value_idx}); - 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') { + if ((0 > $value) && ($type eq 'percent')) { + push @errors, $locale->text('You cannot adjust the price for pricegroup "#1" by a negative percentage.', $name); - # remove bin, weight and rop from list - map { $form->{"l_$_"} = "" } qw(bin weight rop); - - $form->{l_onhand} = ""; + } elsif (!$value && ($form->{$value_idx} ne '')) { + push @errors, $locale->text('No valid number entered for pricegroup "#1".', $name); - # 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} = ""; + } elsif (0 < $value) { + $value_found = 1; } } - $form->{l_lastcost} = "" - if ($form->{searchitems} eq 'assembly' && !$form->{bom}); + push @errors, $locale->text('No prices will be updated because no prices have been entered.') if (!$value_found); - foreach $item (@columns) { - if ($form->{"l_$item"} eq "Y") { - push @column_index, $item; + my $num_matches = IC->get_num_matches_for_priceupdate(); - # add column to callback - $callback .= "&l_$item=Y"; - } - } + $form->header(); - if ($form->{l_subtotal} eq 'Y') { - $callback .= "&l_subtotal=Y"; + if (@errors) { + $form->show_generic_error(join('
', @errors), 'back_button' => 1); } - $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; - - print qq| - - - - - - - - - + $form->{nextsub} = "update_prices"; - -|; + map { delete $form->{$_} } qw(action header); - map { print "\n$column_header{$_}" } @column_index; + print $form->parse_html_template('ic/confirm_price_update', { HIDDENS => [ map { name => $_, value => $form->{$_} }, keys %$form ], + num_matches => $num_matches }); - print qq| - - |; + $lxdebug->leave_sub(); +} - # add order to callback - $form->{callback} = $callback .= "&sort=$form->{sort}"; +sub update_prices { + $lxdebug->enter_sub(); - # escape callback for href - $callback = $form->escape($callback); + $auth->assert('part_service_assembly_edit'); - if (@{ $form->{parts} }) { - $sameitem = $form->{parts}->[0]->{ $form->{sort} }; - } + my $num_updated = IC->update_prices(\%myconfig, \%$form); - # insert numbers for top100 - my $j = 0; - foreach $ref (@{ $form->{parts} }) { - $j++; - $ref->{number} = $j; + if (-1 != $num_updated) { + $form->redirect($locale->text('#1 prices were updated.', $num_updated)); + } else { + $form->error($locale->text('Could not update prices!')); } - # 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"}; - - $totop100 .= qq| -{"totop100_partnumber_$i"}> -{"totop100_description_$i"}> -{"totop100_unit_$i"}> -{"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} }) { - - 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}; - - # use this for assemblies - $onhand = $ref->{onhand}; - - $align = "left"; - if ($ref->{assemblyitem}) { - $align = "right"; - $onhand = 0 if ($form->{sold}); - } + $lxdebug->leave_sub(); +} - $ref->{description} =~ s/ -/
/g; - - $column_data{number} = - ""; - $column_data{partnumber} = - ""; - $column_data{description} = ""; - $column_data{partsgroup} = ""; - - $column_data{onhand} = - ""; - $column_data{sellprice} = - ""; - $column_data{listprice} = - ""; - $column_data{lastcost} = - ""; - - $column_data{linetotalsellprice} = ""; - $column_data{linetotallastcost} = ""; - $column_data{linetotallistprice} = ""; +sub top100 { + $::lxdebug->enter_sub(); - if (!$ref->{assemblyitem}) { - $totalsellprice += $onhand * $ref->{sellprice}; - $totallastcost += $onhand * $ref->{lastcost}; - $totallistprice += $onhand * $ref->{listprice}; - - $subtotalonhand += $onhand; - $subtotalsellprice += $onhand * $ref->{sellprice}; - $subtotallastcost += $onhand * $ref->{lastcost}; - $subtotallistprice += $onhand * $ref->{listprice}; - } + $::auth->assert('part_service_assembly_edit'); - $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}) - ? "" - : ""; - - $column_data{name} = ""; - - $column_data{image} = - ($ref->{image}) - ? "" - : ""; - $column_data{drawing} = - ($ref->{drawing}) - ? "" - : ""; - $column_data{microfiche} = - ($ref->{microfiche}) - ? "" - : ""; - - $column_data{serialnumber} = ""; - - $column_data{soldtotal} = ""; - - $i++; - $i %= 2; - print ""; - - map { print "\n$column_data{$_}" } @column_index; - - print qq| - -|; - } + $::form->{l_soldtotal} = "Y"; + $::form->{sort} = "soldtotal"; + $::form->{lastsort} = "soldtotal"; - if ($form->{l_subtotal} eq 'Y') { - &parts_subtotal; - } #fi + $::form->{l_qty} = undef; + $::form->{l_linetotal} = undef; + $::form->{l_number} = "Y"; + $::form->{number} = "position"; - if ($form->{"l_linetotal"}) { - map { $column_data{$_} = "" } @column_index; - $column_data{linetotalsellprice} = - ""; - $column_data{linetotallastcost} = - ""; - $column_data{linetotallistprice} = - ""; - - print ""; - - map { print "\n$column_data{$_}" } @column_index; - - print qq| - |; + unless ( $::form->{bought} + || $::form->{sold} + || $::form->{rfq} + || $::form->{quoted}) { + $::form->{bought} = $::form->{sold} = 1; } - print qq| - -
$form->{title}
$option
" - . $form->format_amount(\%myconfig, $ref->{number}, '', " ") - . "$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}$ref->{soldtotal}
 " - . $form->format_amount(\%myconfig, $totalsellprice, 2, " ") - . "" - . $form->format_amount(\%myconfig, $totallastcost, 2, " ") - . "" - . $form->format_amount(\%myconfig, $totallistprice, 2, " ") - . "

- -|; + generate_report(); - print qq| - -
- -
{script}> - -{path}> -{login}> -{password}> - - - - - - - - - - - - - - - - -|; - - print $totop100; - - print qq| - + $lxdebug->leave_sub(); +} - |; +# +# 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 l_pricegroups +# +# hiddens: +# nextsub revers lastsort sort ndxs_counter +# +sub generate_report { + $lxdebug->enter_sub(); - if ($form->{menubar}) { - require "$form->{path}/menu.pl"; - &menubar; - } + $auth->assert('part_service_assembly_details'); - print qq| -
+ my ($revers, $lastsort, $description); - - -|; + my $cvar_configs = CVar->get_configs('module' => 'IC'); - $lxdebug->leave_sub(); -} # end addtop100 + my %titles = ( + '' => $locale->text('Articles'), + part => $locale->text('Parts'), + service => $locale->text('Services'), + assembly => $locale->text('Assemblies'), + assortment => $locale->text('Assortments'), + ); -sub generate_report { - $lxdebug->enter_sub(); + $form->{title} = $titles{$form->{searchitems}}; + + my %column_defs = ( + 'bin' => { 'text' => $locale->text('Bin'), }, + 'deliverydate' => { 'text' => $locale->text('deliverydate'), }, + 'description' => { 'text' => $locale->text('Part Description'), }, + 'notes' => { 'text' => $locale->text('Notes'), }, + 'drawing' => { 'text' => $locale->text('Drawing'), }, + 'ean' => { 'text' => $locale->text('EAN'), }, + 'image' => { 'text' => $locale->text('Image'), }, + 'insertdate' => { 'text' => $locale->text('Insert Date'), }, + '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('Stocked Qty'), }, + 'ordnumber' => { 'text' => $locale->text('Order Number'), }, + 'partnumber' => { 'text' => $locale->text('Part Number'), }, + 'partsgroup' => { 'text' => $locale->text('Partsgroup'), }, + '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('Qty in Selected Records'), }, + 'name' => { 'text' => $locale->text('Name in Selected Records'), }, + 'transdate' => { 'text' => $locale->text('Transdate'), }, + 'unit' => { 'text' => $locale->text('Unit'), }, + 'weight' => { 'text' => $locale->text('Weight'), }, + 'shop' => { 'text' => $locale->text('Shop article'), }, + 'projectnumber' => { 'text' => $locale->text('Project Number'), }, + 'projectdescription' => { 'text' => $locale->text('Project Description'), }, + ); - $revers = $form->{revers}; - $lastsort = $form->{lastsort}; + $revers = $form->{revers}; + $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 { - - # switch between backward sorting of tables if ($form->{lastsort} eq $form->{sort}) { - if ($form->{revers} == 0) { - $form->{revers} = 1; - } else { - $form->{revers} = 0; - } #fi + $form->{revers} = 1 - $form->{revers}; } else { - $form->{revers} == 0; + $form->{revers} = 0; $form->{lastsort} = $form->{sort}; } #fi } #fi - $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); - - # 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; - } - } - - IC->all_parts(\%myconfig, \%$form); + # 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) ], + ); - 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); - } - } + # get name of partsgroup if id is given + my $pg_name; + if ($form->{partsgroup_id}) { + my $pg = SL::DB::PartsGroup->new(id => $form->{partsgroup_id})->load; + $pg_name = $pg->{'partsgroup'}; + } + + # 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('Partsgroup') . ": '$form->{partsgroup}'", + partsgroup_id => $locale->text('Partsgroup') . ": '$pg_name'", + 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('Qty in Selected Records'), + ean => $locale->text('EAN') . ": '$form->{ean}'", + insertdatefrom => $locale->text('Insert Date') . ": " . $locale->text('From') . " " . $locale->date(\%myconfig, $form->{insertdatefrom}, 1), + insertdateto => $locale->text('Insert Date') . ": " . $locale->text('To (time)') . " " . $locale->date(\%myconfig, $form->{insertdateto}, 1), + ); - $option .= "
"; + my @itemstatus_keys = qw(active obsolete orphaned onhand short); + my @callback_keys = qw(onorder ordered rfq quoted bought sold partnumber partsgroup partsgroup_id serialnumber description make model + drawing microfiche l_soldtotal l_deliverydate transdatefrom transdateto insertdatefrom insertdateto ean shop all); - if ($form->{partnumber}) { - $callback .= "&partnumber=$form->{partnumber}"; - $option .= $locale->text('Part Number') . qq| : $form->{partnumber}
|; + # calculate dependencies + for (@itemstatus_keys, @callback_keys) { + next if ($form->{itemstatus} ne $_ && !$form->{$_}); + map { $form->{$_} = 'Y' } @{ $dependencies{$_} } if $dependencies{$_}; } - if ($form->{partsgroup}) { - $callback .= "&partsgroup=$form->{partsgroup}"; - $option .= $locale->text('Group') . qq| : $form->{partsgroup}
|; + + # 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}; } - if ($form->{serialnumber}) { - $callback .= "&serialnumber=$form->{serialnumber}"; - $option .= - $locale->text('Serial Number') . qq| : $form->{serialnumber}
|; + + # special case for lastcost + if ($form->{ledgerchecks}){ + # ledgerchecks don't know about sellprice or lastcost. they just return a + # price. so rename sellprice to price, and drop lastcost. + $column_defs{sellprice}{text} = $locale->text('Price'); + $form->{l_lastcost} = "" } + 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}
|; + $description =~ s/\n/
/g; } - @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_qty} = "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_linetotallastcost} = $form->{searchitems} eq 'assembly' && !$form->{bom} ? "" : 'Y' if $form->{l_lastcost}; $form->{l_linetotallistprice} = "Y" if $form->{l_listprice}; } @@ -1448,1615 +423,292 @@ sub generate_report { || $form->{ordered} || $form->{rfq} || $form->{quoted}) { - $form->{l_onhand} = "Y"; - } else { +# $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; + # soldtotal doesn't make sense with more than one bsooqr option. + # so reset it to sold (the most common option), and issue a warning + # ... + # also it doesn't make sense without bsooqr. disable and issue a warning too + my @bsooqr = qw(sold bought onorder ordered rfq quoted); + my $bsooqr_mode = grep { $form->{$_} } @bsooqr; + if ($form->{l_subtotal} && 1 < $bsooqr_mode) { + my $enabled = first { $form->{$_} } @bsooqr; + $form->{$_} = '' for @bsooqr; + $form->{$enabled} = 'Y'; - # add column to callback - $callback .= "&l_$item=Y"; - } + push @options, $::locale->text('Subtotal cannot distinguish betweens record types. Only one of the selected record types will be displayed: #1', $optiontexts{$enabled}); } + if ($form->{l_soldtotal} && !$bsooqr_mode) { + delete $form->{l_soldtotal}; - if ($form->{l_subtotal} eq 'Y') { - $callback .= "&l_subtotal=Y"; + flash('warning', $::locale->text('Soldtotal does not make sense without any bsooqr options')); } - $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; - - print qq| - - - - - - - - - + if ($form->{l_name} && !$bsooqr_mode) { + delete $form->{l_name}; - -|; - - 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} }; + flash('warning', $::locale->text('Name does not make sense without any bsooqr options')); } + IC->all_parts(\%myconfig, \%$form); - 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}; - - # use this for assemblies - $onhand = $ref->{onhand}; - - $align = "left"; - if ($ref->{assemblyitem}) { - $align = "right"; - $onhand = 0 if ($form->{sold}); - } - - $ref->{description} =~ s/ -/
/g; - - $column_data{partnumber} = - ""; - $column_data{description} = ""; - $column_data{partsgroup} = ""; - - $column_data{onhand} = - ""; - $column_data{sellprice} = - ""; - $column_data{listprice} = - ""; - $column_data{lastcost} = - ""; - - $column_data{linetotalsellprice} = ""; - $column_data{linetotallastcost} = ""; - $column_data{linetotallistprice} = ""; - - if (!$ref->{assemblyitem}) { - $totalsellprice += $onhand * $ref->{sellprice}; - $totallastcost += $onhand * $ref->{lastcost}; - $totallistprice += $onhand * $ref->{listprice}; - - $subtotalonhand += $onhand; - $subtotalsellprice += $onhand * $ref->{sellprice}; - $subtotallastcost += $onhand * $ref->{lastcost}; - $subtotallistprice += $onhand * $ref->{listprice}; - } - - $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}) - ? "" - : ""; - - $column_data{name} = ""; - - $column_data{image} = - ($ref->{image}) - ? "" - : ""; - $column_data{drawing} = - ($ref->{drawing}) - ? "" - : ""; - $column_data{microfiche} = - ($ref->{microfiche}) - ? "" - : ""; - - $column_data{serialnumber} = ""; - - $column_data{soldtotal} = - ""; - - $i++; - $i %= 2; - print ""; - - map { print "\n$column_data{$_}" } @column_index; - - print qq| - -|; - - } - - if ($form->{l_subtotal} eq 'Y') { - &parts_subtotal; - } - - if ($form->{"l_linetotal"}) { - map { $column_data{$_} = "" } @column_index; - $column_data{linetotalsellprice} = - ""; - $column_data{linetotallastcost} = - ""; - $column_data{linetotallistprice} = - ""; - - print ""; - - map { print "\n$column_data{$_}" } @column_index; - - print qq| - |; - } - - 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}> - - + my @columns = qw( + partnumber description notes partsgroup bin onhand rop soldtotal unit listprice + linetotallistprice sellprice linetotalsellprice lastcost linetotallastcost + priceupdate weight image drawing microfiche invnumber ordnumber quonumber + transdate name serialnumber deliverydate ean projectnumber projectdescription + insertdate shop + ); -{searchitems}> + my $pricegroups = SL::DB::Manager::Pricegroup->get_all_sorted; + my @pricegroup_columns; + my %column_defs_pricegroups; + if ($form->{l_pricegroups}) { + @pricegroup_columns = map { "pricegroup_" . $_->id } @{ $pricegroups }; + %column_defs_pricegroups = map { + "pricegroup_" . $_->id => { + text => $::locale->text('Pricegroup') . ' ' . $_->pricegroup, + visible => 1, + }, + } @{ $pricegroups }; + } + push @columns, @pricegroup_columns; + + my @includeable_custom_variables = grep { $_->{includeable} } @{ $cvar_configs }; + my @searchable_custom_variables = grep { $_->{searchable} } @{ $cvar_configs }; + my %column_defs_cvars = map { +"cvar_$_->{name}" => { 'text' => $_->{description} } } @includeable_custom_variables; + + push @columns, map { "cvar_$_->{name}" } @includeable_custom_variables; + + %column_defs = (%column_defs, %column_defs_cvars, %column_defs_pricegroups); + 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 shop), @pricegroup_columns; + + my @hidden_variables = ( + qw(l_subtotal l_linetotal searchitems itemstatus bom l_pricegroups insertdatefrom insertdateto), + @itemstatus_keys, + @callback_keys, + map({ "cvar_$_->{name}" } @searchable_custom_variables), + map({'cvar_'. $_->{name} .'_qtyop'} grep({$_->{type} eq 'number'} @searchable_custom_variables)), + map({ "l_$_" } @columns), + ); -{path}> -{login}> -{password}>|; + my $callback = build_std_url('action=generate_report', grep { $form->{$_} } @hidden_variables); - print qq| - |; + my @sort_full = qw(partnumber description onhand soldtotal deliverydate insertdate shop); + my @sort_no_revers = qw(partsgroup bin priceupdate invnumber ordnumber quonumber name image drawing serialnumber); - if ($form->{menubar}) { - require "$form->{path}/menu.pl"; - &menubar; + 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; - print qq| -
- - - -|; - - $lxdebug->leave_sub(); -} #end generate_report - -sub parts_subtotal { - $lxdebug->enter_sub(); - - 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; - $subtotalsellprice = 0; - $subtotallistprice = 0; - $subtotallastcost = 0; - - print ""; - - map { print "\n$column_data{$_}" } @column_index; - - print qq| - -|; - - $lxdebug->leave_sub(); -} - -sub edit { - $lxdebug->enter_sub(); - - IC->get_part(\%myconfig, \%$form); - - $form->{title} = $locale->text('Edit ' . ucfirst $form->{item}); - - &link_part; - &display_form; - - $lxdebug->leave_sub(); -} - -sub link_part { - $lxdebug->enter_sub(); - - IC->create_links("IC", \%myconfig, \%$form); - - # currencies - map { $form->{selectcurrency} .= "