X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FOE.pm;h=31b3067f55b7ffc17b2bbd2100ee6e8bc7e8babc;hb=4e0bef2d1ee1fa29e3fa85a97f34e707fe4e287d;hp=0c6d6fc9dc3967328d693af5eae6bb6c4a9ead6b;hpb=aa76c8a26e6a6af1aa2145aece40e5a91a4e2cc8;p=kivitendo-erp.git diff --git a/SL/OE.pm b/SL/OE.pm index 0c6d6fc9d..31b3067f5 100644 --- a/SL/OE.pm +++ b/SL/OE.pm @@ -42,12 +42,16 @@ 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; use SL::HTML::Restrict; use SL::IC; use SL::TransNumber; +use SL::Util qw(trim); +use Text::ParseWords; use strict; @@ -155,7 +159,7 @@ sub transactions { WHERE proi.projectnumber ILIKE ? AND oi.trans_id = o.id )) SQL - push @values, "%" . $form->{"projectnumber"} . "%", "%" . $form->{"projectnumber"} . "%" ; + push @values, like($form->{"projectnumber"}), like($form->{"projectnumber"}); } if ($form->{"business_id"}) { @@ -169,12 +173,12 @@ SQL } elsif ($form->{$vc}) { $query .= " AND ct.name ILIKE ?"; - push(@values, '%' . $form->{$vc} . '%'); + push(@values, like($form->{$vc})); } if ($form->{"cp_name"}) { $query .= " AND (cp.cp_name ILIKE ? OR cp.cp_givenname ILIKE ?)"; - push(@values, ('%' . $form->{"cp_name"} . '%')x2); + push(@values, (like($form->{"cp_name"}))x2); } if (!$main::auth->assert('sales_all_edit', 1)) { @@ -205,12 +209,12 @@ SQL if ($form->{$ordnumber}) { $query .= qq| AND o.$ordnumber ILIKE ?|; - push(@values, '%' . $form->{$ordnumber} . '%'); + push(@values, like($form->{$ordnumber})); } if ($form->{cusordnumber}) { $query .= qq| AND o.cusordnumber ILIKE ?|; - push(@values, '%' . $form->{cusordnumber} . '%'); + push(@values, like($form->{cusordnumber})); } if($form->{transdatefrom}) { @@ -245,7 +249,7 @@ SQL if ($form->{shippingpoint}) { $query .= qq| AND o.shippingpoint ILIKE ?|; - push(@values, '%' . $form->{shippingpoint} . '%'); + push(@values, like($form->{shippingpoint})); } if ($form->{taxzone_id} ne '') { # taxzone_id could be 0 @@ -255,7 +259,7 @@ SQL if ($form->{transaction_description}) { $query .= qq| AND o.transaction_description ILIKE ?|; - push(@values, '%' . $form->{transaction_description} . '%'); + push(@values, like($form->{transaction_description})); } if ($form->{periodic_invoices_active} ne $form->{periodic_invoices_inactive}) { @@ -270,7 +274,7 @@ SQL if (($form->{order_probability_value} || '') ne '') { my $op = $form->{order_probability_value} eq 'le' ? '<=' : '>='; $query .= qq| AND (o.order_probability ${op} ?)|; - push @values, $form->{order_probability_value}; + push @values, trim($form->{order_probability_value}); } if ($form->{expected_billing_date_from}) { @@ -283,6 +287,45 @@ SQL push @values, conv_date($form->{expected_billing_date_to}); } + if ($form->{parts_partnumber}) { + $query .= <{parts_partnumber}); + } + + if ($form->{parts_description}) { + $query .= <{parts_description}); + } + + if ($form->{all}) { + my @tokens = parse_line('\s+', 0, $form->{all}); + # ordnumber quonumber customer.name vendor.name transaction_description + $query .= qq| AND ( + o.ordnumber ILIKE ? OR + o.quonumber ILIKE ? OR + ct.name ILIKE ? OR + o.transaction_description ILIKE ? + )| for @tokens; + push @values, (like($_))x4 for @tokens; + } + my ($cvar_where, @cvar_values) = CVar->build_filter_query('module' => 'CT', 'trans_id_field' => 'ct.id', 'filter' => $form, @@ -402,9 +445,14 @@ 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 custom_variables + WHERE (config_id IN (SELECT id FROM custom_variable_configs WHERE (module = 'ShipTo'))) + AND (trans_id IN (SELECT shipto_id FROM shipto WHERE (module = 'OE') AND (trans_id = ?)))|; + do_query($form, $dbh, $query, $form->{id}); + $query = qq|DELETE FROM shipto | . qq|WHERE trans_id = ? AND module = 'OE'|; do_query($form, $dbh, $query, $form->{id}); @@ -533,6 +581,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, @@ -593,8 +658,12 @@ SQL dbh => $dbh); # link previous items with orderitems - foreach (qw(orderitems invoice)) { - if (!$form->{saveasnew} && !$form->{useasnew} && $form->{"converted_from_${_}_id_$i"}) { + # assume we have a new workflow if we link from invoice or order to quotation + # unluckily orderitems are used for quotation and orders - therefore one more + # check to be sure NOT to link from order to quotation + foreach (qw(orderitems)) { + if (!$form->{saveasnew} && !$form->{useasnew} && $form->{"converted_from_${_}_id_$i"} + && $form->{type} !~ 'quotation') { RecordLinks->create_links('dbh' => $dbh, 'mode' => 'ids', 'from_table' => $_, @@ -625,7 +694,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 +703,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 +746,8 @@ SQL conv_i($form->{id})); do_query($form, $dbh, $query, @values); + $form->new_lastmtime('oe'); + $form->{ordtotal} = $amount; $form->{name} = $form->{ $form->{vc} }; @@ -688,28 +762,21 @@ SQL $form->save_status($dbh); # Link this record to the records it was created from. - # check every record type we may link. i am not happy with converting the string to array back - # should be a array from the start (OE.pm -> retrieve). - # and that i need the local array ref for close_quotation_rfqs. better ideas welcome $form->{convert_from_oe_ids} =~ s/^\s+//; $form->{convert_from_oe_ids} =~ s/\s+$//; my @convert_from_oe_ids = split m/\s+/, $form->{convert_from_oe_ids}; delete $form->{convert_from_oe_ids}; - @{ $form->{convert_from_oe_ids} } = @convert_from_oe_ids; - foreach (qw(ar oe)) { - if (!$form->{useasnew} && $form->{"convert_from_${_}_ids"}) { - RecordLinks->create_links('dbh' => $dbh, - 'mode' => 'ids', - 'from_table' => $_, - 'from_ids' => $form->{"convert_from_${_}_ids"}, - 'to_table' => 'oe', - 'to_id' => $form->{id}, - ); - delete $form->{"convert_from_${_}_ids"}; - } + if (!$form->{useasnew} && scalar @convert_from_oe_ids) { + RecordLinks->create_links('dbh' => $dbh, + 'mode' => 'ids', + 'from_table' => 'oe', + 'from_ids' => \@convert_from_oe_ids, + 'to_table' => 'oe', + 'to_id' => $form->{id}, + ); $self->_close_quotations_rfqs('dbh' => $dbh, 'from_id' => \@convert_from_oe_ids, - 'to_id' => $form->{id}) if $_ eq 'oe'; + 'to_id' => $form->{id}); } if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { @@ -762,7 +829,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 send_email email_recipient_contact_id email_recipient_address email_sender email_subject email_body) }; $form->{periodic_invoices_config} = YAML::Dump($config); } } @@ -876,14 +943,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 +953,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 +983,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 +1011,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) @@ -973,6 +1040,15 @@ sub retrieve { map { $form->{$_} = $ref->{$_} } keys %$ref; $sth->finish; + if ($form->{shipto_id}) { + my $cvars = CVar->get_custom_variables( + dbh => $dbh, + module => 'ShipTo', + trans_id => $form->{shipto_id}, + ); + $form->{"shiptocvar_$_->{name}"} = $_->{value} for @{ $cvars }; + } + # get printed, emailed and queued $query = qq|SELECT s.printed, s.emailed, s.spoolfile, s.formname FROM status s WHERE s.trans_id = ?|; $sth = prepare_execute_query($form, $dbh, $query, $form->{id}); @@ -1500,23 +1576,28 @@ sub order_details { $form->{subtotal_nofmt} = $form->{ordtotal}; } - $form->{ordtotal} = ($form->{taxincluded}) ? $form->{ordtotal} : $form->{ordtotal} + $tax; + my $grossamount = ($form->{taxincluded}) ? $form->{ordtotal} : $form->{ordtotal} + $tax; + $form->{ordtotal} = $form->round_amount( $grossamount, 2, 1); + $form->{rounding} = $form->round_amount( + $form->{ordtotal} - $form->round_amount($grossamount, 2), + 2 + ); # format amounts + $form->{rounding} = $form->format_amount($myconfig, $form->{rounding}, 2); $form->{quototal} = $form->{ordtotal} = $form->format_amount($myconfig, $form->{ordtotal}, 2); - if ($form->{type} =~ /_quotation/) { - $form->set_payment_options($myconfig, $form->{quodate}); - } else { - $form->set_payment_options($myconfig, $form->{orddate}); - } + $form->set_payment_options($myconfig, $form->{$form->{type} =~ /_quotation/ ? 'quodate' : 'orddate'}, $form->{type}); $form->{username} = $myconfig->{name}; $dbh->disconnect; $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}; + if ($form->{delivery_term} && $form->{language_id}) { + $form->{delivery_term}->description_long( $form->{delivery_term}->translated_attribute('description_long', $form->{language_id})); + $form->{delivery_term}->description_long_invoice($form->{delivery_term}->translated_attribute('description_long_invoice', $form->{language_id})); + } $form->{order} = SL::DB::Manager::Order->find_by(id => $form->{id}) if $form->{id};