X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FOE.pm;h=d86b6c0ec55a28c686203fd61a8bd63f2f8126a0;hb=63cb5b41d9b06d0b7f522ef154dd9f57ea428bae;hp=3954a93083fe4950d192da5e6229841c4d1580c4;hpb=a9903fd72fc5a09d99eb60707dfd3aadcabfe73f;p=kivitendo-erp.git diff --git a/SL/OE.pm b/SL/OE.pm index 3954a9308..d86b6c0ec 100644 --- a/SL/OE.pm +++ b/SL/OE.pm @@ -36,7 +36,6 @@ package OE; use List::Util qw(max first); -use YAML; use SL::AM; use SL::Common; @@ -53,6 +52,7 @@ use SL::IC; use SL::TransNumber; use SL::Util qw(trim); use SL::DB; +use SL::YAML; use Text::ParseWords; use strict; @@ -100,6 +100,12 @@ sub transactions { FROM record_links rl1 LEFT JOIN record_links rl2 ON (rl1.to_table = rl2.from_table AND rl1.to_id = rl2.from_id) WHERE rl1.from_table = 'oe' AND rl2.to_table = 'ar' + UNION + SELECT rl1.from_id, rl3.to_id + FROM record_links rl1 + JOIN record_links rl2 ON (rl1.to_table = rl2.from_table AND rl1.to_id = rl2.from_id) + JOIN record_links rl3 ON (rl2.to_table = rl3.from_table AND rl2.to_id = rl3.from_id) + WHERE rl1.from_table = 'oe' AND rl2.to_table = 'ar' AND rl3.to_table = 'ar' ) rl LEFT JOIN ar ON ar.id = rl.to_id @@ -116,6 +122,7 @@ sub transactions { qq| o.transaction_description, | . qq| o.marge_total, o.marge_percent, | . qq| o.itime::DATE AS insertdate, | . + qq| department.description as department, | . qq| ex.$rate AS exchangerate, | . qq| pt.description AS payment_terms, | . qq| pr.projectnumber AS globalprojectnumber, | . @@ -134,6 +141,7 @@ sub transactions { 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|LEFT JOIN department ON (o.department_id = department.id) | . qq|$periodic_invoices_joins | . qq|WHERE (o.quotation = ?) |; push(@values, $quotation); @@ -181,7 +189,7 @@ SQL push(@values, (like($form->{"cp_name"}))x2); } - if (!$main::auth->assert('sales_all_edit', 1)) { + if ( !(($vc eq 'customer' && $main::auth->assert('sales_all_edit', 1)) || ($vc eq 'vendor' && $main::auth->assert('purchase_all_edit', 1))) ) { $query .= " AND o.employee_id = (select id from employee where login= ?)"; push @values, $::myconfig{login}; } @@ -353,6 +361,7 @@ SQL "insertdate" => "o.itime", "taxzone" => "tz.description", "payment_terms" => "pt.description", + "department" => "department.description", ); if ($form->{sort} && grep($form->{sort}, keys(%allowed_sort_columns))) { $sortorder = $allowed_sort_columns{$form->{sort}} . " ${sortdir}" . ", o.itime ${sortdir}"; @@ -368,8 +377,13 @@ SQL while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { $ref->{billed_amount} = $billed_amount{$ref->{id}}; $ref->{billed_netamount} = $billed_netamount{$ref->{id}}; - $ref->{remaining_amount} = $ref->{amount} - $ref->{billed_amount}; - $ref->{remaining_netamount} = $ref->{netamount} - $ref->{billed_netamount}; + if ($ref->{billed_amount} < 0) { # case: credit note(s) higher than invoices + $ref->{remaining_amount} = $ref->{amount} + $ref->{billed_amount}; + $ref->{remaining_netamount} = $ref->{netamount} + $ref->{billed_netamount}; + } else { + $ref->{remaining_amount} = $ref->{amount} - $ref->{billed_amount}; + $ref->{remaining_netamount} = $ref->{netamount} - $ref->{billed_netamount}; + } $ref->{exchangerate} = 1 unless $ref->{exchangerate}; push @{ $form->{OE} }, $ref if $ref->{id} != $id{ $ref->{id} }; $id{ $ref->{id} } = $ref->{id}; @@ -816,7 +830,7 @@ sub save_periodic_invoices_config { return if !$params{oe_id}; - my $config = $params{config_yaml} ? YAML::Load($params{config_yaml}) : undef; + my $config = $params{config_yaml} ? SL::YAML::Load($params{config_yaml}) : undef; return if 'HASH' ne ref $config; my $obj = SL::DB::Manager::PeriodicInvoicesConfig->find_by(oe_id => $params{oe_id}) @@ -836,7 +850,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 direct_debit send_email email_recipient_contact_id email_recipient_address email_sender email_subject email_body) }; - $form->{periodic_invoices_config} = YAML::Dump($config); + $form->{periodic_invoices_config} = SL::YAML::Dump($config); } } } @@ -958,7 +972,8 @@ 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 $extra_days = $form->{type} eq 'sales_quotation' ? $::instance_conf->get_reqdate_interval : + $form->{type} eq 'sales_order' ? $::instance_conf->get_delivery_date_interval : 1; $form->{reqdate} = DateTime->today_local->next_workday(extra_days => $extra_days)->to_kivitendo; $form->{transdate} = DateTime->today_local->to_kivitendo; } @@ -1079,6 +1094,7 @@ sub _retrieve { my $transdate = $form->{transdate} ? $dbh->quote($form->{transdate}) : "current_date"; $form->{taxzone_id} = 0 unless ($form->{taxzone_id}); + unshift @values, ($form->{taxzone_id}) x 2; # retrieve individual items # this query looks up all information about the items @@ -1101,8 +1117,8 @@ sub _retrieve { JOIN parts p ON (o.parts_id = p.id) JOIN oe ON (o.trans_id = oe.id) LEFT JOIN chart c1 ON ((SELECT inventory_accno_id FROM buchungsgruppen WHERE id=p.buchungsgruppen_id) = c1.id) - LEFT JOIN chart c2 ON ((SELECT tc.income_accno_id FROM taxzone_charts tc WHERE tc.taxzone_id = '$form->{taxzone_id}' and tc.buchungsgruppen_id = p.buchungsgruppen_id) = c2.id) - LEFT JOIN chart c3 ON ((SELECT tc.expense_accno_id FROM taxzone_charts tc WHERE tc.taxzone_id = '$form->{taxzone_id}' and tc.buchungsgruppen_id = p.buchungsgruppen_id) = c3.id) + LEFT JOIN chart c2 ON ((SELECT tc.income_accno_id FROM taxzone_charts tc WHERE tc.taxzone_id = ? and tc.buchungsgruppen_id = p.buchungsgruppen_id) = c2.id) + LEFT JOIN chart c3 ON ((SELECT tc.expense_accno_id FROM taxzone_charts tc WHERE tc.taxzone_id = ? and tc.buchungsgruppen_id = p.buchungsgruppen_id) = c3.id) LEFT JOIN project pr ON (o.project_id = pr.id) LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) | . ($form->{id} @@ -1176,8 +1192,9 @@ sub _retrieve { # get tax rates and description my $accno_id = ($form->{vc} eq "customer") ? $ref->{income_accno} : $ref->{expense_accno}; $query = - qq|SELECT c.accno, t.taxdescription, t.rate, t.taxnumber | . - qq|FROM tax t LEFT JOIN chart c on (c.id = t.chart_id) | . + qq|SELECT c.accno, t.taxdescription, t.rate, c.accno as taxnumber | . + qq|FROM tax t | . + qq|LEFT JOIN chart c on (c.id = t.chart_id) | . qq|WHERE t.id IN (SELECT tk.tax_id FROM taxkeys tk | . qq| WHERE tk.chart_id = (SELECT id FROM chart WHERE accno = ?) | . qq| AND startdate <= $transdate ORDER BY startdate DESC LIMIT 1) | . @@ -1511,9 +1528,9 @@ sub order_details { # get parts and push them onto the stack my $sortorder = ""; if ($form->{groupitems}) { - $sortorder = qq|ORDER BY pg.partsgroup, a.oid|; + $sortorder = qq|ORDER BY pg.partsgroup, a.position|; } else { - $sortorder = qq|ORDER BY a.oid|; + $sortorder = qq|ORDER BY a.position|; } $query = qq|SELECT p.partnumber, p.description, p.unit, a.qty, | . @@ -1573,7 +1590,14 @@ sub order_details { push(@{ $form->{TEMPLATE_ARRAYS}->{taxrate_nofmt} }, $form->{"${item}_rate"} * 100); push(@{ $form->{TEMPLATE_ARRAYS}->{taxnumber} }, $form->{"${item}_taxnumber"}); - my $tax_obj = SL::DB::Manager::Tax->find_by(taxnumber => $form->{"${item}_taxnumber"}); + my $tax_objs = SL::DB::Manager::Tax->get_objects_from_sql( + sql => 'SELECT * from tax where chart_id = (SELECT id FROM chart WHERE accno = ?)', + args => [ $form->{"${item}_taxnumber"} ] + ); + my $tax_obj; + if ( $tax_objs ) { + $tax_obj = $tax_objs->[0]; + } my $description = $tax_obj ? $tax_obj->translated_attribute('taxdescription', $form->{language_id}, 0) : ''; push(@{ $form->{TEMPLATE_ARRAYS}->{taxdescription} }, $description . q{ } . 100 * $form->{"${item}_rate"} . q{%}); }