Check for whole cart adjustment and apply line item discount
Success!

1) I have an Event that does a EVENT_BEFORE_SAVE_ELEMENT check.

Event::on(Elements::class, Elements::EVENT_BEFORE_SAVE_ELEMENT, function(Event $event){

    /**
     *  Runs so an admin doesn't have to set SKU or Slug when creating a NEW SONG
     *  This Event will also set the Price based on the Price Group Category Selected
     */

    // Only perform action if we are working with a Digital Product and Song Type
    if ( ($event-&gt;element instanceof \craft\digitalproducts\elements\Product) &amp;&amp; ($event-&gt;element-&gt;typeId == 1) ) {

        // Only adjust the SKU and Slug if this is a NEW Digital Product
        if ($event-&gt;isNew) {

            // Get the last row from the Content Table
            $lastId = (new \craft\db\Query())
                -&gt;select([
                    'elements.id'
                ])
                -&gt;from('elements')
                -&gt;orderBy('id DESC')
                -&gt;limit(1)
                -&gt;one();

            // Increment the Last ID number by One. This will work fine unless the last item was deleted.
            // But the point of this is to assign a new, unused number to the Slug and SKU anyway
            $songId = $lastId['id'] + 1;

            // Assign the SKU and Slug
            $event-&gt;element-&gt;sku = 'song-' . $songId;
            $event-&gt;element-&gt;slug = $songId;
        }

        // Get the price from the Price Category
        $categories = $event-&gt;element-&gt;getfieldValue('priceCategory')-&gt;one();
        $productPrice = $categories['productPrice'];

        $event-&gt;element-&gt;price = $productPrice;
    }
});


I also have a method that checks the Categories. If the price changes there, then it goes back and updates the prices on all the products, too.

2) Then, to connect the Verbb Gift Voucher plugin and to adjust the Line Items by a percent discount, I run this EVENT_REGISTER_ORDER_ADJUSTERS

Event::on(OrderAdjustments::class, OrderAdjustments::EVENT_REGISTER_ORDER_ADJUSTERS, function(RegisterComponentTypesEvent $event) {
    $event-&gt;types[] = CartAdjustmentsAdjuster::class;
});


which is this:
    class CartAdjustmentsAdjuster implements AdjusterInterface
    {

    // Properties
    // =========================================================================

    private $_orderLineItems;

    // Public Methods
    // =========================================================================

    public function adjust(Order $order): array
    {
        $adjustments = [];

        $this-&gt;_orderLineItems = $order-&gt;getLineItems();

        // Get the Voucher code by session
        $giftVoucherCodes = Craft::$app-&gt;getSession()-&gt;get('giftVoucher.giftVoucherCodes');

        if (!$giftVoucherCodes || count($giftVoucherCodes) == 0) {
            return [];
        }

        foreach ($giftVoucherCodes as $giftVoucherCode) {
            $voucherCode = Code::find()
                -&gt;where(['=', 'codeKey', $giftVoucherCode])
                -&gt;one();

            if ($voucherCode) {

                $priceAdjust = (new \craft\db\Query())
                    -&gt;select([
                        'content.field_prePayDiscount'
                    ])
                    -&gt;from('content')
                    -&gt;innerJoin('giftvoucher_codes', '[[giftvoucher_codes.voucherId]] = [[content.elementId]]')
                    -&gt;where(['=', 'giftvoucher_codes.codeKey', $voucherCode])
                    -&gt;all();

                $discount = $priceAdjust[0]['field_prePayDiscount'];
                if($discount &gt; 0) {

                    foreach ($this-&gt;_orderLineItems as $item)
                    {
                        $origAmt = $item-&gt;price;
                        $saleAmt = ($discount / 100);
                        $discountAmt = $saleAmt * $origAmt;
                        $discountPrice = $origAmt - $discountAmt;

                        $item-&gt;saleAmount = $saleAmt;
                        $item-&gt;salePrice = $discountPrice;
                    }
                }
            }
        }

        return $adjustments;
    }
}


One important note is that this custom adjuster needs to be installed first before the Verbb Gift Voucher plugin so that the Gift Voucher amount will be applied after the Line Item adjustments are made.

The docs state:


  You could have a project level event listener, that could reorder these adjusters, and not append any new ones.


But installing in this order works, too.