From c1ec3f4f93af94698c2d017329ed8286a7c3cc0b Mon Sep 17 00:00:00 2001 From: "G. Richardson" Date: Wed, 1 Jul 2015 11:28:27 +0200 Subject: [PATCH] Belegpositionen nicht mehr mit ordnumber, transdate, cusordnumber speichern MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit stattdessen für das Drucktemplate der Rechnung ordnumber_oe, transdate_oe und cusordnumber_oe aus Recordlinks auslesen, und auch entsprechende Druckvariablen für Angebot und Lieferschein bereitstellen. Diese Informationen sollen in Zukunft nur noch aus record_links bestimmt werden, aus Kompatibilitätsgründen werden die alten Werte aber vorerst noch in der DB belassen, aber eben nicht mehr bei neuen Aufträgen oder Lieferscheinen gespeichert. Dadurch werden sie auch nicht mehr im Rahmen des Workflows weitergereicht. Ursprünglich wurden diese Datenbankfelder wahrscheinlich für Sammelaufträge konzipiert, d.h. sie sollten nur befüllt werden, wenn man einen neuen Auftrag aus mehreren bestehenden Aufträgen erstellt hat. Das passt insofern, als daß diese Felder beim initialen Speichern eines Auftrags nicht gefüllt wurden. Allerdings wurden die Felder schon gefüllt, wenn man einen Auftrag zum zweiten Mal gespeichert hat, es war also nicht allein auf das Zusammenfügen von Aufträgen beschränkt. Außerdem wurden diese Felder im Rahmen des Workflows von Auftrag zu Lieferschein oder Auftrag zu Rechnung dann in delivery_order_items oder invoice gefüllt. Bei "als neu speichern" eine Auftrags wurde auch noch die alte Auftragsnummer in die neue Position übernommen. Weiterhin wurde nicht berücksichtigt, daß man mittlerweile auch aus mehreren Lieferscheinen eine Rechnung erstellen kann, die auch unterschiedliche Aufträge haben können. Für das Rückverfolgen der ursprünglichen Belege ist generell nun record_links eine gute Möglichkeit, die Rückverfolgung von Positionen zu ermöglichen. Das Verhalten, daß die Variablen nur dann gefüllt sind, wenn sie aus Sammelaufträgen stammen, ist nun nicht mehr vorgesehen (und hat vorher auch nicht richtig funktioniert). In der Druckvorlage gibt es für Rechnungspositionen nun auch neue Druckvariablen, nämlich die Angebotsnummer, Angebotsdatum, Lieferscheinnummer und Lieferscheindatum für die Belege, aus denen die Positionen im Rahmen des Workflows ursprünglich stammten. Siehe Doku. --- SL/DO.pm | 3 -- SL/IS.pm | 84 ++++++++++++++++++++++++++++++++++++++++--- SL/OE.pm | 7 ++-- bin/mozilla/io.pl | 4 ++- doc/dokumentation.xml | 47 +++++++++++++++++------- 5 files changed, 120 insertions(+), 25 deletions(-) diff --git a/SL/DO.pm b/SL/DO.pm index 236a173c2..6ea31a9be 100644 --- a/SL/DO.pm +++ b/SL/DO.pm @@ -293,7 +293,6 @@ sub save { UPDATE delivery_order_items SET delivery_order_id = ?, position = ?, parts_id = ?, description = ?, longdescription = ?, qty = ?, base_qty = ?, sellprice = ?, discount = ?, unit = ?, reqdate = ?, project_id = ?, serialnumber = ?, - ordnumber = ?, transdate = ?, cusordnumber = ?, lastcost = ? , price_factor_id = ?, price_factor = (SELECT factor FROM price_factors where id = ?), marge_price_factor = ?, pricegroup_id = ?, active_price_source = ?, active_discount_source = ? WHERE id = ? @@ -368,8 +367,6 @@ SQL $form->{"sellprice_$i"}, $form->{"discount_$i"} / 100, $form->{"unit_$i"}, conv_date($items_reqdate), conv_i($form->{"project_id_$i"}), $form->{"serialnumber_$i"}, - $form->{"ordnumber_$i"}, conv_date($form->{"transdate_$i"}), - $form->{"cusordnumber_$i"}, $form->{"lastcost_$i"}, conv_i($form->{"price_factor_id_$i"}), conv_i($form->{"price_factor_id_$i"}), conv_i($form->{"marge_price_factor_$i"}), diff --git a/SL/IS.pm b/SL/IS.pm index 4fd440425..5550ddae9 100644 --- a/SL/IS.pm +++ b/SL/IS.pm @@ -36,6 +36,7 @@ package IS; use List::Util qw(max); +use Carp; use SL::AM; use SL::ARAP; use SL::CVar; @@ -60,6 +61,8 @@ use strict; sub invoice_details { $main::lxdebug->enter_sub(); + # prepare invoice for printing + my ($self, $myconfig, $form, $locale) = @_; $form->{duedate} ||= $form->{invdate}; @@ -182,6 +185,74 @@ sub invoice_details { if ($form->{"id_$i"} != 0) { + # Prepare linked items for printing + if ( $form->{"invoice_id_$i"} ) { + + require SL::DB::InvoiceItem; + my $invoice_item = SL::DB::Manager::InvoiceItem->find_by( id => $form->{"invoice_id_$i"} ); + my $linkeditems = $invoice_item->linked_records( direction => 'from', recursive => 1 ); + + # check for (recursively) linked sales quotation items, sales order + # items and sales delivery order items. + + # The checks for $form->{"ordnumber_$i"} and quo and do are for the old + # behaviour, where this data was stored in its own database fields in + # the invoice items, and there were no record links for the items. + + # If this information were to be fetched in retrieve_invoice, e.g. for showing + # this information in the second row, then these fields will already have + # been set and won't be calculated again. This shouldn't be done there + # though, as each invocation creates several database calls per item, and would + # make the interface very slow for many items. So currently these + # requests are only made when printing the record. + + # When using the workflow an invoice item can only be (recursively) linked to at + # most one sales quotation item and at most one delivery order item. But it may + # be linked back to several order items, if collective orders were involved. If + # that is the case we will always choose the very first order item from the + # original order, i.e. where it first appeared in an order. + + # TODO: credit note items aren't checked for a record link to their + # invoice item + + unless ( $form->{"ordnumber_$i"} ) { + + # $form->{"ordnumber_$i"} comes from ordnumber in invoice, if an + # entry exists this must be from before the change from ordnumber to linked items. + # So we just use that value and don't check for linked items. + # In that case there won't be any links for quo or do items either + + # sales order items are fetched and sorted by id, the lowest id is first + # It is assumed that the id always grows, so the item we want (the original) will have the lowest id + # better solution: filter the order_item that doesn't have any links from other order_items + # or maybe fetch linked_records with param save_path and order by _record_length_depth + my @linked_orderitems = grep { $_->isa("SL::DB::OrderItem") && $_->record->type eq 'sales_order' } @{$linkeditems}; + if ( scalar @linked_orderitems ) { + @linked_orderitems = sort { $a->id <=> $b->id } @linked_orderitems; + my $orderitem = $linked_orderitems[0]; # 0: the original order item, -1: the last collective order item + + $form->{"ordnumber_$i"} = $orderitem->record->record_number; + $form->{"transdate_oe_$i"} = $orderitem->record->transdate->to_kivitendo; + $form->{"cusordnumber_oe_$i"} = $orderitem->record->cusordnumber; + }; + + my @linked_quoitems = grep { $_->isa("SL::DB::OrderItem") && $_->record->type eq 'sales_quotation' } @{$linkeditems}; + if ( scalar @linked_quoitems ) { + croak "an invoice item may only be linked back to 1 sales quotation item, something is wrong\n" unless scalar @linked_quoitems == 1; + $form->{"quonumber_$i"} = $linked_quoitems[0]->record->record_number; + $form->{"transdate_quo_$i"} = $linked_quoitems[0]->record->transdate->to_kivitendo; + }; + + my @linked_deliveryorderitems = grep { $_->isa("SL::DB::DeliveryOrderItem") && $_->record->type eq 'sales_delivery_order' } @{$linkeditems}; + if ( scalar @linked_deliveryorderitems ) { + croak "an invoice item may only be linked back to 1 sales delivery item, something is wrong\n" unless scalar @linked_deliveryorderitems == 1; + $form->{"donumber_$i"} = $linked_deliveryorderitems[0]->record->record_number; + $form->{"transdate_do_$i"} = $linked_deliveryorderitems[0]->record->transdate->to_kivitendo; + }; + }; + }; + + # add number, description and qty to $form->{number}, if ($form->{"subtotal_$i"} && !$subtotal_header) { $subtotal_header = $i; @@ -215,9 +286,15 @@ sub invoice_details { push @{ $form->{TEMPLATE_ARRAYS}->{deliverydate_oe} }, $form->{"reqdate_$i"}; push @{ $form->{TEMPLATE_ARRAYS}->{sellprice} }, $form->{"sellprice_$i"}; push @{ $form->{TEMPLATE_ARRAYS}->{sellprice_nofmt} }, $form->parse_amount($myconfig, $form->{"sellprice_$i"}); + # linked item print variables + push @{ $form->{TEMPLATE_ARRAYS}->{quonumber_quo} }, $form->{"quonumber_$i"}; + push @{ $form->{TEMPLATE_ARRAYS}->{transdate_quo} }, $form->{"transdate_quo_$i"}; push @{ $form->{TEMPLATE_ARRAYS}->{ordnumber_oe} }, $form->{"ordnumber_$i"}; + push @{ $form->{TEMPLATE_ARRAYS}->{transdate_oe} }, $form->{"transdate_oe_$i"}; + push @{ $form->{TEMPLATE_ARRAYS}->{cusordnumber_oe} }, $form->{"cusordnumber_oe_$i"}; push @{ $form->{TEMPLATE_ARRAYS}->{donumber_do} }, $form->{"donumber_$i"}; - push @{ $form->{TEMPLATE_ARRAYS}->{transdate_oe} }, $form->{"transdate_$i"}; + push @{ $form->{TEMPLATE_ARRAYS}->{transdate_do} }, $form->{"transdate_do_$i"}; + push @{ $form->{TEMPLATE_ARRAYS}->{invnumber} }, $form->{"invnumber"}; push @{ $form->{TEMPLATE_ARRAYS}->{invdate} }, $form->{"invdate"}; push @{ $form->{TEMPLATE_ARRAYS}->{price_factor} }, $price_factor->{formatted_factor}; @@ -789,7 +866,7 @@ sub post_invoice { UPDATE invoice SET trans_id = ?, position = ?, parts_id = ?, description = ?, longdescription = ?, qty = ?, sellprice = ?, fxsellprice = ?, discount = ?, allocated = ?, assemblyitem = ?, unit = ?, deliverydate = ?, project_id = ?, serialnumber = ?, pricegroup_id = ?, - ordnumber = ?, donumber = ?, transdate = ?, cusordnumber = ?, base_qty = ?, subtotal = ?, + base_qty = ?, subtotal = ?, marge_percent = ?, marge_total = ?, lastcost = ?, active_price_source = ?, active_discount_source = ?, price_factor_id = ?, price_factor = (SELECT factor FROM price_factors WHERE id = ?), marge_price_factor = ? WHERE id = ? @@ -801,8 +878,7 @@ SQL $form->{"discount_$i"}, $allocated, 'f', $form->{"unit_$i"}, conv_date($form->{"reqdate_$i"}), conv_i($form->{"project_id_$i"}), $form->{"serialnumber_$i"}, $pricegroup_id, - $form->{"ordnumber_$i"}, $form->{"donumber_$i"}, conv_date($form->{"transdate_$i"}), - $form->{"cusordnumber_$i"}, $baseqty, $form->{"subtotal_$i"} ? 't' : 'f', + $baseqty, $form->{"subtotal_$i"} ? 't' : 'f', $form->{"marge_percent_$i"}, $form->{"marge_absolut_$i"}, $form->{"lastcost_$i"}, $form->{"active_price_source_$i"}, $form->{"active_discount_source_$i"}, diff --git a/SL/OE.pm b/SL/OE.pm index 1c75511fd..74733c867 100644 --- a/SL/OE.pm +++ b/SL/OE.pm @@ -557,7 +557,7 @@ sub save { UPDATE orderitems SET trans_id = ?, position = ?, parts_id = ?, description = ?, longdescription = ?, qty = ?, base_qty = ?, sellprice = ?, discount = ?, unit = ?, reqdate = ?, project_id = ?, serialnumber = ?, ship = ?, - pricegroup_id = ?, ordnumber = ?, transdate = ?, cusordnumber = ?, subtotal = ?, + pricegroup_id = ?, subtotal = ?, marge_percent = ?, marge_total = ?, lastcost = ?, price_factor_id = ?, active_price_source = ?, active_discount_source = ?, price_factor = (SELECT factor FROM price_factors WHERE id = ?), marge_price_factor = ? @@ -569,9 +569,8 @@ SQL $form->{"qty_$i"}, $baseqty, $fxsellprice, $form->{"discount_$i"}, $form->{"unit_$i"}, conv_date($reqdate), conv_i($form->{"project_id_$i"}), - $form->{"serialnumber_$i"}, $form->{"ship_$i"}, $pricegroup_id, - $form->{"ordnumber_$i"}, conv_date($form->{"transdate_$i"}), - $form->{"cusordnumber_$i"}, $form->{"subtotal_$i"} ? 't' : 'f', + $form->{"serialnumber_$i"}, $form->{"ship_$i"}, + $pricegroup_id, $form->{"subtotal_$i"} ? 't' : 'f', $form->{"marge_percent_$i"}, $form->{"marge_absolut_$i"}, $form->{"lastcost_$i"}, conv_i($form->{"price_factor_id_$i"}), $form->{"active_price_source_$i"}, $form->{"active_discount_source_$i"}, diff --git a/bin/mozilla/io.pl b/bin/mozilla/io.pl index 6b4cad7a6..ff28f9a4a 100644 --- a/bin/mozilla/io.pl +++ b/bin/mozilla/io.pl @@ -1494,11 +1494,13 @@ sub print_form { format_dates($output_dateformat, $output_longdates, qw(invdate orddate quodate pldate duedate reqdate transdate shippingdate deliverydate validitydate paymentdate - datepaid transdate_oe deliverydate_oe dodate + datepaid transdate_oe transdate_do transdate_quo deliverydate_oe dodate employee_startdate employee_enddate ), grep({ /^datepaid_\d+$/ || /^transdate_oe_\d+$/ || + /^transdate_do_\d+$/ || + /^transdate_quo_\d+$/ || /^deliverydate_oe_\d+$/ || /^reqdate_\d+$/ || /^deliverydate_\d+$/ || diff --git a/doc/dokumentation.xml b/doc/dokumentation.xml index 1ae60f7d2..1919d375c 100644 --- a/doc/dokumentation.xml +++ b/doc/dokumentation.xml @@ -3881,6 +3881,14 @@ ln -s $(pwd)/kivitendo-task-server.service /etc/systemd/system/ + + cusordnumber_oe + + + Bestellnummer des Kunden aus dem Auftrag, aus dem der Posten ursprünglich stammt (nur Verkauf) + + + discount @@ -3897,6 +3905,14 @@ ln -s $(pwd)/kivitendo-task-server.service /etc/systemd/system/ + + donumber_do + + + Lieferscheinnummer des Lieferscheins, aus dem die Position ursprünglich stammt, wenn die Rechnung im Rahmen des Workflows aus einem Lieferschein erstellt wurde. + + + drawing @@ -3981,17 +3997,7 @@ ln -s $(pwd)/kivitendo-task-server.service /etc/systemd/system/ ordnumber_oe - Auftragsnummer des Originalauftrags, wenn die Rechnung - aus einem Sammelauftrag erstellt wurde - - - - - donumber_do - - - Lieferscheinnummer desjenigen Lieferscheins, aus dem die Position stammt, sofern die Rechnung aus einem oder - mehreren Lieferscheinen erstellt wurde + Auftragsnummer des Originalauftrags, aus dem der Posten ursprünglich stammt. Nützlich, wenn die Rechnung aus mehreren Lieferscheinen zusammengefasst wurde, oder wenn zwischendurch eine Sammelauftrag aus mehreren Aufträgen erstellt wurde. In letzterem Fall wird die unsprüngliche Auftragsnummer angezeigt. @@ -4101,12 +4107,27 @@ ln -s $(pwd)/kivitendo-task-server.service /etc/systemd/system/ + + transdate_do + + + Datum des Lieferscheins, wenn die Rechnung im Rahmen des Workflows aus einem Lieferschein stammte. + + + transdate_oe - Auftragsdatum des Originalauftrags, wenn die Rechnung - aus einem Sammelauftrag erstellt wurde + Datum des Auftrags, wenn die Rechnung im Rahmen des Workflows aus einem Auftrag erstellt wurde. Wenn es Sammelaufträge gab wird das Datum des ursprünglichen Auftrags genommen. + + + + + transdate_quo + + + Datum des Angebots, wenn die Position im Rahmen des Workflows aus einem Angebot stammte. -- 2.20.1