@adtrackify/at-service-common 4.0.3 → 4.0.5

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.
Files changed (125) hide show
  1. package/dist/cjs/__tests__/db/products-db-service.spec.d.ts +1 -0
  2. package/dist/cjs/__tests__/db/products-db-service.spec.js +90 -0
  3. package/dist/cjs/__tests__/db/products-db-service.spec.js.map +1 -0
  4. package/dist/cjs/__tests__/services/cost/cost-calculation-types.spec.d.ts +1 -0
  5. package/dist/cjs/__tests__/services/cost/cost-calculation-types.spec.js +24 -0
  6. package/dist/cjs/__tests__/services/cost/cost-calculation-types.spec.js.map +1 -0
  7. package/dist/cjs/__tests__/services/cost/cost-calculator-service.spec.d.ts +1 -0
  8. package/dist/cjs/__tests__/services/cost/cost-calculator-service.spec.js +3320 -0
  9. package/dist/cjs/__tests__/services/cost/cost-calculator-service.spec.js.map +1 -0
  10. package/dist/cjs/__tests__/services/cost/cost-currency-service.spec.d.ts +1 -0
  11. package/dist/cjs/__tests__/services/cost/cost-currency-service.spec.js +115 -0
  12. package/dist/cjs/__tests__/services/cost/cost-currency-service.spec.js.map +1 -0
  13. package/dist/cjs/__tests__/services/cost/cost-filter-service.spec.d.ts +1 -0
  14. package/dist/cjs/__tests__/services/cost/cost-filter-service.spec.js +469 -0
  15. package/dist/cjs/__tests__/services/cost/cost-filter-service.spec.js.map +1 -0
  16. package/dist/cjs/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.d.ts +1 -0
  17. package/dist/cjs/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.js +207 -0
  18. package/dist/cjs/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.js.map +1 -0
  19. package/dist/cjs/__tests__/services/currency-exchange-rate-lookup-service.spec.d.ts +1 -0
  20. package/dist/cjs/__tests__/services/currency-exchange-rate-lookup-service.spec.js +35 -0
  21. package/dist/cjs/__tests__/services/currency-exchange-rate-lookup-service.spec.js.map +1 -0
  22. package/dist/cjs/services/cost/cost-calculation-types.d.ts +69 -0
  23. package/dist/cjs/services/cost/cost-calculation-types.js +20 -0
  24. package/dist/cjs/services/cost/cost-calculation-types.js.map +1 -0
  25. package/dist/cjs/services/cost/cost-calculator-service.d.ts +24 -0
  26. package/dist/cjs/services/cost/cost-calculator-service.js +457 -0
  27. package/dist/cjs/services/cost/cost-calculator-service.js.map +1 -0
  28. package/dist/cjs/services/cost/cost-currency-service.d.ts +6 -0
  29. package/dist/cjs/services/cost/cost-currency-service.js +88 -0
  30. package/dist/cjs/services/cost/cost-currency-service.js.map +1 -0
  31. package/dist/cjs/services/cost/cost-filter-service.d.ts +10 -0
  32. package/dist/cjs/services/cost/cost-filter-service.js +122 -0
  33. package/dist/cjs/services/cost/cost-filter-service.js.map +1 -0
  34. package/dist/cjs/services/cost/index.d.ts +5 -0
  35. package/dist/cjs/services/cost/index.js +22 -0
  36. package/dist/cjs/services/cost/index.js.map +1 -0
  37. package/dist/cjs/services/cost/order-cost/index.d.ts +2 -0
  38. package/dist/cjs/services/cost/order-cost/index.js +19 -0
  39. package/dist/cjs/services/cost/order-cost/index.js.map +1 -0
  40. package/dist/cjs/services/cost/order-cost/order-cost-resolution-service.d.ts +23 -0
  41. package/dist/cjs/services/cost/order-cost/order-cost-resolution-service.js +362 -0
  42. package/dist/cjs/services/cost/order-cost/order-cost-resolution-service.js.map +1 -0
  43. package/dist/cjs/services/cost/order-cost/order-cost-resolution-types.d.ts +37 -0
  44. package/dist/cjs/services/cost/order-cost/order-cost-resolution-types.js +3 -0
  45. package/dist/cjs/services/cost/order-cost/order-cost-resolution-types.js.map +1 -0
  46. package/dist/cjs/services/currency-exchange-rate-lookup-service.d.ts +2 -1
  47. package/dist/cjs/services/currency-exchange-rate-lookup-service.js +28 -0
  48. package/dist/cjs/services/currency-exchange-rate-lookup-service.js.map +1 -1
  49. package/dist/cjs/services/db/identity-cache-dynamodb-service.js +1 -1
  50. package/dist/cjs/services/db/identity-cache-dynamodb-service.js.map +1 -1
  51. package/dist/cjs/services/db/index.d.ts +2 -0
  52. package/dist/cjs/services/db/index.js +2 -0
  53. package/dist/cjs/services/db/index.js.map +1 -1
  54. package/dist/cjs/services/db/products-db-service-types.d.ts +10 -0
  55. package/dist/cjs/services/db/products-db-service-types.js +3 -0
  56. package/dist/cjs/services/db/products-db-service-types.js.map +1 -0
  57. package/dist/cjs/services/db/products-db-service.d.ts +19 -0
  58. package/dist/cjs/services/db/products-db-service.js +282 -0
  59. package/dist/cjs/services/db/products-db-service.js.map +1 -0
  60. package/dist/cjs/services/index.d.ts +1 -0
  61. package/dist/cjs/services/index.js +1 -0
  62. package/dist/cjs/services/index.js.map +1 -1
  63. package/dist/esm/__tests__/db/products-db-service.spec.d.ts +1 -0
  64. package/dist/esm/__tests__/db/products-db-service.spec.js +88 -0
  65. package/dist/esm/__tests__/db/products-db-service.spec.js.map +1 -0
  66. package/dist/esm/__tests__/services/cost/cost-calculation-types.spec.d.ts +1 -0
  67. package/dist/esm/__tests__/services/cost/cost-calculation-types.spec.js +22 -0
  68. package/dist/esm/__tests__/services/cost/cost-calculation-types.spec.js.map +1 -0
  69. package/dist/esm/__tests__/services/cost/cost-calculator-service.spec.d.ts +1 -0
  70. package/dist/esm/__tests__/services/cost/cost-calculator-service.spec.js +3318 -0
  71. package/dist/esm/__tests__/services/cost/cost-calculator-service.spec.js.map +1 -0
  72. package/dist/esm/__tests__/services/cost/cost-currency-service.spec.d.ts +1 -0
  73. package/dist/esm/__tests__/services/cost/cost-currency-service.spec.js +113 -0
  74. package/dist/esm/__tests__/services/cost/cost-currency-service.spec.js.map +1 -0
  75. package/dist/esm/__tests__/services/cost/cost-filter-service.spec.d.ts +1 -0
  76. package/dist/esm/__tests__/services/cost/cost-filter-service.spec.js +467 -0
  77. package/dist/esm/__tests__/services/cost/cost-filter-service.spec.js.map +1 -0
  78. package/dist/esm/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.d.ts +1 -0
  79. package/dist/esm/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.js +205 -0
  80. package/dist/esm/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.js.map +1 -0
  81. package/dist/esm/__tests__/services/currency-exchange-rate-lookup-service.spec.d.ts +1 -0
  82. package/dist/esm/__tests__/services/currency-exchange-rate-lookup-service.spec.js +33 -0
  83. package/dist/esm/__tests__/services/currency-exchange-rate-lookup-service.spec.js.map +1 -0
  84. package/dist/esm/services/cost/cost-calculation-types.d.ts +69 -0
  85. package/dist/esm/services/cost/cost-calculation-types.js +16 -0
  86. package/dist/esm/services/cost/cost-calculation-types.js.map +1 -0
  87. package/dist/esm/services/cost/cost-calculator-service.d.ts +24 -0
  88. package/dist/esm/services/cost/cost-calculator-service.js +451 -0
  89. package/dist/esm/services/cost/cost-calculator-service.js.map +1 -0
  90. package/dist/esm/services/cost/cost-currency-service.d.ts +6 -0
  91. package/dist/esm/services/cost/cost-currency-service.js +85 -0
  92. package/dist/esm/services/cost/cost-currency-service.js.map +1 -0
  93. package/dist/esm/services/cost/cost-filter-service.d.ts +10 -0
  94. package/dist/esm/services/cost/cost-filter-service.js +119 -0
  95. package/dist/esm/services/cost/cost-filter-service.js.map +1 -0
  96. package/dist/esm/services/cost/index.d.ts +5 -0
  97. package/dist/esm/services/cost/index.js +6 -0
  98. package/dist/esm/services/cost/index.js.map +1 -0
  99. package/dist/esm/services/cost/order-cost/index.d.ts +2 -0
  100. package/dist/esm/services/cost/order-cost/index.js +3 -0
  101. package/dist/esm/services/cost/order-cost/index.js.map +1 -0
  102. package/dist/esm/services/cost/order-cost/order-cost-resolution-service.d.ts +23 -0
  103. package/dist/esm/services/cost/order-cost/order-cost-resolution-service.js +356 -0
  104. package/dist/esm/services/cost/order-cost/order-cost-resolution-service.js.map +1 -0
  105. package/dist/esm/services/cost/order-cost/order-cost-resolution-types.d.ts +37 -0
  106. package/dist/esm/services/cost/order-cost/order-cost-resolution-types.js +2 -0
  107. package/dist/esm/services/cost/order-cost/order-cost-resolution-types.js.map +1 -0
  108. package/dist/esm/services/currency-exchange-rate-lookup-service.d.ts +2 -1
  109. package/dist/esm/services/currency-exchange-rate-lookup-service.js +28 -0
  110. package/dist/esm/services/currency-exchange-rate-lookup-service.js.map +1 -1
  111. package/dist/esm/services/db/identity-cache-dynamodb-service.js +1 -1
  112. package/dist/esm/services/db/identity-cache-dynamodb-service.js.map +1 -1
  113. package/dist/esm/services/db/index.d.ts +2 -0
  114. package/dist/esm/services/db/index.js +2 -0
  115. package/dist/esm/services/db/index.js.map +1 -1
  116. package/dist/esm/services/db/products-db-service-types.d.ts +10 -0
  117. package/dist/esm/services/db/products-db-service-types.js +2 -0
  118. package/dist/esm/services/db/products-db-service-types.js.map +1 -0
  119. package/dist/esm/services/db/products-db-service.d.ts +19 -0
  120. package/dist/esm/services/db/products-db-service.js +278 -0
  121. package/dist/esm/services/db/products-db-service.js.map +1 -0
  122. package/dist/esm/services/index.d.ts +1 -0
  123. package/dist/esm/services/index.js +1 -0
  124. package/dist/esm/services/index.js.map +1 -1
  125. package/package.json +1 -1
