Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision c1ec3f4f

Von Kivitendo Admin vor mehr als 9 Jahren hinzugefügt

  • ID c1ec3f4f93af94698c2d017329ed8286a7c3cc0b
  • Vorgänger a7114646
  • Nachfolger cc369842

Belegpositionen nicht mehr mit ordnumber, transdate, cusordnumber speichern

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.

Unterschiede anzeigen:

SL/DO.pm
293 293
    UPDATE delivery_order_items SET
294 294
       delivery_order_id = ?, position = ?, parts_id = ?, description = ?, longdescription = ?, qty = ?, base_qty = ?,
295 295
       sellprice = ?, discount = ?, unit = ?, reqdate = ?, project_id = ?, serialnumber = ?,
296
       ordnumber = ?, transdate = ?, cusordnumber = ?,
297 296
       lastcost = ? , price_factor_id = ?, price_factor = (SELECT factor FROM price_factors where id = ?),
298 297
       marge_price_factor = ?, pricegroup_id = ?, active_price_source = ?, active_discount_source = ?
299 298
    WHERE id = ?
......
368 367
               $form->{"sellprice_$i"}, $form->{"discount_$i"} / 100,
369 368
               $form->{"unit_$i"}, conv_date($items_reqdate), conv_i($form->{"project_id_$i"}),
370 369
               $form->{"serialnumber_$i"},
371
               $form->{"ordnumber_$i"}, conv_date($form->{"transdate_$i"}),
372
               $form->{"cusordnumber_$i"},
373 370
               $form->{"lastcost_$i"},
374 371
               conv_i($form->{"price_factor_id_$i"}), conv_i($form->{"price_factor_id_$i"}),
375 372
               conv_i($form->{"marge_price_factor_$i"}),
