Creating Invoice record using BPM does not copy Item List field.

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • jaykay89
    Junior Member
    • Nov 2023
    • 12

    Creating Invoice record using BPM does not copy Item List field.

    I am trying to create a new Invoice record using fields from another Invoice. All fields seem to copy properly except for the Invoice Item list.

    1 thing to note is I do have custom fields and calculations for the Invoice Items. I've attached a screenshot of my config for reference.

    Is there a way to copy all items from one Invoice to another Invoice using Formula Script instead?

    Thank you.

    Click image for larger version

Name:	Screenshot 2024-01-31 160430.png
Views:	330
Size:	61.6 KB
ID:	102238

  • rabii
    Active Community Member
    • Jun 2016
    • 1250

    #2
    itemList is a list of Item so it won't be copied as it is an object. you can use the formula instead and loop through the itemList of current invoice and create new itemList for nex invoice based on data in the first one.
    Rabii
    Web Dev

    Comment


    • jaykay89
      jaykay89 commented
      Editing a comment
      Ok how would I access the itemList in formula and also assign a new itemlist for a new record I am creating?

      I have the basic code below but am unsure how to access certain fields and to also assign related fields such as Invoice Items.

      PHP Code:
      
      //Not sure this is how I access and itemList from the the target entity(Invoice).
      $itemList = bpm\targetEntity\attribute('itemList');
      $count = array\length($itemList);
      
      ifThen(
          $count > 0,
          (
              $i=0;
              while
                  $i < $count,
                  (
                      $item = array\at($itemList, $i);
      
                      //Add new item to newly created Invoice.
                      //???
      
                      $i = $i+1;
                  )    
              )
          )
      
      ); 
      
  • yuri
    Member
    • Mar 2014
    • 8453

    #3
    Copying items from Quote to Invoice.

    PHP Code:
    $quoteId = workflow\targetEntity\attribute('id');
    $itemIds = record\findMany('QuoteItem', 100, 'order', null, 'quoteId', $quoteId);
    
    $newItemList = list();
    $i = 0;
    
    while ($i < array\length($itemIds)) {
        $itemId = array\at($itemIds, $i);
        
        $item = record\fetch('QuoteItem', $itemId);
        
        if (!$item) {
            continue;
        }
        
        $quantity = object\get($item, 'quantity');
        $productId = object\get($item, 'productId');
        $name = object\get($item, 'name');
        $unitPrice = object\get($item, 'unitPrice');
        $listPrice = object\get($item, 'listPrice');
        $unitPriceCurrency = object\get($item, 'unitPriceCurrency');
        $listPriceCurrency = object\get($item, 'listPriceCurrency');
        $taxRate = object\get($item, 'taxRate');
        
        $newItem = object\create();
        
        object\set($newItem, 'quantity', $quantity);
        object\set($newItem, 'productId', $productId);
        object\set($newItem, 'name', $name);
        object\set($newItem, 'unitPrice', $unitPrice);
        object\set($newItem, 'listPrice', $listPrice);
        object\set($newItem, 'unitPriceCurrency', $unitPriceCurrency);
        object\set($newItem, 'listPriceCurrency', $listPriceCurrency);
        object\set($newItem, 'taxRate', $taxRate);
        
        $newItemList = array\push($newItemList, $newItem);
        
        $i = $i + 1;
    }
    
    itemList = $newItemList;
    If you find EspoCRM good, we would greatly appreciate if you could give the project a star on GitHub. We believe our work truly deserves more recognition. Thanks.

    Comment


    • jaykay89
      jaykay89 commented
      Editing a comment
      Thank you Yuri. This formula worked for me. Cheers!
      Last edited by jaykay89; 02-02-2024, 02:43 AM.
  • rabii
    Active Community Member
    • Jun 2016
    • 1250

    #4
    Hey,

    First you should know that you can't do both at the sametime meaning, add first action (Create Record) choose all fields as per image above except the itemList don't add it. Then add another action (Update Created Record) choose the newly created invoice and in the formula field use the code below, this code will get all the invoiceItem list of the previous invoice and then create similar to the new created invoice.

    PHP Code:
    $count = record\count('InvoiceItem', 'invoiceId=', id);
    $itemList = record\findRelatedMany('Invoice', id, 'items', $count, 'createdAt', 'desc');
    
    $i = 0;
    
    while ($i < array\length($itemList)) {
        
        $item = record\fetch('InvoiceItem', array\at($itemList, $i));
    
        if ($item) {
            
            record\create('InvoiceItem',
                // replace theCreatedUnvoice with the id of the createdinvoice task (if you click on it, you will find an id)
                'invoiceId', id,
                'name', object\get($item, 'name'),
                'productId', object\get($item, 'productId'),
                'quantity', object\get($item, 'quantity'),
                'taxRate', object\get($item, 'taxRate'),
                'listPrice', object\get($item, 'listPrice'),
                'unitPrice', object\get($item, 'unitPrice'),
                'discount', object\get($item, 'discount'),
                'amount', object\get($item, 'amount'),
                'unitWeight', object\get($item, 'unitWeight'),
                'weight', object\get($item, 'weight'),
                'description', object\get($item, 'description')
            );
        }
        
        $i = $i + 1;
    } 
    
    Rabii
    Web Dev

    Comment


    • yuri
      yuri commented
      Editing a comment
      I wouldn't recommend creating invoice items separately, but setting them all at once as I did in my example. Otherwise, hooks and total calculations will be bypassed

      Sorting by 'order' will preserve an item order.

    • rabii
      rabii commented
      Editing a comment
      thanks for sharing
Working...