X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;ds=sidebyside;f=bin%2Fmozilla%2Fio.pl;h=37df5546164524bd280da2504e09b1dabd3d701f;hb=8efbc44487e0f99236ec55539a61f1d0d04635a9;hp=c2e4bd45e7abb0699fb1f14ff3f987d2251fb1cd;hpb=6f7c3b1044f67c26a7c7355e991224a7bab733f9;p=kivitendo-erp.git diff --git a/bin/mozilla/io.pl b/bin/mozilla/io.pl index c2e4bd45e..37df55461 100644 --- a/bin/mozilla/io.pl +++ b/bin/mozilla/io.pl @@ -36,8 +36,9 @@ # ####################################################################### +use Carp; use CGI; -use CGI::Ajax; +use List::MoreUtils qw(uniq); use List::Util qw(min max first); use SL::CVar; @@ -46,6 +47,10 @@ use SL::CT; use SL::IC; use SL::IO; +use SL::DB::Language; +use SL::DB::Printer; +use SL::Helper::Flash; + require "bin/mozilla/common.pl"; use strict; @@ -112,11 +117,11 @@ sub display_row { my $form = $main::form; my %myconfig = %main::myconfig; my $locale = $main::locale; - my $cgi = $main::cgi; + my $cgi = $::request->{cgi}; my $numrows = shift; - my ($readonly, $stock_in_out, $stock_in_out_title); + my ($stock_in_out, $stock_in_out_title); my $is_purchase = (first { $_ eq $form->{type} } qw(request_quotation purchase_order purchase_delivery_order)) || ($form->{script} eq 'ir.pl'); my $show_min_order_qty = first { $_ eq $form->{type} } qw(request_quotation purchase_order); @@ -124,8 +129,6 @@ sub display_row { my $is_s_p_order = (first { $_ eq $form->{type} } qw(sales_order purchase_order)); if ($is_delivery_order) { - $readonly = ' readonly' if ($form->{closed}); - if ($form->{type} eq 'sales_delivery_order') { $stock_in_out_title = $locale->text('Release From Stock'); $stock_in_out = 'out'; @@ -147,11 +150,10 @@ sub display_row { { id => 'qty', width => 5, value => $locale->text('Qty'), display => 1, }, { id => 'price_factor', width => 5, value => $locale->text('Price Factor'), display => !$is_delivery_order, }, { id => 'unit', width => 5, value => $locale->text('Unit'), display => 1, }, - { id => 'license', width => 10, value => $locale->text('License'), display => 0, }, { id => 'serialnr', width => 10, value => $locale->text('Serial No.'), display => 0, }, { id => 'projectnr', width => 10, value => $locale->text('Project'), display => 0, }, { id => 'sellprice', width => 15, value => $locale->text('Price'), display => !$is_delivery_order, }, - { id => 'sellprice_pg', width => 8, value => $locale->text('Pricegroup'), display => ($form->{type} =~ /^(sales_|invoice)/) && !$is_delivery_order, }, + { id => 'sellprice_pg', width => 8, value => $locale->text('Pricegroup'), display => !$is_delivery_order && !$is_purchase, }, { id => 'discount', width => 5, value => $locale->text('Discount'), display => !$is_delivery_order, }, { id => 'linetotal', width => 10, value => $locale->text('Extended'), display => !$is_delivery_order, }, { id => 'bin', width => 10, value => $locale->text('Bin'), display => 0, }, @@ -225,11 +227,11 @@ sub display_row { # adjust prices by unit, ignore if pricegroup changed if ((!$form->{"prices_$i"}) || ($form->{"new_pricegroup_$i"} == $form->{"old_pricegroup_$i"})) { $form->{"sellprice_$i"} *= AM->convert_unit($form->{"selected_unit_$i"}, $form->{"unit_old_$i"}, $all_units) || 1; + $form->{"lastcost_$i"} *= AM->convert_unit($form->{"selected_unit_$i"}, $form->{"unit_old_$i"}, $all_units) || 1; $form->{"unit_old_$i"} = $form->{"selected_unit_$i"}; } my $this_unit = $form->{"unit_$i"}; $this_unit = $form->{"selected_unit_$i"} if AM->convert_unit($this_unit, $form->{"selected_unit_$i"}, $all_units); - $this_unit ||= "kg"; if (0 < scalar @{ $form->{ALL_PRICE_FACTORS} }) { my @values = ('', map { $_->{id} } @{ $form->{ALL_PRICE_FACTORS} }); @@ -248,7 +250,10 @@ sub display_row { $column_data{"unit"} = AM->unit_select_html($all_units, "unit_$i", $this_unit, $form->{"id_$i"} ? $form->{"unit_$i"} : undef); # / unit ending +#count the max of decimalplaces of sellprice and lastcost, so the same number of decimalplaces +#is shown for lastcost and sellprice. my $decimalplaces = ($form->{"sellprice_$i"} =~ /\.(\d+)/) ? max 2, length $1 : 2; + $decimalplaces = ($form->{"lastcost_$i"} =~ /\.(\d+)/) ? max $decimalplaces, length $1 : $decimalplaces; my $price_factor = $price_factors{$form->{"price_factor_id_$i"}} || 1; my $discount = $form->round_amount($form->{"qty_$i"} * $form->{"sellprice_$i"} * $form->{"discount_$i"} / 100 / $price_factor, 2); @@ -279,27 +284,44 @@ sub display_row { } # build in drop down list for pricesgroups + # $sellprice_value setzt den Wert etwas unabhängiger von der Darstellung. + # Hintergrund: Preisgruppen werden hier überprüft und neu berechnet. + # Vorher wurde der ganze cgi->textfield Block zweimal identisch eingebaut, dass passiert + # jetzt nach der Abfrage. + my $sellprice_value; if ($form->{"prices_$i"}) { $column_data{sellprice_pg} = qq||; - $column_data{sellprice} = $cgi->textfield(-name => "sellprice_$i", -size => 10, -onBlur => 'check_right_number_format(this)', -value => - (($form->{"new_pricegroup_$i"} != $form->{"old_pricegroup_$i"}) + $sellprice_value =($form->{"new_pricegroup_$i"} != $form->{"old_pricegroup_$i"}) ? $form->format_amount(\%myconfig, $form->{"price_new_$i"}, $decimalplaces) - : $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces))); + : $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces); } else { # for last row and report # set pricegroup drop down list from report menu if ($form->{"sellprice_$i"} != 0) { + # remember the pricegroup_id in pricegroup_old + # but don't overwrite it $form->{"pricegroup_old_$i"} = $form->{"pricegroup_id_$i"}; my $default_option = $form->{"sellprice_$i"}.'--'.$form->{"pricegroup_id_$i"}; - $column_data{sellprice_pg} = NTI($cgi->popup_menu("sellpricepg_$i", [ $default_option ], $default_option, { $default_option => $form->{"pricegroup_$i"} || '' })); + $column_data{sellprice_pg} = NTI($cgi->popup_menu("sellprice_pg_$i", [ $default_option ], $default_option, { $default_option => $form->{"pricegroup_$i"} || '' })); } else { $column_data{sellprice_pg} = qq| |; } - $column_data{sellprice} = $cgi->textfield(-name => "sellprice_$i", -size => 10, -onBlur => "check_right_number_format(this)", -value => - $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces)); + $sellprice_value = $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces); } - $column_data{discount} = $cgi->textfield(-name => "discount_$i", -size => 3, -value => $form->format_amount(\%myconfig, $form->{"discount_$i"})); + # Falls der Benutzer die Preise nicht anpassen sollte, wird das entsprechende + # Textfield auf readonly gesetzt. Anm. von Sven: Manipulation der Preise ist + # immer noch möglich, konsequenterweise sollten diese NUR aus der Datenbank + # geholt werden. + my $edit_prices = $main::auth->assert('edit_prices', 1); + $column_data{sellprice} = (!$edit_prices) + ? $cgi->textfield(-readonly => "readonly", + -name => "sellprice_$i", -size => 10, -onBlur => "check_right_number_format(this)", -value => $sellprice_value) + : $cgi->textfield(-name => "sellprice_$i", -size => 10, -onBlur => "check_right_number_format(this)", -value => $sellprice_value); + $column_data{discount} = (!$edit_prices) + ? $cgi->textfield(-readonly => "readonly", + -name => "discount_$i", -size => 3, -value => $form->format_amount(\%myconfig, $form->{"discount_$i"})) + : $cgi->textfield(-name => "discount_$i", -size => 3, -value => $form->format_amount(\%myconfig, $form->{"discount_$i"})); $column_data{linetotal} = $form->format_amount(\%myconfig, $linetotal, 2); $column_data{bin} = $form->{"bin_$i"}; @@ -325,8 +347,20 @@ sub display_row { $form->{"marge_percent_$i"} = 0; my $marge_color; - my $real_sellprice = $linetotal; - my $real_lastcost = $form->{"lastcost_$i"} * $form->{"qty_$i"} / ( $form->{"marge_price_factor_$i"} || 1 ); + my $real_sellprice; + if ( $form->{taxincluded} and $form->{"qty_$i"} * 1 and $form->{$form->{"taxaccounts_$i"} . "_rate"} * 1) { + # if we use taxincluded we need to calculate the marge from the net_value + # all the marge calculations are based on linetotal which we need to + # convert to net first + + # there is no direct form value for the tax_rate of the item, but + # form->{taxaccounts_$i} gives the tax account (e.g. 3806) and 3806_rate + # gives the tax percentage (e.g. 0.19) + $real_sellprice = $linetotal / (1 + $form->{$form->{"taxaccounts_$i"} . "_rate"}); + } else { + $real_sellprice = $linetotal; + }; + my $real_lastcost = $form->round_amount($form->{"lastcost_$i"} * $form->{"qty_$i"} / $price_factor, 2); my $marge_percent_warn = $myconfig{marge_percent_warn} * 1 || 15; my $marge_adjust_credit_note = $form->{type} eq 'credit_note' ? -1 : 1; @@ -348,14 +382,17 @@ sub display_row { %s |, $marge_color, $locale->text('Ertrag'),$form->{"marge_absolut_$i"}, $form->{"marge_percent_$i"}, $locale->text('LP'), $form->format_amount(\%myconfig, $form->{"listprice_$i"}, 2), - $locale->text('EK'), $form->format_amount(\%myconfig, $form->{"lastcost_$i"}, 2) } - if $form->{"id_$i"} && ($form->{type} =~ /^sales_/ || $form->{type} =~ /invoice/) && !$is_delivery_order; + $locale->text('EK'), $form->format_amount(\%myconfig, $form->{"lastcost_$i"}, $decimalplaces) } + if $form->{"id_$i"} && ($form->{type} =~ /^sales_/ || $form->{type} =~ /invoice/ || $form->{type} =~ /^credit_note$/ ) && !$is_delivery_order; + + $form->{"listprice_$i"} = $form->format_amount(\%myconfig, $form->{"listprice_$i"}, 2) + if $form->{"id_$i"} && ($form->{type} =~ /^sales_/ || $form->{type} =~ /invoice/) ; # / marge calculations ending # calculate onhand if ($form->{"id_$i"}) { my $part = IC->get_basic_part_info(id => $form->{"id_$i"}); - my $onhand_color = 'color="#ff0000"' if $part->{onhand} < $part->{rop}; + my $onhand_color = $part->{onhand} < $part->{rop} ? 'color="#ff0000"' : ''; push @ROW2, { value => sprintf "%s %s %s", $locale->text('On Hand'), $onhand_color, @@ -369,7 +406,7 @@ sub display_row { if ($is_delivery_order) { map { $form->{"${_}_${i}"} = $form->format_amount(\%myconfig, $form->{"${_}_${i}"}) } qw(sellprice discount lastcost); - push @hidden_vars, qw(sellprice discount price_factor_id lastcost); + push @hidden_vars, qw(sellprice discount not_discountable price_factor_id lastcost pricegroup_id); push @hidden_vars, "stock_${stock_in_out}_sum_qty", "stock_${stock_in_out}"; } @@ -411,7 +448,7 @@ sub set_pricegroup { my $form = $main::form; my $locale = $main::locale; - my $cgi = $main::cgi; + my $cgi = $::request->{cgi}; _check_io_auth(); @@ -436,148 +473,28 @@ sub set_pricegroup { sub select_item { $main::lxdebug->enter_sub(); - my $form = $main::form; - my %myconfig = %main::myconfig; - my $locale = $main::locale; - my $cgi = $main::cgi; + my %params = @_; + my $mode = $params{mode} || croak "Missing parameter 'mode'"; -# diese variable kommt schon in der methode display_row vor, kann man die besser wiederverwenden? @mb fragen. ich check das jetzt erstmal so ein - my $is_purchase = (first { $_ eq $form->{type} } qw(request_quotation purchase_order purchase_delivery_order)) || ($form->{script} eq 'ir.pl'); _check_io_auth(); - my @column_index = qw(ndx partnumber description rop onhand unit sellprice); - my %column_data; - $column_data{ndx} = qq|