@@ -0,0 +1,451 @@
1
+ import Big from 'big.js';
2
+ import { DateTime } from 'luxon';
3
+ import { Logger } from '../../helpers/logging-helper.js';
4
+ import { ORDER_COST_ENTRY_TYPE, SHIPPING_METHOD, SHIPPING_RATE_TYPE, WEIGHT_UNIT, } from '@adtrackify/at-tracking-event-types';
5
+ import { normalizeCategory, } from './cost-calculation-types.js';
6
+ import { COST_CATEGORY } from '@adtrackify/at-tracking-event-types';
7
+ import { CostFilterService } from './cost-filter-service.js';
8
+ import { CostCurrencyService } from './cost-currency-service.js';
9
+ const WEIGHT_CONVERSION = {
10
+ [WEIGHT_UNIT.GRAMS]: 1,
11
+ [WEIGHT_UNIT.KILOGRAMS]: 1000,
12
+ [WEIGHT_UNIT.OUNCES]: 28.3495,
13
+ [WEIGHT_UNIT.POUNDS]: 453.592,
14
+ };
15
+ export const CostCalculatorService = {
16
+ isDateInRange: (orderDate, effectiveFrom, effectiveTo) => {
17
+ try {
18
+ const orderDt = DateTime.fromISO(orderDate);
19
+ if (!orderDt.isValid)
20
+ return true;
21
+ if (effectiveFrom) {
22
+ const fromDt = DateTime.fromISO(effectiveFrom);
23
+ if (fromDt.isValid && orderDt < fromDt)
24
+ return false;
25
+ }
26
+ if (effectiveTo) {
27
+ const toDt = DateTime.fromISO(effectiveTo);
28
+ if (toDt.isValid && orderDt > toDt)
29
+ return false;
30
+ }
31
+ return true;
32
+ }
33
+ catch (error) {
34
+ Logger.error('CostCalculatorService.isDateInRange: failed', { error, orderDate, effectiveFrom, effectiveTo });
35
+ return true;
36
+ }
37
+ },
38
+ findMatchingWeightTierAmount: (tiers, weightGrams, weightUnit) => {
39
+ try {
40
+ if (!tiers?.length)
41
+ return 0;
42
+ const targetWeight = weightUnit ? weightGrams / (WEIGHT_CONVERSION[weightUnit] ?? 1) : weightGrams;
43
+ for (const tier of tiers) {
44
+ const isAboveMin = targetWeight >= tier.weightMin;
45
+ const isBelowMax = tier.weightMax === null || targetWeight <= tier.weightMax;
46
+ if (isAboveMin && isBelowMax) {
47
+ return tier.flatAmount ?? 0;
48
+ }
49
+ }
50
+ return 0;
51
+ }
52
+ catch (error) {
53
+ Logger.error('CostCalculatorService.findMatchingWeightTierAmount: failed', { error, weightGrams, weightUnit, tierCount: tiers?.length });
54
+ return 0;
55
+ }
56
+ },
57
+ findQuantityTierAmount: (tiers, quantity) => {
58
+ try {
59
+ if (!tiers?.length)
60
+ return 0;
61
+ for (const tier of tiers) {
62
+ const isAboveMin = quantity >= tier.quantityMin;
63
+ const isBelowMax = tier.quantityMax === null || quantity <= tier.quantityMax;
64
+ if (isAboveMin && isBelowMax) {
65
+ return tier.flatAmount ?? 0;
66
+ }
67
+ }
68
+ return 0;
69
+ }
70
+ catch (error) {
71
+ Logger.error('CostCalculatorService.findQuantityTierAmount: failed', { error, quantity, tierCount: tiers?.length });
72
+ return 0;
73
+ }
74
+ },
75
+ calculateHandlingCost: (configs, lineItems, lineItemCosts, orderCurrency, exchangeRatesMap) => {
76
+ try {
77
+ const fee = configs.globalProductOverride?.globalHandlingFee ?? 0;
78
+ if (!fee)
79
+ return 0;
80
+ const configCurrency = configs.globalProductOverride?.currency;
81
+ const convertedFee = configCurrency
82
+ ? CostCurrencyService.convertAmount(fee, configCurrency, orderCurrency, exchangeRatesMap)
83
+ : fee;
84
+ let total = new Big(0);
85
+ for (const li of lineItems) {
86
+ total = total.plus(convertedFee);
87
+ if (lineItemCosts[li.lineItemId]) {
88
+ lineItemCosts[li.lineItemId].totalLineItemHandlingCost = new Big(lineItemCosts[li.lineItemId].totalLineItemHandlingCost)
89
+ .plus(convertedFee)
90
+ .toNumber();
91
+ }
92
+ }
93
+ return total.toNumber();
94
+ }
95
+ catch (error) {
96
+ Logger.error('CostCalculatorService.calculateHandlingCost: failed', { error, configs, orderCurrency, lineItemCount: lineItems.length });
97
+ return 0;
98
+ }
99
+ },
100
+ calculateGatewayCost: (configs, orderGateways, totalPrice, orderCreatedAt, orderCurrency, exchangeRatesMap) => {
101
+ try {
102
+ const gatewayConfig = configs.gateway;
103
+ if (!gatewayConfig?.entries?.length)
104
+ return 0;
105
+ const normalizedOrderGateways = orderGateways.map((g) => g.toLowerCase());
106
+ const matchingEntry = gatewayConfig.entries.find((entry) => {
107
+ const gatewayMatches = normalizedOrderGateways.includes(entry.gatewayName.toLowerCase());
108
+ const dateValid = CostCalculatorService.isDateInRange(orderCreatedAt, entry.effectiveFrom, entry.effectiveTo);
109
+ return gatewayMatches && dateValid;
110
+ });
111
+ if (!matchingEntry)
112
+ return 0;
113
+ const rawFlatAmount = matchingEntry.flatAmount ?? 0;
114
+ const convertedFlatAmount = CostCurrencyService.convertAmount(rawFlatAmount, matchingEntry.currency, orderCurrency, exchangeRatesMap);
115
+ const flatAmount = new Big(convertedFlatAmount);
116
+ const percentAmount = new Big(totalPrice).times(matchingEntry.percentRate ?? 0).div(100);
117
+ return flatAmount.plus(percentAmount).toNumber();
118
+ }
119
+ catch (error) {
120
+ Logger.error('CostCalculatorService.calculateGatewayCost: failed', { error, configs, orderCurrency, orderGateways, totalPrice, orderCreatedAt });
121
+ return 0;
122
+ }
123
+ },
124
+ findMatchingShippingProfile: (profiles, shipCountryCode, orderCreatedAt, orderFilterContext) => {
125
+ try {
126
+ if (!profiles?.length)
127
+ return null;
128
+ let defaultProfile = null;
129
+ for (const profile of profiles) {
130
+ if (!CostCalculatorService.isDateInRange(orderCreatedAt, profile.effectiveFrom, profile.effectiveTo)) {
131
+ continue;
132
+ }
133
+ if (profile.filters && orderFilterContext && !CostFilterService.matchesFilters(profile.filters, orderFilterContext, null)) {
134
+ continue;
135
+ }
136
+ if (profile.isDefault) {
137
+ defaultProfile = profile;
138
+ }
139
+ if (shipCountryCode && profile.countries?.length) {
140
+ const normalizedCountry = shipCountryCode.toLowerCase();
141
+ const countryMatches = profile.countries.some((c) => c.toLowerCase() === normalizedCountry);
142
+ if (countryMatches) {
143
+ return profile;
144
+ }
145
+ }
146
+ }
147
+ return defaultProfile;
148
+ }
149
+ catch (error) {
150
+ Logger.error('CostCalculatorService.findMatchingShippingProfile: failed', { error, shipCountryCode });
151
+ return null;
152
+ }
153
+ },
154
+ calculateShippingCost: (configs, shopifyShippingAmount, shipCountryCode, totalWeightGrams, orderCreatedAt, orderCurrency, exchangeRatesMap, orderFilterContext) => {
155
+ try {
156
+ const shippingConfig = configs.shipping;
157
+ if (!shippingConfig)
158
+ return 0;
159
+ switch (shippingConfig.method) {
160
+ case SHIPPING_METHOD.SHOPIFY_CHARGES:
161
+ return shopifyShippingAmount;
162
+ case SHIPPING_METHOD.FIXED_RATE: {
163
+ const fixedAmount = shippingConfig.fixedRateAmount ?? 0;
164
+ return CostCurrencyService.convertAmount(fixedAmount, shippingConfig.currency, orderCurrency, exchangeRatesMap);
165
+ }
166
+ case SHIPPING_METHOD.SHIPPING_PROFILES: {
167
+ const profile = CostCalculatorService.findMatchingShippingProfile(shippingConfig.profiles, shipCountryCode, orderCreatedAt, orderFilterContext);
168
+ if (!profile)
169
+ return 0;
170
+ if (profile.rateType === SHIPPING_RATE_TYPE.FLAT) {
171
+ const flatAmount = profile.flatAmount ?? 0;
172
+ return CostCurrencyService.convertAmount(flatAmount, profile.currency, orderCurrency, exchangeRatesMap);
173
+ }
174
+ if (profile.rateType === SHIPPING_RATE_TYPE.WEIGHT_TIERED) {
175
+ const tierAmount = CostCalculatorService.findMatchingWeightTierAmount(profile.weightTiers, totalWeightGrams, profile.weightUnit);
176
+ return CostCurrencyService.convertAmount(tierAmount, profile.currency, orderCurrency, exchangeRatesMap);
177
+ }
178
+ return 0;
179
+ }
180
+ default:
181
+ return 0;
182
+ }
183
+ }
184
+ catch (error) {
185
+ Logger.error('CostCalculatorService.calculateShippingCost: failed', { error, configs, orderCurrency, shipCountryCode, totalWeightGrams });
186
+ return 0;
187
+ }
188
+ },
189
+ calculateOtherCostEntry: (entry, context, lineItemCosts, orderCurrency, exchangeRatesMap) => {
190
+ const defaultResult = { orderLevel: 0, lineItemLevel: 0 };
191
+ try {
192
+ let orderLevelCost = new Big(0);
193
+ let lineItemLevelCost = new Big(0);
194
+ const { orderFilterContext, lineItems, totalWeight, totalQuantity, hasRefund, totalProductCost, totalShipping, totalPrice, grossSalePrice, netSalePrice } = context;
195
+ if (!CostFilterService.matchesFilters(entry.filters, orderFilterContext, null, lineItems.map(li => li.filterContext))) {
196
+ return defaultResult;
197
+ }
198
+ const convertFlat = (amount) => CostCurrencyService.convertAmount(amount, entry.currency, orderCurrency, exchangeRatesMap);
199
+ switch (entry.type) {
200
+ case ORDER_COST_ENTRY_TYPE.PER_ORDER:
201
+ orderLevelCost = new Big(convertFlat(entry.flatAmount ?? 0));
202
+ break;
203
+ case ORDER_COST_ENTRY_TYPE.PER_LINE_ITEM:
204
+ for (const li of lineItems) {
205
+ if (CostFilterService.matchesFilters(entry.filters, orderFilterContext, li.filterContext)) {
206
+ const amount = new Big(convertFlat(entry.flatAmount ?? 0)).times(li.quantity);
207
+ lineItemLevelCost = lineItemLevelCost.plus(amount);
208
+ if (lineItemCosts[li.lineItemId]) {
209
+ lineItemCosts[li.lineItemId].totalLineItemOtherCost = new Big(lineItemCosts[li.lineItemId].totalLineItemOtherCost)
210
+ .plus(amount)
211
+ .toNumber();
212
+ }
213
+ }
214
+ }
215
+ break;
216
+ case ORDER_COST_ENTRY_TYPE.BY_ORDER_WEIGHT: {
217
+ if (entry.weightIntervals?.length) {
218
+ const tierAmount = CostCalculatorService.findMatchingWeightTierAmount(entry.weightIntervals, totalWeight, entry.weightUnit);
219
+ orderLevelCost = new Big(convertFlat(tierAmount));
220
+ }
221
+ else {
222
+ const weightInUnit = entry.weightUnit
223
+ ? totalWeight / (WEIGHT_CONVERSION[entry.weightUnit] ?? 1)
224
+ : totalWeight;
225
+ orderLevelCost = new Big(convertFlat(entry.flatAmount ?? 0)).times(weightInUnit);
226
+ }
227
+ break;
228
+ }
229
+ case ORDER_COST_ENTRY_TYPE.BY_LINE_ITEM_QUANTITY:
230
+ for (const li of lineItems) {
231
+ if (CostFilterService.matchesFilters(entry.filters, orderFilterContext, li.filterContext)) {
232
+ let amount;
233
+ if (entry.quantityIntervals?.length) {
234
+ const tierAmount = CostCalculatorService.findQuantityTierAmount(entry.quantityIntervals, li.quantity);
235
+ amount = new Big(convertFlat(tierAmount));
236
+ }
237
+ else {
238
+ amount = new Big(convertFlat(entry.flatAmount ?? 0)).times(li.quantity);
239
+ }
240
+ lineItemLevelCost = lineItemLevelCost.plus(amount);
241
+ if (lineItemCosts[li.lineItemId]) {
242
+ lineItemCosts[li.lineItemId].totalLineItemOtherCost = new Big(lineItemCosts[li.lineItemId].totalLineItemOtherCost)
243
+ .plus(amount)
244
+ .toNumber();
245
+ }
246
+ }
247
+ }
248
+ break;
249
+ case ORDER_COST_ENTRY_TYPE.BY_ORDER_QUANTITY:
250
+ if (entry.quantityIntervals?.length) {
251
+ const tierAmount = CostCalculatorService.findQuantityTierAmount(entry.quantityIntervals, totalQuantity);
252
+ orderLevelCost = new Big(convertFlat(tierAmount));
253
+ }
254
+ else {
255
+ orderLevelCost = new Big(convertFlat(entry.flatAmount ?? 0)).times(totalQuantity);
256
+ }
257
+ break;
258
+ case ORDER_COST_ENTRY_TYPE.PER_REFUND_ORDER:
259
+ if (hasRefund) {
260
+ orderLevelCost = new Big(convertFlat(entry.flatAmount ?? 0));
261
+ }
262
+ break;
263
+ case ORDER_COST_ENTRY_TYPE.PER_REFUND_LINE_ITEM:
264
+ for (const li of lineItems) {
265
+ if (li.refundedQuantity > 0 && CostFilterService.matchesFilters(entry.filters, orderFilterContext, li.filterContext)) {
266
+ const amount = new Big(convertFlat(entry.flatAmount ?? 0)).times(li.refundedQuantity);
267
+ lineItemLevelCost = lineItemLevelCost.plus(amount);
268
+ if (lineItemCosts[li.lineItemId]) {
269
+ lineItemCosts[li.lineItemId].totalLineItemOtherCost = new Big(lineItemCosts[li.lineItemId].totalLineItemOtherCost)
270
+ .plus(amount)
271
+ .toNumber();
272
+ }
273
+ }
274
+ }
275
+ break;
276
+ case ORDER_COST_ENTRY_TYPE.PCT_COGS:
277
+ orderLevelCost = new Big(totalProductCost).times(entry.percentRate ?? 0).div(100);
278
+ break;
279
+ case ORDER_COST_ENTRY_TYPE.PCT_SHIPPING:
280
+ orderLevelCost = new Big(totalShipping).times(entry.percentRate ?? 0).div(100);
281
+ break;
282
+ case ORDER_COST_ENTRY_TYPE.PCT_TOTAL_SALES:
283
+ orderLevelCost = new Big(totalPrice).times(entry.percentRate ?? 0).div(100);
284
+ break;
285
+ case ORDER_COST_ENTRY_TYPE.PCT_GROSS_SALES:
286
+ orderLevelCost = new Big(grossSalePrice).times(entry.percentRate ?? 0).div(100);
287
+ break;
288
+ case ORDER_COST_ENTRY_TYPE.PCT_NET_SALES:
289
+ orderLevelCost = new Big(netSalePrice).times(entry.percentRate ?? 0).div(100);
290
+ break;
291
+ default:
292
+ break;
293
+ }
294
+ return { orderLevel: orderLevelCost.toNumber(), lineItemLevel: lineItemLevelCost.toNumber() };
295
+ }
296
+ catch (error) {
297
+ Logger.error('CostCalculatorService.calculateOtherCostEntry: failed', { error, entry, orderCurrency });
298
+ return defaultResult;
299
+ }
300
+ },
301
+ calculateOtherCost: (configs, context, lineItemCosts, orderCurrency, exchangeRatesMap) => {
302
+ const defaultCategoryCosts = {
303
+ totalOtherCogs: 0,
304
+ otherFulfillmentCost: 0,
305
+ otherTransactionCost: 0,
306
+ marketingCost: 0,
307
+ agencyFeesCost: 0,
308
+ opexCost: 0,
309
+ totalOtherCost: 0,
310
+ };
311
+ const defaultResult = { orderLevel: 0, lineItemLevel: 0, total: 0, categoryCosts: defaultCategoryCosts };
312
+ try {
313
+ const orderConfig = configs.order;
314
+ if (!orderConfig?.entries?.length)
315
+ return defaultResult;
316
+ let orderLevelTotal = new Big(0);
317
+ let lineItemLevelTotal = new Big(0);
318
+ const categoryCosts = { ...defaultCategoryCosts };
319
+ for (const entry of orderConfig.entries) {
320
+ if (!CostCalculatorService.isDateInRange(context.orderCreatedAt, entry.effectiveFrom, entry.effectiveTo)) {
321
+ continue;
322
+ }
323
+ try {
324
+ const entryCost = CostCalculatorService.calculateOtherCostEntry(entry, context, lineItemCosts, orderCurrency, exchangeRatesMap);
325
+ const entryTotal = entryCost.orderLevel + entryCost.lineItemLevel;
326
+ orderLevelTotal = orderLevelTotal.plus(entryCost.orderLevel);
327
+ lineItemLevelTotal = lineItemLevelTotal.plus(entryCost.lineItemLevel);
328
+ const category = normalizeCategory(entry.category);
329
+ switch (category) {
330
+ case COST_CATEGORY.COGS:
331
+ categoryCosts.totalOtherCogs += entryTotal;
332
+ break;
333
+ case COST_CATEGORY.FULFILLMENT:
334
+ categoryCosts.otherFulfillmentCost += entryTotal;
335
+ break;
336
+ case COST_CATEGORY.TRANSACTION:
337
+ categoryCosts.otherTransactionCost += entryTotal;
338
+ break;
339
+ case COST_CATEGORY.MARKETING:
340
+ categoryCosts.marketingCost += entryTotal;
341
+ break;
342
+ case COST_CATEGORY.AGENCY_FEES:
343
+ categoryCosts.agencyFeesCost += entryTotal;
344
+ break;
345
+ case COST_CATEGORY.OPEX:
346
+ categoryCosts.opexCost += entryTotal;
347
+ break;
348
+ case COST_CATEGORY.OTHER:
349
+ default:
350
+ categoryCosts.totalOtherCost += entryTotal;
351
+ break;
352
+ }
353
+ }
354
+ catch (entryError) {
355
+ Logger.warn('CostCalculatorService.calculateOtherCost: entry failed', {
356
+ error: entryError,
357
+ entryId: entry.id,
358
+ category: entry.category,
359
+ });
360
+ }
361
+ }
362
+ return {
363
+ orderLevel: orderLevelTotal.toNumber(),
364
+ lineItemLevel: lineItemLevelTotal.toNumber(),
365
+ total: orderLevelTotal.plus(lineItemLevelTotal).toNumber(),
366
+ categoryCosts,
367
+ };
368
+ }
369
+ catch (error) {
370
+ Logger.error('CostCalculatorService.calculateOtherCost: failed', { error, configs, orderCurrency });
371
+ return defaultResult;
372
+ }
373
+ },
374
+ calculateLineItemHandlingCosts: (lineItems) => {
375
+ try {
376
+ const result = {};
377
+ for (const li of lineItems) {
378
+ const handlingFee = li.variantHandlingFee ?? 0;
379
+ result[li.lineItemId] = new Big(handlingFee).times(li.quantity).toNumber();
380
+ }
381
+ return result;
382
+ }
383
+ catch (error) {
384
+ Logger.error('CostCalculatorService.calculateLineItemHandlingCosts: failed', { error, lineItemCount: lineItems.length });
385
+ return {};
386
+ }
387
+ },
388
+ calculateOrderCosts: (configs, context, orderCurrency, exchangeRatesMap) => {
389
+ const defaultCategoryCosts = {
390
+ totalOtherCogs: 0,
391
+ otherFulfillmentCost: 0,
392
+ otherTransactionCost: 0,
393
+ marketingCost: 0,
394
+ agencyFeesCost: 0,
395
+ opexCost: 0,
396
+ totalOtherCost: 0,
397
+ };
398
+ const defaultResult = {
399
+ orderLevelHandlingCost: 0,
400
+ lineItemLevelHandlingCost: 0,
401
+ totalHandlingCost: 0,
402
+ orderLevelOtherCost: 0,
403
+ lineItemLevelOtherCost: 0,
404
+ totalOtherCost: 0,
405
+ totalGatewayCost: 0,
406
+ totalShippingCost: 0,
407
+ lineItemCosts: {},
408
+ categoryCosts: defaultCategoryCosts,
409
+ };
410
+ if (!configs) {
411
+ return defaultResult;
412
+ }
413
+ try {
414
+ const lineItemCosts = {};
415
+ for (const li of context.lineItems) {
416
+ lineItemCosts[li.lineItemId] = { totalLineItemHandlingCost: 0, totalLineItemOtherCost: 0 };
417
+ }
418
+ const lineItemHandlingCosts = CostCalculatorService.calculateLineItemHandlingCosts(context.lineItems);
419
+ for (const [lineItemId, handlingCost] of Object.entries(lineItemHandlingCosts)) {
420
+ if (lineItemCosts[lineItemId]) {
421
+ lineItemCosts[lineItemId].totalLineItemHandlingCost = handlingCost;
422
+ }
423
+ }
424
+ CostCalculatorService.calculateHandlingCost(configs, context.lineItems, lineItemCosts, orderCurrency, exchangeRatesMap);
425
+ const lineItemLevelHandlingCost = Object.values(lineItemCosts).reduce((sum, li) => new Big(sum).plus(li.totalLineItemHandlingCost).toNumber(), 0);
426
+ const orderLevelHandlingCost = 0;
427
+ const totalHandlingCost = orderLevelHandlingCost + lineItemLevelHandlingCost;
428
+ const totalGatewayCost = CostCalculatorService.calculateGatewayCost(configs, context.orderFilterContext.paymentGateways, context.totalPrice, context.orderCreatedAt, orderCurrency, exchangeRatesMap);
429
+ const shopifyShippingAmount = context.totalShipping;
430
+ const totalShippingCost = CostCalculatorService.calculateShippingCost(configs, shopifyShippingAmount, context.orderFilterContext.shipCountryCode, context.totalWeight, context.orderCreatedAt, orderCurrency, exchangeRatesMap, context.orderFilterContext);
431
+ const otherCostResult = CostCalculatorService.calculateOtherCost(configs, context, lineItemCosts, orderCurrency, exchangeRatesMap);
432
+ return {
433
+ orderLevelHandlingCost,
434
+ lineItemLevelHandlingCost,
435
+ totalHandlingCost,
436
+ orderLevelOtherCost: otherCostResult.orderLevel,
437
+ lineItemLevelOtherCost: otherCostResult.lineItemLevel,
438
+ totalOtherCost: otherCostResult.categoryCosts.totalOtherCost,
439
+ totalGatewayCost,
440
+ totalShippingCost,
441
+ lineItemCosts,
442
+ categoryCosts: otherCostResult.categoryCosts,
443
+ };
444
+ }
445
+ catch (error) {
446
+ Logger.error('CostCalculatorService.calculateOrderCosts: failed', { error, configs, orderCurrency });
447
+ return defaultResult;
448
+ }
449
+ },
450
+ };
451
+ //# sourceMappingURL=cost-calculator-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-calculator-service.js","sourceRoot":"","sources":["../../../../src/services/cost/cost-calculator-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type CostConfigsBundle } from './cost-calculation-types.js';
2
+ export type ExchangeRatesMap = Record<string, Record<string, number>>;
3
+ export declare const CostCurrencyService: {
4
+ extractCurrenciesFromConfigs: (configs: CostConfigsBundle, orderCurrency: string) => string[];
5
+ convertAmount: (amount: number, fromCurrency: string, toCurrency: string, exchangeRatesMap: ExchangeRatesMap) => number;
6
+ };
@@ -0,0 +1,85 @@
1
+ import { Logger } from '../../helpers/logging-helper.js';
2
+ import { convertAmountBetweenCurrencies } from '../../libs/currency.js';
3
+ export const CostCurrencyService = {
4
+ extractCurrenciesFromConfigs: (configs, orderCurrency) => {
5
+ try {
6
+ const currencies = new Set();
7
+ const normalizedOrderCurrency = orderCurrency.toUpperCase();
8
+ if (configs.globalProductOverride?.currency) {
9
+ const c = configs.globalProductOverride.currency.toUpperCase();
10
+ if (c !== normalizedOrderCurrency)
11
+ currencies.add(c);
12
+ }
13
+ if (configs.order?.entries) {
14
+ for (const entry of configs.order.entries) {
15
+ if (entry.currency) {
16
+ const c = entry.currency.toUpperCase();
17
+ if (c !== normalizedOrderCurrency)
18
+ currencies.add(c);
19
+ }
20
+ }
21
+ }
22
+ if (configs.gateway?.entries) {
23
+ for (const entry of configs.gateway.entries) {
24
+ if (entry.currency) {
25
+ const c = entry.currency.toUpperCase();
26
+ if (c !== normalizedOrderCurrency)
27
+ currencies.add(c);
28
+ }
29
+ }
30
+ }
31
+ if (configs.shipping?.currency) {
32
+ const c = configs.shipping.currency.toUpperCase();
33
+ if (c !== normalizedOrderCurrency)
34
+ currencies.add(c);
35
+ }
36
+ if (configs.shipping?.profiles) {
37
+ for (const profile of configs.shipping.profiles) {
38
+ if (profile.currency) {
39
+ const c = profile.currency.toUpperCase();
40
+ if (c !== normalizedOrderCurrency)
41
+ currencies.add(c);
42
+ }
43
+ }
44
+ }
45
+ return Array.from(currencies);
46
+ }
47
+ catch (error) {
48
+ Logger.error('CostCurrencyService.extractCurrenciesFromConfigs: failed', { error, orderCurrency });
49
+ return [];
50
+ }
51
+ },
52
+ convertAmount: (amount, fromCurrency, toCurrency, exchangeRatesMap) => {
53
+ try {
54
+ if (!amount)
55
+ return amount;
56
+ const normalizedFrom = fromCurrency.toUpperCase();
57
+ const normalizedTo = toCurrency.toUpperCase();
58
+ if (normalizedFrom === normalizedTo)
59
+ return amount;
60
+ const rates = exchangeRatesMap[normalizedFrom];
61
+ if (!rates) {
62
+ Logger.warn('CostCurrencyService.convertAmount: no rates found', {
63
+ fromCurrency: normalizedFrom,
64
+ toCurrency: normalizedTo,
65
+ });
66
+ return amount;
67
+ }
68
+ const rate = rates[normalizedTo];
69
+ if (!rate) {
70
+ Logger.warn('CostCurrencyService.convertAmount: no rate for target currency', {
71
+ fromCurrency: normalizedFrom,
72
+ toCurrency: normalizedTo,
73
+ });
74
+ return amount;
75
+ }
76
+ const converted = convertAmountBetweenCurrencies(normalizedFrom, normalizedTo, amount, rate);
77
+ return converted ?? amount;
78
+ }
79
+ catch (error) {
80
+ Logger.error('CostCurrencyService.convertAmount: failed', { error, amount, fromCurrency, toCurrency });
81
+ return amount;
82
+ }
83
+ },
84
+ };
85
+ //# sourceMappingURL=cost-currency-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-currency-service.js","sourceRoot":"","sources":["../../../../src/services/cost/cost-currency-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AACzD,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAOxE,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAEjC,4BAA4B,EAAE,CAAC,OAA0B,EAAE,aAAqB,EAAY,EAAE;QAC5F,IAAI;YACF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;YACrC,MAAM,uBAAuB,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;YAE5D,IAAI,OAAO,CAAC,qBAAqB,EAAE,QAAQ,EAAE;gBAC3C,MAAM,CAAC,GAAG,OAAO,CAAC,qBAAqB,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAC/D,IAAI,CAAC,KAAK,uBAAuB;oBAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACtD;YAED,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE;gBAC1B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE;oBACzC,IAAI,KAAK,CAAC,QAAQ,EAAE;wBAClB,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;wBACvC,IAAI,CAAC,KAAK,uBAAuB;4BAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;qBACtD;iBACF;aACF;YAED,IAAI,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE;gBAC5B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE;oBAC3C,IAAI,KAAK,CAAC,QAAQ,EAAE;wBAClB,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;wBACvC,IAAI,CAAC,KAAK,uBAAuB;4BAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;qBACtD;iBACF;aACF;YAED,IAAI,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE;gBAC9B,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAClD,IAAI,CAAC,KAAK,uBAAuB;oBAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACtD;YACD,IAAI,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE;gBAC9B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE;oBAC/C,IAAI,OAAO,CAAC,QAAQ,EAAE;wBACpB,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;wBACzC,IAAI,CAAC,KAAK,uBAAuB;4BAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;qBACtD;iBACF;aACF;YAED,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SAC/B;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,CAAC,KAAK,CAAC,0DAA0D,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;YACnG,OAAO,EAAE,CAAC;SACX;IACH,CAAC;IAGD,aAAa,EAAE,CACb,MAAc,EACd,YAAoB,EACpB,UAAkB,EAClB,gBAAkC,EAC1B,EAAE;QACV,IAAI;YACF,IAAI,CAAC,MAAM;gBAAE,OAAO,MAAM,CAAC;YAE3B,MAAM,cAAc,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;YAClD,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;YAE9C,IAAI,cAAc,KAAK,YAAY;gBAAE,OAAO,MAAM,CAAC;YAEnD,MAAM,KAAK,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;YAC/C,IAAI,CAAC,KAAK,EAAE;gBACV,MAAM,CAAC,IAAI,CAAC,mDAAmD,EAAE;oBAC/D,YAAY,EAAE,cAAc;oBAC5B,UAAU,EAAE,YAAY;iBACzB,CAAC,CAAC;gBACH,OAAO,MAAM,CAAC;aACf;YAED,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,EAAE;gBACT,MAAM,CAAC,IAAI,CAAC,gEAAgE,EAAE;oBAC5E,YAAY,EAAE,cAAc;oBAC5B,UAAU,EAAE,YAAY;iBACzB,CAAC,CAAC;gBACH,OAAO,MAAM,CAAC;aACf;YAED,MAAM,SAAS,GAAG,8BAA8B,CAAC,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YAC7F,OAAO,SAAS,IAAI,MAAM,CAAC;SAC5B;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC;YACvG,OAAO,MAAM,CAAC;SACf;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type CostFilter, type CostFilters } from '@adtrackify/at-tracking-event-types';
2
+ import { type OrderFilterContext, type LineItemFilterContext } from './cost-calculation-types.js';
3
+ export declare const CostFilterService: {
4
+ matchSingleFilter: (filter: CostFilter, value: string | undefined) => boolean;
5
+ matchArrayFilter: (filter: CostFilter, values: string[] | undefined) => boolean;
6
+ matchProductFilter: (filter: CostFilter, productId: string, variantId: string) => boolean;
7
+ hasProductFilters: (filters?: CostFilters) => boolean;
8
+ matchLineItemFilters: (filters: CostFilters, lineItem: LineItemFilterContext) => boolean;
9
+ matchesFilters: (filters: CostFilters | undefined, order: OrderFilterContext, lineItem: LineItemFilterContext | null, lineItems?: LineItemFilterContext[]) => boolean;
10
+ };