Merge branch 'dpt_trans_entfernen'
[kivitendo-erp.git] / bin / mozilla / oe.pl
index 5df518f..f7f3375 100644 (file)
@@ -31,6 +31,8 @@
 # Quotation module
 #======================================================================
 
+
+use Carp;
 use POSIX qw(strftime);
 
 use SL::DO;
@@ -42,7 +44,7 @@ use SL::MoreCommon qw(ary_diff);
 use SL::PE;
 use SL::ReportGenerator;
 use List::MoreUtils qw(any none);
-use List::Util qw(max reduce sum);
+use List::Util qw(min max reduce sum);
 use Data::Dumper;
 
 require "bin/mozilla/io.pl";
@@ -341,8 +343,9 @@ sub form_header {
                    "price_factors" => "ALL_PRICE_FACTORS");
 
   # label subs
-  $TMPL_VAR{ALL_EMPLOYEES}         = SL::DB::Manager::Employee->get_all(query => [ or => [ id => $::form->{employee_id},  deleted => 0 ] ]);
-  $TMPL_VAR{ALL_SALESMEN}          = SL::DB::Manager::Employee->get_all(query => [ or => [ id => $::form->{salesman_id},  deleted => 0 ] ]);
+  my $employee_list_query_gen      = sub { $::form->{$_[0]} ? [ or => [ id => $::form->{$_[0]}, deleted => 0 ] ] : [ deleted => 0 ] };
+  $TMPL_VAR{ALL_EMPLOYEES}         = SL::DB::Manager::Employee->get_all(query => $employee_list_query_gen->('employee_id'));
+  $TMPL_VAR{ALL_SALESMEN}          = SL::DB::Manager::Employee->get_all(query => $employee_list_query_gen->('salesman_id'));
   $TMPL_VAR{ALL_SHIPTO}            = SL::DB::Manager::Shipto->get_all(query => [
     or => [ trans_id  => $::form->{"$::form->{vc}_id"} * 1, and => [ shipto_id => $::form->{shipto_id} * 1, trans_id => undef ] ]
   ]);
@@ -410,7 +413,7 @@ sub form_header {
     # emulate click for resubmitting actions
     $dispatch_to_popup  = "document.oe.${_}.click(); " for grep { /^action_/ } keys %$form;
   } elsif ($creditwarning) {
-    $::request->{layout}->add_javascripts_inline("alert('$credittext')");
+    $::request->{layout}->add_javascripts_inline("alert('$credittext');");
   }
 
   $::request->{layout}->add_javascripts_inline("\$(function(){$dispatch_to_popup})");
@@ -431,6 +434,8 @@ sub form_header {
   $form->{javascript} .= qq|<script type="text/javascript" src="js/show_history.js"></script>|;
   $form->{javascript} .= qq|<script type="text/javascript" src="js/show_vc_details.js"></script>|;
 
+  $::request->layout->use_stylesheet('presenter/record/record_list.css');
+
   $form->header;
 
   $TMPL_VAR{HIDDENS} = [ map { name => $_, value => $form->{$_} },
@@ -922,7 +927,7 @@ sub orders {
   my %totals    = map { $_ => 0 } @subtotal_columns;
   my %subtotals = map { $_ => 0 } @subtotal_columns;
 
-  my $idx = 0;
+  my $idx = 1;
 
   my $edit_url = build_std_url('action=edit', 'type', 'vc');
 
@@ -964,8 +969,8 @@ sub orders {
     my $row_set = [ $row ];
 
     if (($form->{l_subtotal} eq 'Y')
-        && (($idx == (scalar @{ $form->{OE} } - 1))
-            || ($oe->{ $form->{sort} } ne $form->{OE}->[$idx + 1]->{ $form->{sort} }))) {
+        && (($idx == (scalar @{ $form->{OE} }))
+            || ($oe->{ $form->{sort} } ne $form->{OE}->[$idx]->{ $form->{sort} }))) {
       push @{ $row_set }, create_subtotal_row(\%subtotals, \@columns, \%column_alignment, \@subtotal_columns, 'listsubtotal');
     }
 
@@ -1334,6 +1339,8 @@ sub invoice {
     ::end_of_request();
   }
 
+  _oe_remove_delivered_or_billed_rows(id => $form->{id}, type => 'billed');
+
   $form->{cp_id} *= 1;
 
   for my $i (1 .. $form->{rowcount}) {
@@ -1613,7 +1620,7 @@ sub save_as_new {
   $form->{saveasnew} = 1;
   map { delete $form->{$_} } qw(printed emailed queued delivered closed);
 
-  # Let Lx-Office assign a new order number if the user hasn't changed the
+  # Let kivitendo assign a new order number if the user hasn't changed the
   # previous one. If it has been changed manually then use it as-is.
   my $idx = $form->{type} =~ /_quotation$/ ? "quonumber" : "ordnumber";
   $form->{$idx} =~ s/^\s*//g;
@@ -1869,6 +1876,8 @@ sub delivery_order {
   $form->{old_employee_id}  = $form->{employee_id};
   $form->{old_salesman_id}  = $form->{salesman_id};
 
+  _oe_remove_delivered_or_billed_rows(id => $form->{id}, type => 'delivered');
+
   # reset
   delete @{$form}{qw(id subject message cc bcc printed emailed queued creditlimit creditremaining discount tradediscount oldinvtotal closed delivered)};
 
@@ -2042,6 +2051,32 @@ sub save_periodic_invoices_config {
   $::lxdebug->leave_sub();
 }
 
+sub _oe_remove_delivered_or_billed_rows {
+  my (%params) = @_;
+
+  return if !$params{id} || !$params{type};
+
+  my $ord_quot = SL::DB::Order->new(id => $params{id})->load;
+  return if !$ord_quot;
+
+  my %args    = (
+    direction => 'to',
+    to        =>   $params{type} eq 'delivered' ? 'DeliveryOrder' : 'Invoice',
+    via       => [ $params{type} eq 'delivered' ? qw(Order)       : qw(Order DeliveryOrder) ],
+  );
+
+  my %handled_base_qtys;
+  foreach my $record (@{ $ord_quot->linked_records(%args) }) {
+    next if $ord_quot->is_sales != $record->is_sales;
+
+    foreach my $item (@{ $record->items }) {
+      $handled_base_qtys{ $item->parts_id } += $item->qty * $item->unit_obj->base_factor;
+    }
+  }
+
+  _remove_billed_or_delivered_rows(quantities => \%handled_base_qtys);
+}
+
 sub dispatcher {
   foreach my $action (qw(delete delivery_order e_mail invoice print purchase_order purchase_order quotation
                          request_for_quotation sales_order sales_order save save_and_close save_as_new ship_to update)) {