Projekt

Allgemein

Profil

Fehler #352

Beim Drucken mehrerer Rechnung aus dem Bericht heraus wird der Rabatt falsch berechnet

Von Jan Büren vor fast 6 Jahren hinzugefügt. Vor mehr als 5 Jahren aktualisiert.

Status:
Erledigt
Priorität:
Normal
Zugewiesen an:
-
Zielversion:
-
Beginn:
11.05.2018
Abgabedatum:
% erledigt:

0%

Geschätzter Aufwand:

Beschreibung

Wie:
Verkauf -> Berichte -> Rechnung -> Anhaken -> Drucken

Was:
Der sellprice der Position ist nicht mehr wie sonst, der Preis ohne Rabatt, sondern der Preis mit Rabatt.
Dieser kommt aus flatten_to_form einfach aus der Datenbank-Tabelle invoice.

Problematisch ist es dann, dass $form->prepare_for_printing diesen sellprice dann nochmal mit dem Rabatt berechnet.

Wenn ich das mit wiederkehrenden Rechnungen mache, stimmt hingegen alles.

Grundproblem scheint zu sein, dass sellprice einmal mit Rabatt und einmal ohne Rabatt gespeichert wird.

Rechnung normal buchen:

# select sellprice,fxsellprice,discount from invoice where trans_id=10457;
 sellprice | fxsellprice | discount 
-----------+-------------+----------
   0.57000 |    44.00000 |    0.987

Wiederkehrende Rechnung buchen:
# select sellprice,fxsellprice,discount from invoice where trans_id=10484;
 sellprice | fxsellprice | discount 
-----------+-------------+----------
  44.00000 |    44.00000 |    0.987

Wenn ich mir das Verhalten in der 3.4 anschaue, dann wird dort auch der sellprice minus rabatt gespeichert.

Beim Ausdruck im Beleg ist das nicht aufgefallen, da hier der Rabatt unabhängig vom sellprice in invoice berechnet wird.

Wenn ich aber über den Menüpunkt Massendruck gehe, passt das dann nicht mehr.

Unschön ist es jetzt, dass sellprice mal diesen oder jenen Wert hat.

Das wäre aber per Upgrade-Skript korrigierbar, die Diskussion was in sellprice gespeichert wird hatten wir auch schon mal im IRC

Zugehörige Revisionen

Revision 075f64d6 (diff)
Von Jan Büren vor mehr als 5 Jahren hinzugefügt

Fixt #352 Beim Drucken mehrerer Rechnung aus dem Bericht heraus wird der Rabatt falsch berechnet

Hotfix für die zweifache Berechnung vom Rabatt (Marge bei Berichten falsch) erstellt.
Hintergrund: Der alte Code erwartet keine vorformatierten Werte, wird aber bei
periodischen Jobs noch zwingend aufgerufen (sellprice mit fxsellprice in MassPrintCreatePDF überlagert)
Ferner Rundungsgenauigkeiten für wiederkehrende Rechnungen erhöht.

Historie

#1

Von Jan Büren vor fast 6 Jahren aktualisiert

Ah, hier hatte Geoff das schon zusammengefasst: https://redmine.kivitendo-premium.de/issues/342

#2

Von Jan Büren vor fast 6 Jahren aktualisiert

Ohje, dann hatte Dirk Marklewitz doch recht, dass fxsellprice der Preis ohne Rabatt ist.

Im Beleg wird alles wieder richtig gedruckt, weil in SL/IS.pm _retrieve_invoice folgendes macht:

    # retrieve individual items
    $query =
      qq|SELECT
           c1.accno AS inventory_accno, c1.new_chart_id AS inventory_new_chart, date($transdate) - c1.valid_from AS inventory_valid,
           c2.accno AS income_accno,    c2.new_chart_id AS income_new_chart,    date($transdate) - c2.valid_from as income_valid,
           c3.accno AS expense_accno,   c3.new_chart_id AS expense_new_chart,   date($transdate) - c3.valid_from AS expense_valid,

           i.id AS invoice_id,
           i.description, i.longdescription, i.qty, i.fxsellprice AS sellprice, i.discount, i.parts_id AS id, i.unit, i.deliverydate AS reqdate,
                                                       ^^^^^^^^^^^^^^^^^^^^^^^

Ok, dieser Wert wird seit Anbeginn der Weltendämmerung als sellprice verwendet.
Tja, man sollte nicht vom Variablennamen vorschnell auf die Verwendung schliessen ...

Demnach brauchen wir fxsellprice in FlattenToForm:

FlattenToForm.pm

-    _copy($item,          $form, '',              "_${idx}", $format_noround, qw(qty sellprice));
+    _copy($item,          $form, '',              "_${idx}", $format_noround, qw(qty sellprice fxsellprice));

Und entsprechend angebliche sellprices durch wirkliche sellprices bei der Funktion ersetzen:
SL/Helper/MassPrintCreatePDF.pm


sub create_massprint_pdf {

   $create_params{variable_content_types} = $form->get_variable_content_types();
   $params{document}->flatten_to_form($form, format_amounts => 1);
   # flatten_to_form sets payment_terms from customer/vendor - we do not want that here
   # really ??
   delete $form->{payment_terms} if !$form->{payment_id};
+  for my $i (1 .. $form->{rowcount}) {
+    $form->{"sellprice_$i"} = $form->{"fxsellprice_$i"};
+  }
   $form->prepare_for_printing;

Folgende Testfälle i.O.:

1. Rechnung erfassen
2. Wiederkehrende Rechnung erfassen und automatisch per Mail verschicken
3. Rechnung mit Fremdwährung erfassen

Alle drei Fälle werden danach von diesem Druckaufruf korrekt ausgedruckt.

#3

Von Jan Büren vor mehr als 5 Jahren aktualisiert

  • Status wurde von Neu zu Erledigt geändert

Pragmatischerweise verbessert der Fix den Ist-Stand mehr als ihn zu verschlechtern, Details:

Das flatten_to_form den Wert fxsellprice mit ausgibt,bzw. berücksichtigt ist sinnvoll.

Der Helper MassPrintCreatePDF.pm macht jetzt das, was auch retrieve_item macht, sodass dann der Aufruf von $form->prepare_for_printing; diesselben Daten bekommt wie über den alten Weg.

Sicherlich müsste das Verfahren an beiden Stellen angefasst werden, dass allerdings dann eher mit Bearbeitung von #342

Im Master mit #075f64d61e999506517a eingespielt

Auch abrufbar als: Atom PDF