X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=bin%2Fmozilla%2Fic.pl;h=f3e7fe5d43f4c5d20d9cfdc25df944b5c03697a8;hb=a9d9ca02abd3a0ff1e43f23888142266174bec55;hp=1489a024d3b5b6dd4ad5d554264d4f7060e90989;hpb=4247547d2a925ddad7006cae89e5f9f1fda7d469;p=kivitendo-erp.git diff --git a/bin/mozilla/ic.pl b/bin/mozilla/ic.pl index 1489a024d..f3e7fe5d4 100644 --- a/bin/mozilla/ic.pl +++ b/bin/mozilla/ic.pl @@ -24,7 +24,8 @@ # 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 @@ -38,8 +39,9 @@ use List::MoreUtils qw(any); use SL::AM; use SL::CVar; use SL::IC; -use SL::Helper::Flash; +use SL::Helper::Flash qw(flash); use SL::HTML::Util; +use SL::Presenter::Part; use SL::ReportGenerator; #use SL::PE; @@ -51,7 +53,6 @@ use strict; our ($form, $locale, %myconfig, $lxdebug, $auth); require "bin/mozilla/io.pl"; -require "bin/mozilla/invoice_io.pl"; require "bin/mozilla/common.pl"; require "bin/mozilla/reportgenerator.pl"; @@ -75,23 +76,6 @@ require "bin/mozilla/reportgenerator.pl"; # end of main -sub add { - $lxdebug->enter_sub(); - - $auth->assert('part_service_assembly_edit'); - - my $title = 'Add ' . ucfirst $form->{item}; - $form->{title} = $locale->text($title); - $form->{callback} = "$form->{script}?action=add&item=$form->{item}" unless $form->{callback}; - $form->{unit_changeable} = 1; - - IC->get_pricegroups(\%myconfig, \%$form); - &link_part; - &display_form; - - $lxdebug->leave_sub(); -} - sub search { $lxdebug->enter_sub(); @@ -101,11 +85,9 @@ sub search { $form->{lastsort} = ""; # memory for which table was sort at last time $form->{ndxs_counter} = 0; # counter for added entries to top100 - my %is_xyz = map { +"is_$_" => ($form->{searchitems} eq $_) } qw(part service assembly); - $form->{title} = (ucfirst $form->{searchitems}) . "s"; + $form->{title} =~ s/ys$/ies/; $form->{title} = $locale->text($form->{title}); - $form->{title} = $locale->text('Assemblies') if ($is_xyz{is_assembly}); $form->{CUSTOM_VARIABLES} = CVar->get_configs('module' => 'IC'); ($form->{CUSTOM_VARIABLES_FILTER_CODE}, @@ -113,868 +95,40 @@ sub search { 'include_prefix' => 'l_', 'include_value' => 'Y'); + setup_ic_search_action_bar(); $form->header; $form->get_lists('partsgroup' => 'ALL_PARTSGROUPS'); - print $form->parse_html_template('ic/search', { %is_xyz, - dateformat => $myconfig{dateformat}, - limit => $myconfig{vclimit}, }); - - $lxdebug->leave_sub(); -} #end search() - -sub search_update_prices { - $lxdebug->enter_sub(); - - $auth->assert('part_service_assembly_edit'); - - my $pricegroups = IC->get_pricegroups(\%myconfig, \%$form); - - $form->{title} = $locale->text('Update Prices'); - - $form->header; - - print $form->parse_html_template('ic/search_update_prices', { PRICE_ROWS => $pricegroups }); + print $form->parse_html_template('ic/search'); $lxdebug->leave_sub(); } #end search() -sub confirm_price_update { - $lxdebug->enter_sub(); - - $auth->assert('part_service_assembly_edit'); - - my @errors = (); - my $value_found = undef; - - 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 ((0 > $value) && ($type eq 'percent')) { - push @errors, $locale->text('You cannot adjust the price for pricegroup "#1" by a negative percentage.', $name); - - } elsif (!$value && ($form->{$value_idx} ne '')) { - push @errors, $locale->text('No valid number entered for pricegroup "#1".', $name); - - } elsif (0 < $value) { - $value_found = 1; - } - } - - push @errors, $locale->text('No prices will be updated because no prices have been entered.') if (!$value_found); - - my $num_matches = IC->get_num_matches_for_priceupdate(); - - $form->header(); - - if (@errors) { - $form->show_generic_error(join('
', @errors), 'back_button' => 1); - } - - $form->{nextsub} = "update_prices"; - - map { delete $form->{$_} } qw(action header); - - print $form->parse_html_template('ic/confirm_price_update', { HIDDENS => [ map { name => $_, value => $form->{$_} }, keys %$form ], - num_matches => $num_matches }); - - $lxdebug->leave_sub(); -} - -sub update_prices { - $lxdebug->enter_sub(); - - $auth->assert('part_service_assembly_edit'); - - my $num_updated = IC->update_prices(\%myconfig, \%$form); - - if (-1 != $num_updated) { - $form->redirect($locale->text('#1 prices were updated.', $num_updated)); - } else { - $form->error($locale->text('Could not update prices!')); - } - - $lxdebug->leave_sub(); -} - -#sub choice { -# $lxdebug->enter_sub(); -# -# $auth->assert('part_service_assembly_edit'); -# -# our ($j, $lastndx); -# my ($totop100); -# -# $form->{title} = $locale->text('Top 100 hinzufuegen'); -# -# $form->header; -# -# 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 -# 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 - -#sub list { -# $lxdebug->enter_sub(); -# -# $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| -#

