X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/eebe8e90991eacadb6fbd20a648c152017a620c7..859394a5b4389f497ce493d11d29882ef66f2e47:/bin/mozilla/io.pl diff --git a/bin/mozilla/io.pl b/bin/mozilla/io.pl index e9fbad82a..c4f656714 100644 --- a/bin/mozilla/io.pl +++ b/bin/mozilla/io.pl @@ -44,6 +44,7 @@ use List::Util qw(min max first); use SL::CVar; use SL::Common; use SL::CT; +use SL::Locale::String qw(t8); use SL::IC; use SL::IO; use SL::PriceSource; @@ -162,8 +163,8 @@ sub display_row { { id => 'weight', width => 5, value => $locale->text('Weight'), display => $defaults->{show_weight}, }, { 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 => 'price_source', width => 5, value => $locale->text('Price Source'), display => !$is_delivery_order, }, + { id => 'sellprice', width => 15, value => $locale->text('Price'), display => !$is_delivery_order, }, { 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, }, @@ -218,12 +219,15 @@ sub display_row { my $totalweight = 0; + my $record = _make_record(); # rows my @ROWS; for my $i (1 .. $numrows) { my %column_data = (); + my $record_item = $record->id && $record->items ? $record->items->[$i-1] : _make_record_item($i); + # undo formatting map { $form->{"${_}_$i"} = $form->parse_amount(\%myconfig, $form->{"${_}_$i"}) } qw(qty discount sellprice lastcost price_new price_old) @@ -233,8 +237,6 @@ sub display_row { $form->{"sellprice_$i"} = $form->{"price_new_$i"}; } - my $record_item = _make_record_item($i); - # unit begin $form->{"unit_old_$i"} ||= $form->{"unit_$i"}; $form->{"selected_unit_$i"} ||= $form->{"unit_$i"}; @@ -308,24 +310,45 @@ sub display_row { } my $sellprice_value = $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces); + my $discount_value = $form->format_amount(\%myconfig, $form->{"discount_$i"}); my $edit_prices = $main::auth->assert('edit_prices', 1) && !$::form->{"active_price_source_$i"}; + my $edit_discounts = $main::auth->assert('edit_prices', 1) && !$::form->{"active_discount_source_$i"}; $column_data{sellprice} = (!$edit_prices) ? $cgi->hidden( -name => "sellprice_$i", -id => "sellprice_$i", -value => $sellprice_value) . $sellprice_value : $cgi->textfield(-name => "sellprice_$i", -id => "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{discount} = (!$edit_discounts) + ? $cgi->hidden( -name => "discount_$i", -id => "discount_$i", -value => $discount_value) . $discount_value . ' %' + : $cgi->textfield(-name => "discount_$i", -id => "discount_$i", -size => 3, -value => $discount_value); $column_data{linetotal} = $form->format_amount(\%myconfig, $linetotal, 2); $column_data{bin} = $form->{"bin_$i"}; $column_data{weight} = $form->format_amount(\%myconfig, $form->{"qty_$i"} * $form->{"weight_$i"}, 3) . ' ' . $defaults->{weightunit} if $defaults->{show_weight}; - if ($form->{"id_${i}"}) { - my $price_source = SL::PriceSource->new(record_item => $record_item); - my $price = $price_source->price_from_source($::form->{"active_price_source_$i"}); - $::form->{price_sources}[$i] = $price_source; - $column_data{price_source} .= $cgi->button(-value => $price->full_description, -onClick => "toggle_price_source($i)"); + if ($form->{"id_${i}"} && !$is_delivery_order) { + my $price_source = SL::PriceSource->new(record_item => $record_item, record => $record); + my $price = $price_source->price_from_source($::form->{"active_price_source_$i"}); + my $discount = $price_source->price_from_source($::form->{"active_discount_source_$i"}); + my $best_price = $price_source->best_price; + my $best_discount = $price_source->best_discount; + $column_data{price_source} .= $cgi->button(-value => $price->source_description, -onClick => "kivi.io.price_chooser($i)"); + if ($price->source) { + $column_data{price_source} .= ' ' . $cgi->img({src => 'image/flag-red.png', alt => $price->invalid, title => $price->invalid }) if $price->invalid; + $column_data{price_source} .= ' ' . $cgi->img({src => 'image/flag-red.png', alt => $price->missing, title => $price->missing }) if $price->missing; + if (!$price->missing && !$price->invalid) { + $column_data{price_source} .= ' ' . $cgi->img({src => 'image/up.png', alt => t8('This price has since gone up'), title => t8('This price has since gone up' ) }) if $price->price > $record_item->sellprice; + $column_data{price_source} .= ' ' . $cgi->img({src => 'image/down.png', alt => t8('This price has since gone down'), title => t8('This price has since gone down') }) if $price->price < $record_item->sellprice; + $column_data{price_source} .= ' ' . $cgi->img({src => 'image/ok.png', alt => t8('There is a better price available'), title => t8('There is a better price available') }) if $best_price && $price->source ne $price_source->best_price->source; + } + } + if ($discount->source) { + $column_data{discount_source} .= ' ' . $cgi->img({src => 'image/flag-red.png', alt => $discount->invalid, title => $discount->invalid }) if $discount->invalid; + $column_data{discount_source} .= ' ' . $cgi->img({src => 'image/flag-red.png', alt => $discount->missing, title => $discount->missing }) if $discount->missing; + if (!$discount->missing && !$discount->invalid) { + $column_data{price_source} .= ' ' . $cgi->img({src => 'image/up.png', alt => t8('This discount has since gone up'), title => t8('This discount has since gone up') }) if $discount->discount * 100 > $record_item->discount; + $column_data{price_source} .= ' ' . $cgi->img({src => 'image/down.png', alt => t8('This discount has since gone down'), title => t8('This discount has since gone down') }) if $discount->discount * 100 < $record_item->discount; + $column_data{price_source} .= ' ' . $cgi->img({src => 'image/ok.png', alt => t8('There is a better discount available'), title => t8('There is a better discount available') }) if $best_discount && $discount->source ne $price_source->best_discount->source; + } + } } if ($is_delivery_order) { @@ -420,7 +443,7 @@ sub display_row { $cgi->hidden("-name" => "unit_old_$i", "-value" => $form->{"selected_unit_$i"}), $cgi->hidden("-name" => "price_new_$i", "-value" => $form->format_amount(\%myconfig, $form->{"price_new_$i"})), map { ($cgi->hidden("-name" => $_, "-id" => $_, "-value" => $form->{$_})); } map { $_."_$i" } - (qw(orderitems_id bo price_old id inventory_accno bin partsgroup partnotes active_price_source + (qw(orderitems_id bo price_old id inventory_accno bin partsgroup partnotes active_price_source active_discount_source income_accno expense_accno listprice assembly taxaccounts ordnumber donumber transdate cusordnumber longdescription basefactor marge_absolut marge_percent marge_price_factor weight), @hidden_vars) ); @@ -461,7 +484,6 @@ sub select_item { $::form->header; my @item_list = map { - $_->{display_sellprice} = $_->{sellprice} * (1 - $::form->{tradediscount}); $_->{display_sellprice} /= $_->{price_factor} if ($_->{price_factor}); $_; } @{ $::form->{item_list} }; @@ -519,6 +541,23 @@ sub item_selected { map { $form->{"${_}_$i"} = $new_item->{$_} } @new_fields; + my $record = _make_record(); + my $price_source = SL::PriceSource->new(record_item => $record->items->[$i-1], record => $record); + my $best_price = $price_source->best_price; + + if ($best_price) { + $::form->{"sellprice_$i"} = $best_price->price; + $::form->{"active_price_source_$i"} = $best_price->source; + } + + my $best_discount = $price_source->best_discount; + + if ($best_discount) { + $::form->{"discount_$i"} = $best_discount->discount; + $::form->{"active_discount_source_$i"} = $best_discount->source; + } + + $form->{"marge_price_factor_$i"} = $new_item->{price_factor}; if ($form->{"part_payment_id_$i"} ne "") { @@ -539,11 +578,6 @@ sub item_selected { $form->{"sellprice_$i"} = $form->round_amount($form->{"sellprice_$i"}, $decimalplaces); } - - # tradediscount - if ($::form->{tradediscount}) { - $::form->{"sellprice_$i"} *= 1 - $::form->{tradediscount}; - } } map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) } @@ -691,7 +725,8 @@ sub remove_emptied_rows { price_old price_new unit_old ordnumber donumber transdate longdescription basefactor marge_total marge_percent marge_price_factor lastcost price_factor_id partnotes - stock_out stock_in has_sernumber reqdate orderitems_id); + stock_out stock_in has_sernumber reqdate orderitems_id + active_price_source active_discount_source); my $ic_cvar_configs = CVar->get_configs(module => 'IC'); push @flds, map { "ic_cvar_$_->{name}" } @{ $ic_cvar_configs }; @@ -1890,6 +1925,8 @@ sub _remove_billed_or_delivered_rows { $::form->{rowcount} -= $removed_rows; } +# TODO: both of these are makeshift so that price sources can operate on rdbo objects. if +# this ever gets rewritten in controller style, throw this out sub _make_record_item { my ($row) = @_; @@ -1918,6 +1955,8 @@ sub _make_record_item { next unless $obj->meta->column($method); if ($obj->meta->column($method)->isa('Rose::DB::Object::Metadata::Column::Date')) { $obj->${\"$method\_as_date"}($::form->{"$method\_$row"}); + } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::(?:Numeric|Float|DoublePrecsion)$/) { + $obj->${\"$method\_as_number"}($::form->{"$method\_$row"}); } else { $obj->$method($::form->{"$method\_$row"}); } @@ -1929,3 +1968,54 @@ sub _make_record_item { return $obj; } + +sub _make_record { + my $class = { + sales_order => 'Order', + purchase_oder => 'Order', + sales_quotation => 'Order', + request_quotation => 'Order', + purchase_delivery_order => 'DeliveryOrder', + sales_delivery_order => 'DeliveryOrder', + }->{$::form->{type}}; + + if ($::form->{type} =~ /invoice|credit_note/) { + $class = $::form->{vc} eq 'customer' ? 'Invoice' + : $::form->{vc} eq 'vendor' ? 'PurchaseInvoice' + : do { die 'unknown invoice type' }; + } + + return unless $class; + + $class = 'SL::DB::' . $class; + + eval "require $class"; + + my $obj = $::form->{id} + ? $class->meta->convention_manager->auto_manager_class_name->find_by(id => $::form->{id}) + : $class->new; + + for my $method (keys %$::form) { + next unless $obj->can($method); + next unless $obj->meta->column($method); + + if ($obj->meta->column($method)->isa('Rose::DB::Object::Metadata::Column::Date')) { + $obj->${\"$method\_as_date"}($::form->{$method}); + } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::(?:Numeric|Float|DoublePrecsion)$/) { + $obj->${\"$method\_as_number"}($::form->{$method}); + } else { + $obj->$method($::form->{$method}); + } + } + + my @items; + for my $i (1 .. $::form->{rowcount}) { + next unless $::form->{"id_$i"}; + push @items, _make_record_item($i) + } + + $obj->items(@items) if @items; + + return $obj; +} +