SL/IS.pm
36 36

  
37 37
use List::Util qw(max);
38 38

  
39
use Carp;
39 40
use SL::AM;
40 41
use SL::ARAP;
41 42
use SL::CVar;
......
60 61
sub invoice_details {
61 62
  $main::lxdebug->enter_sub();
62 63

  
64
  # prepare invoice for printing
65

  
63 66
  my ($self, $myconfig, $form, $locale) = @_;
64 67

  
65 68
  $form->{duedate} ||= $form->{invdate};
......
182 185

  
183 186
    if ($form->{"id_$i"} != 0) {
184 187

  
188
      # Prepare linked items for printing
189
      if ( $form->{"invoice_id_$i"} ) {
190

  
191
        require SL::DB::InvoiceItem;
192
        my $invoice_item = SL::DB::Manager::InvoiceItem->find_by( id => $form->{"invoice_id_$i"} );
193
        my $linkeditems  = $invoice_item->linked_records( direction => 'from', recursive => 1 );
194

  
195
        # check for (recursively) linked sales quotation items, sales order
196
        # items and sales delivery order items.
197

  
198
        # The checks for $form->{"ordnumber_$i"} and quo and do are for the old
199
        # behaviour, where this data was stored in its own database fields in
200
        # the invoice items, and there were no record links for the items.
201

  
202
        # If this information were to be fetched in retrieve_invoice, e.g. for showing
203
        # this information in the second row, then these fields will already have
204
        # been set and won't be calculated again. This shouldn't be done there
205
        # though, as each invocation creates several database calls per item, and would
206
        # make the interface very slow for many items. So currently these
207
        # requests are only made when printing the record.
208

  
209
        # When using the workflow an invoice item can only be (recursively) linked to at
210
        # most one sales quotation item and at most one delivery order item.  But it may
211
        # be linked back to several order items, if collective orders were involved. If
212
        # that is the case we will always choose the very first order item from the
213
        # original order, i.e. where it first appeared in an order.
214

  
215
        # TODO: credit note items aren't checked for a record link to their
216
        # invoice item
217

  
218
        unless ( $form->{"ordnumber_$i"} ) {
219

  
220
          # $form->{"ordnumber_$i"} comes from ordnumber in invoice, if an
221
          # entry exists this must be from before the change from ordnumber to linked items.
222
          # So we just use that value and don't check for linked items.
223
          # In that case there won't be any links for quo or do items either
224

  
225
          # sales order items are fetched and sorted by id, the lowest id is first
226
          # It is assumed that the id always grows, so the item we want (the original) will have the lowest id
227
          # better solution: filter the order_item that doesn't have any links from other order_items
228
          #                  or maybe fetch linked_records with param save_path and order by _record_length_depth
229
          my @linked_orderitems = grep { $_->isa("SL::DB::OrderItem") && $_->record->type eq 'sales_order' } @{$linkeditems};
230
          if ( scalar @linked_orderitems ) {
231
            @linked_orderitems = sort { $a->id <=> $b->id } @linked_orderitems;
232
            my $orderitem = $linked_orderitems[0]; # 0: the original order item, -1: the last collective order item
233

  
234
            $form->{"ordnumber_$i"}       = $orderitem->record->record_number;
235
            $form->{"transdate_oe_$i"}    = $orderitem->record->transdate->to_kivitendo;
236
            $form->{"cusordnumber_oe_$i"} = $orderitem->record->cusordnumber;
237
          };
238

  
239
          my @linked_quoitems = grep { $_->isa("SL::DB::OrderItem") && $_->record->type eq 'sales_quotation' } @{$linkeditems};
240
          if ( scalar @linked_quoitems ) {
241
            croak "an invoice item may only be linked back to 1 sales quotation item, something is wrong\n" unless scalar @linked_quoitems == 1;
242
            $form->{"quonumber_$i"}     = $linked_quoitems[0]->record->record_number;
243
            $form->{"transdate_quo_$i"} = $linked_quoitems[0]->record->transdate->to_kivitendo;
244
          };
245

  
246
          my @linked_deliveryorderitems = grep { $_->isa("SL::DB::DeliveryOrderItem") && $_->record->type eq 'sales_delivery_order' } @{$linkeditems};
247
          if ( scalar @linked_deliveryorderitems ) {
248
            croak "an invoice item may only be linked back to 1 sales delivery item, something is wrong\n" unless scalar @linked_deliveryorderitems == 1;
249
            $form->{"donumber_$i"}     = $linked_deliveryorderitems[0]->record->record_number;
250
            $form->{"transdate_do_$i"} = $linked_deliveryorderitems[0]->record->transdate->to_kivitendo;
251
          };
252
        };
253
      };
254

  
255

  
185 256
      # add number, description and qty to $form->{number},
186 257
      if ($form->{"subtotal_$i"} && !$subtotal_header) {
187 258
        $subtotal_header = $i;
......
215 286
      push @{ $form->{TEMPLATE_ARRAYS}->{deliverydate_oe} },   $form->{"reqdate_$i"};
216 287
      push @{ $form->{TEMPLATE_ARRAYS}->{sellprice} },         $form->{"sellprice_$i"};
217 288
      push @{ $form->{TEMPLATE_ARRAYS}->{sellprice_nofmt} },   $form->parse_amount($myconfig, $form->{"sellprice_$i"});
289
      # linked item print variables
290
      push @{ $form->{TEMPLATE_ARRAYS}->{quonumber_quo} },     $form->{"quonumber_$i"};
291
      push @{ $form->{TEMPLATE_ARRAYS}->{transdate_quo} },     $form->{"transdate_quo_$i"};
218 292
      push @{ $form->{TEMPLATE_ARRAYS}->{ordnumber_oe} },      $form->{"ordnumber_$i"};
293
      push @{ $form->{TEMPLATE_ARRAYS}->{transdate_oe} },      $form->{"transdate_oe_$i"};
294
      push @{ $form->{TEMPLATE_ARRAYS}->{cusordnumber_oe} },   $form->{"cusordnumber_oe_$i"};
219 295
      push @{ $form->{TEMPLATE_ARRAYS}->{donumber_do} },       $form->{"donumber_$i"};
220
      push @{ $form->{TEMPLATE_ARRAYS}->{transdate_oe} },      $form->{"transdate_$i"};
296
      push @{ $form->{TEMPLATE_ARRAYS}->{transdate_do} },      $form->{"transdate_do_$i"};
297

  
221 298
      push @{ $form->{TEMPLATE_ARRAYS}->{invnumber} },         $form->{"invnumber"};
222 299
      push @{ $form->{TEMPLATE_ARRAYS}->{invdate} },           $form->{"invdate"};
223 300
      push @{ $form->{TEMPLATE_ARRAYS}->{price_factor} },      $price_factor->{formatted_factor};
......
789 866
        UPDATE invoice SET trans_id = ?, position = ?, parts_id = ?, description = ?, longdescription = ?, qty = ?,
790 867
                           sellprice = ?, fxsellprice = ?, discount = ?, allocated = ?, assemblyitem = ?,
791 868
                           unit = ?, deliverydate = ?, project_id = ?, serialnumber = ?, pricegroup_id = ?,
792
                           ordnumber = ?, donumber = ?, transdate = ?, cusordnumber = ?, base_qty = ?, subtotal = ?,
869
                           base_qty = ?, subtotal = ?,
793 870
                           marge_percent = ?, marge_total = ?, lastcost = ?, active_price_source = ?, active_discount_source = ?,
794 871
                           price_factor_id = ?, price_factor = (SELECT factor FROM price_factors WHERE id = ?), marge_price_factor = ?
795 872
        WHERE id = ?
......
801 878
                 $form->{"discount_$i"}, $allocated, 'f',
802 879
                 $form->{"unit_$i"}, conv_date($form->{"reqdate_$i"}), conv_i($form->{"project_id_$i"}),
803 880
                 $form->{"serialnumber_$i"}, $pricegroup_id,
804
                 $form->{"ordnumber_$i"}, $form->{"donumber_$i"}, conv_date($form->{"transdate_$i"}),
805
                 $form->{"cusordnumber_$i"}, $baseqty, $form->{"subtotal_$i"} ? 't' : 'f',
881
                 $baseqty, $form->{"subtotal_$i"} ? 't' : 'f',
806 882
                 $form->{"marge_percent_$i"}, $form->{"marge_absolut_$i"},
807 883
                 $form->{"lastcost_$i"},
808 884
                 $form->{"active_price_source_$i"}, $form->{"active_discount_source_$i"},
SL/OE.pm
557 557
         UPDATE orderitems SET
558 558
          trans_id = ?, position = ?, parts_id = ?, description = ?, longdescription = ?, qty = ?, base_qty = ?,
559 559
          sellprice = ?, discount = ?, unit = ?, reqdate = ?, project_id = ?, serialnumber = ?, ship = ?,
560
          pricegroup_id = ?, ordnumber = ?, transdate = ?, cusordnumber = ?, subtotal = ?,
560
          pricegroup_id = ?, subtotal = ?,
561 561
          marge_percent = ?, marge_total = ?, lastcost = ?, price_factor_id = ?,
562 562
          active_price_source = ?, active_discount_source = ?,
563 563
          price_factor = (SELECT factor FROM price_factors WHERE id = ?), marge_price_factor = ?
......
569 569
           $form->{"qty_$i"}, $baseqty,
570 570
           $fxsellprice, $form->{"discount_$i"},
571 571
           $form->{"unit_$i"}, conv_date($reqdate), conv_i($form->{"project_id_$i"}),
572
           $form->{"serialnumber_$i"}, $form->{"ship_$i"}, $pricegroup_id,
573
           $form->{"ordnumber_$i"}, conv_date($form->{"transdate_$i"}),
574
           $form->{"cusordnumber_$i"}, $form->{"subtotal_$i"} ? 't' : 'f',
572
           $form->{"serialnumber_$i"}, $form->{"ship_$i"},
573
           $pricegroup_id, $form->{"subtotal_$i"} ? 't' : 'f',
575 574
           $form->{"marge_percent_$i"}, $form->{"marge_absolut_$i"},
576 575
           $form->{"lastcost_$i"}, conv_i($form->{"price_factor_id_$i"}),
577 576
           $form->{"active_price_source_$i"}, $form->{"active_discount_source_$i"},
bin/mozilla/io.pl
1494 1494
  format_dates($output_dateformat, $output_longdates,
1495 1495
               qw(invdate orddate quodate pldate duedate reqdate transdate
1496 1496
                  shippingdate deliverydate validitydate paymentdate
1497
                  datepaid transdate_oe deliverydate_oe dodate
1497
                  datepaid transdate_oe transdate_do transdate_quo deliverydate_oe dodate
1498 1498
                  employee_startdate employee_enddate
1499 1499
                  ),
1500 1500
               grep({ /^datepaid_\d+$/ ||
1501 1501
                        /^transdate_oe_\d+$/ ||
1502
                        /^transdate_do_\d+$/ ||
1503
                        /^transdate_quo_\d+$/ ||
1502 1504
                        /^deliverydate_oe_\d+$/ ||
1503 1505
                        /^reqdate_\d+$/ ||
1504 1506
                        /^deliverydate_\d+$/ ||
doc/dokumentation.xml
3881 3881
              </listitem>
3882 3882
            </varlistentry>
3883 3883

  
3884
            <varlistentry>
3885
              <term><varname>cusordnumber_oe</varname></term>
3886

  
3887
              <listitem>
3888
                <para>Bestellnummer des Kunden aus dem Auftrag, aus dem der Posten ursprünglich stammt (nur Verkauf)</para>
3889
              </listitem>
3890
            </varlistentry>
3891

  
3884 3892
            <varlistentry>
3885 3893
              <term><varname>discount</varname></term>
3886 3894

  
......
3897 3905
              </listitem>
3898 3906
            </varlistentry>
3899 3907

  
3908
            <varlistentry>
3909
              <term><varname>donumber_do</varname></term>
3910

  
3911
              <listitem>
3912
                <para>Lieferscheinnummer des Lieferscheins, aus dem die Position ursprünglich stammt, wenn die Rechnung im Rahmen des Workflows aus einem  Lieferschein erstellt wurde.</para>
3913
              </listitem>
3914
            </varlistentry>
3915

  
3900 3916
            <varlistentry>
3901 3917
              <term><varname>drawing</varname></term>
3902 3918

  
......
3981 3997
              <term><varname>ordnumber_oe</varname></term>
3982 3998

  
3983 3999
              <listitem>
3984
                <para>Auftragsnummer des Originalauftrags, wenn die Rechnung
3985
                aus einem Sammelauftrag erstellt wurde</para>
3986
              </listitem>
3987
            </varlistentry>
3988

  
3989
            <varlistentry>
3990
              <term><varname>donumber_do</varname></term>
3991

  
3992
              <listitem>
3993
                <para>Lieferscheinnummer desjenigen Lieferscheins, aus dem die Position stammt, sofern die Rechnung aus einem oder
3994
                mehreren Lieferscheinen erstellt wurde</para>
4000
                <para>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.</para>
3995 4001
              </listitem>
3996 4002
            </varlistentry>
3997 4003

  
......
4101 4107
              </listitem>
4102 4108
            </varlistentry>
4103 4109

  
4110
            <varlistentry>
4111
              <term><varname>transdate_do</varname></term>
4112

  
4113
              <listitem>
4114
                <para>Datum des Lieferscheins, wenn die Rechnung im Rahmen des Workflows aus einem Lieferschein stammte.</para>
4115
              </listitem>
4116
            </varlistentry>
4117

  
4104 4118
            <varlistentry>
4105 4119
              <term><varname>transdate_oe</varname></term>
4106 4120

  
4107 4121
              <listitem>
4108
                <para>Auftragsdatum des Originalauftrags, wenn die Rechnung
4109
                aus einem Sammelauftrag erstellt wurde</para>
4122
                <para>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.</para>
4123
              </listitem>
4124
            </varlistentry>
4125

  
4126
            <varlistentry>
4127
              <term><varname>transdate_quo</varname></term>
4128

  
4129
              <listitem>
4130
                <para>Datum des Angebots, wenn die Position im Rahmen des Workflows aus einem Angebot stammte.</para>
4110 4131
              </listitem>
4111 4132
            </varlistentry>
4112 4133

  

Auch abrufbar als: Unified diff