X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FOE.pm;h=dc21c51ef0a0f4d16a92a0408825bb8bc206e2b0;hb=2f6636f68edda5b8a47afd16fda868033a7076ec;hp=5e2551b2d3694ff26151cd3b0298bd95f804b77d;hpb=2f9a52209e4bea503cebf447e498b4a5848eb02c;p=kivitendo-erp.git diff --git a/SL/OE.pm b/SL/OE.pm index 5e2551b2d..dc21c51ef 100644 --- a/SL/OE.pm +++ b/SL/OE.pm @@ -109,7 +109,9 @@ sub transactions { qq| o.closed, o.delivered, o.quonumber, o.cusordnumber, o.shippingpoint, o.shipvia, | . qq| o.transaction_description, | . qq| o.marge_total, o.marge_percent, | . + qq| o.itime::DATE AS insertdate, | . qq| ex.$rate AS exchangerate, | . + qq| pt.description AS payment_terms, | . qq| pr.projectnumber AS globalprojectnumber, | . qq| e.name AS employee, s.name AS salesman, | . qq| ct.${vc}number AS vcnumber, ct.country, ct.ustid, ct.business_id, | . @@ -124,6 +126,7 @@ sub transactions { qq|LEFT JOIN exchangerate ex ON (ex.currency_id = o.currency_id | . qq| AND ex.transdate = o.transdate) | . qq|LEFT JOIN project pr ON (o.globalproject_id = pr.id) | . + qq|LEFT JOIN payment_terms pt ON (pt.id = o.payment_id)| . qq|LEFT JOIN tax_zones tz ON (o.taxzone_id = tz.id) | . qq|$periodic_invoices_joins | . qq|WHERE (o.quotation = ?) |; @@ -176,7 +179,7 @@ SQL if (!$main::auth->assert('sales_all_edit', 1)) { $query .= " AND o.employee_id = (select id from employee where login= ?)"; - push @values, $form->{login}; + push @values, $::myconfig{login}; } if ($form->{employee_id}) { $query .= " AND o.employee_id = ?"; @@ -230,6 +233,16 @@ SQL push(@values, conv_date($form->{reqdateto})); } + if($form->{insertdatefrom}) { + $query .= qq| AND o.itime::DATE >= ?|; + push(@values, conv_date($form->{insertdatefrom})); + } + + if($form->{insertdateto}) { + $query .= qq| AND o.itime::DATE <= ?|; + push(@values, conv_date($form->{insertdateto})); + } + if ($form->{shippingpoint}) { $query .= qq| AND o.shippingpoint ILIKE ?|; push(@values, '%' . $form->{shippingpoint} . '%'); @@ -270,8 +283,17 @@ SQL push @values, conv_date($form->{expected_billing_date_to}); } + my ($cvar_where, @cvar_values) = CVar->build_filter_query('module' => 'CT', + 'trans_id_field' => 'ct.id', + 'filter' => $form, + ); + if ($cvar_where) { + $query .= qq| AND ($cvar_where)|; + push @values, @cvar_values; + } + my $sortdir = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC'; - my $sortorder = join(', ', map { "${_} ${sortdir} " } ("o.id", $form->sort_columns("transdate", $ordnumber, "name"))); + my $sortorder = join(', ', map { "${_} ${sortdir} " } ("o.id", $form->sort_columns("transdate", $ordnumber, "name"), "o.itime")); my %allowed_sort_columns = ( "transdate" => "o.transdate", "reqdate" => "o.reqdate", @@ -285,10 +307,12 @@ SQL "shipvia" => "o.shipvia", "transaction_description" => "o.transaction_description", "shippingpoint" => "o.shippingpoint", + "insertdate" => "o.itime", "taxzone" => "tz.description", + "payment_terms" => "pt.description", ); if ($form->{sort} && grep($form->{sort}, keys(%allowed_sort_columns))) { - $sortorder = $allowed_sort_columns{$form->{sort}} . " ${sortdir}"; + $sortorder = $allowed_sort_columns{$form->{sort}} . " ${sortdir}" . ", o.itime ${sortdir}"; } $query .= qq| ORDER by | . $sortorder; @@ -325,7 +349,7 @@ sub transactions_for_todo_list { my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); my $query = qq|SELECT id FROM employee WHERE login = ?|; - my ($e_id) = selectrow_query($form, $dbh, $query, $form->{login}); + my ($e_id) = selectrow_query($form, $dbh, $query, $::myconfig{login}); $query = qq|SELECT oe.id, oe.transdate, oe.reqdate, oe.quonumber, oe.transaction_description, oe.amount, @@ -509,32 +533,22 @@ sub save { $pricegroup_id *= 1; $pricegroup_id = undef if !$pricegroup_id; + CVar->get_non_editable_ic_cvars(form => $form, + dbh => $dbh, + row => $i, + sub_module => 'orderitems', + may_converted_from => ['orderitems', 'invoice']); + my $position = $i; # save detail record in orderitems table - my $cvars; if (! $form->{"orderitems_id_$i"}) { $query = qq|SELECT nextval('orderitemsid')|; ($form->{"orderitems_id_$i"}) = selectrow_query($form, $dbh, $query); $query = qq|INSERT INTO orderitems (id, position) VALUES (?, ?)|; do_query($form, $dbh, $query, $form->{"orderitems_id_$i"}, conv_i($position)); - - # get values for CVars from master data for new items - $cvars = CVar->get_custom_variables(dbh => $dbh, - module => 'IC', - trans_id => $form->{"id_$i"}, - ); - } else { - # get values for CVars from custom_variables for existing items - $cvars = CVar->get_custom_variables(dbh => $dbh, - module => 'IC', - sub_module => 'orderitems', - trans_id => $form->{"orderitems_id_$i"}, - ); } - # map only non-editable CVars to form (editable ones are already there) - map { $form->{"ic_cvar_$_->{name}_$i"} = $_->{value} unless $_->{flag_editable} } @{ $cvars }; my $orderitems_id = $form->{"orderitems_id_$i"}; push @processed_orderitems, $orderitems_id; @@ -578,9 +592,10 @@ SQL name_prefix => 'ic_', name_postfix => "_$i", dbh => $dbh); + # link previous items with orderitems foreach (qw(orderitems invoice)) { - if ($form->{"converted_from_${_}_id_$i"}) { + if (!$form->{saveasnew} && !$form->{useasnew} && $form->{"converted_from_${_}_id_$i"}) { RecordLinks->create_links('dbh' => $dbh, 'mode' => 'ids', 'from_table' => $_, @@ -588,11 +603,12 @@ SQL 'to_table' => 'orderitems', 'to_id' => $orderitems_id, ); - delete $form->{"converted_from_${_}_id_$i"}; } + delete $form->{"converted_from_${_}_id_$i"}; } } } + # search for orphaned ids $query = sprintf 'SELECT id FROM orderitems WHERE trans_id = ? AND NOT id IN (%s)', join ', ', ("?") x scalar @processed_orderitems; @values = (conv_i($form->{id}), map { conv_i($_) } @processed_orderitems); @@ -642,7 +658,7 @@ SQL conv_i($form->{vendor_id}), conv_i($form->{customer_id}), $amount, $netamount, conv_date($reqdate), $form->{taxincluded} ? 't' : 'f', $form->{shippingpoint}, - $form->{shipvia}, $form->{notes}, $form->{intnotes}, + $form->{shipvia}, $restricter->process($form->{notes}), $form->{intnotes}, $form->{currency}, $form->{closed} ? 't' : 'f', $form->{delivered} ? "t" : "f", $form->{proforma} ? 't' : 'f', $quotation, conv_i($form->{department_id}), @@ -673,23 +689,28 @@ 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}; - - if (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}, - ); - + @{ $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"}; + } $self->_close_quotations_rfqs('dbh' => $dbh, 'from_id' => \@convert_from_oe_ids, - 'to_id' => $form->{id}); + 'to_id' => $form->{id}) if $_ eq 'oe'; } if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { @@ -741,7 +762,7 @@ sub load_periodic_invoice_config { my $config_obj = SL::DB::Manager::PeriodicInvoicesConfig->find_by(oe_id => $form->{id}); if ($config_obj) { - my $config = { map { $_ => $config_obj->$_ } qw(active terminated periodicity start_date_as_date end_date_as_date first_billing_date_as_date extend_automatically_by ar_chart_id + 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) }; $form->{periodic_invoices_config} = YAML::Dump($config); } @@ -839,20 +860,22 @@ sub retrieve { if ($form->{"rowcount"} and $#ids == 0) { $form->{"id"} = $ids[0]; undef @ids; + delete $form->{convert_from_oe_ids}; } # and remember for the rest of the function my $is_collective_order = scalar @ids; + $form->{useasnew} = !!$is_collective_order; if (!$form->{id}) { - my $wday = (localtime(time))[6]; - my $next_workday = $wday == 5 ? 3 : $wday == 6 ? 2 : 1; + 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; - # if we have a client configured interval for sales quotation, we add this - $next_workday += $::instance_conf->get_reqdate_interval if ($::instance_conf->get_reqdate_interval && - $form->{type} eq 'sales_quotation' ); + $next_workday->add(days => (8 - $day_of_week)) if $day_of_week >= 6; - $query_add = qq|, current_date AS transdate, date(current_date + interval '${next_workday} days') AS reqdate|; + $form->{transdate} = DateTime->today_local->to_kivitendo; + $form->{reqdate} = $next_workday->to_kivitendo; } # get default accounts @@ -890,8 +913,8 @@ sub retrieve { o.closed, o.reqdate, o.quonumber, o.department_id, o.cusordnumber, 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 - , o.order_probability, o.expected_billing_date + o.globalproject_id, o.delivered, o.transaction_description, o.delivery_term_id, + o.itime::DATE AS insertdate, o.order_probability, o.expected_billing_date FROM oe o JOIN ${vc} cv ON (o.${vc}_id = cv.id) LEFT JOIN employee e ON (o.employee_id = e.id) @@ -1047,7 +1070,7 @@ sub retrieve { } # delete orderitems_id in collective orders, so that they get cloned no matter what - delete $ref->{orderitems_id} if $is_collective_order; + $ref->{converted_from_orderitems_id} = delete $ref->{orderitems_id} if $is_collective_order; # get tax rates and description my $accno_id = ($form->{vc} eq "customer") ? $ref->{income_accno} : $ref->{expense_accno}; @@ -1272,7 +1295,8 @@ sub order_details { push @{ $form->{TEMPLATE_ARRAYS}->{reqdate} }, $form->{"reqdate_$i"}; push @{ $form->{TEMPLATE_ARRAYS}->{sellprice} }, $form->{"sellprice_$i"}; push @{ $form->{TEMPLATE_ARRAYS}->{sellprice_nofmt} }, $form->parse_amount($myconfig, $form->{"sellprice_$i"}); - push @{ $form->{TEMPLATE_ARRAYS}->{listprice} }, $form->{"listprice_$i"}; + push @{ $form->{TEMPLATE_ARRAYS}->{listprice} }, $form->format_amount($myconfig, $form->{"listprice_$i"}, 2); + push @{ $form->{TEMPLATE_ARRAYS}->{listprice_nofmt} }, $form->{"listprice_$i"}; push @{ $form->{TEMPLATE_ARRAYS}->{price_factor} }, $price_factor->{formatted_factor}; push @{ $form->{TEMPLATE_ARRAYS}->{price_factor_name} }, $price_factor->{description}; push @{ $form->{TEMPLATE_ARRAYS}->{partsgroup} }, $form->{"partsgroup_$i"}; @@ -1407,23 +1431,11 @@ sub order_details { $sth->finish; } - my $cvars; - if (! $form->{"orderitems_id_$i"}) { - # get values for CVars from master data for new items - $cvars = CVar->get_custom_variables(dbh => $dbh, - module => 'IC', - trans_id => $form->{"id_$i"}, - ); - } else { - # get values for CVars from custom_variables for existing items - $cvars = CVar->get_custom_variables(dbh => $dbh, - module => 'IC', - sub_module => 'orderitems', - trans_id => $form->{"orderitems_id_$i"}, - ); - } - # map only non-editable CVars to form (editable ones are already there) - map { $form->{"ic_cvar_$_->{name}_$i"} = $_->{value} unless $_->{flag_editable} } @{ $cvars }; + CVar->get_non_editable_ic_cvars(form => $form, + dbh => $dbh, + row => $i, + sub_module => 'orderitems', + may_converted_from => ['orderitems', 'invoice']); push @{ $form->{TEMPLATE_ARRAYS}->{"ic_cvar_$_->{name}"} }, CVar->format_to_template(CVar->parse($form->{"ic_cvar_$_->{name}_$i"}, $_), $_)