sahab-utils 1.8.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -949,6 +949,8 @@ export type WeatherData = {
949
949
  };
950
950
  export type PaymentConfigs = {
951
951
  isCashAllowed: boolean;
952
+ /** Sahab's surcharge on a cash order, in SAR. Missing, invalid or above MAX_CASH_FEE means no fee. */
953
+ cashFee?: number;
952
954
  isGooglePayAllowed?: boolean;
953
955
  /** Tap GoSell merchant id for card / Apple Pay SDK config (optional; falls back in app). */
954
956
  tapMerchantId?: string;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './constants/types';
2
2
  export * from './ts/broadcast';
3
3
  export * from './ts/calcs';
4
+ export * from './ts/cash';
4
5
  export * from './ts/cashback';
5
6
  export * from './ts/gifts';
6
7
  export * from './ts/iban';
package/dist/index.js CHANGED
@@ -17,6 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./constants/types"), exports);
18
18
  __exportStar(require("./ts/broadcast"), exports);
19
19
  __exportStar(require("./ts/calcs"), exports);
20
+ __exportStar(require("./ts/cash"), exports);
20
21
  __exportStar(require("./ts/cashback"), exports);
21
22
  __exportStar(require("./ts/gifts"), exports);
22
23
  __exportStar(require("./ts/iban"), exports);
@@ -0,0 +1,15 @@
1
+ import { Order, PaymentConfigs } from '../constants/types';
2
+ /** Cash payment — the shared rules. The fee is set from `payment_methods/configs`; the app only shows it
3
+ * and cloudFun is what charges it, so both must reach the same number from the same config. */
4
+ /** A fee above this is read as a typo (5000 for 5.00) and ignored rather than charged to customers. */
5
+ export declare const MAX_CASH_FEE = 50;
6
+ /** What the customer owes ignoring the cash fee, which comes from the payment method and would make a fully discounted order look unpaid. */
7
+ export declare const getOrderTotalWithoutCashFee: (order?: Partial<Order>) => number;
8
+ /** Nothing left to collect: a 100% promo, balance covering everything, or free services. */
9
+ export declare const isFreeOrder: (order?: Partial<Order>) => boolean;
10
+ /** The configured fee in SAR, or 0 when it is missing, not a number, negative or above `MAX_CASH_FEE`. */
11
+ export declare function resolveCashFee(configs?: Pick<PaymentConfigs, 'cashFee'> | null): number;
12
+ /** The fee this order would carry if paid in cash: none when there is nothing to collect. */
13
+ export declare function cashFeeForOrder(order: Partial<Order> | undefined, configs?: Pick<PaymentConfigs, 'cashFee'> | null): number;
14
+ /** A redeemed gift tops up its extras online only; cash is fine once the gift covers everything. */
15
+ export declare function isCashAllowedForOrder(order?: Partial<Order>): boolean;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isFreeOrder = exports.getOrderTotalWithoutCashFee = exports.MAX_CASH_FEE = void 0;
4
+ exports.resolveCashFee = resolveCashFee;
5
+ exports.cashFeeForOrder = cashFeeForOrder;
6
+ exports.isCashAllowedForOrder = isCashAllowedForOrder;
7
+ const types_1 = require("../constants/types");
8
+ const calcs_1 = require("./calcs");
9
+ const gifts_1 = require("./gifts");
10
+ /** Cash payment — the shared rules. The fee is set from `payment_methods/configs`; the app only shows it
11
+ * and cloudFun is what charges it, so both must reach the same number from the same config. */
12
+ /** A fee above this is read as a typo (5000 for 5.00) and ignored rather than charged to customers. */
13
+ exports.MAX_CASH_FEE = 50;
14
+ /** What the customer owes ignoring the cash fee, which comes from the payment method and would make a fully discounted order look unpaid. */
15
+ const getOrderTotalWithoutCashFee = (order) => (0, calcs_1.getCustomerTotalToPay)(Object.assign(Object.assign({}, (order || {})), { paymentType: types_1.OrderPaymentType.CREDIT, sahabExtraPaymentAmount: 0 }));
16
+ exports.getOrderTotalWithoutCashFee = getOrderTotalWithoutCashFee;
17
+ /** Nothing left to collect: a 100% promo, balance covering everything, or free services. */
18
+ const isFreeOrder = (order) => (0, exports.getOrderTotalWithoutCashFee)(order) <= 0;
19
+ exports.isFreeOrder = isFreeOrder;
20
+ /** The configured fee in SAR, or 0 when it is missing, not a number, negative or above `MAX_CASH_FEE`. */
21
+ function resolveCashFee(configs) {
22
+ const fee = Number(configs === null || configs === void 0 ? void 0 : configs.cashFee);
23
+ if (!Number.isFinite(fee) || fee <= 0 || fee > exports.MAX_CASH_FEE)
24
+ return 0;
25
+ return Math.round(fee * 100) / 100;
26
+ }
27
+ /** The fee this order would carry if paid in cash: none when there is nothing to collect. */
28
+ function cashFeeForOrder(order, configs) {
29
+ return (0, exports.isFreeOrder)(order) ? 0 : resolveCashFee(configs);
30
+ }
31
+ /** A redeemed gift tops up its extras online only; cash is fine once the gift covers everything. */
32
+ function isCashAllowedForOrder(order) {
33
+ return !((0, gifts_1.isGiftRedemption)(order) && !(0, exports.isFreeOrder)(order));
34
+ }
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "sahab-utils",
3
- "version": "1.8.0",
3
+ "version": "1.8.1",
4
4
  "description": "This package contains types and utils functions",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
8
8
  "build": "tsc",
9
9
  "deploy": "npm run build && npm publish",
10
- "test": "npm run build && node tests/loyalty.test.js && node tests/gifts.test.js && node tests/cashback.test.js && node tests/utils.test.js && node tests/wheel.test.js && node tests/calcs.test.js && node tests/orderActivity.test.js && node tests/push.test.js && node tests/broadcast.test.js && node tests/iban.test.js"
10
+ "test": "npm run build && node tests/loyalty.test.js && node tests/gifts.test.js && node tests/cashback.test.js && node tests/utils.test.js && node tests/wheel.test.js && node tests/calcs.test.js && node tests/orderActivity.test.js && node tests/push.test.js && node tests/broadcast.test.js && node tests/iban.test.js && node tests/cash.test.js"
11
11
  },
12
12
  "repository": {
13
13
  "type": "git",