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