Browse Source

fix(core): Correctly handle decimal percentages on promotion actions

Fixes #1773
Michael Bromley 3 years ago
parent
commit
41d46522d6

+ 39 - 0
packages/core/e2e/order-promotion.e2e-spec.ts

@@ -709,6 +709,45 @@ describe('Promotions applied to Orders', () => {
                 expect(applyCouponCode!.discounts[0].description).toBe('20% discount on order');
                 expect(applyCouponCode!.discounts[0].description).toBe('20% discount on order');
                 expect(applyCouponCode!.totalWithTax).toBe(4800);
                 expect(applyCouponCode!.totalWithTax).toBe(4800);
             });
             });
+
+            // https://github.com/vendure-ecommerce/vendure/issues/1773
+            it('decimal percentage', async () => {
+                const decimalPercentageCouponCode = 'DPCC';
+                await createPromotion({
+                    enabled: true,
+                    name: '10.5% discount on order',
+                    couponCode: decimalPercentageCouponCode,
+                    conditions: [],
+                    actions: [
+                        {
+                            code: orderPercentageDiscount.code,
+                            arguments: [{ name: 'discount', value: '10.5' }],
+                        },
+                    ],
+                });
+                shopClient.setChannelToken(E2E_DEFAULT_CHANNEL_TOKEN);
+                const { addItemToOrder } = await shopClient.query<
+                    AddItemToOrder.Mutation,
+                    AddItemToOrder.Variables
+                >(ADD_ITEM_TO_ORDER, {
+                    productVariantId: getVariantBySlug('item-5000').id,
+                    quantity: 1,
+                });
+                orderResultGuard.assertSuccess(addItemToOrder);
+                expect(addItemToOrder!.totalWithTax).toBe(6000);
+                expect(addItemToOrder!.discounts.length).toBe(0);
+
+                const { applyCouponCode } = await shopClient.query<
+                    ApplyCouponCode.Mutation,
+                    ApplyCouponCode.Variables
+                >(APPLY_COUPON_CODE, {
+                    couponCode: decimalPercentageCouponCode,
+                });
+                orderResultGuard.assertSuccess(applyCouponCode);
+                expect(applyCouponCode!.discounts.length).toBe(1);
+                expect(applyCouponCode!.discounts[0].description).toBe('10.5% discount on order');
+                expect(applyCouponCode!.totalWithTax).toBe(5370);
+            });
         });
         });
 
 
         describe('orderFixedDiscount', () => {
         describe('orderFixedDiscount', () => {

+ 1 - 1
packages/core/src/config/promotion/actions/facet-values-percentage-discount-action.ts

@@ -10,7 +10,7 @@ export const discountOnItemWithFacets = new PromotionItemAction({
     code: 'facet_based_discount',
     code: 'facet_based_discount',
     args: {
     args: {
         discount: {
         discount: {
-            type: 'int',
+            type: 'float',
             ui: {
             ui: {
                 component: 'number-form-input',
                 component: 'number-form-input',
                 suffix: '%',
                 suffix: '%',

+ 1 - 1
packages/core/src/config/promotion/actions/order-percentage-discount-action.ts

@@ -6,7 +6,7 @@ export const orderPercentageDiscount = new PromotionOrderAction({
     code: 'order_percentage_discount',
     code: 'order_percentage_discount',
     args: {
     args: {
         discount: {
         discount: {
-            type: 'int',
+            type: 'float',
             ui: {
             ui: {
                 component: 'number-form-input',
                 component: 'number-form-input',
                 suffix: '%',
                 suffix: '%',

+ 1 - 1
packages/core/src/config/promotion/actions/product-percentage-discount-action.ts

@@ -10,7 +10,7 @@ export const productsPercentageDiscount = new PromotionItemAction({
     description: [{ languageCode: LanguageCode.en, value: 'Discount specified products by { discount }%' }],
     description: [{ languageCode: LanguageCode.en, value: 'Discount specified products by { discount }%' }],
     args: {
     args: {
         discount: {
         discount: {
-            type: 'int',
+            type: 'float',
             ui: {
             ui: {
                 component: 'number-form-input',
                 component: 'number-form-input',
                 suffix: '%',
                 suffix: '%',