| . $locale->text('choice part') . 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('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"}
-# -#
-# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -# -#{ndxs_counter}>|; -# -# my $totop100 = ""; -# -# 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| -# -# -#
-#|; -# $lxdebug->leave_sub(); -#} #end list() - sub top100 { - $lxdebug->enter_sub(); - - $auth->assert('part_service_assembly_edit'); - - if ($form->{ndx}) { - $form->{ndxs_counter}++; - - 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 - -sub addtop100 { - $lxdebug->enter_sub(); - - $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"; - $form->{l_linetotal} = ""; - $form->{revers} = 1; - $form->{number} = "position"; - $form->{l_number} = "Y"; - - $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&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 .= "
"; - - if ($form->{partnumber}) { - $callback .= "&partnumber=$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}
|; - } - 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/\n/
/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 @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"; - $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} = ""; - } - } - - foreach my $item (@columns) { - if ($form->{"l_$item"} eq "Y") { - push @column_index, $item; + $::lxdebug->enter_sub(); - # add column to callback - $callback .= "&l_$item=Y"; - } - } - - if ($form->{l_subtotal} eq 'Y') { - $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||; - - $form->header; - my $colspan = $#column_index + 1; - - print qq| -

$form->{title}

- - - - - - -|; - - map { print "\n$column_header{$_}" } @column_index; - - print qq| - - |; - - # add order to callback - $form->{callback} = $callback .= "&sort=$form->{sort}"; + $::auth->assert('part_service_assembly_edit'); - # escape callback for href - $callback = $form->escape($callback); + $::form->{l_soldtotal} = "Y"; + $::form->{sort} = "soldtotal"; + $::form->{lastsort} = "soldtotal"; - if (@{ $form->{parts} }) { - $sameitem = $form->{parts}->[0]->{ $form->{sort} }; - } + $::form->{l_qty} = undef; + $::form->{l_linetotal} = undef; + $::form->{l_number} = "Y"; + $::form->{number} = "position"; - # insert numbers for top100 - my $j = 0; - foreach my $ref (@{ $form->{parts} }) { - $j++; - $ref->{number} = $j; + unless ( $::form->{bought} + || $::form->{sold} + || $::form->{rfq} + || $::form->{quoted}) { + $::form->{bought} = $::form->{sold} = 1; } - # if avaible -> insert choice here - 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"}> -{"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 - my $i = 0; - foreach my $ref (@{ $form->{parts} }) { - - if ($form->{l_subtotal} eq 'Y' && !$ref->{assemblyitem}) { - if ($sameitem ne $ref->{ $form->{sort} }) { - parts_subtotal(\@column_index, \$subtotalonhand, \$subtotalsellprice, \$subtotallastcost, \$subtotallistprice); - $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/\n/
/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} = ""; - - 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(\@column_index, \$subtotalonhand, \$subtotalsellprice, \$subtotallastcost, \$subtotallistprice); - } #fi - - 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| - -
$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}) - . "" - . $form->format_amount(\%myconfig, $ref->{listprice}) - . "" - . $form->format_amount(\%myconfig, $ref->{lastcost}) - . "" - . $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}&callback=$callback>$ref->{invnumber}$ref->{invnumber}{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&callback=$callback>$ref->{ordnumber}$ref->{ordnumber}{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&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) - . "

- -|; - - print qq| - -
- -
{script}> - - - - - - - - - - - - - - - - -|; - - print $totop100; - - print qq| - - - - -
-|; + generate_report(); $lxdebug->leave_sub(); -} # end addtop100 +} # # Report for Wares. @@ -986,7 +140,7 @@ sub addtop100 { # searchitems=part revers=0 lastsort='' # # filter: -# partnumber ean description partsgroup serialnumber make model drawing microfiche +# partnumber ean description partsgroup classification serialnumber make model drawing microfiche # transdatefrom transdateto # # radio: @@ -1011,12 +165,9 @@ sub generate_report { my $cvar_configs = CVar->get_configs('module' => 'IC'); - $form->{title} = (ucfirst $form->{searchitems}) . "s"; - $form->{title} =~ s/ys$/ies/; - $form->{title} = $locale->text($form->{title}); + $form->{title} = $locale->text('Articles'); my %column_defs = ( - 'bin' => { 'text' => $locale->text('Bin'), }, 'deliverydate' => { 'text' => $locale->text('deliverydate'), }, 'description' => { 'text' => $locale->text('Part Description'), }, 'notes' => { 'text' => $locale->text('Notes'), }, @@ -1026,6 +177,7 @@ sub generate_report { 'insertdate' => { 'text' => $locale->text('Insert Date'), }, 'invnumber' => { 'text' => $locale->text('Invoice Number'), }, 'lastcost' => { 'text' => $locale->text('Last Cost'), }, + 'assembly_lastcost' => { 'text' => $locale->text('Assembly Last Cost'), }, 'linetotallastcost' => { 'text' => $locale->text('Extended'), }, 'linetotallistprice' => { 'text' => $locale->text('Extended'), }, 'linetotalsellprice' => { 'text' => $locale->text('Extended'), }, @@ -1033,22 +185,28 @@ sub generate_report { 'microfiche' => { 'text' => $locale->text('Microfiche'), }, 'name' => { 'text' => $locale->text('Name'), }, 'onhand' => { 'text' => $locale->text('Stocked Qty'), }, + 'assembly_qty' => { 'text' => $locale->text('Assembly Item Qty'), }, 'ordnumber' => { 'text' => $locale->text('Order Number'), }, 'partnumber' => { 'text' => $locale->text('Part Number'), }, - 'partsgroup' => { 'text' => $locale->text('Group'), }, - 'priceupdate' => { 'text' => $locale->text('Updated'), }, + 'partsgroup' => { 'text' => $locale->text('Partsgroup'), }, + 'priceupdate' => { 'text' => $locale->text('Price 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'), }, + 'transdate' => { 'text' => $locale->text('Transdate Record'), }, 'unit' => { 'text' => $locale->text('Unit'), }, 'weight' => { 'text' => $locale->text('Weight'), }, - 'shop' => { 'text' => $locale->text('Shopartikel'), }, + 'shop' => { 'text' => $locale->text('Shop article'), }, + 'type_and_classific' => { 'text' => $locale->text('Type'), }, 'projectnumber' => { 'text' => $locale->text('Project Number'), }, 'projectdescription' => { 'text' => $locale->text('Project Description'), }, + 'warehouse' => { 'text' => $locale->text('Default Warehouse'), }, + 'bin' => { 'text' => $locale->text('Default Bin'), }, + 'make' => { 'text' => $locale->text('Make'), }, + 'model' => { 'text' => $locale->text('Model'), }, ); $revers = $form->{revers}; @@ -1111,6 +269,7 @@ sub generate_report { obsolete => $locale->text('Obsolete'), orphaned => $locale->text('Orphaned'), onhand => $locale->text('On Hand'), + assembly_qty => $locale->text('Assembly Item Qty'), short => $locale->text('Short'), onorder => $locale->text('On Order'), ordered => $locale->text('Ordered'), @@ -1121,23 +280,29 @@ sub generate_report { 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}'", - partsgroup_id => $locale->text('Group') . ": '$pg_name'", + 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}'", + customername => $locale->text('Customer') . ": '$form->{customername}'", + customernumber=> $locale->text('Customer Part Number').": '$form->{customernumber}'", 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), + l_service => $locale->text('Services'), + l_assembly => $locale->text('Assemblies'), + l_part => $locale->text('Parts'), ); 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); + drawing microfiche l_soldtotal l_deliverydate transdatefrom transdateto insertdatefrom insertdateto ean shop all + l_service l_assembly l_part); # calculate dependencies for (@itemstatus_keys, @callback_keys) { @@ -1159,6 +324,7 @@ sub generate_report { $column_defs{sellprice}{text} = $locale->text('Price'); $form->{l_lastcost} = "" } + $form->{l_assembly_lastcost} = "Y" if $form->{l_assembly} && $form->{l_lastcost}; if ($form->{description}) { $description = $form->{description}; @@ -1171,11 +337,12 @@ sub generate_report { $form->{l_linetotallastcost} = $form->{searchitems} eq 'assembly' && !$form->{bom} ? "" : 'Y' if $form->{l_lastcost}; $form->{l_linetotallistprice} = "Y" if $form->{l_listprice}; } + $form->{"l_type_and_classific"} = "Y"; - if ($form->{searchitems} eq 'service') { + if ($form->{l_service} && !$form->{l_assembly} && !$form->{l_part}) { - # remove bin, weight and rop from list - map { $form->{"l_$_"} = "" } qw(bin weight rop); + # remove warehouse, bin, weight and rop from list + map { $form->{"l_$_"} = "" } qw(bin weight rop warehouse); $form->{l_onhand} = ""; @@ -1211,6 +378,10 @@ sub generate_report { flash('warning', $::locale->text('Soldtotal does not make sense without any bsooqr options')); } + if ($form->{l_soldtotal} && ($form->{l_warehouse} || $form->{l_bin})) { + delete $form->{"l_$_"} for qw(bin warehouse); + flash('warning', $::locale->text('Sorry, I am too stupid to figure out the default warehouse/bin and the sold qty. I drop the default warehouse/bin option.')); + } if ($form->{l_name} && !$bsooqr_mode) { delete $form->{l_name}; @@ -1219,14 +390,15 @@ sub generate_report { IC->all_parts(\%myconfig, \%$form); my @columns = qw( - partnumber description notes partsgroup bin onhand rop soldtotal unit listprice - linetotallistprice sellprice linetotalsellprice lastcost linetotallastcost + partnumber type_and_classific description notes partsgroup warehouse bin + make model assembly_qty onhand rop soldtotal unit listprice + linetotallistprice sellprice linetotalsellprice lastcost assembly_lastcost linetotallastcost priceupdate weight image drawing microfiche invnumber ordnumber quonumber transdate name serialnumber deliverydate ean projectnumber projectdescription insertdate shop ); - my $pricegroups = SL::DB::Manager::Pricegroup->get_all(sort => 'id'); + my $pricegroups = SL::DB::Manager::Pricegroup->get_all_sorted; my @pricegroup_columns; my %column_defs_pricegroups; if ($form->{l_pricegroups}) { @@ -1248,13 +420,16 @@ sub generate_report { %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; + map { $column_defs{$_}->{align} = 'right' } qw(assembly_qty onhand sellprice listprice lastcost assembly_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), + qw(l_type_and_classific classification_id l_part l_service l_assembly l_assortment), @itemstatus_keys, @callback_keys, map({ "cvar_$_->{name}" } @searchable_custom_variables), + map({'cvar_'. $_->{name} .'_from'} grep({$_->{type} eq 'date'} @searchable_custom_variables)), + map({'cvar_'. $_->{name} .'_to'} grep({$_->{type} eq 'date'} @searchable_custom_variables)), map({'cvar_'. $_->{name} .'_qtyop'} grep({$_->{type} eq 'number'} @searchable_custom_variables)), map({ "l_$_" } @columns), ); @@ -1262,7 +437,7 @@ sub generate_report { my $callback = build_std_url('action=generate_report', grep { $form->{$_} } @hidden_variables); 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); + my @sort_no_revers = qw(partsgroup 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); @@ -1278,13 +453,15 @@ sub generate_report { 'part' => $locale->text('part_list'), 'service' => $locale->text('service_list'), 'assembly' => $locale->text('assembly_list'), + 'article' => $locale->text('article_list'), ); $report->set_options('raw_top_info_text' => $form->parse_html_template('ic/generate_report_top', { options => \@options }), - 'raw_bottom_info_text' => $form->parse_html_template('ic/generate_report_bottom'), + 'raw_bottom_info_text' => $form->parse_html_template('ic/generate_report_bottom' , + { PART_CLASSIFICATIONS => SL::DB::Manager::PartClassification->get_all_sorted }), 'output_format' => 'HTML', 'title' => $form->{title}, - 'attachment_basename' => $attachment_basenames{$form->{searchitems}} . strftime('_%Y%m%d', localtime time), + 'attachment_basename' => 'article_list' . strftime('_%Y%m%d', localtime time), ); $report->set_options_from_form(); $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv'; @@ -1328,6 +505,7 @@ sub generate_report { $ref->{sellprice} *= $ref->{exchangerate} / $ref->{price_factor}; $ref->{listprice} *= $ref->{exchangerate} / $ref->{price_factor}; $ref->{lastcost} *= $ref->{exchangerate} / $ref->{price_factor}; + $ref->{assembly_lastcost} *= $ref->{exchangerate} / $ref->{price_factor}; # use this for assemblies my $soldtotal = $bsooqr_mode ? $ref->{soldtotal} : $ref->{onhand}; @@ -1338,11 +516,11 @@ sub generate_report { $soldtotal = 0 if ($form->{sold}); } - my $edit_link = build_std_url('action=edit', 'id=' . E($ref->{id}), 'callback'); + my $edit_link = build_std_url('script=controller.pl', 'action=Part/edit', 'part.id=' . E($ref->{id})); $row->{partnumber}->{link} = $edit_link; $row->{description}->{link} = $edit_link; - foreach (qw(sellprice listprice lastcost)) { + foreach (qw(sellprice listprice lastcost assembly_lastcost)) { $row->{$_}{data} = $form->format_amount(\%myconfig, $ref->{$_}, 2); $row->{"linetotal$_"}{data} = $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{$_}, 2); } @@ -1376,14 +554,23 @@ sub generate_report { # | ist bestellt | Von Kunden bestellt | -> edit_oe_ord_link # | Anfrage | Angebot | -> edit_oe_quo_link - my $edit_oe_ord_link = build_std_url("script=oe.pl", 'action=edit', 'type=' . E($ref->{cv} eq 'vendor' ? 'purchase_order' : 'sales_order'), 'id=' . E($ref->{trans_id}), 'callback'); - my $edit_oe_quo_link = build_std_url("script=oe.pl", 'action=edit', 'type=' . E($ref->{cv} eq 'vendor' ? 'request_quotation' : 'sales_quotation'), 'id=' . E($ref->{trans_id}), 'callback'); + my $edit_oe_ord_link = ($::instance_conf->get_feature_experimental_order) + ? build_std_url("script=controller.pl", 'action=Order/edit', + 'type=' . E($ref->{cv} eq 'vendor' ? 'purchase_order' : 'sales_order'), 'id=' . E($ref->{trans_id}), 'callback') + : build_std_url("script=oe.pl", 'action=edit', + 'type=' . E($ref->{cv} eq 'vendor' ? 'purchase_order' : 'sales_order'), 'id=' . E($ref->{trans_id}), 'callback'); + + my $edit_oe_quo_link = ($::instance_conf->get_feature_experimental_order) + ? build_std_url("script=controller.pl", 'action=Order/edit', + 'type=' . E($ref->{cv} eq 'vendor' ? 'request_quotation' : 'sales_quotation'), 'id=' . E($ref->{trans_id}), 'callback') + : build_std_url("script=oe.pl", 'action=edit', + 'type=' . E($ref->{cv} eq 'vendor' ? 'request_quotation' : 'sales_quotation'), 'id=' . E($ref->{trans_id}), 'callback'); $row->{ordnumber}{link} = $edit_oe_ord_link; $row->{quonumber}{link} = $edit_oe_quo_link if (!$ref->{ordnumber}); } else { - $row->{invnumber}{link} = build_std_url("script=$ref->{module}.pl", 'action=edit', 'type=invoice', 'id=' . E($ref->{trans_id}), 'callback'); + $row->{invnumber}{link} = build_std_url("script=$ref->{module}.pl", 'action=edit', 'type=invoice', 'id=' . E($ref->{trans_id}), 'callback') if ($ref->{invnumber}); } # set properties of images @@ -1394,6 +581,11 @@ sub generate_report { map { $row->{$_}{link} = $ref->{$_} } qw(drawing microfiche); $row->{notes}{data} = SL::HTML::Util->strip($ref->{notes}); + $row->{type_and_classific}{data} = SL::Presenter::Part::type_abbreviation($ref->{part_type}). + SL::Presenter::Part::classification_abbreviation($ref->{classification_id}); + + # last price update + $row->{priceupdate}{data} = SL::DB::Part->new(id => $ref->{id})->load->last_price_update->valid_from->to_kivitendo; $report->add_data($row); @@ -1405,7 +597,7 @@ sub generate_report { (!$next_ref->{assemblyitem} && ($same_item ne $next_ref->{ $form->{sort} })))) { my $row = { map { $_ => { 'class' => 'listsubtotal', } } @columns }; - if (($form->{searchitems} ne 'assembly') || !$form->{bom}) { + if ( !$form->{l_assembly} || !$form->{bom}) { $row->{soldtotal}->{data} = $form->format_amount(\%myconfig, $subtotals{soldtotal}); } @@ -1429,714 +621,58 @@ sub generate_report { $report->add_data($row); } + setup_ic_generate_report_action_bar(); $report->generate_with_headers(); $lxdebug->leave_sub(); } #end generate_report -sub parts_subtotal { - $lxdebug->enter_sub(); - - $auth->assert('part_service_assembly_edit'); - - my (%column_data); - my ($column_index, $subtotalonhand, $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; - $$subtotalsellprice = 0; - $$subtotallistprice = 0; - $$subtotallastcost = 0; - - print ""; - - map { print "\n$column_data{$_}" } @{ $column_index }; - - print qq| - -|; - - $lxdebug->leave_sub(); -} - -sub edit { - $lxdebug->enter_sub(); - - $auth->assert('part_service_assembly_details'); - - # show history button - $form->{javascript} = qq||; - #/show hhistory button - IC->get_part(\%myconfig, \%$form); - - $form->{"original_partnumber"} = $form->{"partnumber"}; - - my $title = 'Edit ' . ucfirst $form->{item}; - $form->{title} = $locale->text($title); - - &link_part; - &display_form; - - $lxdebug->leave_sub(); -} - -sub link_part { - $lxdebug->enter_sub(); - - $auth->assert('part_service_assembly_details'); - - IC->create_links("IC", \%myconfig, \%$form); - - # currencies - map({ $form->{selectcurrency} .= "