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;
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';
}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,
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,
)) {
} 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,
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{
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 (
) 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);
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,
'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);
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__