diff --git a/ajax/activate.php b/ajax/activate.php
index c26bb1318d916d4559f61dd8309df96a3dae58eb..f0d9443ea69e53cae2a5c33bb276741eacb690e7 100644
--- a/ajax/activate.php
+++ b/ajax/activate.php
@@ -21,6 +21,6 @@ function ($discountId) {
 
         return $Discount->isActive();
     },
-    array('discountId'),
+    ['discountId'],
     'Permission::checkAdminUser'
 );
diff --git a/ajax/create.php b/ajax/create.php
index 9858366cdec1ff3598f0776e2256e12822bfdba5..44fb53279a924cdeab5896a339e4b35b309e97a1 100644
--- a/ajax/create.php
+++ b/ajax/create.php
@@ -23,6 +23,6 @@ function ($params) {
 
         return $Discount->getId();
     },
-    array('params'),
+    ['params'],
     'Permission::checkAdminUser'
 );
diff --git a/ajax/deactivate.php b/ajax/deactivate.php
index 142c5538c1d71a5d8fc02e0d632bd9e4dd2ff481..dd763228ecbc5ffebc4a748674d7cf86c7324574 100644
--- a/ajax/deactivate.php
+++ b/ajax/deactivate.php
@@ -21,6 +21,6 @@ function ($discountId) {
 
         return $Discount->isActive();
     },
-    array('discountId'),
+    ['discountId'],
     'Permission::checkAdminUser'
 );
diff --git a/ajax/deleteChild.php b/ajax/deleteChild.php
index 24157332404fc25e6649dfcefa8a179cdd63f98b..c95c99f64a87e6cef6a6a142b88c09af14e8ad6a 100644
--- a/ajax/deleteChild.php
+++ b/ajax/deleteChild.php
@@ -18,6 +18,6 @@ function ($discountId) {
         $Discount  = $Discounts->getChild($discountId);
         $Discount->delete();
     },
-    array('discountId'),
+    ['discountId'],
     'Permission::checkAdminUser'
 );
diff --git a/ajax/deleteChildren.php b/ajax/deleteChildren.php
index 28a15d55ac7f042ce532dcb32f072a585a08ee47..933bcbb89e1c04755945a8e19a2f2b97d6750af0 100644
--- a/ajax/deleteChildren.php
+++ b/ajax/deleteChildren.php
@@ -31,6 +31,6 @@ function ($discountIds) {
             throw new $ExceptionStack();
         }
     },
-    array('discountIds'),
+    ['discountIds'],
     'Permission::checkAdminUser'
 );
diff --git a/ajax/get.php b/ajax/get.php
index fdb588e83d6ce02c2da27f6e6ff03eb8c3087bcd..c6efba879f4379ba5eefd623da3483d423e66e3e 100644
--- a/ajax/get.php
+++ b/ajax/get.php
@@ -23,6 +23,6 @@ function ($id) {
 
         return $attributes;
     },
-    array('id'),
+    ['id'],
     'Permission::checkAdminUser'
 );
diff --git a/ajax/search.php b/ajax/search.php
index c9027b9587df8e68861a6acd70d98997fc1b6c76..ed5bed6b547b04777961ce1beace37b9b0e28848 100644
--- a/ajax/search.php
+++ b/ajax/search.php
@@ -15,17 +15,17 @@
     'package_quiqqer_discount_ajax_search',
     function ($fields, $params) {
         $Discounts = new QUI\ERP\Discount\Handler();
-        $result    = array();
+        $result    = [];
         $Locale    = QUI::getLocale();
 
         $allowedFields = $Discounts->getChildAttributes();
 
-        $query  = array();
+        $query  = [];
         $params = json_decode($params, true);
         $fields = json_decode($fields, true);
 
         if (!is_array($fields)) {
-            $fields = array();
+            $fields = [];
         }
 
         if (isset($params['order'])) {
@@ -43,24 +43,24 @@ function ($fields, $params) {
                 continue;
             }
 
-            $query['where_or'][$field] = array(
+            $query['where_or'][$field] = [
                 'type'  => '%LIKE%',
                 'value' => $value
-            );
+            ];
         }
 
         // search
         $data = $Discounts->getChildrenData($query);
 
         foreach ($data as $entry) {
-            $entry['title'] = array(
+            $entry['title'] = [
                 'quiqqer/discount',
-                'discount.' . $entry['id'] . '.title'
-            );
+                'discount.'.$entry['id'].'.title'
+            ];
 
             $entry['text'] = $Locale->get(
                 'quiqqer/discount',
-                'discount.' . $entry['id'] . '.title'
+                'discount.'.$entry['id'].'.title'
             );
 
             $result[] = $entry;
@@ -72,6 +72,6 @@ function ($fields, $params) {
 
         return $result;
     },
-    array('fields', 'params'),
+    ['fields', 'params'],
     'Permission::checkAdminUser'
 );
diff --git a/ajax/toggle.php b/ajax/toggle.php
index ddfc0ebd7651e34b941cc2aa57b84ddde6f13b2e..da595f9bada0f6e63ae5265e392e8951053c7bad 100644
--- a/ajax/toggle.php
+++ b/ajax/toggle.php
@@ -26,6 +26,6 @@ function ($discountId) {
 
         return $Discount->isActive();
     },
-    array('discountId'),
+    ['discountId'],
     'Permission::checkAdminUser'
 );
