X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=bin%2Fmozilla%2Fic.pl;h=fc0da269e7d0244cf5f3961d3f312a7cd4363d7e;hb=f559ec45ea2fc09c361ef7e4a40a59b1f2133737;hp=b2a4da64a9da486cb8a38a97677ea9be11798207;hpb=a2a806917f032855799eebba851e67eff2e377ef;p=kivitendo-erp.git diff --git a/bin/mozilla/ic.pl b/bin/mozilla/ic.pl index b2a4da64a..fc0da269e 100644 --- a/bin/mozilla/ic.pl +++ b/bin/mozilla/ic.pl @@ -32,11 +32,23 @@ #====================================================================== #$locale->text('ea'); +use POSIX qw(strftime); + use SL::IC; +use SL::ReportGenerator; #use SL::PE; -require "$form->{path}/io.pl"; +# use strict; +#use warnings; + +# global imports +our ($form, $locale, %myconfig, $lxdebug); + +require "bin/mozilla/io.pl"; +require "bin/mozilla/invoice_io.pl"; +require "bin/mozilla/common.pl"; +require "bin/mozilla/reportgenerator.pl"; 1; @@ -48,11 +60,11 @@ sub add { $form->{title} = $locale->text('Add ' . ucfirst $form->{item}); $form->{callback} = - "$form->{script}?action=add&item=$form->{item}&path=$form->{path}&login=$form->{login}&password=$form->{password}" + "$form->{script}?action=add&item=$form->{item}&login=$form->{login}&password=$form->{password}" unless $form->{callback}; - $form->{unit} = - ($form->{item} eq 'service') ? $locale->text('hr') : $locale->text('ea'); + $form->{"unit_changeable"} = 1; + IC->get_pricegroups(\%myconfig, \%$form); &link_part; &display_form; @@ -63,6 +75,8 @@ sub add { sub search { $lxdebug->enter_sub(); + my ($button1, $button2, $onhand, $makemodel, $serialnumber, $l_serialnumber, $toplevel, $bought); + $form->{title} = (ucfirst $form->{searchitems}) . "s"; $form->{title} = $locale->text($form->{title}); @@ -79,8 +93,8 @@ sub search { # $locale->text('Services') # use JavaScript Calendar or not - $form->{jsscript} = $jscalendar; - $jsscript = ""; + $form->{jsscript} = 1; + my $jsscript = ""; if ($form->{jsscript}) { # with JavaScript Calendar @@ -96,44 +110,33 @@ sub search { |; #write Trigger - $jsscript = - Form->write_trigger(\%myconfig, "2", "transdatefrom", "BL", "trigger1", - "transdateto", "BL", "trigger2"); + $jsscript = Form->write_trigger(\%myconfig, "2", "transdatefrom", "BL", "trigger1", "transdateto", "BL", "trigger2"); } else { # without JavaScript Calendar - $button1 = qq| - |; - $button2 = qq| - |; + $button1 = qq| |; + $button2 = qq| |; } unless ($form->{searchitems} eq 'service') { - $onhand = qq| -  | - . $locale->text('On Hand') . qq| -  | - . $locale->text('Short') . qq| + $onhand = qq|  | . $locale->text('On Hand') . qq| +  | . $locale->text('Short') . qq| |; $makemodel = qq| - | . $locale->text('Make') . qq| - - | . $locale->text('Model') . qq| - + | . $locale->text('Make') . qq| + | . $locale->text('Model') . qq| |; $serialnumber = qq| - | . $locale->text('Serial Number') . qq| - + | . $locale->text('Serial Number') . qq| |; $l_serialnumber = qq| -  | - . $locale->text('Serial Number') . qq| +  | . $locale->text('Serial Number') . qq| |; } @@ -185,7 +188,7 @@ sub search {   | . $locale->text('From') . qq| $button1 - | . $locale->text('To') . qq| + | . $locale->text('To (time)') . qq| $button2 @@ -235,7 +238,7 @@ sub search { | . $locale->text('From') . qq| $button1 - | . $locale->text('To') . qq| + | . $locale->text('To (time)') . qq| $button2 @@ -269,6 +272,8 @@ sub search { | . $locale->text('Part Number') . qq| + | . $locale->text('EAN') . qq| + | @@ -326,7 +331,7 @@ sub search { . $locale->text('List Price') . qq|  | . $locale->text('Sell Price') . qq| -  | +  | . $locale->text('Last Cost') . qq|  | . $locale->text('Line Total') . qq| @@ -372,12 +377,12 @@ $jsscript -{path}> {login}> {password}> + @@ -394,9 +399,238 @@ $jsscript $lxdebug->leave_sub(); } #end search() +sub search_update_prices { + $lxdebug->enter_sub(); + + my ($onhand, $makemodel, $serialnumber, $l_serialnumber, $toplevel, $bought); + + $form->{title} = $locale->text('Update prices'); + IC->get_pricegroups(\%myconfig, \%$form); + + # use JavaScript Calendar or not +# $form->{jsscript} = 1; +# $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| +# |; +# } + + $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| +|; + + + + $form->header; + + print qq| + + +
{script}> + + + + + + + + " } @column_index; $subtotalonhand = 0 if ($form->{searchitems} eq 'assembly' && $form->{bom}); $column_data{onhand} = ""; $column_data{linetotalsellprice} = ""; $column_data{linetotallistprice} = ""; $column_data{linetotallastcost} = ""; $subtotalonhand = 0; @@ -1841,9 +1863,13 @@ sub parts_subtotal { sub edit { $lxdebug->enter_sub(); - + # show history button + $form->{javascript} = qq||; + #/show hhistory button IC->get_part(\%myconfig, \%$form); + $form->{"original_partnumber"} = $form->{"partnumber"}; + $form->{title} = $locale->text('Edit ' . ucfirst $form->{item}); &link_part; @@ -1858,23 +1884,23 @@ sub link_part { IC->create_links("IC", \%myconfig, \%$form); # currencies - map { $form->{selectcurrency} .= "|; + foreach my $item (@{ $form->{payment_terms} }) { + if ($form->{payment_id} eq $item->{id}) { + $payment .= qq||; + } else { + $payment .= qq||; + } + } + + if (($rows = $form->numtextrows($form->{notes}, 40)) < 2) { - $rows = 2; + $rows = 4; } $notes = - qq||; + qq||; if (($rows = $form->numtextrows($form->{description}, 40)) > 1) { $description = qq||; @@ -1994,12 +2013,35 @@ sub form_header { qq||; } - foreach $item (split / /, $form->{taxaccounts}) { + $ean = qq||; + + foreach my $item (split / /, $form->{taxaccounts}) { $form->{"IC_tax_$item"} = ($form->{"IC_tax_$item"}) ? "checked" : ""; } + IC->retrieve_buchungsgruppen(\%myconfig, $form); + if (@{ $form->{BUCHUNGSGRUPPEN} }) { + foreach my $item (@{ $form->{BUCHUNGSGRUPPEN} }) { + if ($item->{id} == $form->{buchungsgruppen_id}) { + $form->{selectbuchungsgruppe} .= + " + + + |; + + # set option - foreach $item (qw(IC IC_income IC_expense)) { + foreach my $item (qw(IC IC_income IC_expense)) { if ($form->{$item}) { if ($form->{id} && $form->{orphaned}) { $form->{"select$item"} =~ s/ selected//; @@ -2025,7 +2067,7 @@ sub form_header { } # tax fields - foreach $item (split / /, $form->{taxaccounts}) { + foreach my $item (split / /, $form->{taxaccounts}) { $tax .= qq| {"IC_tax_$item"}> $form->{"IC_tax_${item}_description"}
@@ -2074,11 +2116,6 @@ sub form_header { -
$form->{title}
+ + + + + + + + + + + + + $serialnumber + + $makemodel + + + + + + + $toplevel + + + + + $bought + + + + |; + print qq| + + + + + +
| . $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| +
+
+
+ + + + + + + + + + + + + + + + +|; + for my $i (1 .. $form->{price_rows}) { + print qq| + + + + + + +|; + } + + print qq| +
| . $locale->text('Preisklasse') . qq|| . $locale->text('Preis') . qq|| . $locale->text('Prozentual/Absolut') . qq|
| . $locale->text('Sell Price') . qq|/
| . $locale->text('List Price') . qq|/
$form->{"pricegroup_$i"}/
+

+ +{price_rows}> + +{login}> +{password}> + +
+ + + + + +|; + $lxdebug->leave_sub(); +} #end search() + +sub confirm_price_update { + $lxdebug->enter_sub(); + + + $form->{nextsub} = "update_prices"; + $form->header; + + print qq| + + +
{script}> +|; + + # delete action variable + map { delete $form->{$_} } qw(action header); + + foreach my $key (keys %$form) { + $form->{$key} =~ s/\"/"/g; + print qq|\n|; + } + + print qq| +

| . $locale->text('Confirm!') . qq|

+ +

| + . $locale->text('Are you sure you want to update the prices') +. qq|

+ +

+ +

+|; + + $lxdebug->leave_sub(); +} + +sub update_prices { + $lxdebug->enter_sub(); + + if (IC->update_prices(\%myconfig, \%$form)) { + $form->redirect($form->{update_count} . $locale->text('prices updated!')); + } else { + $form->error($locale->text('Could not update prices!')); + } + + $lxdebug->leave_sub(); +} + sub choice { $lxdebug->enter_sub(); + our ($j, $lastndx); + my ($totop100); + $form->{title} = $locale->text('Top 100 hinzufuegen'); $form->header; @@ -415,10 +649,8 @@ sub choice { print qq| - - + + @@ -429,7 +661,6 @@ sub choice { print qq| -{path}> {login}> {password}> @@ -461,9 +692,10 @@ sub choice { {extras}>|; + my ($partnumber, $description, $unit, $sellprice, $soldtotal); # if choice set data if ($form->{ndx}) { - for ($i = 0; $i < $form->{ndxs_counter}; $i++) { + for (my $i = 0; $i < $form->{ndxs_counter}; $i++) { # prepeare data $partnumber = $form->{"totop100_partnumber_$j"}; @@ -487,7 +719,7 @@ sub choice { # set data for next page if (($form->{ndxs_counter}) > 0) { - for ($i = 1; ($i < $form->{ndxs_counter} + 1); $i++) { + 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"}; @@ -519,20 +751,12 @@ sub 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 + 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'); @@ -587,7 +811,6 @@ sub list {
-{path}> {login}> {password}> @@ -615,21 +838,16 @@ sub list { {ndxs_counter}>|; - $totop100 = ""; + my $totop100 = ""; if (($form->{ndxs_counter}) > 0) { for ($i = 1; ($i < $form->{ndxs_counter} + 1); $i++) { - $j1 = $form->{"totop100_partnumber_$i"}; - $j2 = $form->{"totop100_description_$i"}; - $j3 = $form->{"totop100_unit_$i"}; - $j4 = $form->{"totop100_sellprice_$i"}; - $j5 = $form->{"totop100_soldtotal_$i"}; - - $partnumber = $j1; - $description = $j2; - $unit = $j3; - $sellprice = $j4; - $soldtotal = $j5; + + $partnumber = $form->{"totop100_partnumber_$i"}; + $description = $form->{"totop100_description_$i"}; + $unit = $form->{"totop100_unit_$i"}; + $sellprice = $form->{"totop100_sellprice_$i"}; + $soldtotal = $form->{"totop100_soldtotal_$i"}; $totop100 .= qq| {"totop100_partnumber_$i"}> @@ -662,18 +880,13 @@ sub top100 { 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; + 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(); @@ -683,18 +896,22 @@ sub top100 { sub addtop100 { $lxdebug->enter_sub(); + my ($revers, $lastsort, $callback, $option, $description, $sameitem, + $partnumber, $unit, $sellprice, $soldtotal, $totop100, $onhand, $align); + my (@column_index, %column_header, %column_data); + my ($totalsellprice, $totallastcost, $totallistprice, $subtotalonhand, $subtotalsellprice, $subtotallastcost, $subtotallistprice); + $form->{top100} = "top100"; $form->{l_soldtotal} = "Y"; $form->{soldtotal} = "soldtotal"; $form->{sort} = "soldtotal"; $form->{l_qty} = "N"; - $callback .= "&form->{top100}=$form->{top100}"; $form->{l_linetotal} = ""; $form->{revers} = 1; $form->{number} = "position"; $form->{l_number} = "Y"; - my $totop100 = ""; + $totop100 = ""; $form->{title} = $locale->text('Top 100'); @@ -708,7 +925,7 @@ sub addtop100 { } #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->{script}?action=top100&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 @@ -801,6 +1018,10 @@ sub addtop100 { $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}
|; @@ -839,8 +1060,8 @@ sub addtop100 { $option .= $locale->text('soldtotal') . qq| : $form->{soldtotal}
|; } - @columns = $form->sort_columns( - qw(number partnumber description partsgroup bin onhand rop unit listprice linetotallistprice sellprice linetotalsellprice lastcost linetotallastcost priceupdate weight image drawing microfiche invnumber ordnumber quonumber name serialnumber soldtotal) + my @columns = $form->sort_columns( + qw(number partnumber ean description partsgroup bin onhand rop unit listprice linetotallistprice sellprice linetotalsellprice lastcost linetotallastcost priceupdate weight image drawing microfiche invnumber ordnumber quonumber name serialnumber soldtotal) ); if ($form->{l_linetotal}) { @@ -870,7 +1091,7 @@ sub addtop100 { || $form->{rfq} || $form->{quoted}) { $form->{l_onhand} = "Y"; - } else { + } else { $form->{l_linetotalsellprice} = ""; $form->{l_linetotallastcost} = ""; } @@ -879,7 +1100,7 @@ sub addtop100 { $form->{l_lastcost} = "" if ($form->{searchitems} eq 'assembly' && !$form->{bom}); - foreach $item (@columns) { + foreach my $item (@columns) { if ($form->{"l_$item"} eq "Y") { push @column_index, $item; @@ -981,7 +1202,7 @@ sub addtop100 { . qq||; $form->header; - $colspan = $#column_index + 1; + my $colspan = $#column_index + 1; print qq| @@ -1015,14 +1236,14 @@ sub addtop100 { # insert numbers for top100 my $j = 0; - foreach $ref (@{ $form->{parts} }) { + foreach my $ref (@{ $form->{parts} }) { $j++; $ref->{number} = $j; } # if avaible -> insert choice here if (($form->{ndxs_counter}) > 0) { - for ($i = 1; ($i < $form->{ndxs_counter} + 1); $i++) { + 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"}; @@ -1048,7 +1269,8 @@ sub addtop100 { } #rof } #fi # build data for columns - foreach $ref (@{ $form->{parts} }) { + foreach my $ref (@{ $form->{parts} }) { + my $i = 0; if ($form->{l_subtotal} eq 'Y' && !$ref->{assemblyitem}) { if ($sameitem ne $ref->{ $form->{sort} }) { @@ -1076,7 +1298,7 @@ sub addtop100 { $column_data{number} = ""; $column_data{partnumber} = ""; @@ -1085,32 +1307,29 @@ sub addtop100 { $column_data{onhand} = ""; $column_data{sellprice} = ""; $column_data{listprice} = ""; $column_data{lastcost} = ""; $column_data{linetotalsellprice} = ""; $column_data{linetotallastcost} = ""; $column_data{linetotallistprice} = ""; if (!$ref->{assemblyitem}) { @@ -1126,10 +1345,10 @@ sub addtop100 { $column_data{rop} = ""; + . $form->format_amount(\%myconfig, $ref->{rop}) . ""; $column_data{weight} = ""; $column_data{unit} = ""; $column_data{bin} = ""; @@ -1137,15 +1356,15 @@ sub addtop100 { $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} = ""; @@ -1186,15 +1405,15 @@ sub addtop100 { map { $column_data{$_} = "" } @column_index; $column_data{linetotalsellprice} = ""; $column_data{linetotallastcost} = ""; $column_data{linetotallistprice} = ""; print ""; @@ -1217,7 +1436,6 @@ sub addtop100 { {script}> -{path}> {login}> {password}> @@ -1244,14 +1462,8 @@ sub addtop100 { |; - - if ($form->{menubar}) { - require "$form->{path}/menu.pl"; - &menubar; - } + . $locale->text('choice') . qq|"> - print qq| @@ -1261,173 +1473,139 @@ sub addtop100 { $lxdebug->leave_sub(); } # end addtop100 +# +# Report for Wares. +# Warning, deep magic ahead. +# This function parses the requested details, sanity checks them, and converts them into a format thats usable for IC->all_parts +# +# flags coming from the form: +# hardcoded: +# searchitems=part revers=0 lastsort='' +# +# filter: +# partnumber ean description partsgroup serialnumber make model drawing microfiche +# transdatefrom transdateto +# +# radio: +# itemstatus = active | onhand | short | obsolete | orphaned +# action = continue | top100 +# +# checkboxes: +# bought sold onorder ordered rfq quoted +# l_partnumber l_description l_serialnumber l_unit l_listprice l_sellprice l_lastcost +# l_linetotal l_priceupdate l_bin l_rop l_weight l_image l_drawing l_microfiche +# l_partsgroup l_subtotal l_soldtotal l_deliverydate +# +# hiddens: +# nextsub login password revers lastsort sort ndxs_counter +# sub generate_report { $lxdebug->enter_sub(); - $revers = $form->{revers}; - $lastsort = $form->{lastsort}; + my ($revers, $lastsort, $description); + + $form->{title} = (ucfirst $form->{searchitems}) . "s"; + $form->{title} = $locale->text($form->{title}); + my $revers = $form->{revers}; + my $lastsort = $form->{lastsort}; + + # sorting and direction of sorting + # ToDO: change this to the simpler field+direction method if (($form->{lastsort} eq "") && ($form->{sort} eq undef)) { $form->{revers} = 0; $form->{lastsort} = "partnumber"; $form->{sort} = "partnumber"; } else { - - # 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); + # 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 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; - } + # these strings get displayed at the top of the results to indicate the user which switches were used + my %optiontexts = ( + active => $locale->text('Active'), + obsolete => $locale->text('Obsolete'), + orphaned => $locale->text('Orphaned'), + onhand => $locale->text('On Hand'), + short => $locale->text('Short'), + onorder => $locale->text('On Order'), + ordered => $locale->text('Ordered'), + rfq => $locale->text('RFQ'), + quoted => $locale->text('Quoted'), + bought => $locale->text('Bought'), + sold => $locale->text('Sold'), + transdatefrom => $locale->text('From') . " " . $locale->date(\%myconfig, $form->{transdatefrom}, 1), + transdateto => $locale->text('To (time)') . " " . $locale->date(\%myconfig, $form->{transdateto}, 1), + partnumber => $locale->text('Part Number') . ": '$form->{partnumber}'", + partsgroup => $locale->text('Group') . ": '$form->{partsgroup}'", + serialnumber => $locale->text('Serial Number') . ": '$form->{serialnumber}'", + description => $locale->text('Part Description') . ": '$form->{description}'", + make => $locale->text('Make') . ": '$form->{make}'", + model => $locale->text('Model') . ": '$form->{model}'", + drawing => $locale->text('Drawing') . ": '$form->{drawing}'", + microfiche => $locale->text('Microfiche') . ": '$form->{microfiche}'", + l_soldtotal => $locale->text('soldtotal'), + ); + + my @itemstatus_keys = qw(active obsolete orphaned onhand short); + my @callback_keys = qw(onorder ordered rfq quoted bought sold partnumber partsgroup serialnumber description make model + drawing microfiche l_soldtotal l_deliverydate transdatefrom transdateto ean); + + # calculate dependencies + for (@itemstatus_keys, @callback_keys) { + next if ($form->{itemstatus} ne $_ && !$form->{$_}); + map { $form->{$_} = 'Y' } @{ $dependencies{$_} } if $dependencies{$_}; + } + + # generate callback and optionstrings + my @options; + for my $key (@itemstatus_keys, @callback_keys) { + next if ($form->{itemstatus} ne $key && !$form->{$key}); + push @options, $optiontexts{$key}; } IC->all_parts(\%myconfig, \%$form); - if ($form->{itemstatus} eq 'active') { - $option .= $locale->text('Active') . " : "; - } - if ($form->{itemstatus} eq 'obsolete') { - $option .= $locale->text('Obsolete') . " : "; + # special case for lastcost + $form->{l_lastcost} = "" if $form->{ledgerchecks}; + + if ($form->{description}) { + $description = $form->{description}; + $description =~ s/\n/
/g; } - if ($form->{itemstatus} eq 'orphaned') { - $option .= $locale->text('Orphaned') . " : "; - } - if ($form->{itemstatus} eq 'onhand') { - $option .= $locale->text('On Hand') . " : "; - $form->{l_onhand} = "Y"; - } - if ($form->{itemstatus} eq 'short') { - $option .= $locale->text('Short') . " : "; - $form->{l_onhand} = "Y"; - } - if ($form->{onorder}) { - $form->{l_ordnumber} = "Y"; - $callback .= "&onorder=$form->{onorder}"; - $option .= $locale->text('On Order') . " : "; - } - if ($form->{ordered}) { - $form->{l_ordnumber} = "Y"; - $callback .= "&ordered=$form->{ordered}"; - $option .= $locale->text('Ordered') . " : "; - } - if ($form->{rfq}) { - $form->{l_quonumber} = "Y"; - $callback .= "&rfq=$form->{rfq}"; - $option .= $locale->text('RFQ') . " : "; - } - if ($form->{quoted}) { - $form->{l_quonumber} = "Y"; - $callback .= ""ed=$form->{quoted}"; - $option .= $locale->text('Quoted') . " : "; - } - if ($form->{bought}) { - $form->{l_invnumber} = "Y"; - $callback .= "&bought=$form->{bought}"; - $option .= $locale->text('Bought') . " : "; - } - if ($form->{sold}) { - $form->{l_invnumber} = "Y"; - $callback .= "&sold=$form->{sold}"; - $option .= $locale->text('Sold') . " : "; - } - if ( $form->{bought} - || $form->{sold} - || $form->{onorder} - || $form->{ordered} - || $form->{rfq} - || $form->{quoted}) { - - $form->{l_lastcost} = ""; - $form->{l_name} = "Y"; - if ($form->{transdatefrom}) { - $callback .= "&transdatefrom=$form->{transdatefrom}"; - $option .= "\n
" - . $locale->text('From') - . " " - . $locale->date(\%myconfig, $form->{transdatefrom}, 1); - } - if ($form->{transdateto}) { - $callback .= "&transdateto=$form->{transdateto}"; - $option .= "\n
" - . $locale->text('To') - . " " - . $locale->date(\%myconfig, $form->{transdateto}, 1); - } - } - - $option .= "
"; - - if ($form->{partnumber}) { - $callback .= "&partnumber=$form->{partnumber}"; - $option .= $locale->text('Part Number') . qq| : $form->{partnumber}
|; - } - if ($form->{partsgroup}) { - $callback .= "&partsgroup=$form->{partsgroup}"; - $option .= $locale->text('Group') . qq| : $form->{partsgroup}
|; - } - if ($form->{serialnumber}) { - $callback .= "&serialnumber=$form->{serialnumber}"; - $option .= - $locale->text('Serial Number') . qq| : $form->{serialnumber}
|; - } - if ($form->{description}) { - $callback .= "&description=$form->{description}"; - $description = $form->{description}; - $description =~ s/ -/
/g; - $option .= - $locale->text('Part Description') . qq| : $form->{description}
|; - } - if ($form->{make}) { - $callback .= "&make=$form->{make}"; - $option .= $locale->text('Make') . qq| : $form->{make}
|; - } - if ($form->{model}) { - $callback .= "&model=$form->{model}"; - $option .= $locale->text('Model') . qq| : $form->{model}
|; - } - if ($form->{drawing}) { - $callback .= "&drawing=$form->{drawing}"; - $option .= $locale->text('Drawing') . qq| : $form->{drawing}
|; - } - if ($form->{microfiche}) { - $callback .= "µfiche=$form->{microfiche}"; - $option .= $locale->text('Microfiche') . qq| : $form->{microfiche}
|; - } - - # table soldtotal aktive - if ($form->{l_soldtotal}) { - $callback .= "&soldtotal=$form->{soldtotal}"; - $option .= $locale->text('soldtotal') . qq| : $form->{soldtotal}
|; - } - - if ($form->{l_deliverydate}) { - $callback .= "&deliverydate=$form->{deliverydate}"; - } - - @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 deliverydate) - ); if ($form->{l_linetotal}) { $form->{l_onhand} = "Y"; @@ -1456,371 +1634,215 @@ sub generate_report { || $form->{rfq} || $form->{quoted}) { $form->{l_onhand} = "Y"; - } else { + } else { $form->{l_linetotalsellprice} = ""; $form->{l_linetotallastcost} = ""; } } - $form->{l_lastcost} = "" - if ($form->{searchitems} eq 'assembly' && !$form->{bom}); - - foreach $item (@columns) { - if ($form->{"l_$item"} eq "Y") { - push @column_index, $item; - - # add column to callback - $callback .= "&l_$item=Y"; - } - } - - if ($form->{l_subtotal} eq 'Y') { - $callback .= "&l_subtotal=Y"; - } - $column_header{partnumber} = - qq||; - $column_header{description} = - qq||; - $column_header{partsgroup} = - qq||; - $column_header{bin} = - qq||; - $column_header{priceupdate} = - qq||; - $column_header{onhand} = - qq||; - $column_header{unit} = - qq||; - $column_header{listprice} = - qq||; - $column_header{lastcost} = - qq||; - $column_header{rop} = - qq||; - $column_header{weight} = - qq||; - - $column_header{invnumber} = - qq||; - $column_header{ordnumber} = - qq||; - $column_header{quonumber} = - qq||; - - $column_header{name} = - qq||; - - $column_header{sellprice} = - qq||; - $column_header{linetotalsellprice} = - qq||; - $column_header{linetotallastcost} = - qq||; - $column_header{linetotallistprice} = - qq||; - - $column_header{image} = - qq||; - $column_header{drawing} = - qq||; - $column_header{microfiche} = - qq||; + $form->{l_lastcost} = "" if ($form->{searchitems} eq 'assembly' && !$form->{bom}); + + my @columns = + qw(partnumber description partsgroup bin onhand rop unit listprice linetotallistprice sellprice linetotalsellprice lastcost linetotallastcost + priceupdate weight image drawing microfiche invnumber ordnumber quonumber name serialnumber soldtotal deliverydate); + + my %column_defs = ( + 'bin' => { 'text' => $locale->text('Bin'), }, + 'deliverydate' => { 'text' => $locale->text('deliverydate'), }, + 'description' => { 'text' => $locale->text('Part Description'), }, + 'drawing' => { 'text' => $locale->text('Drawing'), }, + 'image' => { 'text' => $locale->text('Image'), }, + 'invnumber' => { 'text' => $locale->text('Invoice Number'), }, + 'lastcost' => { 'text' => $locale->text('Last Cost'), }, + 'linetotallastcost' => { 'text' => $locale->text('Extended'), }, + 'linetotallistprice' => { 'text' => $locale->text('Extended'), }, + 'linetotalsellprice' => { 'text' => $locale->text('Extended'), }, + 'listprice' => { 'text' => $locale->text('List Price'), }, + 'microfiche' => { 'text' => $locale->text('Microfiche'), }, + 'name' => { 'text' => $locale->text('Name'), }, + 'onhand' => { 'text' => $locale->text('Qty'), }, + 'ordnumber' => { 'text' => $locale->text('Order Number'), }, + 'partnumber' => { 'text' => $locale->text('Part Number'), }, + 'partsgroup' => { 'text' => $locale->text('Group'), }, + 'priceupdate' => { 'text' => $locale->text('Updated'), }, + 'quonumber' => { 'text' => $locale->text('Quotation'), }, + 'rop' => { 'text' => $locale->text('ROP'), }, + 'sellprice' => { 'text' => $locale->text('Sell Price'), }, + 'serialnumber' => { 'text' => $locale->text('Serial Number'), }, + 'soldtotal' => { 'text' => $locale->text('soldtotal'), }, + 'unit' => { 'text' => $locale->text('Unit'), }, + 'weight' => { 'text' => $locale->text('Weight'), }, + ); - $column_header{serialnumber} = - qq||; - $column_header{soldtotal} = - qq||; + 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); - $column_header{deliverydate} = - qq||; + my @hidden_variables = (qw(l_subtotal l_linetotal searchitems itemstatus bom), @itemstatus_keys, @callback_keys, map { "l_$_" } @columns); + my $callback = build_std_url('action=generate_report', grep { $form->{$_} } @hidden_variables); - $form->header; - $colspan = $#column_index + 1; + my @sort_full = qw(partnumber description onhand soldtotal deliverydate); + my @sort_no_revers = qw(partsgroup bin priceupdate invnumber ordnumber quonumber name image drawing serialnumber); - print qq| - + 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; -
| - . $locale->text('Part Number') . qq|| - . $locale->text('Part Description') . qq|| . $locale->text('Part Number') . qq|| . $locale->text('Part Description') . qq|
" - . $form->format_amount(\%myconfig, $ref->{number}, '', " ") + . $form->format_amount(\%myconfig, $ref->{number}) . "$ref->{partnumber} " - . $form->format_amount(\%myconfig, $ref->{onhand}, '', " ") + . $form->format_amount(\%myconfig, $ref->{onhand}) . "" - . $form->format_amount(\%myconfig, $ref->{sellprice}, 2, " ") + . $form->format_amount(\%myconfig, $ref->{sellprice}) . "" - . $form->format_amount(\%myconfig, $ref->{listprice}, 2, " ") + . $form->format_amount(\%myconfig, $ref->{listprice}) . "" - . $form->format_amount(\%myconfig, $ref->{lastcost}, 2, " ") + . $form->format_amount(\%myconfig, $ref->{lastcost}) . "" - . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{sellprice}, - 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->{lastcost}, 2) . "" - . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{listprice}, - 2, " ") + . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{listprice}, 2) . "" - . $form->format_amount(\%myconfig, $ref->{rop}, '', " ") . "" - . $form->format_amount(\%myconfig, $ref->{weight}, '', " ") + . $form->format_amount(\%myconfig, $ref->{weight}) . "$ref->{unit} $ref->{bin} {module}.pl?action=edit&type=invoice&id=$ref->{trans_id}&path=$form->{path}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{invnumber}{module}.pl?action=edit&type=invoice&id=$ref->{trans_id}&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}{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&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}{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{quonumber}$ref->{quonumber}$ref->{name} " - . $form->format_amount(\%myconfig, $totalsellprice, 2, " ") + . $form->format_amount(\%myconfig, $totalsellprice, 2) . "" - . $form->format_amount(\%myconfig, $totallastcost, 2, " ") + . $form->format_amount(\%myconfig, $totallastcost, 2) . "" - . $form->format_amount(\%myconfig, $totallistprice, 2, " ") + . $form->format_amount(\%myconfig, $totallistprice, 2) . "
{revers}&lastsort=$form->{lastsort}>| - . $locale->text('Part Number') - . qq|{revers}&lastsort=$form->{lastsort}>| - . $locale->text('Part Description') - . qq|| - . $locale->text('Group') - . qq|| - . $locale->text('Bin') - . qq|| - . $locale->text('Updated') - . qq|{revers}&lastsort=$form->{lastsort}>| - . $locale->text('Qty') - . qq|| . $locale->text('Unit') . qq|| - . $locale->text('List Price') - . qq|| . $locale->text('Last Cost') . qq|| . $locale->text('ROP') . qq|| . $locale->text('Weight') . qq|| - . $locale->text('Invoice Number') - . qq|| - . $locale->text('Order Number') - . qq|| - . $locale->text('Quotation') - . qq|| - . $locale->text('Name') - . qq|| - . $locale->text('Sell Price') - . qq|| . $locale->text('Extended') . qq|| . $locale->text('Extended') . qq|| . $locale->text('Extended') . qq|| . $locale->text('Image') . qq|| - . $locale->text('Drawing') - . qq|| - . $locale->text('Microfiche') - . qq|| - . $locale->text('Serial Number') - . qq|{revers}&lastsort=$form->{lastsort}>| - . $locale->text('soldtotal') - . qq|{revers}&lastsort=$form->{lastsort}>| - . $locale->text('deliverydate') - . qq|
- - - - + # add order to callback + $form->{callback} = join '&', ($callback, map { "${_}=" . E($form->{$_}) } qw(sort revers)); - + my $report = SL::ReportGenerator->new(\%myconfig, $form); - -|; + my %attachment_basenames = ( + 'part' => $locale->text('part_list'), + 'service' => $locale->text('service_list'), + 'assembly' => $locale->text('assembly_list'), + ); - map { print "\n$column_header{$_}" } @column_index; + $report->set_options('top_info_text' => $locale->text('Options') . ': ' . join(', ', grep $_, @options), + 'raw_bottom_info_text' => $form->parse_html_template2('ic/generate_report_bottom'), + 'output_format' => 'HTML', + 'title' => $form->{title}, + 'attachment_basename' => $attachment_basenames{$form->{searchitems}} . strftime('_%Y%m%d', localtime time), + ); + $report->set_options_from_form(); - print qq| - - |; + $report->set_columns(%column_defs); + $report->set_column_order(@columns); - # add order to callback - $form->{callback} = $callback .= "&sort=$form->{sort}"; + $report->set_export_options('generate_report', @hidden_variables, qw(sort revers)); - # escape callback for href - $callback = $form->escape($callback); + $report->set_sort_indicator($form->{sort}, $form->{revers} ? 0 : 1); - if (@{ $form->{parts} }) { - $sameitem = $form->{parts}->[0]->{ $form->{sort} }; - } + my @subtotal_columns = qw(sellprice listprice lastcost); + my %subtotals = map { $_ => 0 } ('onhand', @subtotal_columns); + my %totals = map { $_ => 0 } @subtotal_columns; + my $idx = 0; + my $same_item = $form->{parts}[0]{ $form->{sort} } if (scalar @{ $form->{parts} }); - foreach $ref (@{ $form->{parts} }) { + # postprocess parts + foreach my $ref (@{ $form->{parts} }) { - if ($form->{l_subtotal} eq 'Y' && !$ref->{assemblyitem}) { - if ($sameitem ne $ref->{ $form->{sort} }) { - &parts_subtotal; - $sameitem = $ref->{ $form->{sort} }; - } - } + # fresh row, for inserting later + my $row = { map { $_ => { 'data' => $ref->{$_} } } @columns }; - $ref->{exchangerate} = 1 unless $ref->{exchangerate}; - $ref->{sellprice} *= $ref->{exchangerate}; - $ref->{listprice} *= $ref->{exchangerate}; - $ref->{lastcost} *= $ref->{exchangerate}; + $ref->{exchangerate} ||= 1; + $ref->{price_factor} ||= 1; + $ref->{sellprice} *= $ref->{exchangerate} / $ref->{price_factor}; + $ref->{listprice} *= $ref->{exchangerate} / $ref->{price_factor}; + $ref->{lastcost} *= $ref->{exchangerate} / $ref->{price_factor}; # use this for assemblies - $onhand = $ref->{onhand}; + my $onhand = $ref->{onhand}; - $align = "left"; if ($ref->{assemblyitem}) { - $align = "right"; - $onhand = 0 if ($form->{sold}); - } - - $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}; + $row->{partnumber}{align} = 'right'; + $row->{onhand}{data} = 0; + $onhand = 0 if ($form->{sold}); } - $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} = - ""; - - $column_data{deliverydate} = ""; - - $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} = - ""; + my $edit_link = build_std_url('action=edit', 'id=' . E($ref->{id}), 'callback'); + $row->{partnumber}->{link} = $edit_link; + $row->{description}->{link} = $edit_link; - print ""; + foreach (qw(sellprice listprice lastcost)) { + $row->{$_}{data} = $form->format_amount(\%myconfig, $ref->{$_}, -2); + $row->{"linetotal$_"}{data} = $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{$_}, 2); + } - map { print "\n$column_data{$_}" } @column_index; + map { $row->{$_}{data} = $form->format_amount(\%myconfig, $ref->{$_}); } qw(onhand rop weight soldtotal); - print qq| - |; - } + if (!$ref->{assemblyitem}) { + foreach my $col (@subtotal_columns) { + $totals{$col} += $onhand * $ref->{$col}; + $subtotals{$col} += $onhand * $ref->{$col}; + } - 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}, '', " ") - . "$ref->{deliverydate}
 " - . $form->format_amount(\%myconfig, $totalsellprice, 2, " ") - . "" - . $form->format_amount(\%myconfig, $totallastcost, 2, " ") - . "" - . $form->format_amount(\%myconfig, $totallistprice, 2, " ") - . "

+ $subtotals{onhand} += $onhand; + } -|; + # set module stuff + if ($ref->{module} eq 'oe') { + my $edit_oe_link = build_std_url("script=oe.pl", 'action=edit', 'type=' . E($ref->{type}), 'id=' . E($ref->{trans_id}), 'callback'); + $row->{ordnumber}{link} = $edit_oe_link; + $row->{quonumber}{link} = $edit_oe_link if (!$ref->{ordnumber}); - print qq| + } else { + $row->{invnumber}{link} = build_std_url("script=$ref->{module}.pl", 'action=edit', 'type=invoice', 'id=' . E($ref->{trans_id}), 'callback'); + } -
+ # set properties of images + if ($ref->{image} && (lc $report->{options}->{output_format} eq 'html')) { + $row->{image}{data} = ''; + $row->{image}{raw_data} = ''; + } + map { $row->{$_}{link} = $ref->{$_} } qw(drawing microfiche); -
{script}> + $report->add_data($row); - + my $next_ref = $form->{parts}[$idx + 1]; -{searchitems}> + # insert subtotal rows + if (($form->{l_subtotal} eq 'Y') && + (!$next_ref || + (!$next_ref->{assemblyitem} && ($same_item ne $next_ref->{ $form->{sort} })))) { + my $row = { map { $_ => { 'class' => 'listsubtotal', } } @columns }; -{path}> -{login}> -{password}>|; + if (($form->{searchitems} ne 'assembly') || !$form->{bom}) { + $row->{onhand}->{data} = $form->format_amount(\%myconfig, $subtotals{onhand}); + } - print qq| - |; + map { $row->{"linetotal$_"}->{data} = $form->format_amount(\%myconfig, $subtotals{$_}, 2) } @subtotal_columns; + map { $subtotals{$_} = 0 } ('onhand', @subtotal_columns); + + $report->add_data($row); + + $same_item = $next_ref->{ $form->{sort} }; + } - if ($form->{menubar}) { - require "$form->{path}/menu.pl"; - &menubar; + $idx++; } - print qq| -
+ if ($form->{"l_linetotal"}) { + my $row = { map { $_ => { 'class' => 'listtotal', } } @columns }; - - -|; + map { $row->{"linetotal$_"}->{data} = $form->format_amount(\%myconfig, $totals{$_}, 2) } @subtotal_columns; + + $report->add_separator(); + $report->add_data($row); + } + + $report->generate_with_headers(); $lxdebug->leave_sub(); } #end generate_report sub parts_subtotal { $lxdebug->enter_sub(); + + # imports + our (%column_data, @column_index); + our ($subtotalonhand, $totalsellprice, $totallastcost, $totallistprice, $subtotalsellprice, $subtotallastcost, $subtotallistprice); map { $column_data{$_} = "
 " - . $form->format_amount(\%myconfig, $subtotalonhand, '', " ") + . $form->format_amount(\%myconfig, $subtotalonhand) . "" - . $form->format_amount(\%myconfig, $subtotalsellprice, 2, " ") + . $form->format_amount(\%myconfig, $subtotalsellprice, 2) . "" - . $form->format_amount(\%myconfig, $subtotallistprice, 2, " ") + . $form->format_amount(\%myconfig, $subtotallistprice, 2) . "" - . $form->format_amount(\%myconfig, $subtotallastcost, 2, " ") + . $form->format_amount(\%myconfig, $subtotallastcost, 2) . "
| . $locale->text('Buchungsgruppe') . qq|
{weight}> -   - $form->{weightunit} - {weightunit}> -
@@ -2109,11 +2146,6 @@ sub form_header {  $form->{weight} {weight}> - -   - $form->{weightunit} - {weightunit}> - @@ -2138,6 +2170,18 @@ sub form_header { |; } + $linkaccounts = qq||; + + if ($form->{IC_cogs_default}) { + $form->{IC_expense_default} = $form->{IC_cogs_default}; + } + + if (($form->{item} eq "service") || ($form->{item} eq "part")) { + $linkaccounts .= qq||; + } + if ($form->{item} eq "part") { + $linkaccounts .= qq||; + } if ($form->{item} ne 'service') { $n = ($form->{onhand} > 0) ? "1" : "0"; @@ -2179,10 +2223,24 @@ sub form_header { | - . $locale->text('Geschäftsvolumen') . qq| + . $locale->text('Business Volume') . qq| {gv}> |; + $notdiscountableok = ($form->{not_discountable}) == 1 ? "checked" : ""; + $notdiscountable .= qq| + + | + . $locale->text('Not Discountable') . qq| + + +|; + + $formula = + qq||; + + $formula_label = $locale->text('Formula'); + $imagelinks = qq| @@ -2213,7 +2271,7 @@ sub form_header { |; } $shopok = $form->{shop} == 1 ? "checked" : ""; - $obsolete .= qq| + $shop .= qq| | . $locale->text('Shopartikel') . qq| @@ -2221,6 +2279,7 @@ sub form_header { |; + # type=submit $locale->text('Add Part') # type=submit $locale->text('Add Service') # type=submit $locale->text('Add Assembly') @@ -2229,7 +2288,8 @@ sub form_header { # type=submit $locale->text('Edit Service') # type=submit $locale->text('Edit Assembly') # use JavaScript Calendar or not - $form->{jsscript} = $jscalendar; + my ($jsscript, $button1); + $form->{jsscript} = 1; $jsscript = ""; if ($form->{jsscript}) { @@ -2250,12 +2310,37 @@ sub form_header { |; } + my $unit_select = ''; + if (!$form->{"unit_changeable"}) { + $unit_select .= '' . $form->{"unit"}; + } else { + my $units = AM->retrieve_units(\%myconfig, $form, $form->{"item"} eq "service" ? "service" : "dimension"); + $unit_select .= AM->unit_select_html($units, "unit", $form->{"unit"}); + } + + my $price_factor; + if (0 < scalar @{ $form->{ALL_PRICE_FACTORS} }) { + my @values = ('', map { $_->{id} } @{ $form->{ALL_PRICE_FACTORS} }); + my %labels = map { $_->{id} => $_->{description} } @{ $form->{ALL_PRICE_FACTORS} }; + + $price_factor = + qq|| + . $locale->text('Price Factor') + . qq|| + . NTI($cgi->popup_menu('-name' => 'price_factor_id', + '-default' => $form->{price_factor_id}, + '-values' => \@values, + '-labels' => \%labels)) + . qq||; + } + $form->{fokus} = "ic.partnumber"; $form->header; print qq| - + +
{script}> @@ -2269,6 +2354,8 @@ sub form_header { {rowcount}> + + @@ -2298,18 +2385,47 @@ sub form_header { @@ -2329,14 +2445,17 @@ sub form_header { $lastcost + $price_factor - + $weight $rop $bin + $notdiscountable $vegv + $shop $obsolete
- - + + - $linkaccounts + - + + + + + + + + + + + +
| - . $locale->text('Link Accounts') . qq|
+ + $buchungsgruppe + $linkaccounts +
+
| . $locale->text('Notes') . qq|$formula_label
+ $notes + $formula +
| . $locale->text('EAN-Code') . qq|
+ + + $ean +
+ + + + + +
| . $locale->text('Payment Terms') . qq|
+
{sellprice}>
| . $locale->text('Unit') . qq|$unit_select
@@ -2374,7 +2493,6 @@ sub form_footer { } print qq| - {path}> {login}> {password}> @@ -2431,15 +2549,26 @@ sub form_footer { if (!$form->{previousform}) { if ($form->{menubar}) { - require "$form->{path}/menu.pl"; + require "bin/mozilla/menu.pl"; &menubar; } } - +# button for saving history + if($form->{id} ne "") { + print qq| + {id} + . qq|); name=history id=history value=| + . $locale->text('history') + . qq|>|; + } +# /button for saving history print qq|
+ + |; @@ -2450,10 +2579,7 @@ sub form_footer { sub makemodel_row { $lxdebug->enter_sub(); my ($numrows) = @_; - - $form->{"make_$i"} =~ s/\"/"/g; - $form->{"model_$i"} =~ s/\"/"/g; - + print qq| @@ -2464,7 +2590,9 @@ sub makemodel_row { |; - for $i (1 .. $numrows) { + for my $i (1 .. $numrows) { + $form->{"make_$i"} =~ s/\"/"/g; + $form->{"model_$i"} =~ s/\"/"/g; print qq| @@ -2485,6 +2613,10 @@ sub makemodel_row { sub assembly_row { $lxdebug->enter_sub(); my ($numrows) = @_; + my (@column_index, %column_data, %column_header); + my ($nochange, $callback, $previousform, $linetotal, $href); + + our ($deliverydate); # ToDO: cjeck if this indeed comes from global context @column_index = qw(runningnumber qty unit bom partnumber description partsgroup total); @@ -2505,7 +2637,7 @@ sub assembly_row { $previousform = ""; # save form variables in a previousform variable - foreach $key (sort keys %$form) { + foreach my $key (sort keys %$form) { # escape ampersands $form->{$key} =~ s/&/%26/g; @@ -2552,7 +2684,7 @@ sub assembly_row { |; - for $i (1 .. $numrows) { + for my $i (1 .. $numrows) { $form->{"partnumber_$i"} =~ s/\"/"/g; $linetotal = @@ -2601,7 +2733,7 @@ sub assembly_row { } else { $href = - qq|$form->{script}?action=edit&id=$form->{"id_$i"}&path=$form->{path}&login=$form->{login}&password=$form->{password}&rowcount=$i&previousform=$previousform|; + qq|$form->{script}?action=edit&id=$form->{"id_$i"}&login=$form->{login}&password=$form->{password}&rowcount=$i&previousform=$previousform|; $column_data{partnumber} = qq|$form->{"partnumber_$i"}|; $column_data{runningnumber} = @@ -2653,7 +2785,7 @@ sub update { $lxdebug->enter_sub(); if ($form->{item} eq "assembly") { - $i = $form->{assembly_rows}; + my $i = $form->{assembly_rows}; # if last row is empty check the form otherwise retrieve item if ( ($form->{"partnumber_$i"} eq "") @@ -2662,11 +2794,11 @@ sub update { &check_form; - } else { + } else { IC->assembly_item(\%myconfig, \%$form); - $rows = scalar @{ $form->{item_list} }; + my $rows = scalar @{ $form->{item_list} }; if ($rows) { $form->{"qty_$i"} = 1 unless ($form->{"qty_$i"}); @@ -2696,25 +2828,19 @@ sub update { } } - } - if ($form->{item} eq "part") { + } elsif (($form->{item} eq 'part') || ($form->{item} eq 'service')) { &check_form; } - if ($form->{item} eq 'service') { - map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) } - qw(sellprice listprice); - &form_header; - &form_footer; - } - $lxdebug->leave_sub(); } sub save { $lxdebug->enter_sub(); + my ($parts_id, %newform, $previousform, $amount, $callback); + # check if there is a part number - commented out, cause there is an automatic allocation of numbers # $form->isblank("partnumber", $locale->text(ucfirst $form->{item}." Part Number missing!")); @@ -2726,9 +2852,18 @@ sub save { $locale->text( "Inventory quantity must be zero before you can set this $form->{item} obsolete!" )) - if ($form->{onhand}); + if ($form->{onhand} * 1); + } + + if (!$form->{buchungsgruppen_id}) { + $form->error($locale->text("Parts must have an entry type.") . " " . + $locale->text("If you see this message, you most likely just setup your LX-Office and haven't added any entry types. If this is the case, the option is accessible for administrators in the System menu.") + ); } + $form->error($locale->text('Description must not be empty!')) unless $form->{description}; + $form->error($locale->text('Partnumber must not be set to empty!')) if $form->{id} && !$form->{partnumber}; + # expand dynamic strings # $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!') @@ -2737,14 +2872,20 @@ sub save { # $locale->text('Assembly Number missing!') # save part - $lxdebug->message(LXDebug::DEBUG1, - "ic.pl: sellprice in save = $form->{sellprice}\n"); - $rc = IC->save(\%myconfig, \%$form); - if ($rc == 3) { + $lxdebug->message($LXDebug::DEBUG1, "ic.pl: sellprice in save = $form->{sellprice}\n"); + if (IC->save(\%myconfig, \%$form) == 3) { $form->error($locale->text('Partnumber not unique!')); } + # saving the history + if(!exists $form->{addition}) { + $form->{snumbers} = qq|partnumber_| . $form->{partnumber}; + $form->{addition} = "SAVED"; + $form->save_history($form->dbconnect(\%myconfig)); + } + # /saving the history $parts_id = $form->{id}; + my $i; # load previous variables if ($form->{previousform}) { @@ -2757,8 +2898,8 @@ sub save { map { delete $form->{$_} } keys %newform; # now take it apart and restore original values - foreach $item (split /&/, $previousform) { - ($key, $value) = split /=/, $item, 2; + foreach my $item (split /&/, $previousform) { + my ($key, $value) = split m/=/, $item, 2; $value =~ s/%26/&/g; $form->{$key} = $value; } @@ -2778,8 +2919,7 @@ sub save { $form->{weight} -= $form->{"weight_$i"} * $form->{"qty_$i"}; # change/add values for assembly item - map { $form->{"${_}_$i"} = $newform{$_} } - qw(partnumber description bin unit weight listprice sellprice inventory_accno income_accno expense_accno); + map { $form->{"${_}_$i"} = $newform{$_} } qw(partnumber description bin unit weight listprice sellprice inventory_accno income_accno expense_accno price_factor_id); $form->{sellprice} += $form->{"sellprice_$i"} * $form->{"qty_$i"}; $form->{weight} += $form->{"weight_$i"} * $form->{"qty_$i"}; @@ -2790,44 +2930,46 @@ sub save { $i = $form->{rowcount}; $form->{"qty_$i"} = 1 unless ($form->{"qty_$i"}); - map { $form->{"${_}_$i"} = $newform{$_} } - qw(partnumber description bin unit listprice inventory_accno income_accno expense_accno sellprice); + map { $form->{"${_}_$i"} = $newform{$_} } qw(partnumber description bin unit listprice inventory_accno income_accno expense_accno sellprice lastcost price_factor_id); + $form->{"sellprice_$i"} = $newform{lastcost} if ($form->{vendor_id}); + if ($form->{exchangerate} != 0) { $form->{"sellprice_$i"} /= $form->{exchangerate}; } - $lxdebug->message(LXDebug::DEBUG1, - qq|sellprice_$i in previousform 2 = | - . $form->{"sellprice_$i"} . qq|\n|); - map { $form->{"taxaccounts_$i"} .= "$_ " } split / /, - $newform{taxaccount}; + + $lxdebug->message($LXDebug::DEBUG1, qq|sellprice_$i in previousform 2 = | . $form->{"sellprice_$i"} . qq|\n|); + + map { $form->{"taxaccounts_$i"} .= "$_ " } split / /, $newform{taxaccount}; chop $form->{"taxaccounts_$i"}; - foreach $item (qw(description rate taxnumber)) { - $index = $form->{"taxaccounts_$i"} . "_$item"; + foreach my $item (qw(description rate taxnumber)) { + my $index = $form->{"taxaccounts_$i"} . "_$item"; $form->{$index} = $newform{$index}; } # credit remaining calculation - $amount = - $form->{"sellprice_$i"} * (1 - $form->{"discount_$i"} / 100) * - $form->{"qty_$i"}; - map { $form->{"${_}_base"} += $amount } - (split / /, $form->{"taxaccounts_$i"}); - map { $amount += ($form->{"${_}_base"} * $form->{"${_}_rate"}) } - split / /, $form->{"taxaccounts_$i"} - if !$form->{taxincluded}; + $amount = $form->{"sellprice_$i"} * (1 - $form->{"discount_$i"} / 100) * $form->{"qty_$i"}; + + map { $form->{"${_}_base"} += $amount } (split / /, $form->{"taxaccounts_$i"}); + map { $amount += ($form->{"${_}_base"} * $form->{"${_}_rate"}) } split / /, $form->{"taxaccounts_$i"} if !$form->{taxincluded}; $form->{creditremaining} -= $amount; # redo number formatting, because invoice parse them! - $i = $form->{rowcount}; - map { - $form->{"${_}_$i"} = - $form->format_amount(\%myconfig, $form->{"${_}_$i"}) - } qw(weight listprice sellprice rop); + map { $form->{"${_}_$i"} = $form->format_amount(\%myconfig, $form->{"${_}_$i"}) } qw(weight listprice sellprice rop); } $form->{"id_$i"} = $parts_id; + + # Get the actual price factor (not just the ID) for the marge calculation. + $form->get_lists('price_factors' => 'ALL_PRICE_FACTORS'); + foreach my $pfac (@{ $form->{ALL_PRICE_FACTORS} }) { + next if ($pfac->{id} != $newform{price_factor_id}); + $form->{"marge_price_factor_$i"} = $pfac->{factor}; + last; + } + delete $form->{ALL_PRICE_FACTORS}; + delete $form->{action}; # restore original callback @@ -2838,17 +2980,15 @@ sub save { $form->{makemodel_rows}--; # put callback together - foreach $key (keys %$form) { + foreach my $key (keys %$form) { # do single escape for Apache 2.0 - $value = $form->escape($form->{$key}, 1); + my $value = $form->escape($form->{$key}, 1); $callback .= qq|&$key=$value|; } $form->{callback} = $callback; } - $lxdebug->message(LXDebug::DEBUG1, - qq|ic.pl: sellprice_$i nach sub save = | - . $form->{"sellprice_$i"} . qq|\n|); + $lxdebug->message($LXDebug::DEBUG1, qq|ic.pl: sellprice_$i nach sub save = | . $form->{"sellprice_$i"} . qq|\n|); # redirect $form->redirect; @@ -2859,16 +2999,32 @@ sub save { sub save_as_new { $lxdebug->enter_sub(); + # saving the history + if(!exists $form->{addition}) { + $form->{snumbers} = qq|partnumber_| . $form->{partnumber}; + $form->{addition} = "SAVED AS NEW"; + $form->save_history($form->dbconnect(\%myconfig)); + } + # /saving the history $form->{id} = 0; + if ($form->{"original_partnumber"} && + ($form->{"partnumber"} eq $form->{"original_partnumber"})) { + $form->{partnumber} = ""; + } &save; - $lxdebug->leave_sub(); } sub delete { $lxdebug->enter_sub(); - - $rc = IC->delete(\%myconfig, \%$form); + # saving the history + if(!exists $form->{addition}) { + $form->{snumbers} = qq|partnumber_| . $form->{partnumber}; + $form->{addition} = "DELETED"; + $form->save_history($form->dbconnect(\%myconfig)); + } + # /saving the history + my $rc = IC->delete(\%myconfig, \%$form); # redirect $form->redirect($locale->text('Item deleted!')) if ($rc > 0); @@ -2877,181 +3033,6 @@ sub delete { $lxdebug->leave_sub(); } -sub stock_assembly { - $lxdebug->enter_sub(); - - $form->{title} = $locale->text('Stock Assembly'); - - $form->header; - - print qq| - - -
{script}> - - - - - - - - - - -
$form->{title}
- - - - - - - - - - -
| - . $locale->text('Part Number') . qq| 
| - . $locale->text('Part Description') . qq|
-

- -{path}> -{login}> -{password}> - - - -
- -
- - - -|; - - $lxdebug->leave_sub(); -} - -sub list_assemblies { - $lxdebug->enter_sub(); - - IC->retrieve_assemblies(\%myconfig, \%$form); - - $column_header{partnumber} = - qq|| . $locale->text('Part Number') . qq||; - $column_header{description} = - qq|| . $locale->text('Part Description') . qq||; - $column_header{bin} = - qq|| . $locale->text('Bin') . qq||; - $column_header{onhand} = - qq|| . $locale->text('Qty') . qq||; - $column_header{rop} = - qq|| . $locale->text('ROP') . qq||; - $column_header{stock} = - qq|| . $locale->text('Add') . qq||; - - @column_index = (qw(partnumber description bin onhand rop stock)); - - $form->{title} = $locale->text('Stock Assembly'); - - $form->{callback} = - "$form->{script}?action=stock_assembly&path=$form->{path}&login=$form->{login}&password=$form->{password}"; - - $form->header; - - $colspan = $#column_index + 1; - - print qq| - - -
{script}> - - - - - - - |; - - map { print "\n$column_header{$_}" } @column_index; - - print qq| - -|; - - $i = 1; - foreach $ref (@{ $form->{assembly_items} }) { - - map { $ref->{$_} =~ s/\"/"/g } qw(partnumber description); - - $column_data{partnumber} = qq||; - $column_data{description} = - qq||; - $column_data{bin} = qq||; - $column_data{onhand} = - qq||; - $column_data{rop} = - qq||; - $column_data{stock} = qq||; - - $j++; - $j %= 2; - print - qq|{id}>\n|; - - map { print "\n$column_data{$_}" } @column_index; - - print qq| - -|; - - $i++; - - } - - $i--; - print qq| - - -
$form->{title}
$ref->{partnumber}$ref->{description} $ref->{bin} | - . $form->format_amount(\%myconfig, $ref->{onhand}, '', " ") - . qq|| - . $form->format_amount(\%myconfig, $ref->{rop}, '', " ") - . qq|

-
- - -{path}> -{login}> -{password}> - - - - - -
- - -
- - - -|; - - $lxdebug->leave_sub(); -} - -sub restock_assemblies { - $lxdebug->enter_sub(); - - $form->redirect($locale->text('Assemblies restocked!')) - if (IC->restock_assemblies(\%myconfig, \%$form)); - $form->error($locale->text('Cannot stock assemblies!')); - - $lxdebug->leave_sub(); -} - sub price_row { $lxdebug->enter_sub(); @@ -3066,7 +3047,7 @@ sub price_row { | . $locale->text('Preis') . qq| |; - for $i (1 .. $numrows) { + for my $i (1 .. $numrows) { print qq| $form->{"pricegroup_$i"} @@ -3085,4 +3066,37 @@ sub price_row { $lxdebug->leave_sub(); } -sub continue { &{ $form->{nextsub} } } +sub parts_language_selection { + $lxdebug->enter_sub(); + + our ($onload); + + my $languages = IC->retrieve_languages(\%myconfig, $form); + + + my $callback = "$form->{script}?action=parts_language_selection&"; + map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" } + (qw(login password name input_name), grep({ /^[fl]_/ } keys %$form))); + + my @header_sort = qw(name longdescription); + my %header_title = ( "name" => $locale->text("Name"), + "longdescription" => $locale->text("Long Description"), + ); + + my @header = + map(+{ "column_title" => $header_title{$_}, + "column" => $_, + "callback" => $callback, + }, + @header_sort); + + $form->{"title"} = $locale->text("Language Values"); + $form->header(); + print($form->parse_html_template("ic/parts_language_selection", { "HEADER" => \@header, + "LANGUAGES" => $languages, + "onload" => $onload })); + + $lxdebug->leave_sub(); +} + +sub continue { call_sub($form->{"nextsub"}); }