Preisquellen: Support für editierbare Preisquellen
[kivitendo-erp.git] / bin / mozilla / io.pl
index 0cd7385..33a5930 100644 (file)
@@ -41,6 +41,7 @@ use Carp;
 use CGI;
 use List::MoreUtils qw(any uniq apply);
 use List::Util qw(min max first);
+use List::UtilsBy qw(sort_by uniq_by);
 
 use SL::ClientJS;
 use SL::CVar;
@@ -217,7 +218,7 @@ sub display_row {
 
   # special alignings
   my %align  = map { $_ => 'right' } qw(qty ship right discount linetotal stock_in_out weight ship_missing);
-  my %nowrap = map { $_ => 1 }       qw(description unit);
+  my %nowrap = map { $_ => 1 }       qw(description unit  price_source);
 
   $form->{marge_total}           = 0;
   $form->{sellprice_total}       = 0;
@@ -335,24 +336,18 @@ sub display_row {
       $column_data{ship_missing} = $form->format_amount(\%myconfig, $ship_missing_qty) . ' ' . $form->{"unit_$i"} . '; ' . $form->format_amount(\%myconfig, $ship_missing_amount, $decimalplaces);
     }
 
-    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_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};
 
+    my $sellprice_value = $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces);
+    my $discount_value  = $form->format_amount(\%myconfig, $form->{"discount_$i"});
+
+    my $price;
     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"});
+         $price         = $price_source->price_from_source($::form->{"active_price_source_$i"});
       my $discount      = $price_source->discount_from_source($::form->{"active_discount_source_$i"});
       my $best_price    = $price_source->best_price;
       my $best_discount = $price_source->best_discount;
@@ -377,6 +372,15 @@ sub display_row {
       }
     }
 
+    my $edit_prices     = $main::auth->assert('edit_prices', 1) && (!$::form->{"active_price_source_$i"} || !$price || $price->editable);
+    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_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);
+
     if ($is_delivery_order) {
       $column_data{stock_in_out} =  calculate_stock_in_out($i);
     }
@@ -1026,126 +1030,6 @@ sub request_for_quotation {
   quotation();
 }
 
-sub edit_e_mail {
-  $main::lxdebug->enter_sub();
-
-  my $form     = $main::form;
-  my %myconfig = %main::myconfig;
-  my $locale   = $main::locale;
-
-  _check_io_auth();
-
-  if ($form->{second_run}) {
-    $form->{print_and_post} = 0;
-    $form->{resubmit}       = 0;
-  }
-
-  $form->{email} = $form->{shiptoemail} if $form->{shiptoemail} && $form->{formname} =~ /(pick|packing|bin)_list/;
-
-  if ($form->{"cp_id"}) {
-    CT->get_contact(\%myconfig, $form);
-    $form->{"email"} = $form->{"cp_email"} if $form->{"cp_email"};
-  }
-
-  $form->{language} = $form->get_template_language(\%myconfig);
-  $form->{language} = "_" . $form->{language} if $form->{language};
-
-  my $title = $locale->text('E-mail') . " " . $form->get_formname_translation();
-
-  $form->{oldmedia} = $form->{media};
-  $form->{media}    = "email";
-
-  my $global_bcc = AM->get_defaults()->{global_bcc};
-
-  $form->{bcc} = join ', ', grep $_, $form->{bcc}, $global_bcc;
-
-  my $attachment_filename = $form->generate_attachment_filename();
-  my $subject             = $form->{subject} || $form->generate_email_subject();
-
-  $form->header;
-
-  my (@dont_hide_key_list, %dont_hide_key, @hidden_keys);
-  @dont_hide_key_list = qw(action email cc bcc subject message sendmode format header override login password);
-  @dont_hide_key{@dont_hide_key_list} = (1) x @dont_hide_key_list;
-  @hidden_keys = sort grep { !$dont_hide_key{$_} } grep { !ref $form->{$_} } keys %$form;
-
-  my (@files, @vc_files, @part_files, $has_document);
-
-  if ($::instance_conf->get_doc_storage) {
-    @files = SL::File->get_all_versions(object_id => $form->{id}, object_type => $form->{type}, file_type => 'document');
-    $has_document = 1 if scalar(@files) > 0;
-    @files = SL::File->get_all(object_id => $form->{id}, object_type => $form->{type}, file_type => 'attachment');
-    @vc_files = SL::File->get_all(object_id => $form->{"$form->{vc}_id"}, object_type => $form->{vc})
-      if $form->{vc} && $form->{"$form->{vc}_id"};
-
-    my %part_id_map = map { $_->{id} => $_ } grep { $_->{id} } map {
-      {
-        'id'       => $form->{"id_$_"},
-        'partname' => $form->{"partnumber_$_"}
-      }
-    } (1 .. $form->{rowcount});
-
-    foreach my $partid (keys %part_id_map) {
-      my @pfiles = SL::File->get_all(object_id => $partid, object_type => 'part');
-      push @part_files, map { $_->{partname} = $part_id_map{$partid}->{partname}; $_ } @pfiles;
-    }
-  }
-
-  print $form->parse_html_template('generic/edit_email',
-                                   { title         => $title,
-                                     a_filename    => $attachment_filename,
-                                     subject       => $subject,
-                                     has_document  => $has_document,
-                                     print_options => print_options('inline' => 1),
-                                     action        => 'send_email',
-                                     FILES         => \@files,
-                                     VC_FILES      => \@vc_files,
-                                     PART_FILES    => \@part_files,
-                                     HIDDEN        => [ map +{ name => $_, value => $form->{$_} }, @hidden_keys ],
-                                     SHOW_BCC      => $::auth->assert('email_bcc', 'may fail') });
-
-  $main::lxdebug->leave_sub();
-}
-
-sub send_email {
-  $main::lxdebug->enter_sub();
-
-  my $form     = $main::form;
-  my %myconfig = %main::myconfig;
-
-  _check_io_auth();
-
-  my $callback = $form->{script} . "?action=edit";
-  map({ $callback .= "\&${_}=" . E($form->{$_}); } qw(type id));
-  if ( $form->{action_oldfile} || $form->{action_nofile} ) {
-    if (!$form->{email} || $form->{email} =~ /^\s*$/) {
-      flash('error', $::locale->text('E-mail address missing!'));
-    }
-    else {
-      $form->send_email(\%myconfig,'pdf');
-    }
-  }
-  else {
-    print_form("return");
-    $form->{addition} = "SCREENED";
-    $form->save_history;
-    $form->{addition} = "MAILED";
-  }
-
-  flash_later('info' , $::locale->text('E-Mail is sent to #1', $form->{email})) if !$form->{emailerr};
-  flash_later('error', $::locale->text($form->{emailerr})) if $form->{emailerr};
-
-  delete $form->{emailerr};
-
-  Common->save_email_status(\%myconfig, $form);
-  ##TODO andere SAVE HISTORY
-
-  $form->{callback} = $callback;
-  $form->redirect();
-
-  $main::lxdebug->leave_sub();
-}
-
 sub print_options {
   $::lxdebug->enter_sub();
 
@@ -2044,6 +1928,37 @@ sub setup_sales_purchase_print_options {
   );
 }
 
