ShopOrder: billing_email zusätzlich als invoice_mail ...
[kivitendo-erp.git] / SL / DB / ShopOrder.pm
index 55dfc06..6a53387 100644 (file)
@@ -9,6 +9,7 @@ use SL::DBUtils;
 use SL::DB::Shop;
 use SL::DB::MetaSetup::ShopOrder;
 use SL::DB::Manager::ShopOrder;
+use SL::DB::PaymentTerm;
 use SL::DB::Helper::LinkedRecords;
 use SL::Locale::String qw(t8);
 use Carp;
@@ -26,8 +27,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';
 
@@ -46,7 +48,8 @@ sub convert_to_sales_order {
     }else{
       my $current_order_item = SL::DB::OrderItem->new(
         parts_id            => $part->id,
-        description         => $part->description,
+        description         => $_->description, # description from the shop
+        longdescription     => $part->notes,    # longdescription from parts. TODO locales
         qty                 => $_->quantity,
         sellprice           => $_->price,
         unit                => $part->unit,
@@ -59,8 +62,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 +71,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,
@@ -94,11 +97,11 @@ sub convert_to_sales_order {
       intnotes                => $customer->notes,
       salesman_id             => $employee->id,
       taxincluded             => $self->tax_included,
-      payment_id              => $customer->payment_id,
+      payment_id              => $self->payment_id,
       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 +114,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 (
@@ -130,26 +138,63 @@ WHERE (
  OR
    ( street % ?  AND zipcode ILIKE ?)
  OR
-   email ILIKE ?
+   ( email ILIKE ? OR invoice_mail ILIKE ? )
 ) 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, $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 },
+                            'invoice_mail' => { ilike => $email },
+                   ],
+                 ],
+                 and => [ obsolete => 'F' ]
+      ],
+    );
+  }
 
   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);
   my $customer_proposals = $self->check_for_existing_customers;
   my $name = $self->billing_firstname . " " . $self->billing_lastname;
   my $customer = 0;
+  my $default_payment    = SL::DB::Manager::PaymentTerm->get_first();
+  my $payment_id = $default_payment ? $default_payment->id : undef;
   if(!scalar(@{$customer_proposals})){
     my %address = ( 'name'                  => $name,
                     'department_1'          => $self->billing_company,
@@ -158,6 +203,7 @@ sub get_customer{
                     'zipcode'               => $self->billing_zipcode,
                     'city'                  => $self->billing_city,
                     'email'                 => $self->billing_email,
+                    'invoice_mail'          => $self->billing_email,
                     'country'               => $self->billing_country,
                     'greeting'              => $self->billing_greeting,
                     'fax'                   => $self->billing_fax,
@@ -168,7 +214,7 @@ sub get_customer{
                     'pricegroup_id'         => (split '\/',$shop->price_source)[0] eq "pricegroup" ?  (split '\/',$shop->price_source)[1] : undef,
                     'taxzone_id'            => $shop->taxzone_id,
                     'currency'              => $::instance_conf->get_currency_id,
-                    #'payment_id'            => 7345,# TODO hardcoded
+                    'payment_id'            => $payment_id,
                   );
     $customer = SL::DB::Customer->new(%address);
 
@@ -193,6 +239,7 @@ sub get_customer{
                                                     obsolete => 'F',
                                                   );
   }
+  $customer->update_attributes(invoice_mail => $self->billing_email) if $customer->invoice_mail ne $self->billing_email;
 
   return $customer;
 }
@@ -208,6 +255,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__