Auftrags-Controller: Preis nach Preisgruppe setzen, wenn keiner angegeben
[kivitendo-erp.git] / SL / Controller / Order.pm
index bd20669..f275f87 100644 (file)
@@ -18,6 +18,7 @@ use SL::DB::Employee;
 use SL::DB::Project;
 use SL::DB::Default;
 use SL::DB::Unit;
+use SL::DB::Price;
 
 use SL::Helper::DateTime;
 use SL::Helper::CreatePDF qw(:all);
@@ -25,6 +26,7 @@ use SL::Helper::CreatePDF qw(:all);
 use List::Util qw(max first);
 use List::MoreUtils qw(none pairwise);
 use English qw(-no_match_vars);
+use File::Spec;
 
 use Rose::Object::MakeMethods::Generic
 (
@@ -119,19 +121,23 @@ sub action_create_pdf {
   $sfile->fh->print($pdf);
   $sfile->fh->close;
 
-  my $tmp_filename = $sfile->file_name;
-  my $pdf_filename = t8('Sales Order') . '_' . $self->order->ordnumber . '.pdf';
+  my $key = join('_', Time::HiRes::gettimeofday(), int rand 1000000000000);
+  $::auth->set_session_value("Order::create_pdf-${key}" => $sfile->file_name);
+
+  my $pdf_filename =  t8('Sales Order') . '_' . $self->order->ordnumber . '.pdf';
 
   $self->js
-    ->run('download_pdf', $tmp_filename, $pdf_filename)
+    ->run('download_pdf', $pdf_filename, $key)
     ->flash('info', t8('The PDF has been created'))->render($self);
 }
 
 sub action_download_pdf {
   my ($self) = @_;
 
+  my $key = $::form->{key};
+  my $tmp_filename = $::auth->get_session_value("Order::create_pdf-${key}");
   return $self->send_file(
-    $::form->{tmp_filename},
+    $tmp_filename,
     type => 'application/pdf',
     name => $::form->{pdf_filename},
   );
@@ -278,12 +284,17 @@ sub action_add_item {
   my $cv_method   = $self->cv;
   my $cv_discount = $self->order->$cv_method? $self->order->$cv_method->discount : 0.0;
 
+  my $price = $item->sellprice;
+  $price  ||= ($self->order->$cv_method && $self->order->$cv_method->klass)
+            ? (SL::DB::Manager::Price->find_by(parts_id => $part->id, pricegroup_id => $self->order->$cv_method->klass)->price || $part->sellprice)
+            : $part->sellprice;
+
   my %new_attr;
   $new_attr{part}        = $part;
   $new_attr{description} = $part->description if ! $item->description;
   $new_attr{qty}         = 1.0                if ! $item->qty;
   $new_attr{unit}        = $part->unit;
-  $new_attr{sellprice}   = $part->sellprice   if ! $item->sellprice;
+  $new_attr{sellprice}   = $price;
   $new_attr{discount}    = $cv_discount       if ! $item->discount;
 
   # add_custom_variables adds cvars to an orderitem with no cvars for saving, but
@@ -490,6 +501,13 @@ sub _get_unalterable_data {
       #$item->active_price_source('');
       #$item->active_discount_source('');
     }
+
+    # autovivify all cvars that are not in the form (cvars_by_config can do it).
+    # workaround to pre-parse number-cvars (parse_custom_variable_values does not parse number values).
+    foreach my $var (@{ $item->cvars_by_config }) {
+      $var->unparsed_value($::form->parse_amount(\%::myconfig, $var->{__unparsed_value})) if ($var->config->type eq 'number' && exists($var->{__unparsed_value}));
+    }
+    $item->parse_custom_variable_values;
   }
 }
 
@@ -497,11 +515,6 @@ sub _get_unalterable_data {
 sub _save {
   my ($self) = @_;
 
-  # autovivify all cvars that are not in the form (cvars_by_config can do it)
-  foreach my $item (@{ $self->order->items }) {
-    $item->cvars_by_config;
-  }
-
   my $errors = [];
   my $db = $self->order->db;