Hook on Quote, beforeSave, afterSave calculations

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • jensolsson.se
    Junior Member
    • Dec 2022
    • 20

    Hook on Quote, beforeSave, afterSave calculations

    Hi

    I made a custom hook on Quote to make two calculations. I want to know how much of the products are recurring and how much is one-off. For this I also added a recurring property to Product. Now it does work sort of, but for some reason on initial save my hook makes the products saved twice. Lets say I have in the quote 2x Mobile Phones, 2x Subsctiptions so 4 items in total. When Saved I have a list of: 2x Mobile Phones, 2x Subscriptions, 2x Mobile Phones, 2x Subscriptions, so 8 items in total.
    I thoought I should probably make my afterSave hook a beforeSave hook instead. But since it is not saved I do not know how I can retrieve a list of QuoteItems related to the Quote.

    Here is my code for afterSave located at: /custom/Espo/Custom/Hooks/Quote/UpdateQuoteTotals.php
    Question is how do I get the $items in beforeSave?

    Code:
    <?php
    namespace Espo\Custom\Hooks\Quote;
    use Espo\ORM\Entity;
    
    class UpdateQuoteTotals extends \Espo\Core\Hooks\Base {
    
      public function beforeSave(Entity $entity, array $options): void {
          error_log("beforeSave");
      }
    
    
      public function afterSave(Entity $entity, array $options = array()) {
          error_log("afterSave");
           $entityManager = $this->getEntityManager();
           $recurringTotal = 0;
           $initialTotal = 0;
    
           $items = $entityManager
               ->getRDBRepository("QuoteItem")
               ->where([ // where clause
                  'quoteId' => $entity->get('id')
               ])
               ->find();
    
    
           foreach ($items as $item) {
               $product = $entityManager->getEntity("Product", $item->get('productId'));
               if ($product->get('recurring')) {
                   $recurringTotal += $item->get("amount");
               }
               else {
                   $initialTotal += $item->get("amount");
               }
           }
    
           $entity->set("amountRecurring", $recurringTotal);
           $entity->set("amountInitial", $initialTotal);
           $entityManager->saveEntity($entity, ['skipHooks' => true]);
        }
    }
    ?>
    ​
    Last edited by jensolsson.se; 08-08-2023, 06:17 AM.
  • jensolsson.se
    Junior Member
    • Dec 2022
    • 20

    #2
    Think I found a solution. Instead I created a /custom/Espo/Custom/Repositories/Quote.php

    I put this inside, does it make sense? Seem to work at least:



    PHP Code:
    <?php
    
    namespace Espo\Custom\Repositories;
    
    
    class Quote extends \Espo\Modules\Sales\Repositories\Quote {
    
    protected function calculateItems(\Espo\ORM\Entity $entity, array $options = array()) {
    
    error_log("CALCULATE");
    
    parent::calculateItems($entity, $options);
    
    
    $entityManager = $this->getEntityManager();
    
    error_log("beforeSave");
    
    $items = $entity->get('itemList');
    
    
    $recurringTotal = 0.0;
    
    $initialTotal = 0.0;
    
    
    foreach ($items as $item) {
    
    error_log(print_r($item, TRUE));
    
    $product = $entityManager->getEntity("Product", $item->productId);
    
    
    if ($product->get('recurring')) {
    
    $recurringTotal += $item->amount;
    
    }
    
    else {
    
    $initialTotal += $item->amount;
    
    }
    
    }
    
    
    $entity->set("amountRecurring", $recurringTotal);
    
    $entity->set("amountInitial", $initialTotal);
    
    
    }
    
    }
    
    ?>

    Comment

    • rabii
      Active Community Member
      • Jun 2016
      • 1250

      #3
      if i remember i had a conversation with yuri about which to use repositories vs hooks read this https://forum.espocrm.com/forum/deve...ooks#post88381

      I think the reason why the first hooks didn't work is because you were trying to access QuoteItem where i guess if your tried it with itemList (which should be array of associated quoteItems linked to that specific record, it might work.

      Anyway glad it is working now
      Rabii
      Web Dev

      Comment

      Working...