diff --git a/ajax/update.php b/ajax/update.php
index d13deae70f4f49eccfc3f24479ed4b5cfb06fb4d..790782af429c5fef61ca11ff961c8f7efc39f44c 100644
--- a/ajax/update.php
+++ b/ajax/update.php
@@ -22,6 +22,6 @@ function ($discountId, $params) {
         $Discount->setAttributes($params);
         $Discount->update();
     },
-    array('discountId', 'params'),
+    ['discountId', 'params'],
     'Permission::checkAdminUser'
 );
diff --git a/bin/controls/DiscountEdit.html b/bin/controls/DiscountEdit.html
index e5f690e89259a5549228038115afe0c347479684..33177590df647b0ff185b6de3c5210eb43f80c7c 100644
--- a/bin/controls/DiscountEdit.html
+++ b/bin/controls/DiscountEdit.html
@@ -174,6 +174,7 @@
                         <option value="1">{{usageScopeEvery}}</option>
                         <option value="2">{{usageScopeTotal}}</option>
                         <option value="3">{{usageScopeUnique}}</option>
+                        <option value="4">{{usageScopeGrandTotal}}</option>
                     </select>
                 </label>
             </td>
diff --git a/bin/controls/DiscountEdit.js b/bin/controls/DiscountEdit.js
index bd60e790c061901cdb7273ce6d34a85640b237b7..f1f50b41253160b38f70b665b1dac850447aa0e9 100644
--- a/bin/controls/DiscountEdit.js
+++ b/bin/controls/DiscountEdit.js
@@ -77,11 +77,12 @@ define('package/quiqqer/discount/bin/controls/DiscountEdit', [
                 usageLastProductDiscount    : QUILocale.get(lg, 'control.edit.template.usageLastProductDiscount'),
                 usageLastProductDiscountDesc: QUILocale.get(lg, 'control.edit.template.usageLastProductDiscountDesc'),
 
-                usageScope      : QUILocale.get(lg, 'control.edit.template.usageScope'),
-                usageScopeEvery : QUILocale.get(lg, 'control.edit.template.usageScopeEvery'),
-                usageScopeTotal : QUILocale.get(lg, 'control.edit.template.usageScopeTotal'),
-                usageScopeUnique: QUILocale.get(lg, 'control.edit.template.usageScopeUnique'),
-                scopeDescription: QUILocale.get(lg, 'control.edit.template.usage.description'),
+                usageScope          : QUILocale.get(lg, 'control.edit.template.usageScope'),
+                usageScopeEvery     : QUILocale.get(lg, 'control.edit.template.usageScopeEvery'),
+                usageScopeTotal     : QUILocale.get(lg, 'control.edit.template.usageScopeTotal'),
+                usageScopeUnique    : QUILocale.get(lg, 'control.edit.template.usageScopeUnique'),
+                usageScopeGrandTotal: QUILocale.get(lg, 'control.edit.template.usageScopeGrandTotal'),
+                scopeDescription    : QUILocale.get(lg, 'control.edit.template.usage.description'),
 
                 calculationBasis          : QUILocale.get(lg, 'control.edit.template.calculationBasis'),
                 calculationBasisNetto     : QUILocale.get(lg, 'control.edit.template.calculationBasis.netto'),
diff --git a/locale.xml b/locale.xml
index 63970673def7e7ce39f29d3c6ad4dc5ed02c8782..1012c4ebb005bfbe38a0b340e7d2f0e9e057bfaf 100644
--- a/locale.xml
+++ b/locale.xml
@@ -245,6 +245,10 @@
             'For each product' and 'On one product (Unique)' is applied to the single price of the product.
             ]]></en>
         </locale>