+sub _get_files_for_email_dialog {
+  my %files = map { ($_ => []) } qw(versions files vc_files part_files);
+
+  return %files if !$::instance_conf->get_doc_storage;
+
+  $files{versions} = [ SL::File->get_all_versions(object_id => $::form->{id},    object_type => $::form->{type}, file_type => 'document') ];
+  $files{files}    = [ SL::File->get_all(         object_id => $::form->{id},    object_type => $::form->{type}, file_type => 'attachment') ];
+  $files{vc_files} = [ SL::File->get_all(         object_id => $::form->{vc_id}, object_type => $::form->{vc},   file_type => 'attachment') ]
+    if $::form->{vc} && $::form->{"vc_id"};
+
+  my @parts =
+    uniq_by { $_->{id} }
+    grep    { $_->{id} }
+    map     {
+      +{ id         => $::form->{"id_$_"},
+         partnumber => $::form->{"partnumber_$_"},
+       }
+    } (1 .. $::form->{rowcount});
+
+  foreach my $part (@parts) {
+    my @pfiles = SL::File->get_all(object_id => $part->{id}, object_type => 'part');
+    push @{ $files{part_files} }, map { +{ %{ $_ }, partnumber => $part->{partnumber} } } @pfiles;
+  }
+
+  foreach my $key (keys %files) {
+    $files{$key} = [ sort_by { lc $_->{db_file}->{file_name} } @{ $files{$key} } ];
+  }
+
+  return %files;
+}
+
 sub show_sales_purchase_email_dialog {
   my $contact    = $::form->{cp_id} ? SL::DB::Contact->load_cached($::form->{cp_id}) : undef;
   my $email_form = {
@@ -2052,9 +1967,12 @@ sub show_sales_purchase_email_dialog {
     attachment_filename => $::form->generate_attachment_filename,
   };
 
-  my $html = $::form->parse_html_template("common/_send_email_dialog", {
-    email_form => $email_form,
-    show_bcc   => $::auth->assert('email_bcc', 'may fail'),
+  my %files = _get_files_for_email_dialog();
+  my $html  = $::form->parse_html_template("common/_send_email_dialog", {
+    email_form  => $email_form,
+    show_bcc    => $::auth->assert('email_bcc', 'may fail'),
+    FILES       => \%files,
+    is_customer => $::form->{vc} eq 'customer',
   });
 
   print $::form->ajax_response_header, $html;
@@ -2074,8 +1992,13 @@ sub send_sales_purchase_email {
 
   $::form->{media} = 'email';
 
-  print_form("return");
-  Common->save_email_status(\%::myconfig, $::form);
+  if (($::form->{attachment_policy} // '') =~ m{^(?:old_file|no_file)$}) {
+    $::form->send_email(\%::myconfig, 'pdf');
+
+  } else {
+    print_form("return");
+    Common->save_email_status(\%::myconfig, $::form);
+  }
 
   flash_later('info', $::locale->text('The email has been sent.'));