]> wagnertech.de Git - mfinanz.git/blobdiff - SL/Controller/Order.pm
calculate_qty (Formel): alu (?) und andere unbenutzte Parameter entfernt
[mfinanz.git] / SL / Controller / Order.pm
index b87049a0a1b62ea36af4462b1414c1670180bd30..864cc674fa401eb5abafe9864ad0212885a83ba6 100644 (file)
@@ -56,7 +56,8 @@ sub action_add {
   my ($self) = @_;
 
   $self->order->transdate(DateTime->now_local());
-  $self->order->reqdate(DateTime->today_local->next_workday) if !$self->order->reqdate;
+  my $extra_days = $self->type eq _sales_quotation_type() ? $::instance_conf->get_reqdate_interval : 1;
+  $self->order->reqdate(DateTime->today_local->next_workday(extra_days => $extra_days)) if !$self->order->reqdate;
 
   $self->_pre_render();
   $self->render(
@@ -137,32 +138,44 @@ sub action_save {
 sub action_save_as_new {
   my ($self) = @_;
 
-  if (!$self->order->id) {
+  my $order = $self->order;
+
+  if (!$order->id) {
     $self->js->flash('error', t8('This object has not been saved yet.'));
     return $self->js->render();
   }
 
-  delete $::form->{$_} for qw(closed delivered converted_from_oe_id converted_from_orderitems_ids);
-
-  my $src_order = SL::DB::Order->new(id => $self->order->id)->load;
+  # load order from db to check if values changed
+  my $saved_order = SL::DB::Order->new(id => $order->id)->load;
 
+  my %new_attrs;
   # Lets assign a new number if the user hasn't changed the previous one.
   # If it has been changed manually then use it as-is.
-  if (trim($self->order->number) eq $src_order->number) {
-    $self->order->number('');
-  }
+  $new_attrs{number}    = (trim($order->number) eq $saved_order->number)
+                        ? ''
+                        : trim($order->number);
 
-  # Clear reqdate and transdate unless changed
-  if ($self->order->transdate == $src_order->transdate) {
-    $self->order->transdate(DateTime->today_local)
-  }
-  if ($self->order->reqdate == $src_order->reqdate) {
+  # Clear transdate unless changed
+  $new_attrs{transdate} = ($order->transdate == $saved_order->transdate)
+                        ? DateTime->today_local
+                        : $order->transdate;
+
+  # Set new reqdate unless changed
+  if ($order->reqdate == $saved_order->reqdate) {
     my $extra_days = $self->type eq _sales_quotation_type() ? $::instance_conf->get_reqdate_interval : 1;
-    $self->order->reqdate(DateTime->today_local->next_workday(extra_days => $extra_days));
+    $new_attrs{reqdate} = DateTime->today_local->next_workday(extra_days => $extra_days);
+  } else {
+    $new_attrs{reqdate} = $order->reqdate;
   }
 
   # Update employee
-  $self->order->employee(SL::DB::Manager::Employee->current);
+  $new_attrs{employee}  = SL::DB::Manager::Employee->current;
+
+  # Create new record from current one
+  $self->order(SL::DB::Order->new_from($order, destination_type => $order->type, attributes => \%new_attrs));
+
+  # no linked records on save as new
+  delete $::form->{$_} for qw(converted_from_oe_id converted_from_orderitems_ids);
 
   # save
   $self->action_save();
@@ -594,6 +607,7 @@ sub action_customer_vendor_changed {
   $self->js
     ->replaceWith('#order_cp_id',            $self->build_contact_select)
     ->replaceWith('#order_shipto_id',        $self->build_shipto_select)
+    ->replaceWith('#business_info_row',      $self->build_business_info_row)
     ->val(        '#order_taxzone_id',       $self->order->taxzone_id)
     ->val(        '#order_taxincluded',      $self->order->taxincluded)
     ->val(        '#order_payment_id',       $self->order->payment_id)
@@ -605,6 +619,40 @@ sub action_customer_vendor_changed {
   $self->js->render();
 }
 
+# open the dialog for customer/vendor details
+sub action_show_customer_vendor_details_dialog {
+  my ($self) = @_;
+
+  my $is_customer = 'customer' eq $::form->{vc};
+  my $cv;
+  if ($is_customer) {
+    $cv = SL::DB::Customer->new(id => $::form->{vc_id})->load;
+  } else {
+    $cv = SL::DB::Vendor->new(id => $::form->{vc_id})->load;
+  }
+
+  my %details = map { $_ => $cv->$_ } @{$cv->meta->columns};
+  $details{discount_as_percent} = $cv->discount_as_percent;
+  $details{creditlimt}          = $cv->creditlimit_as_number;
+  $details{business}            = $cv->business->description      if $cv->business;
+  $details{language}            = $cv->language_obj->description  if $cv->language_obj;
+  $details{delivery_terms}      = $cv->delivery_term->description if $cv->delivery_term;
+  $details{payment_terms}       = $cv->payment->description       if $cv->payment;
+  $details{pricegroup}          = $cv->pricegroup->pricegroup     if $cv->pricegroup;
+
+  foreach my $entry (@{ $cv->shipto }) {
+    push @{ $details{SHIPTO} },   { map { $_ => $entry->$_ } @{$entry->meta->columns} };
+  }
+  foreach my $entry (@{ $cv->contacts }) {
+    push @{ $details{CONTACTS} }, { map { $_ => $entry->$_ } @{$entry->meta->columns} };
+  }
+
+  $_[0]->render('common/show_vc_details', { layout => 0 },
+                is_customer => $is_customer,
+                %details);
+
+}
+
 # called if a unit in an existing item row is changed
 sub action_unit_changed {
   my ($self) = @_;
@@ -1016,6 +1064,14 @@ sub build_shipto_select {
   );
 }
 
+# render the info line for business
+#
+# Needed, if customer/vendor changed.
+sub build_business_info_row
+{
+  $_[0]->p->render('order/tabs/_business_info_row', SELF => $_[0]);
+}
+
 # build the rows for displaying taxes
 #
 # Called if amounts where recalculated and redisplayed.
@@ -1695,6 +1751,10 @@ reused from generic code.
 
 =over 4
 
+=item * C<template/webpages/order/tabs/_business_info_row.html>
+
+For displaying information on business type
+
 =item * C<template/webpages/order/tabs/_item_input.html>
 
 The input line for items
@@ -1735,8 +1795,6 @@ java script functions
 
 =item * currency
 
-=item * customer/vendor details ('D'-button)
-
 =item * credit limit
 
 =item * more workflows (save as new, quotation, purchase order)