Unterstützung #314
Erzeugnisbestandteile in Rechnungen (invoice-Tabelle) speichern (oder nicht)
0%
Beschreibung
Bis 2015 (f087c373) wurden Erzeugnisbestandteile in der Tabelle invoice gespeichert und mit assemblyitem = true markiert.
Danach ging das kaputt, wurde aber wohl auch nicht vermisst. Wenn ich das richtig sehen, gibt es auch keine Auswertungen dafür. In den Berichten werden assemblyitems extra rausgefiltert.
Die Frage ist jetzt, ob das wieder aktiviert werden soll. Wenn, dann sollte aber auch lastcost mitgespeichert werden.
Falls mal Auswertungen gewünscht werden, wäre es evtl. besser, eine extra Tabelle einzuführen, die bei verkauften Erzeugnissen die Bestandteile zum Verkaufszeitpunkt speichert.
Bei eingeschalteter Stückliste beim Erzeugnis werden die Bestandteile für den Ausdruck übrigens aus den Stammdaten geholt.
Historie
Von Werner Hahn vor etwa 7 Jahren aktualisiert
Für unser neues Projekt brauchen wir da so was, dass die Erzeugnissbestandteile in Auftrag/Lieferschein/Rechnung mit gespeichert werden, so dass später nachvollziehbar welche Einzelteile verbaut wurden sind. Meine Idee war es diese als json in den Positionstbl (order_items, delivery_order_items, invoice) zu haben.
Von Jan Büren vor etwa 7 Jahren aktualisiert
@Werner: Also das JSON-Objekt direkt in den (*items|invoices) Tabelle als Typ JSON?
Ich würde eher ein klassisches E/R-Design bevorzugen.
Die ids in io,doi und invoice sind doch persistent, dann wäre es doch naheliegend einen Fremdschlüssel auf eine processed_assembly_items Tabelle zu machen, die dann nur parts_id, lastcost, qty und sonstige Daten enthält, die für eine spätere Auswertung relevant wäre.
Von Martin Helmling vor fast 7 Jahren aktualisiert
Wichtig ist, nicht mehr die invoice Tabelle zu verwenden, da diese inzwischen durch das Löschen von "orphand" Einträgen gelöscht werden.
Wie in meiner Mail vom 3.1. an die develop liste zu entnehmen ist, kostet dies beim Speichern einige Zeit:
Das (erneuten) Buchen einer Verkaufsrechnung mit 20 Positionen, davon 18
Erzeugnisse, dauert 30 Sekunden. Das ist reproduzierbar.
Es stellt sich heraus, dass die meiste Zeit (ca 20 sec) benötigt wird um
3844 'orphaned invoice' Einträge zu löschen:
SL/IS.pm: Line 1410: 'DELETE FROM invoice WHERE id IN (%s)'.
Weitere Nachforschung ergab, dass diese in process_assembly() erzeugt werden
SL/IS.pm: Line 1707 ff: '# save detail record for individual assembly
item in invoice table'
Die Funktionen 'process_assembly' und 'cogs' sind anscheinend uralte
Mechanismen zum Berechnen von was? 'allocated' etc.
Frage 1:
Warum braucht das Löschen von 3844 Inventory- Einträgen über 30
Sekunden? Hat das mit den zwei Triggerfuktionen beim Löschen zu tun?
Die Triggerfunktionen sind clean_up_record_links_before_invoice_delete()
und delete_custom_variables_trigger()
Frage 2:
Warum werden diese temporären 3844 invoice Tabelleneinträge erzeugt?
Gäbe es dafür nicht eine bessere Lösung?