-sub parts_subtotal {
- $lxdebug->enter_sub();
-
- $auth->assert('part_service_assembly_edit');
-
- # imports
- our (%column_data, @column_index);
- our ($subtotalonhand, $totalsellprice, $totallastcost, $totallistprice, $subtotalsellprice, $subtotallastcost, $subtotallistprice);
-
- map { $column_data{$_} = "<td> </td>" } @column_index;
- $subtotalonhand = 0 if ($form->{searchitems} eq 'assembly' && $form->{bom});
-
- $column_data{onhand} =
- "<th class=listsubtotal align=right>"
- . $form->format_amount(\%myconfig, $subtotalonhand)
- . "</th>";
-
- $column_data{linetotalsellprice} =
- "<th class=listsubtotal align=right>"
- . $form->format_amount(\%myconfig, $subtotalsellprice, 2)
- . "</th>";
- $column_data{linetotallistprice} =
- "<th class=listsubtotal align=right>"
- . $form->format_amount(\%myconfig, $subtotallistprice, 2)
- . "</th>";
- $column_data{linetotallastcost} =
- "<th class=listsubtotal align=right>"
- . $form->format_amount(\%myconfig, $subtotallastcost, 2)
- . "</th>";
-
- $subtotalonhand = 0;
- $subtotalsellprice = 0;
- $subtotallistprice = 0;
- $subtotallastcost = 0;
-
- print "<tr class=listsubtotal>";
-
- map { print "\n$column_data{$_}" } @column_index;
-
- print qq|
- </tr>
-|;
-
- $lxdebug->leave_sub();
-}
-
-sub edit {
- $lxdebug->enter_sub();
-
- $auth->assert('part_service_assembly_edit');
-
- # show history button
- $form->{javascript} = qq|<script type="text/javascript" src="js/show_history.js"></script>|;
- #/show hhistory button
- IC->get_part(\%myconfig, \%$form);
-
- $form->{"original_partnumber"} = $form->{"partnumber"};
-
- $form->{title} = $locale->text('Edit ' . ucfirst $form->{item});
-
- &link_part;
- &display_form;
-
- $lxdebug->leave_sub();
-}
-
-sub link_part {
- $lxdebug->enter_sub();
-
- $auth->assert('part_service_assembly_edit');
-
- IC->create_links("IC", \%myconfig, \%$form);
-
- # currencies
- map({ $form->{selectcurrency} .= "<option>$_\n" }
- split(/:/, $form->{currencies}));
-
- # parts and assemblies have the same links
- my $item = $form->{item};
- if ($form->{item} eq 'assembly') {
- $item = 'part';
- }
-
- # build the popup menus
- $form->{taxaccounts} = "";
- foreach my $key (keys %{ $form->{IC_links} }) {
- foreach my $ref (@{ $form->{IC_links}{$key} }) {
-
- # if this is a tax field
- if ($key =~ /IC_tax/) {
- if ($key =~ /\Q$item\E/) {
- $form->{taxaccounts} .= "$ref->{accno} ";
- $form->{"IC_tax_$ref->{accno}_description"} =
- "$ref->{accno}--$ref->{description}";
-
- if ($form->{id}) {
- if ($form->{amount}{ $ref->{accno} }) {
- $form->{"IC_tax_$ref->{accno}"} = "checked";
- }
- } else {
- $form->{"IC_tax_$ref->{accno}"} = "checked";
- }
- }
- } else {
-
- $form->{"select$key"} .=
- "<option $ref->{selected}>$ref->{accno}--$ref->{description}\n";
- if ($form->{amount}{$key} eq $ref->{accno}) {
- $form->{$key} = "$ref->{accno}--$ref->{description}";
- }
-
- }
- }
- }
- chop $form->{taxaccounts};
-
- if (($form->{item} eq "part") || ($form->{item} eq "assembly")) {
- $form->{selectIC_income} = $form->{selectIC_sale};
- $form->{selectIC_expense} = $form->{selectIC_cogs};
- $form->{IC_income} = $form->{IC_sale};
- $form->{IC_expense} = $form->{IC_cogs};
- }
-
- delete $form->{IC_links};
- delete $form->{amount};
-
- $form->get_partsgroup(\%myconfig, { all => 1 });
-
- $form->{partsgroup} = "$form->{partsgroup}--$form->{partsgroup_id}";
-
- if (@{ $form->{all_partsgroup} }) {
- $form->{selectpartsgroup} = qq|<option>\n|;
- map { $form->{selectpartsgroup} .= qq|<option value="$_->{partsgroup}--$_->{id}">$_->{partsgroup}\n| } @{ $form->{all_partsgroup} };
- }
-
- if ($form->{item} eq 'assembly') {
-
- foreach my $i (1 .. $form->{assembly_rows}) {
- if ($form->{"partsgroup_id_$i"}) {
- $form->{"partsgroup_$i"} =
- qq|$form->{"partsgroup_$i"}--$form->{"partsgroup_id_$i"}|;
- }
- }
- $form->get_partsgroup(\%myconfig);
-
- if (@{ $form->{all_partsgroup} }) {
- $form->{selectassemblypartsgroup} = qq|<option>\n|;
-
- map {
- $form->{selectassemblypartsgroup} .=
- qq|<option value="$_->{partsgroup}--$_->{id}">$_->{partsgroup}\n|
- } @{ $form->{all_partsgroup} };
- }
- }
- $lxdebug->leave_sub();
-}
-
-sub form_header {
- $lxdebug->enter_sub();
-
- $auth->assert('part_service_assembly_edit');
-
- $form->{eur} = $eur; # config dumps into namespace - yuck
- $form->{pg_keys} = sub { "$_[0]->{partsgroup}--$_[0]->{id}" };
- $form->{description_area} = ($form->{rows} = $form->numtextrows($form->{description}, 40)) > 1;
- $form->{notes_rows} = max 4, $form->numtextrows($form->{notes}, 40), $form->numtextrows($form->{formel}, 40);
-
- map { $form->{"is_$_"} = ($form->{item} eq $_) } qw(part service assembly);
- map { $form->{$_} =~ s/"/"/g; } qw(unit);
-
- $form->get_lists('price_factors' => 'ALL_PRICE_FACTORS',
- 'partsgroup' => 'all_partsgroup',
- 'vendors' => 'ALL_VENDORS',);
-
-
- IC->retrieve_buchungsgruppen(\%myconfig, $form);
- @{ $form->{BUCHUNGSGRUPPEN} } = grep { $_->{id} eq $form->{buchungsgruppen_id} || ($form->{id} && $form->{orphaned}) || !$form->{id} } @{ $form->{BUCHUNGSGRUPPEN} };
-
- # use JavaScript Calendar or not (yes!)
- $form->{jsscript} = 1;
-
- $units = AM->retrieve_units(\%myconfig, $form);
- $form->{ALL_UNITS} = [ map +{ name => $_ }, sort { $units->{$a}{sortkey} <=> $units->{$b}{sortkey} } keys %$units ];
-
- $form->{defaults} = AM->get_defaults();
-
- $form->{fokus} = "ic.partnumber";
-
- $form->header;
- #print $form->parse_html_template('ic/form_header', { ALL_PRICE_FACTORS => $form->{ALL_PRICE_FACTORS},
- # ALL_UNITS => $form->{ALL_UNITS},
- # BUCHUNGSGRUPPEN => $form->{BUCHUNGSGRUPPEN},
- # payment_terms => $form->{payment_terms},
- # all_partsgroup => $form->{all_partsgroup}});
- print $form->parse_html_template('ic/form_header');
- $lxdebug->leave_sub();
-}
-
-sub form_footer {
- $lxdebug->enter_sub();
-
- $auth->assert('part_service_assembly_edit');
-
- print $form->parse_html_template('ic/form_footer');
-
- $lxdebug->leave_sub();
-}
-
-sub makemodel_row {
- $lxdebug->enter_sub();
- my ($numrows) = @_;
-
- my @mm_data = grep { any { $_ ne '' } @$_{qw(make model)} } map +{ make => $form->{"make_$_"}, model => $form->{"model_$_"} }, 1 .. $numrows;
- delete @{$form}{grep { m/^make_\d+/ || m/^model_\d+/ } keys %{ $form }};
- print $form->parse_html_template('ic/makemodel', { MM_DATA => [ @mm_data, {} ], mm_rows => scalar @mm_data + 1 });
-
- $lxdebug->leave_sub();
-}
-
-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 lastcost total);
-
- if ($form->{previousform}) {
- $nochange = 1;
- @column_index = qw(qty unit bom partnumber description partsgroup total);
- } else {
-
- # change callback
- $form->{old_callback} = $form->{callback};
- $callback = $form->{callback};
- $form->{callback} = "$form->{script}?action=display_form";
-
- # delete action
- map { delete $form->{$_} } qw(action header);
-
- $previousform = "";
-
- # save form variables in a previousform variable
- foreach my $key (sort keys %$form) {
- next unless ref $form->{$key} eq '' && $form->{$key};
- next if $key =~ /^select/; # get rid of these stupid select things
-
- # escape ampersands
- $form->{$key} =~ s/&/%26/g;
- if (any { $key eq $_ } qw(sellprice listprice lastcost)) {
- $previousform .= sprintf qq|%s=%s&|, $key, $form->format_amount(\%myconfig, $form->{$key});
- } else {
- $previousform .= qq|$key=$form->{$key}&|;
- }
- }
- chop $previousform;
- $previousform = $form->escape($form->escape($previousform, 1));
- $form->{callback} = $callback;
-
- $form->{assemblytotal} = 0;
- $form->{assembly_purchase_price_total} = 0;
- $form->{weight} = 0;
-
- }
- $column_header{runningnumber} =
- qq|<th nowrap width=5%>| . $locale->text('No.') . qq|</th>|;
- $column_header{qty} =
- qq|<th align=left nowrap width=10%>| . $locale->text('Qty') . qq|</th>|;
- $column_header{unit} =
- qq|<th align=left nowrap width=5%>| . $locale->text('Unit') . qq|</th>|;
- $column_header{partnumber} =
- qq|<th align=left nowrap width=20%>|
- . $locale->text('Part Number')
- . qq|</th>|;
- $column_header{description} =
- qq|<th nowrap width=50% align="left">| . $locale->text('Part Description') . qq|</th>|;
- $column_header{lastcost} =
- qq|<th nowrap width=50%>| . $locale->text('Purchase Prices') . qq|</th>|;
- $column_header{total} =
- qq|<th align=right nowrap>| . $locale->text('Sale Prices') . qq|</th>|;
- $column_header{bom} = qq|<th>| . $locale->text('BOM') . qq|</th>|;
- $column_header{partsgroup} = qq|<th>| . $locale->text('Group') . qq|</th>|;
-
- print qq|
- <tr class=listheading>
- <th class=listheading>| . $locale->text('Individual Items') . qq|</th>
- </tr>
- <tr>
- <td>
- <table width=100%>
- <tr>
-|;
-
- map { print "\n$column_header{$_}" } @column_index;
-
- print qq|
- </tr>
-|;
-
- for my $i (1 .. $numrows) {
- $form->{"partnumber_$i"} =~ s/\"/"/g;
-
- $linetotal =
- $form->round_amount($form->{"sellprice_$i"} * $form->{"qty_$i"} / ($form->{"price_factor_$i"} || 1), 4);
- $line_purchase_price =
- $form->round_amount($form->{"lastcost_$i"} * $form->{"qty_$i"} / ($form->{"price_factor_$i"} || 1), 4); #lastcost == purchase_price | ungenaue datenbankfeld-uebersetzung
- $form->{assemblytotal} += $linetotal;
- $form->{assembly_purchase_price_total} += $line_purchase_price;
-
- $form->{"qty_$i"} = $form->format_amount(\%myconfig, $form->{"qty_$i"});
-
- $linetotal = $form->format_amount(\%myconfig, $linetotal, 2);
- $line_purchase_price = $form->format_amount(\%myconfig, $line_purchase_price, 2);
-
- if (($i >= 1) && ($i == $numrows)) {
-
- if ($nochange) {
- map { $column_data{$_} = qq|<td></td>| }
- qw(qty unit partnumber description bom partsgroup);
- } else {
-
- map { $column_data{$_} = qq|<td></td>| } qw(runningnumber unit bom);
-
- $column_data{qty} =
- qq|<td><input name="qty_$i" size=5 value="$form->{"qty_$i"}"></td>|;
- $column_data{partnumber} =
- qq|<td><input name="partnumber_$i" size=15 value="$form->{"partnumber_$i"}"></td>|;
- $column_data{description} =
- qq|<td><input name="description_$i" size=40 value="$form->{"description_$i"}"></td>|;
- $column_data{partsgroup} =
- qq|<td><input name="partsgroup_$i" size=10 value="$form->{"partsgroup_$i"}"></td>|;
-
- }
-
- } else {
-
- if ($form->{previousform}) {
- $column_data{partnumber} =
- qq|<td><input type=hidden name="partnumber_$i" value="$form->{"partnumber_$i"}">$form->{"partnumber_$i"}</td>|;
- $column_data{qty} =
- qq|<td align=right><input type=hidden name="qty_$i" value="$form->{"qty_$i"}">$form->{"qty_$i"}</td>|;
-
- $column_data{bom} =
- qq|<td align=center><input type=hidden name="bom_$i" value=$form->{"bom_$i"}>|;
- $column_data{bom} .= ($form->{"bom_$i"}) ? "x" : " ";
- $column_data{bom} .= qq|</td>|;
-
- $column_data{partsgroup} =
- qq|<td><input type=hidden name="partsgroup_$i" value="$form->{"partsgroup_$i"}">$form->{"partsgroup_$i"}</td>|;
-
- } else {
- $href =
- qq|$form->{script}?action=edit&id=$form->{"id_$i"}&rowcount=$i&previousform=$previousform|;
- $column_data{partnumber} =
- qq|<td><input type=hidden name="partnumber_$i" value="$form->{"partnumber_$i"}"><a href=$href>$form->{"partnumber_$i"}</a></td>|;
- $column_data{runningnumber} =
- qq|<td><input name="runningnumber_$i" size=3 value="$i"></td>|;
- $column_data{qty} =
- qq|<td><input name="qty_$i" size=5 value="$form->{"qty_$i"}"></td>|;
-
- $form->{"bom_$i"} = ($form->{"bom_$i"}) ? "checked" : "";
- $column_data{bom} =
- qq|<td align=center><input name="bom_$i" type=checkbox class=checkbox value=1 $form->{"bom_$i"}></td>|;
-
- $column_data{partsgroup} =
- qq|<td><input type=hidden name="partsgroup_$i" value="$form->{"partsgroup_$i"}">$form->{"partsgroup_$i"}</td>|;
- }
-
- $column_data{unit} =
- qq|<td><input type=hidden name="unit_$i" value="$form->{"unit_$i"}">$form->{"unit_$i"}</td>|;
- $column_data{description} =
- qq|<td><input type=hidden name="description_$i" value="$form->{"description_$i"}">$form->{"description_$i"}</td>|;
- }
-
- $column_data{lastcost} = qq|<td align=right>$line_purchase_price</td>|;
- $column_data{total} = qq|<td align=right>$linetotal</td>|;
-
- $column_data{deliverydate} = qq|<td align=right>$deliverydate</td>|;
-
- print qq|
- <tr>|;
-
- map { print "\n$column_data{$_}" } @column_index;
-
- print qq|
- </tr>
- <input type=hidden name="id_$i" value=$form->{"id_$i"}>
- <input type=hidden name="sellprice_$i" value=$form->{"sellprice_$i"}>
- <input type=hidden name="lastcost_$i" value=$form->{"lastcost_$i"}>
- <input type=hidden name="weight_$i" value=$form->{"weight_$i"}>
- <input type=hidden name="price_factor_id_$i" value=$form->{"price_factor_id_$i"}>
- <input type=hidden name="price_factor_$i" value=$form->{"price_factor_$i"}>
-|;
- }
-
- print qq|
- <tr>
- <td colspan="6"></td>
- <td>| . $locale->text('Totals') . qq|</td>
- <td align="right">| . $form->format_amount(\%myconfig, $form->{assembly_purchase_price_total}, 2) .
- qq|</td>
- <td align="right">| . $form->format_amount(\%myconfig, $form->{assemblytotal}, 2) .
- qq| </td>
- </tr>
- <input type="hidden" name="assembly_rows" value="| . $form->{assembly_rows} .
- qq|">
- </table>
- </td>
- </tr>
-|;
-
- $lxdebug->leave_sub();
-}
-
-sub update {
- $lxdebug->enter_sub();
-
- # parse pricegroups. and no, don't rely on check_form for this...
- map { $form->{"price_$_"} = $form->parse_amount(\%myconfig, $form->{"price_$_"}) } 1 .. $form->{price_rows};
-
- if ($form->{item} eq "assembly") {
- my $i = $form->{assembly_rows};
-
- # if last row is empty check the form otherwise retrieve item
- if ( ($form->{"partnumber_$i"} eq "")
- && ($form->{"description_$i"} eq "")
- && ($form->{"partsgroup_$i"} eq "")) {
-
- &check_form;
-
- } else {
-
- IC->assembly_item(\%myconfig, \%$form);
-
- my $rows = scalar @{ $form->{item_list} };
-
- if ($rows) {
- $form->{"qty_$i"} = 1 unless ($form->{"qty_$i"});
-
- if ($rows > 1) {
- $form->{makemodel_rows}--;
- &select_item;
- exit;
- } else {
- map { $form->{item_list}[$i]{$_} =~ s/\"/"/g }
- qw(partnumber description unit partsgroup);
- map { $form->{"${_}_$i"} = $form->{item_list}[0]{$_} }
- keys %{ $form->{item_list}[0] };
- $form->{"runningnumber_$i"} = $form->{assembly_rows};
- $form->{assembly_rows}++;
-
- &check_form;
-
- }
-
- } else {
-
- $form->{rowcount} = $i;
- $form->{assembly_rows}++;
-
- &new_item;
-
- }
- }
-
- } elsif (($form->{item} eq 'part') || ($form->{item} eq 'service')) {
- &check_form;
- }
-
- $lxdebug->leave_sub();
-}
-
-sub save {
- $lxdebug->enter_sub();
-
- $auth->assert('part_service_assembly_edit');
-
- 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!"));
-
- # check if there is a description
- $form->isblank("description", $locale->text("Part Description missing!"));
-
- if ($form->{obsolete}) {
- $form->error(
- $locale->text(
- "Inventory quantity must be zero before you can set this $form->{item} obsolete!"
- ))
- 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.")