S/H/Inventory Kosmetik. Kritische Parameter am Anfang der Routine abfragen
[kivitendo-erp.git] / SL / DB / ShopOrder.pm
index 55dfc06..2752de6 100644 (file)
@@ -26,8 +26,9 @@ __PACKAGE__->meta->initialize;
 sub convert_to_sales_order {
   my ($self, %params) = @_;
 
-  my $customer = delete $params{customer};
-  my $employee = delete $params{employee};
+  my $customer  = delete $params{customer};
+  my $employee  = delete $params{employee};
+  my $transdate = delete $params{transdate} // DateTime->today_local;
   croak "param customer is missing" unless ref($customer) eq 'SL::DB::Customer';
   croak "param employee is missing" unless ref($employee) eq 'SL::DB::Employee';
 
@@ -59,8 +60,8 @@ sub convert_to_sales_order {
   if(!scalar(@error_report)){
 
     my $shipto_id;
-    if ($self->billing_firstname ne $self->delivery_firstname || $self->billing_lastname ne $self->delivery_lastname || $self->billing_city ne $self->delivery_city || $self->billing_street ne $self->delivery_street) {
-      if(my $address = SL::DB::Manager::Shipto->find_by( shiptoname   => $self->delivery_firstname . " " . $self->delivery_lastname,
+    if ($self->has_differing_delivery_address) {
+      if(my $address = SL::DB::Manager::Shipto->find_by( shiptoname   => $self->delivery_fullname,
                                                          shiptostreet => $self->delivery_street,
                                                          shiptocity   => $self->delivery_city,
                                                         )) {
@@ -68,7 +69,7 @@ sub convert_to_sales_order {
       } else {
         my $deliveryaddress = SL::DB::Shipto->new;
         $deliveryaddress->assign_attributes(
-          shiptoname         => $self->delivery_firstname . " " . $self->delivery_lastname,
+          shiptoname         => $self->delivery_fullname,
           shiptodepartment_1 => $self->delivery_company,
           shiptodepartment_2 => $self->delivery_department,
           shiptostreet       => $self->delivery_street,
@@ -98,7 +99,7 @@ sub convert_to_sales_order {
       taxzone_id              => $customer->taxzone_id,
       currency_id             => $customer->currency_id,
       transaction_description => $shop->transaction_description,
-      transdate               => DateTime->today_local
+      transdate               => $transdate,
     );
      return $order;
    }else{
@@ -111,14 +112,19 @@ sub convert_to_sales_order {
 
 sub check_for_existing_customers {
   my ($self, %params) = @_;
-
-  my $name     = $self->billing_lastname ne '' ? $self->billing_firstname . " " . $self->billing_lastname : '';
-  my $lastname = $self->billing_lastname ne '' ? "%" . $self->billing_lastname . "%"                      : '';
-  my $company  = $self->billing_company  ne '' ? "%" . $self->billing_company  . "%"                      : '';
-  my $street   = $self->billing_street   ne '' ?  $self->billing_street                                   : '';
-
-  # Fuzzysearch for street to find e.g. "Dorfstrasse - Dorfstr. - Dorfstraße"
-  my $fs_query = <<SQL;
+  my $customers;
+
+  my $name             = $self->billing_lastname ne '' ? $self->billing_firstname . " " . $self->billing_lastname : '';
+  my $lastname         = $self->billing_lastname ne '' ? "%" . $self->billing_lastname . "%"                      : '';
+  my $company          = $self->billing_company  ne '' ? "%" . $self->billing_company  . "%"                      : '';
+  my $street           = $self->billing_street   ne '' ?  $self->billing_street                                   : '';
+  my $street_not_fuzzy = $self->billing_street   ne '' ?  "%" . $self->billing_street . "%"                       : '';
+  my $zipcode          = $self->billing_street   ne '' ?  $self->billing_zipcode                                  : '';
+  my $email            = $self->billing_street   ne '' ?  $self->billing_email                                    : '';
+
+  if(check_trgm($::form->get_standard_dbh())) {
+    # Fuzzysearch for street to find e.g. "Dorfstrasse - Dorfstr. - Dorfstraße"
+    my $fs_query = <<SQL;
 SELECT *
 FROM customer
 WHERE (
@@ -134,16 +140,47 @@ WHERE (
 ) AND obsolete = 'F'
 SQL
 
-  my @values = ($lastname, $company, $self->billing_zipcode, $street, $self->billing_zipcode, $self->billing_email);
+    my @values = ($lastname, $company, $self->billing_zipcode, $street, $self->billing_zipcode, $self->billing_email);
 
-  my $customers = SL::DB::Manager::Customer->get_objects_from_sql(
-    sql  => $fs_query,
-    args => \@values,
-  );
+    $customers = SL::DB::Manager::Customer->get_objects_from_sql(
+      sql  => $fs_query,
+      args => \@values,
+    );
+  }else{
+    # If trgm extension is not installed
+    $customers = SL::DB::Manager::Customer->get_all(
+      where => [
+          or => [
+            and => [
+                     or => [ 'name' => { ilike => $lastname },
+                             'name' => { ilike => $company  },
+                           ],
+                     'zipcode' => { ilike => $zipcode },
+                   ],
+            and => [
+                     and => [ 'street'  => { ilike => $street_not_fuzzy },
+                              'zipcode' => { ilike => $zipcode },
+                            ],
+                   ],
+            or  => [ 'email' => { ilike => $email } ],
+          ],
+      ],
+    );
+  }
 
   return $customers;
 }
 
+sub check_for_open_invoices {
+  my ($self) = @_;
+    my $open_invoices = SL::DB::Manager::Invoice->get_all_count(
+      query => [customer_id => $self->{kivi_customer_id},
+              paid => {lt_sql => 'amount'},
+      ],
+    );
+  return $open_invoices;
+}
+
 sub get_customer{
   my ($self, %params) = @_;
   my $shop = SL::DB::Manager::Shop->find_by(id => $self->shop_id);
@@ -208,6 +245,18 @@ sub compare_to {
   return $result || ($self->id <=> $other->id);
 }
 
+sub has_differing_delivery_address {
+  my ($self) = @_;
+  ($self->billing_firstname // '') ne ($self->delivery_firstname // '') ||
+  ($self->billing_lastname  // '') ne ($self->delivery_lastname  // '') ||
+  ($self->billing_city      // '') ne ($self->delivery_city      // '') ||
+  ($self->billing_street    // '') ne ($self->delivery_street    // '')
+}
+
+sub delivery_fullname {
+  ($_[0]->delivery_firstname // '') . " " . ($_[0]->delivery_lastname // '')
+}
+
 1;
 
 __END__