]> wagnertech.de Git - kivitendo-erp.git/blobdiff - bin/mozilla/io.pl
PriceSource: Gutschriften berücksichtigen
[kivitendo-erp.git] / bin / mozilla / io.pl
index e9fbad82a12c9c06aa3b8478fffaac068f7c4d3e..80fda8657cae9162d90149bc34ececdc484840cd 100644 (file)
@@ -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;
@@ -218,6 +219,7 @@ sub display_row {
 
   my $totalweight = 0;
 
+  my $record = _make_record();
   # rows
 
   my @ROWS;
@@ -233,7 +235,7 @@ sub display_row {
       $form->{"sellprice_$i"} = $form->{"price_new_$i"};
     }
 
-    my $record_item = _make_record_item($i);
+    my $record_item = $record->id && $record->items ? $record->items->[$i-1] : _make_record_item($i);
 
 # unit begin
     $form->{"unit_old_$i"}      ||= $form->{"unit_$i"};
@@ -322,10 +324,16 @@ sub display_row {
     $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_source = SL::PriceSource->new(record_item => $record_item, record => $record);
       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)");
+      $column_data{price_source} .= $cgi->button(-value => $price->full_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;
+        $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 $price->source ne $price_source->best_price->source;
+      }
     }
 
     if ($is_delivery_order) {
@@ -519,6 +527,16 @@ 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;
+  }
+
+
   $form->{"marge_price_factor_$i"} = $new_item->{price_factor};
 
   if ($form->{"part_payment_id_$i"} ne "") {
@@ -691,7 +709,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);
 
   my $ic_cvar_configs = CVar->get_configs(module => 'IC');
   push @flds, map { "ic_cvar_$_->{name}" } @{ $ic_cvar_configs };
@@ -1890,6 +1909,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) = @_;
 
@@ -1929,3 +1950,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;
+}
+