X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDB%2FShopOrder.pm;h=2752de6271a32ad896811bfea4ace1871c114207;hb=2436f6e94ca447e5c6f5c3002e5cd6767d025173;hp=55dfc0640f9575f5761ec18fa0be83ed2942278c;hpb=b2bedb6b5eff41a17ddb194df1c75213b841f3bb;p=kivitendo-erp.git diff --git a/SL/DB/ShopOrder.pm b/SL/DB/ShopOrder.pm index 55dfc0640..2752de627 100644 --- a/SL/DB/ShopOrder.pm +++ b/SL/DB/ShopOrder.pm @@ -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 = <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 = <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__