Hook für die Behandlung von Zeilenelementen im Vertrag

Moin Moin,

Umgebung
Version 7.7.6
Sugar Version 6.5.24 (Erstellen 509)

Soll
Wenn ich die Positionen eines Vertrages ändere/hinzufüge/entferne, sollen im Vertrag selbst Summen aus diesen gespeichert werden. Ich möchte z.B. alle Positionen mit der Art “Ware” im Header des Vertrages in das Feld “SummeWaren” einfügen. Dieses Feld soll gefüllt werden, wenn eine oder mehrere Positionen entfern, geändert oder hinzugefügt werden.

Ist
Aktuell versuche ich einen Hook in den AOS_Products_Quotes im after_save zu realisieren. Dort scheint er die Positionen zu verwenden und ich kann entsprechend agieren. Leider wird der Hook absolut unregelmäßig oft (!) gestartet und ich erzeuge einen Loop, wenn der Vertrag bezüglich der Änderungen gespeichert werden soll. Ausserdem, werden bei neuen Zeilenelementen diese nach dem speichern noch einmal hinzugefügt!

Ich suche nun eine Stelle, wo ich den Hook einbinden kann. Ich vermute, dass die Stelle bei den AOS_Product_Quotes einfach falsch ist. Im Vertrag selbst klappt es nicht, da er dort zwar die Zeilen mit add_relationship etc. abrufen, aber normale Änderungen von bestehenden Zeilenelementen nicht aufgreifen kann.

Hat hier Jemand eine Idee, wo man so etwas einbinden könnte? Erhoffe mir einen Hinweis zum passenden Modul und Event.

Danke für jegliche Hilfe. Weitere Infos auf Nachfrage!

Gruß
Darc

Um einen Loop zu verhindern, kannst du wie folgt vorgehen:

class hooks {
   static $already_ran = false;

    function save_hook($bean, $event, $arguments) {
      if (self::$already_ran == true) return;
        self::$already_ran = true;
 }
}

Des Weiteren wäre meine Lösung das schon im Modul AOS_Product_Quotes zu realisieren, dann aber über die Datenbank und nicht über die Bean, da bei $quote->save() die aos_product_quotes hooks wieder gefeuert werden.

im save_hook bzw delete_hook dann in etwa:

$quote = new AOS_Quotes();
$quote->retrieve($bean->parent_id);
$summeWaren = 0;

Alle Zeilenelement für die Quote holen:

$sql = "SELECT * FROM aos_products_quotes WHERE parent_type = 'AOS_Quotes' AND parent_id = '{$quote->id}' AND deleted = 0";

 $result = $db->query($sql);
      while ($row = $db->fetchByAssoc($result)) {
           if ($row['name'] == 'Ware') $summeWaren += $row['product_total_price'];
}

Jetzt solltest du in $summeWaren, die Summe aller Product_Quots mit Name = Ware haben.

Dann updatest du die Quote mit

$query = "UPDATE aos_quotes SET summeWaren = '{$summeWaren}' WHERE id = '{$quote->id}'";
$db->query($query);
1 Like