X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=bin%2Fmozilla%2Finvoice_io.pl;h=952768611b02b2e4c89447d1c8db3cfd2b9fcd09;hb=ef92528c3f875dee2b456418adb214ccebb97361;hp=3277f049cb85b7914fc5143ac7cf8e7e8bcb0763;hpb=270df90017196116ff80fc2b917bb23aca5ca994;p=kivitendo-erp.git diff --git a/bin/mozilla/invoice_io.pl b/bin/mozilla/invoice_io.pl index 3277f049c..952768611 100644 --- a/bin/mozilla/invoice_io.pl +++ b/bin/mozilla/invoice_io.pl @@ -43,12 +43,14 @@ use SL::IC; require "bin/mozilla/common.pl"; +use strict; + # any custom scripts for this one if (-f "bin/mozilla/custom_invoice_io.pl") { - eval { require "bin/mozilla/custom_ivvoice_io.pl"; }; + eval { require "bin/mozilla/custom_invoice_io.pl"; }; } -if (-f "bin/mozilla/$form->{login}_invoice_io.pl") { - eval { require "bin/mozilla/$form->{login}_invoice_io.pl"; }; +if (-f "bin/mozilla/$main::form->{login}_invoice_io.pl") { + eval { require "bin/mozilla/$main::form->{login}_invoice_io.pl"; }; } 1; @@ -86,530 +88,28 @@ use SL::IS; use SL::PE; use SL::AM; use Data::Dumper; -######################################## -# Eintrag fuer Version 2.2.0 geaendert # -# neue Optik im Rechnungsformular # -######################################## -sub display_row { - $lxdebug->enter_sub(); - my $numrows = shift; - - my $is_sales = - (substr($form->{type}, 0, 6) eq "sales_") - || (($form->{type} eq "invoice") && ($form->{script} eq "is.pl")) - || ($form->{type} eq 'credit_note'); - - if ($lizenzen && $form->{vc} eq "customer") { - if ($form->{type} =~ /sales_order/) { - @column_index = (runningnumber, partnumber, description, ship, qty); - } elsif ($form->{type} =~ /sales_quotation/) { - @column_index = (runningnumber, partnumber, description, qty); - } else { - @column_index = (runningnumber, partnumber, description, qty); - } - } else { - if ( ($form->{type} =~ /purchase_order/) - || ($form->{type} =~ /sales_order/)) { - @column_index = (runningnumber, partnumber, description, ship, qty); - } else { - @column_index = (runningnumber, partnumber, description, qty); - } - } -############## ENDE Neueintrag ################## - - my $dimension_units = AM->retrieve_units(\%myconfig, $form, "dimension"); - my $service_units = AM->retrieve_units(\%myconfig, $form, "service"); - my $all_units = AM->retrieve_units(\%myconfig, $form); - - my %price_factors = map { $_->{id} => $_->{factor} } @{ $form->{ALL_PRICE_FACTORS} }; - - push @column_index, qw(unit); - - #for pricegroups column - if ( $form->{type} =~ (/sales_quotation/) - or (($form->{level} =~ /Sales/) and ($form->{type} =~ /invoice/)) - or (($form->{level} eq undef) and ($form->{type} =~ /invoice/)) - or ($form->{type} =~ /sales_order/)) { - push @column_index, qw(sellprice_pg); - } - - push @column_index, qw(sellprice); - - if ($form->{vc} eq 'customer') { - push @column_index, qw(discount); - } - - push @column_index, "linetotal"; - - my $colspan = $#column_index + 1; - - $form->{invsubtotal} = 0; - map { $form->{"${_}_base"} = 0 } (split(/ /, $form->{taxaccounts})); - -######################################## - # Eintrag fuer Version 2.2.0 geaendert # - # neue Optik im Rechnungsformular # -######################################## - $column_data{runningnumber} = - qq|| - . $locale->text('No.') - . qq||; - $column_data{partnumber} = - qq|| - . $locale->text('Number') - . qq||; - $column_data{description} = - qq|| - . $locale->text('Part Description') - . qq||; - if ($form->{"type"} eq "purchase_order") { - $column_data{ship} = - qq|| - . $locale->text('Ship rcvd') - . qq||; - } else { - $column_data{ship} = - qq|| - . $locale->text('Ship') - . qq||; - } - $column_data{qty} = - qq|| - . $locale->text('Qty') - . qq||; - $column_data{unit} = - qq|| - . $locale->text('Unit') - . qq||; - $column_data{license} = - qq|| - . $locale->text('License') - . qq||; - $column_data{serialnr} = - qq|| - . $locale->text('Serial No.') - . qq||; - $column_data{projectnr} = - qq|| - . $locale->text('Project') - . qq||; - $column_data{sellprice} = - qq|| - . $locale->text('Price') - . qq||; - $column_data{sellprice_pg} = - qq|| - . $locale->text('Pricegroup') - . qq||; - $column_data{discount} = - qq|| - . $locale->text('Discount') - . qq||; - $column_data{linetotal} = - qq|| - . $locale->text('Extended') - . qq||; - $column_data{bin} = - qq|| - . $locale->text('Bin') - . qq||; -############## ENDE Neueintrag ################## - - $myconfig{"show_form_details"} = 1 - unless (defined($myconfig{"show_form_details"})); - $form->{"show_details"} = $myconfig{"show_form_details"} - unless (defined($form->{"show_details"})); - $form->{"show_details"} = $form->{"show_details"} ? 1 : 0; - my $show_details_new = 1 - $form->{"show_details"}; - my $show_details_checked = $form->{"show_details"} ? "checked" : ""; - - print qq| - - | . $cgi->hidden("-name" => "show_details", "-value" => $form->{show_details}) . qq| - -
- - |; - - map { print "\n$column_data{$_}" } @column_index; - - print qq| - -|; - - $runningnumber = $locale->text('No.'); - $deliverydate = $locale->text('Delivery Date'); - $serialnumber = $locale->text('Serial No.'); - $projectnumber = $locale->text('Project'); - $partsgroup = $locale->text('Group'); - $reqdate = $locale->text('Reqdate'); - - $delvar = 'deliverydate'; - - if ($form->{type} =~ /_order$/ || $form->{type} =~ /_quotation$/) { - $deliverydate = $locale->text('Required by'); - $delvar = 'reqdate'; - } - - $form->{marge_total} = 0; - $form->{sellprice_total} = 0; - $form->{lastcost_total} = 0; - my %projectnumber_labels = (); - my @projectnumber_values = (""); - foreach my $item (@{ $form->{"ALL_PROJECTS"} }) { - push(@projectnumber_values, $item->{"id"}); - $projectnumber_labels{$item->{"id"}} = $item->{"projectnumber"}; - } - - for $i (1 .. $numrows) { - - # undo formatting - map { - $form->{"${_}_$i"} = - $form->parse_amount(\%myconfig, $form->{"${_}_$i"}) - } qw(qty ship discount sellprice price_new price_old) unless ($form->{simple_save}); - - if (!$form->{"unit_old_$i"}) { - # Neue Ware aus der Datenbank. In diesem Fall ist unit_$i die - # Einheit, wie sie in den Stammdaten hinterlegt wurde. - # Es sollte also angenommen werden, dass diese ausgewaehlt war. - $form->{"unit_old_$i"} = $form->{"unit_$i"}; - } - - # Die zuletzt ausgewaehlte mit der aktuell ausgewaehlten Einheit - # vergleichen und bei Unterschied den Preis entsprechend umrechnen. - $form->{"selected_unit_$i"} = $form->{"unit_$i"} unless ($form->{"selected_unit_$i"}); - - my $check_units = $form->{"inventory_accno_$i"} ? $dimension_units : $service_units; - if (!$check_units->{$form->{"selected_unit_$i"}} || - ($check_units->{$form->{"selected_unit_$i"}}->{"base_unit"} ne - $all_units->{$form->{"unit_old_$i"}}->{"base_unit"})) { - # Die ausgewaehlte Einheit ist fuer diesen Artikel nicht gueltig - # (z.B. Dimensionseinheit war ausgewaehlt, es handelt sich aber - # um eine Dienstleistung). Dann keinerlei Umrechnung vornehmen. - $form->{"unit_old_$i"} = $form->{"selected_unit_$i"} = $form->{"unit_$i"}; - } - if ((!$form->{"prices_$i"}) || ($form->{"new_pricegroup_$i"} == $form->{"old_pricegroup_$i"})) { - if ($form->{"unit_old_$i"} ne $form->{"selected_unit_$i"}) { - my $basefactor = 1; - if (defined($all_units->{$form->{"unit_old_$i"}}->{"factor"}) && - $all_units->{$form->{"unit_old_$i"}}->{"factor"}) { - $basefactor = $all_units->{$form->{"selected_unit_$i"}}->{"factor"} / - $all_units->{$form->{"unit_old_$i"}}->{"factor"}; - } - $form->{"sellprice_$i"} *= $basefactor; - $form->{"unit_old_$i"} = $form->{"selected_unit_$i"}; - } - } - - ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/); - $decimalplaces = max length($dec), 2; - - $price_factor = $price_factors{$form->{"price_factor_id_$i"}} || 1; - $discount = (100 - $form->{"discount_$i"} * 1) / 100; - - $linetotal = $form->round_amount($form->{"sellprice_$i"} * $form->{"qty_$i"} * $discount / $price_factor, $decimalplaces); - - my $real_sellprice = $form->{"sellprice_$i"} * $discount / $price_factor; - - # marge calculations - my ($marge_font_start, $marge_font_end); - - $form->{"lastcost_$i"} *= 1; - - $marge_price_factor = $form->{"marge_price_factor_$i"} * 1 || 1; - - if ($real_sellprice && ($form->{"qty_$i"} * 1)) { - $form->{"marge_percent_$i"} = ($real_sellprice - $form->{"lastcost_$i"} / $marge_price_factor) * 100 / $real_sellprice; - $myconfig{"marge_percent_warn"} = 15 unless (defined($myconfig{"marge_percent_warn"})); - - if ($form->{"id_$i"} && - ($form->{"marge_percent_$i"} < (1 * $myconfig{"marge_percent_warn"}))) { - $marge_font_start = ""; - $marge_font_end = ""; - } - - } else { - $form->{"marge_percent_$i"} = 0; - } - - my $marge_adjust_credit_note = $form->{type} eq 'credit_note' ? -1 : 1; - $form->{"marge_total_$i"} = ($real_sellprice - $form->{"lastcost_$i"} / $marge_price_factor) * $form->{"qty_$i"} * $marge_adjust_credit_note; - $form->{"marge_total"} += $form->{"marge_total_$i"}; - $form->{"lastcost_total"} += $form->{"lastcost_$i"} * $form->{"qty_$i"} / $marge_price_factor; - $form->{"sellprice_total"} += $real_sellprice * $form->{"qty_$i"}; - - map { $form->{"${_}_$i"} = $form->format_amount(\%myconfig, $form->{"${_}_$i"}, 2) } qw(marge_total marge_percent); - - # convert " to " - map { $form->{"${_}_$i"} =~ s/\"/"/g } - qw(partnumber description unit unit_old); - -######################################## - # Eintrag fuer Version 2.2.0 geaendert # - # neue Optik im Rechnungsformular # -######################################## - $column_data{runningnumber} = - qq||; # HuT -############## ENDE Neueintrag ################## - - $column_data{partnumber} = - qq||; - - if (($rows = $form->numtextrows($form->{"description_$i"}, 30, 6)) > 1) { - $column_data{description} = - qq||; - } else { - $column_data{description} = - qq||; - } - - (my $qty_dec) = ($form->{"qty_$i"} =~ /\.(\d+)/); - $qty_dec = length $qty_dec; - - $column_data{qty} = - qq||; - $column_data{ship} = - qq||; - - my $is_part = $form->{"inventory_accno_$i"}; - my $is_assembly = $form->{"assembly_$i"}; - my $is_assigned = $form->{"id_$i"}; - my $this_unit = $form->{"unit_$i"}; - if ($form->{"selected_unit_$i"} && $this_unit && - $all_units->{$form->{"selected_unit_$i"}} && $all_units->{$this_unit} && - ($all_units->{$form->{"selected_unit_$i"}}->{"base_unit"} eq $all_units->{$this_unit}->{"base_unit"})) { - $this_unit = $form->{"selected_unit_$i"}; - } elsif (!$is_assigned || - ($is_part && !$this_unit && ($all_units->{$this_unit} && ($all_units->{$this_unit}->{"base_unit"} eq $all_units->{"kg"}->{"base_unit"})))) { - $this_unit = "kg"; - } - - my $price_factor_select; - 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_select = - NTI($cgi->popup_menu('-name' => "price_factor_id_$i", - '-default' => $form->{"price_factor_id_$i"}, - '-values' => \@values, - '-labels' => \%labels, - '-style' => 'width:90px')) - . ' '; - } - - $column_data{"unit"} = ""; - - # build in drop down list for pricesgroups - if ($form->{"prices_$i"}) { - if ($form->{"new_pricegroup_$i"} != $form->{"old_pricegroup_$i"}) { - $price_tmp = $form->format_amount(\%myconfig, $form->{"price_new_$i"}, $decimalplaces); - } else { - $price_tmp = $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces); - } - - $column_data{sellprice_pg} = - qq||; - $column_data{sellprice} = - qq||; - } else { - - # for last row and report - # set pricegroup drop down list from report menu - if ($form->{"sellprice_$i"} != 0) { - $prices = - qq|\n|; - - $form->{"pricegroup_old_$i"} = $form->{"pricegroup_id_$i"}; - - $column_data{sellprice_pg} = - qq||; - - } else { - - # for last row - $column_data{sellprice_pg} = qq||; - } - - $column_data{sellprice} = - qq||; - } - $column_data{discount} = - qq||; - $column_data{linetotal} = - qq||; - $column_data{bin} = qq||; - -######################################## - # Eintrag fuer Version 2.2.0 geaendert # - # neue Optik im Rechnungsformular # -######################################## - # if ($lizenzen && $form->{type} eq "invoice" && $form->{vc} eq "customer") { - # $column_data{license} = qq||; - # } - # - # if ($form->{type} !~ /_quotation/) { - # $column_data{serialnr} = qq||; - # } - # - # $column_data{projectnr} = qq||; -############## ENDE Neueintrag ################## - my $j = $i % 2; - print qq| - - |; - - map { print "\n$column_data{$_}" } @column_index; - - print("\n" . - $cgi->hidden("-name" => "unit_old_$i", - "-value" => $form->{"selected_unit_$i"}) - . "\n" . - $cgi->hidden("-name" => "price_new_$i", - "-value" => $form->format_amount(\%myconfig, $form->{"price_new_$i"})) - . "\n"); - map({ print($cgi->hidden("-name" => $_, "-value" => $form->{$_}) . "\n"); } - ("orderitems_id_$i", "bo_$i", "pricegroup_old_$i", "price_old_$i", - "id_$i", "inventory_accno_$i", "bin_$i", "partsgroup_$i", "partnotes_$i", - "income_accno_$i", "expense_accno_$i", "listprice_$i", "assembly_$i", - "taxaccounts_$i", "ordnumber_$i", "transdate_$i", "cusordnumber_$i", - "longdescription_$i", "basefactor_$i", "marge_total_$i", "marge_percent_$i", "lastcost_$i", - "marge_price_factor_$i")); - -######################################## - # Eintrag fuer Version 2.2.0 geaendert # - # neue Optik im Rechnungsformular # -######################################## - - my $row_style_attr = - 'style="display:none;"' if (!$form->{"show_details"}); - - # print second row - print qq| - - - -|; - -############## ENDE Neueintrag ################## - - map { $form->{"${_}_base"} += $linetotal } - (split(/ /, $form->{"taxaccounts_$i"})); - - $form->{invsubtotal} += $linetotal; - } - - print qq| -
|; - if ($form->{"formel_$i"}) { - $column_data{qty} .= qq|| - . $cgi->hidden("-name" => "formel_$i", "-value" => $form->{"formel_$i"}) . $cgi->hidden("-name" => "alu_$i", "-value" => $form->{"alu_$i"}); - } - $column_data{qty} .= qq|" . - $price_factor_select . - AM->unit_select_html($is_part || $is_assembly ? $dimension_units : - $is_assigned ? $service_units : $all_units, - "unit_$i", $this_unit, - $is_assigned ? $form->{"unit_$i"} : undef) - . " | - . $form->format_amount(\%myconfig, $linetotal, 2) - . qq|$form->{"bin_$i"}
-|; - if ($lizenzen && $form->{type} eq "invoice" && $form->{vc} eq "customer") { - my $selected = $form->{"licensenumber_$i"}; - my $lizenzen_quoted; - $form->{"lizenzen_$i"} =~ s/ selected//g; - $form->{"lizenzen_$i"} =~ - s/value="${selected}"\>/value="${selected}" selected\>/; - $lizenzen_quoted = $form->{"lizenzen_$i"}; - $lizenzen_quoted =~ s/\"/"/g; - print qq| - Lizenz\#  - -|; - } - if ($form->{type} !~ /_quotation/) { - print qq| - $serialnumber |; - } - - print qq|$projectnumber | . - NTI($cgi->popup_menu('-name' => "project_id_$i", - '-values' => \@projectnumber_values, - '-labels' => \%projectnumber_labels, - '-default' => $form->{"project_id_$i"})); - - if ($form->{type} eq 'invoice' or $form->{type} =~ /order/) { - my $reqdate_term = - ($form->{type} eq 'invoice') - ? 'deliverydate' - : 'reqdate'; # invoice uses a different term for the same thing. - print qq| - ${$reqdate_term}  -|; - } - my $subtotalchecked = ($form->{"subtotal_$i"}) ? "checked" : ""; - print qq| - |.$locale->text('Subtotal').qq|  -|; - - if ($form->{"id_$i"} && $is_sales) { - my $marge_price_factor; - - $form->{"marge_price_factor_$i"} *= 1; - - if ($form->{"marge_price_factor_$i"} && (1 != $form->{"marge_price_factor_$i"})) { - $marge_price_factor = '/' . $form->format_amount(\%myconfig, $form->{"marge_price_factor_$i"}); - } - - print qq| - ${marge_font_start}| . $locale->text('Ertrag') . qq| $form->{"marge_total_$i"} $form->{"marge_percent_$i"} % ${marge_font_end}|; - } - print qq| -  | . $locale->text('LP') . qq| | . $form->format_amount(\%myconfig, $form->{"listprice_$i"}, 2) . qq| -  | . $locale->text('EK') . qq| | . $form->format_amount(\%myconfig, $form->{"lastcost_$i"}, 2) . $marge_price_factor; +sub set_pricegroup { + $main::lxdebug->enter_sub(); - print qq| -
- - -|; - - if (0 != ($form->{sellprice_total} * 1)) { - $form->{marge_percent} = ($form->{sellprice_total} - $form->{lastcost_total}) / $form->{sellprice_total} * 100; - } + my $form = $main::form; + my %myconfig = %main::myconfig; + my $locale = $main::locale; - $lxdebug->leave_sub(); -} - -sub set_pricegroup { - $lxdebug->enter_sub(); my $rowcount = shift; - for $j (1 .. $rowcount) { - my $pricegroup_old = $form->{"pricegroup_old_$i"}; + for my $j (1 .. $rowcount) { + my $pricegroup_old = $form->{"pricegroup_old_$j"}; if ($form->{PRICES}{$j}) { - $len = 0; - $prices = ''; - $price = 0; - foreach $item (@{ $form->{PRICES}{$j} }) { + my $len = 0; + my $prices = ''; + my $price = 0; + foreach my $item (@{ $form->{PRICES}{$j} }) { #$price = $form->round_amount($myconfig, $item->{price}, 5); #$price = $form->format_amount($myconfig, $item->{price}, 2); - $price = $item->{price}; - $pricegroup_id = $item->{pricegroup_id}; - $pricegroup = $item->{pricegroup}; + my $price = $item->{price}; + my $pricegroup_id = $item->{pricegroup_id}; + my $pricegroup = $item->{pricegroup}; # build drop down list for pricegroups $prices .= @@ -626,7 +126,8 @@ sub set_pricegroup { if ($item->{selected} && ($pricegroup_id != 0)) { $form->{"pricegroup_old_$j"} = $pricegroup_id; $form->{"price_new_$j"} = $price; - $form->{"sellprice_$j"} = $price; + # edit: don't change the sellprice here + # $form->{"sellprice_$j"} = $price; # this must only be updated for existing articles, not new ones } if ($pricegroup_id == 0) { $form->{"price_new_$j"} = $form->{"sellprice_$j"}; @@ -635,13 +136,21 @@ sub set_pricegroup { $form->{"prices_$j"} = $prices; } } - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); } sub display_form { - $lxdebug->enter_sub(); + $main::lxdebug->enter_sub(); + + my $form = $main::form; + my %myconfig = %main::myconfig; + + $main::auth->assert('part_service_assembly_edit | vendor_invoice_edit | sales_order_edit | invoice_edit |' . + 'request_quotation_edit | sales_quotation_edit | purchase_order_edit | '. + 'purchase_delivery_order_edit | sales_delivery_order_edit'); relink_accounts(); + retrieve_partunits() if ($form->{type} =~ /_delivery_order$/); my $new_rowcount = $form->{"rowcount"} * 1 + 1; $form->{"project_id_${new_rowcount}"} = $form->{"globalproject_id"}; @@ -651,10 +160,10 @@ sub display_form { # if we have a display_form if ($form->{display_form}) { call_sub($form->{"display_form"}); - exit; + ::end_of_request(); } - Common::webdav_folder($form) if ($webdav); + Common::webdav_folder($form) if ($main::webdav); # if ( $form->{print_and_post} # && $form->{second_run} @@ -668,7 +177,7 @@ sub display_form { # $form->{print_and_post} = 0; # # &print_form($old_form); - # exit; + # ::end_of_request(); # } # # $form->{action} = ""; @@ -691,48 +200,52 @@ sub display_form { # } &form_header; - $numrows = ++$form->{rowcount}; - $subroutine = "display_row"; + { + no strict 'refs'; - if ($form->{item} eq 'part') { + my $numrows = ++$form->{rowcount}; + my $subroutine = "display_row"; - #set preisgruppenanzahl - $numrows = $form->{price_rows}; - $subroutine = "price_row"; + if ($form->{item} eq 'part') { - &{$subroutine}($numrows); + #set preisgruppenanzahl + $numrows = $form->{price_rows}; + $subroutine = "price_row"; - $numrows = ++$form->{makemodel_rows}; - $subroutine = "makemodel_row"; - } - if ($form->{item} eq 'assembly') { - $numrows = $form->{price_rows}; - $subroutine = "price_row"; + &{$subroutine}($numrows); - &{$subroutine}($numrows); + $numrows = ++$form->{makemodel_rows}; + $subroutine = "makemodel_row"; + } + if ($form->{item} eq 'assembly') { + $numrows = $form->{price_rows}; + $subroutine = "price_row"; - $numrows = ++$form->{makemodel_rows}; - $subroutine = "makemodel_row"; + &{$subroutine}($numrows); - # create makemodel rows - &{$subroutine}($numrows); + $numrows = ++$form->{makemodel_rows}; + $subroutine = "makemodel_row"; - $numrows = ++$form->{assembly_rows}; - $subroutine = "assembly_row"; - } - if ($form->{item} eq 'service') { - $numrows = $form->{price_rows}; - $subroutine = "price_row"; + # create makemodel rows + &{$subroutine}($numrows); - &{$subroutine}($numrows); + $numrows = ++$form->{assembly_rows}; + $subroutine = "assembly_row"; + } + if ($form->{item} eq 'service') { + $numrows = $form->{price_rows}; + $subroutine = "price_row"; - $numrows = 0; - } + &{$subroutine}($numrows); - # create rows - &{$subroutine}($numrows) if $numrows; + $numrows = 0; + } + + # create rows + &{$subroutine}($numrows) if $numrows; + } &form_footer; - $lxdebug->leave_sub(); + $main::lxdebug->leave_sub(); }