+        <locale name="control.edit.template.usageScopeGrandTotal">
+            <de><![CDATA[Von Gesamtsumme abziehen]]></de>
+            <en><![CDATA[Deduct from grand total]]></en>
+        </locale>
 
         <locale name="control.edit.template.shopping.amount.of">
             <de><![CDATA[Einkaufsmenge von]]></de>
diff --git a/src/QUI/ERP/Discount/Discount.php b/src/QUI/ERP/Discount/Discount.php
index cf4eac7d0f695dd289ee8b8d685f264c09f5c994..e737981113f95fc5f77f3247c96e700eacb4713a 100644
--- a/src/QUI/ERP/Discount/Discount.php
+++ b/src/QUI/ERP/Discount/Discount.php
@@ -530,6 +530,10 @@ public function toPriceFactor($Locale = null, $Customer = null)
             $basis = QUI\ERP\Accounting\Calc::CALCULATION_BASIS_VAT_BRUTTO;
         }
 
+        if ($this->getAttribute('scope') === Handler::DISCOUNT_SCOPE_GRAND_TOTAL) {
+            $basis = QUI\ERP\Accounting\Calc::CALCULATION_GRAND_TOTAL;
+        }
+
         try {
             $Plugin = QUI::getPackage('quiqqer/products');
             $Config = $Plugin->getConfig();
diff --git a/src/QUI/ERP/Discount/Handler.php b/src/QUI/ERP/Discount/Handler.php
index 5d5a41bc2c67e8c1797542c16fc42aee26595f1b..9bcd281f99be1ea9e69afada95c527573168c91a 100644
--- a/src/QUI/ERP/Discount/Handler.php
+++ b/src/QUI/ERP/Discount/Handler.php
@@ -41,6 +41,13 @@ class Handler extends QUI\CRUD\Factory
      */
     const DISCOUNT_SCOPE_UNIQUE = 3;
 
+    /**
+     * discount scope -> grand total
+     * - ignoring vat calc
+     * - deduct from grand total
+     */
+    const DISCOUNT_SCOPE_GRAND_TOTAL = 4;
+
     /**
      * pricefactor discount type
      */
diff --git a/src/QUI/ERP/Discount/Utils.php b/src/QUI/ERP/Discount/Utils.php
index 1d13076e46bce8ba32a964906480d3aded987084..7cd5fd1811e877abfd69dc922cfba7950e8d2673 100644
--- a/src/QUI/ERP/Discount/Utils.php
+++ b/src/QUI/ERP/Discount/Utils.php
@@ -22,8 +22,10 @@ class Utils
      *
      * @param \QUI\Interfaces\Users\User $User
      * @return array
+     *
+     * @throws \QUI\Database\Exception
      */
-    public static function getUserDiscounts(UserInterface $User)
+    public static function getUserDiscounts(UserInterface $User): array
     {
         $guString = UserGroups::getUserGroupStringFromUser($User);
         $guString = ','.\str_replace(',', ',|,', $guString).',';
@@ -63,8 +65,10 @@ public static function getUserDiscounts(UserInterface $User)
      *
      * @param Product $Product
      * @return array
+     *
+     * @throws \QUI\Database\Exception
      */
-    public static function getProductDiscounts(Product $Product)
+    public static function getProductDiscounts(Product $Product): array
     {
         $result    = [];
         $Discounts = new Handler();
@@ -101,8 +105,10 @@ public static function getProductDiscounts(Product $Product)
      *
      * @param \QUI\Interfaces\Users\User $User
      * @return array
+     *
+     * @throws \QUI\Database\Exception
      */
-    public static function getActiveUserDiscounts(UserInterface $User)
+    public static function getActiveUserDiscounts(UserInterface $User): array
     {
         $guString = UserGroups::getUserGroupStringFromUser($User);
         $guString = ','.\str_replace(',', ',|,', $guString).',';
@@ -168,8 +174,10 @@ public static function getActiveUserDiscounts(UserInterface $User)
      *
      * @param \QUI\Interfaces\Users\User $User
      * @return array
+     *
+     * @throws \QUI\Database\Exception
      */
-    public static function getUsableUserDiscounts(UserInterface $User)
+    public static function getUsableUserDiscounts(UserInterface $User): array
     {
         $discounts = self::getActiveUserDiscounts($User);
         $result    = [];