Auftragsimport - Methoden ausgelagert
[kivitendo-erp.git] / SL / OE.pm
index f776d51..4599443 100644 (file)
--- a/SL/OE.pm
+++ b/SL/OE.pm
@@ -42,6 +42,8 @@ use SL::Common;
 use SL::CVar;
 use SL::DB::Order;
 use SL::DB::PeriodicInvoicesConfig;
+use SL::DB::Project;
+use SL::DB::ProjectType;
 use SL::DB::Status;
 use SL::DB::Tax;
 use SL::DBUtils;
@@ -402,7 +404,7 @@ sub save {
 
   my $number_field         = $form->{type} =~ m{order} ? 'ordnumber' : 'quonumber';
   my $trans_number         = SL::TransNumber->new(type => $form->{type}, dbh => $dbh, number => $form->{$number_field}, id => $form->{id});
-  $form->{$number_field} ||= $trans_number->create_unique;
+  $form->{$number_field} ||= $trans_number->create_unique; # set $form->{ordnumber} or $form->{quonumber}
 
   if ($form->{id}) {
     $query = qq|DELETE FROM shipto | .
@@ -533,6 +535,23 @@ sub save {
       $pricegroup_id *= 1;
       $pricegroup_id  = undef if !$pricegroup_id;
 
+      # force new project, if not set yet
+      if ($::instance_conf->get_order_always_project && !$form->{"globalproject_id"} && ($form->{type} eq 'sales_order')) {
+        require SL::DB::Customer;
+        my $customer = SL::DB::Manager::Customer->find_by(id => $form->{customer_id});
+        die "Can't find customer" unless $customer;
+        my $new_project = SL::DB::Project->new(
+          projectnumber     => $form->{ordnumber},
+          description       => $customer->name,
+          customer_id       => $customer->id,
+          active            => 1,
+          project_type_id   => $::instance_conf->get_project_type_id,
+          project_status_id => $::instance_conf->get_project_status_id,
+        );
+        $new_project->save;
+        $form->{"globalproject_id"} = $new_project->id;
+      };
+
       CVar->get_non_editable_ic_cvars(form               => $form,
                                       dbh                => $dbh,
                                       row                => $i,
@@ -625,7 +644,7 @@ SQL
   my $tax = 0;
   map { $tax += $form->round_amount($taxaccounts{$_}, 2) } keys %taxaccounts;
 
-  $amount = $form->round_amount($netamount + $tax, 2);
+  $amount = $form->round_amount($netamount + $tax, 2, 1);
   $netamount = $form->round_amount($netamount, 2);
 
   if ($form->{currency} eq $form->{defaultcurrency}) {
@@ -634,7 +653,10 @@ SQL
     $exchangerate = $form->check_exchangerate($myconfig, $form->{currency}, $form->{transdate}, ($form->{vc} eq 'customer') ? 'buy' : 'sell');
   }
 
-  $form->{exchangerate} = $exchangerate || $form->parse_amount($myconfig, $form->{exchangerate});
+  # from inputfield (exchangerate) or hidden (forex)
+  my $exchangerate_from_form = $form->{forex} || $form->parse_amount($myconfig, $form->{exchangerate});
+
+  $form->{exchangerate} = $exchangerate || $exchangerate_from_form;
 
   my $quotation = $form->{type} =~ /_order$/ ? 'f' : 't';
 
@@ -674,6 +696,8 @@ SQL
              conv_i($form->{id}));
   do_query($form, $dbh, $query, @values);
 
+  $form->new_lastmtime('oe');
+
   $form->{ordtotal} = $amount;
 
   $form->{name} = $form->{ $form->{vc} };
@@ -762,7 +786,7 @@ sub load_periodic_invoice_config {
 
     if ($config_obj) {
       my $config = { map { $_ => $config_obj->$_ } qw(active terminated periodicity order_value_periodicity start_date_as_date end_date_as_date first_billing_date_as_date extend_automatically_by ar_chart_id
-                                                      print printer_id copies) };
+                                                      print printer_id copies direct_debit) };
       $form->{periodic_invoices_config} = YAML::Dump($config);
     }
   }
@@ -876,14 +900,9 @@ sub retrieve {
   $form->{useasnew} = 1 if $is_collective_order == 1;
 
   if (!$form->{id}) {
-    my $extra_days   = $form->{type} eq 'sales_quotation' ? $::instance_conf->get_reqdate_interval : 1;
-    my $next_workday = DateTime->today_local->add(days => $extra_days);
-    my $day_of_week  = $next_workday->day_of_week;
-
-    $next_workday->add(days => (8 - $day_of_week)) if $day_of_week >= 6;
-
+    my $extra_days     = $form->{type} eq 'sales_quotation' ? $::instance_conf->get_reqdate_interval : 1;
+    $form->{reqdate}   = DateTime->today_local->next_workday(extra_days => $extra_days)->to_kivitendo;
     $form->{transdate} = DateTime->today_local->to_kivitendo;
-    $form->{reqdate}   = $next_workday->to_kivitendo;
   }
 
   # get default accounts
@@ -891,7 +910,9 @@ sub retrieve {
                      (SELECT c.accno FROM chart c WHERE d.income_accno_id    = c.id) AS income_accno,
                      (SELECT c.accno FROM chart c WHERE d.expense_accno_id   = c.id) AS expense_accno,
                      (SELECT c.accno FROM chart c WHERE d.fxgain_accno_id    = c.id) AS fxgain_accno,
-                     (SELECT c.accno FROM chart c WHERE d.fxloss_accno_id    = c.id) AS fxloss_accno
+                     (SELECT c.accno FROM chart c WHERE d.fxloss_accno_id    = c.id) AS fxloss_accno,
+                     (SELECT c.accno FROM chart c WHERE d.rndgain_accno_id   = c.id) AS rndgain_accno,
+                     (SELECT c.accno FROM chart c WHERE d.rndloss_accno_id   = c.id) AS rndloss_accno
               $query_add
               FROM defaults d|;
   my $ref = selectfirst_hashref_query($form, $dbh, $query);
@@ -919,6 +940,7 @@ sub retrieve {
            (SELECT cu.name FROM currencies cu WHERE cu.id=o.currency_id) AS currency, e.name AS employee, o.employee_id, o.salesman_id,
            o.${vc}_id, cv.name AS ${vc}, o.amount AS invtotal,
            o.closed, o.reqdate, o.quonumber, o.department_id, o.cusordnumber,
+           o.mtime, o.itime,
            d.description AS department, o.payment_id, o.language_id, o.taxzone_id,
            o.delivery_customer_id, o.delivery_vendor_id, o.proforma, o.shipto_id,
            o.globalproject_id, o.delivered, o.transaction_description, o.delivery_term_id,
@@ -946,6 +968,8 @@ sub retrieve {
         map { $form->{$_} = '' if ($ref->{$_} ne $form->{$_}) } keys %$ref;
       }
     }
+    $form->{mtime}   ||= $form->{itime};
+    $form->{lastmtime} = $form->{mtime};
 
     # if not given, fill transdate with current_date
     $form->{transdate} = $form->current_date($myconfig)
@@ -1518,7 +1542,7 @@ sub order_details {
   $form->{delivery_term} = SL::DB::Manager::DeliveryTerm->find_by(id => $form->{delivery_term_id} || undef);
   $form->{delivery_term}->description_long($form->{delivery_term}->translated_attribute('description_long', $form->{language_id})) if $form->{delivery_term} && $form->{language_id};
 
-  $::form->{order} = SL::DB::Manager::Order->find_by(id => $::form->{id});
+  $form->{order} = SL::DB::Manager::Order->find_by(id => $form->{id}) if $form->{id};
 
   $main::lxdebug->leave_sub();
 }