foodbot-cart-calculations 1.0.0-dev.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.
@@ -0,0 +1,690 @@
1
+ function calculateTax2(cart, texSettings, taxType) {
2
+ return new Promise(function (resolve, reject) {
3
+ try {
4
+ cart.cartTotal = 0;
5
+ cart.tax_amount = 0;
6
+ cart.item_details.forEach(function (v) {
7
+ v.tax_amount = 0;
8
+ });
9
+ cart.item_details.forEach(function (v) {
10
+ if (!v.event && v.item_modifiers) {
11
+ v.item_modifiers.forEach(function (w) {
12
+ w.tax_amount = 0;
13
+ w.tax_array = [];
14
+ });
15
+ v.tax_array = [];
16
+ }
17
+ });
18
+ cart.item_details.forEach(function (v) {
19
+ if (v.isPackage == 1) {
20
+ v.package_items.forEach(function (w) {
21
+ w.modifiers.forEach(function (x) {
22
+ x.tax_amount = 0;
23
+ x.tax_array = [];
24
+ });
25
+ v.tax_array = [];
26
+ });
27
+ v.tax_array = [];
28
+ }
29
+ });
30
+ cart.merged_tax_array = [];
31
+
32
+ cart.item_details.forEach(async (element, itemIndex) => {
33
+ let total = 0;
34
+ if (!cart.item_details[itemIndex].tax_amount_modifier) {
35
+ cart.item_details[itemIndex].tax_amount_modifier = 0;
36
+ }
37
+ cart.item_details[itemIndex].total_tax_amount = 0;
38
+
39
+ let promoDiscount = (element.promotion_discount) ? element.promotion_discount : 0;
40
+ let pointsDiscount = (element.points_discount) ? element.points_discount : 0;
41
+
42
+ if (promoDiscount > 0) {
43
+ cart.item_details[itemIndex].item_event = 'update';
44
+ }
45
+ promoDiscount = (promoDiscount > element.item_price * element.quantity) ? element.item_price * element.quantity : promoDiscount;
46
+ element.promotion_discount = JSON.parse(JSON.stringify(promoDiscount));
47
+ promoDiscount = parseFloat(promoDiscount).toFixed(2);
48
+
49
+ let afterDiscount = element.item_price * element.quantity - promoDiscount;
50
+ afterDiscount = parseFloat(afterDiscount).toFixed(2);
51
+ afterDiscount = afterDiscount - pointsDiscount;
52
+ afterDiscount = parseFloat(afterDiscount).toFixed(2);
53
+ afterDiscount = (afterDiscount < 0) ? 0 : afterDiscount;
54
+ cart.cartTotal = parseFloat(cart.cartTotal) + parseFloat(afterDiscount);
55
+ cart.cartTotal = parseFloat(cart.cartTotal).toFixed(2);
56
+ total = +element.item_price;
57
+ if (element.isPackage == 1) {
58
+ let result = await calculatePackageItemTax(cart, itemIndex, element, texSettings, afterDiscount, taxType);
59
+ cart = result.cart;
60
+ element = result.element;
61
+ } else {
62
+ let result = await calculateItemTax(cart, itemIndex, element, texSettings, afterDiscount, taxType);
63
+ cart = result.cart;
64
+ element = result.element;
65
+ }
66
+
67
+ if (element.isPackage == 1) {
68
+ let result = await calculatePackageModiTax(cart, itemIndex, element, texSettings, afterDiscount, taxType);
69
+ cart = result.cart;
70
+ element = result.element;
71
+ } else {
72
+ let result = await calculateModiTax(cart, itemIndex, element, texSettings, afterDiscount, taxType);
73
+ cart = result.cart;
74
+ element = result.element;
75
+ }
76
+ if (itemIndex == cart.item_details.length - 1) {
77
+ cart.cart_total_with_tax = parseFloat(cart.cartTotal) + parseFloat(cart.tax_amount);
78
+ cart.cart_total_with_tax = parseFloat(cart.cart_total_with_tax).toFixed(2);
79
+
80
+ await new Promise((resolve) => {
81
+ setTimeout(async () => {
82
+ resolve(); // Resolve after processing all items
83
+ }, 300)});
84
+
85
+ // setTimeout(() => {
86
+ resolve(cart);
87
+ // }, 500);
88
+ }
89
+
90
+ });
91
+ } catch (error) {
92
+ reject(error);
93
+ }
94
+ });
95
+ }
96
+
97
+ function calculateItemTax(cart, itemIndex, element, tax_settings, afterDicsount, taxType) {
98
+ return new Promise(async (resolve, reject) => {
99
+ if (element.event && element.tax_id && element.tax_id.length == 0) {
100
+ let no_tax = tax_settings.filter(ele => ele.tax_rate == 0);
101
+ element.tax_id = [{
102
+ "tax_id": no_tax[0].tax_id
103
+ }]
104
+ }
105
+ getTaxSettings2(element.tax_id, tax_settings, element.ieps_tax).then(async (itemTaxs) => {
106
+ let lastPrice = afterDicsount
107
+ getBeforeTaxPriceOfItem(itemTaxs, lastPrice, taxType, element.quantity).then((resp) => {
108
+ lastPrice = resp.beforeTax;
109
+ let lastPriceIeps = +resp.beforeTaxIeps;
110
+ let iepsTaxRate = +resp.iepsTaxRate;
111
+ let iepsTaxAmount = +resp.iepsTaxAmount;
112
+ let iepsTaxRateQuantity = +resp.iepsTaxRateQuantity;
113
+ let itemTotalTax = 0;
114
+ let tax_array = []
115
+ if (itemTaxs && itemTaxs.length > 0) {
116
+ itemTaxs.forEach(async (itemTaxArray, itemTaxIndex) => {
117
+ // let startItemTax = JSON.parse(JSON.stringify(itemTaxArray))
118
+ // if (!element.tax_array) {
119
+ // element.tax_array = []
120
+ // }
121
+ // let taxAmount = 0
122
+ // if (startItemTax.ieps_type && startItemTax.ieps_type == 2) {
123
+ // taxAmount = lastPrice >= startItemTax.tax_rate ? startItemTax.tax_rate : 0;
124
+ // } else {
125
+ // taxAmount = (lastPrice * startItemTax.tax_rate) / 100;
126
+ // }
127
+ // taxAmount = parseFloat(taxAmount).toFixed(2)
128
+ // itemTotalTax = (parseFloat(itemTotalTax) + parseFloat(taxAmount)).toFixed(2)
129
+
130
+ // cart.tax_amount = parseFloat(cart.tax_amount) + parseFloat(taxAmount)
131
+ // cart.tax_amount = parseFloat(cart.tax_amount).toFixed(2)
132
+ // startItemTax.base_price = parseFloat(lastPrice).toFixed(2)
133
+ // startItemTax.tax_amount = parseFloat(taxAmount).toFixed(2)
134
+ // element.tax_array.push(JSON.parse(JSON.stringify(startItemTax)))
135
+
136
+
137
+ let startItemTax = JSON.parse(JSON.stringify(itemTaxArray))
138
+ let taxAmount = 0;
139
+
140
+ if (startItemTax.ieps_type) {
141
+ taxAmount = iepsTaxAmount;
142
+ } else {
143
+ // taxAmount = (lastPrice * startItemTax.tax_rate) / 100;
144
+ taxAmount = resp.taxAmount;
145
+ }
146
+ taxAmount = parseFloat(taxAmount).toFixed(6);
147
+ cart.tax_amount = parseFloat(cart.tax_amount) + parseFloat(taxAmount)
148
+ cart.tax_amount = parseFloat(cart.tax_amount).toFixed(6)
149
+ itemTotalTax = (parseFloat(itemTotalTax) + parseFloat(taxAmount)).toFixed(6);
150
+ startItemTax.tax_amount = parseFloat(taxAmount).toFixed(6);
151
+ startItemTax.base_price = startItemTax.ieps_type ? lastPriceIeps : lastPrice;
152
+ startItemTax.tax_rate = startItemTax.ieps_type ? iepsTaxRate : startItemTax.tax_rate;
153
+ startItemTax.tax_rate_quantity = iepsTaxRateQuantity;
154
+ tax_array.push(JSON.parse(JSON.stringify(startItemTax)))
155
+
156
+
157
+ cart = await setTaxes(cart, JSON.parse(JSON.stringify(startItemTax)))
158
+
159
+ if (itemTaxIndex == itemTaxs.length - 1) {
160
+ element.tax_amount = itemTotalTax;
161
+ element.tax_array = tax_array;
162
+ element.tax_amount = parseFloat(element.tax_amount).toFixed(6);
163
+ element.total_tax_amount = itemTotalTax;
164
+ element.total_tax_amount = parseFloat(element.total_tax_amount).toFixed(6);
165
+ element.tax_amount_modifier = parseFloat(itemTotalTax).toFixed(6);
166
+ resolve({ 'cart': cart, "element": element });
167
+ }
168
+ });
169
+ } else {
170
+ resolve({ 'cart': cart, "element": element });
171
+ }
172
+ });
173
+ })
174
+ })
175
+ }
176
+ function calculatePackageItemTax(cart, itemIndex, element, tax_settings, afterDicsount, taxType) {
177
+ return new Promise(async (resolve, reject) => {
178
+ let itemTotalTax = 0;
179
+ element.package_items.forEach((packageItem, packageItemIndex) => {
180
+ element.package_items[packageItemIndex].tax_amount = 0
181
+ let promoDiscountPackage = (packageItem.promotion_discount) ? packageItem.promotion_discount : 0
182
+ let pointsDisouuntPackage = (packageItem.points_discount) ? packageItem.points_discount : 0
183
+
184
+ let defaultComboDiscount = packageItem.default_combo_discount ? packageItem.default_combo_discount : 0
185
+ let afterDicsountPackage = packageItem.price * element.quantity - promoDiscountPackage
186
+
187
+ afterDicsountPackage = parseFloat(afterDicsountPackage).toFixed(2)
188
+ afterDicsountPackage = afterDicsountPackage - pointsDisouuntPackage
189
+
190
+ afterDicsountPackage = parseFloat(afterDicsountPackage).toFixed(2)
191
+ afterDicsountPackage = afterDicsountPackage - defaultComboDiscount
192
+
193
+ afterDicsountPackage = parseFloat(afterDicsountPackage).toFixed(2)
194
+
195
+ getTaxSettings2(packageItem.tax_id, tax_settings, packageItem.ieps_tax).then(async (itemTaxs) => {
196
+
197
+ if (!element.package_items[packageItemIndex].tax_amount_modifier)
198
+ element.package_items[packageItemIndex].tax_amount_modifier = 0
199
+
200
+ element.package_items[packageItemIndex].total_tax_amount = 0
201
+
202
+ let lastPrice = afterDicsountPackage
203
+ let itemtaxAmount = 0;
204
+
205
+ await getBeforeTaxPriceOfItem(itemTaxs, lastPrice, taxType, packageItem.quantity).then(async (resp) => {
206
+ lastPrice = resp.beforeTax;
207
+ let lastPriceIeps = +resp.beforeTaxIeps;
208
+ let iepsTaxRate = +resp.iepsTaxRate;
209
+ let iepsTaxAmount = +resp.iepsTaxAmount;
210
+ let iepsTaxRateQuantity = +resp.iepsTaxRateQuantity;
211
+ let tax_array = []
212
+ if (itemTaxs && itemTaxs.length > 0) {
213
+ itemTaxs.forEach(async (itemTaxArray, itemTaxIndex) => {
214
+
215
+ let startItemTax = JSON.parse(JSON.stringify(itemTaxArray))
216
+
217
+ let taxAmount = 0
218
+
219
+ if (startItemTax.ieps_type) {
220
+ taxAmount = iepsTaxAmount;
221
+ } else {
222
+ // taxAmount = (lastPrice * startItemTax.tax_rate) / 100;
223
+ taxAmount = resp.taxAmount;
224
+ }
225
+
226
+ taxAmount = parseFloat(taxAmount).toFixed(6);
227
+ cart.tax_amount = parseFloat(cart.tax_amount) + parseFloat(taxAmount)
228
+ cart.tax_amount = parseFloat(cart.tax_amount).toFixed(6)
229
+ itemTotalTax = (parseFloat(itemTotalTax) + parseFloat(taxAmount)).toFixed(6);
230
+ itemtaxAmount = (parseFloat(itemtaxAmount) + parseFloat(taxAmount)).toFixed(6);
231
+ startItemTax.tax_amount = parseFloat(taxAmount).toFixed(6);
232
+ startItemTax.base_price = startItemTax.ieps_type ? lastPriceIeps : lastPrice;
233
+ startItemTax.tax_rate = startItemTax.ieps_type ? iepsTaxRate : startItemTax.tax_rate;
234
+ startItemTax.tax_rate_quantity = iepsTaxRateQuantity;
235
+ tax_array.push(JSON.parse(JSON.stringify(startItemTax)));
236
+ cart = await setTaxes(cart, JSON.parse(JSON.stringify(startItemTax)))
237
+
238
+ //push array yo package
239
+ element = await setPackageTaxes(element, JSON.parse(JSON.stringify(startItemTax)));
240
+ element.package_items[packageItemIndex].tax_amount = parseFloat(itemtaxAmount).toFixed(6);
241
+ element.package_items[packageItemIndex].tax_array = tax_array;
242
+ element.package_items[packageItemIndex].total_tax_amount = parseFloat(itemtaxAmount).toFixed(6);
243
+
244
+ // element.package_items[packageItemIndex].tax_amount_modifier = itemTotalTax
245
+ });
246
+ }
247
+ });
248
+
249
+ element.tax_amount = (parseFloat(element.tax_amount) + parseFloat(element.package_items[packageItemIndex].tax_amount)).toFixed(6)
250
+ element.total_tax_amount = (parseFloat(element.total_tax_amount) + parseFloat(element.package_items[packageItemIndex].tax_amount)).toFixed(6)
251
+ })
252
+ if (packageItemIndex == element.package_items.length - 1) {
253
+ element.tax_amount_modifier = 0;
254
+ resolve({ 'cart': cart, "element": element });
255
+ }
256
+ })
257
+ })
258
+ }
259
+ function calculateModiTax(cart, itemIndex, element, tax_settings, afterDicsount, taxType) {
260
+ return new Promise(async (resolve, reject) => {
261
+ if (element && element.item_modifiers && element.item_modifiers.length > 0) {
262
+
263
+ element.item_modifiers.forEach((modi, modiIndex) => {
264
+ let itemModiTotalTax = 0
265
+ let taxId = []
266
+ let iepsTax;
267
+ //code commented for test
268
+
269
+ //code gain commented for push
270
+
271
+ if (modi.is_tax_rate_same == 1) {
272
+ if (modi.linked_product && modi.linked_product.product_tax_id) {
273
+ taxId = modi.linked_product.product_tax_id
274
+ if (modi.linked_product.ieps_tax && modi.linked_product.ieps_tax.ieps_details && modi.linked_product.ieps_tax.ieps_details.type == 1)
275
+ iepsTax = modi.linked_product.ieps_tax
276
+ } else {
277
+ taxId = element.tax_id
278
+ if (element.ieps_tax && element.ieps_tax.ieps_details && element.ieps_tax.ieps_details.type == 1)
279
+ iepsTax = element.ieps_tax
280
+ }
281
+ }
282
+ else {
283
+ if (modi.linked_product && modi.linked_product.product_tax_id) {
284
+ taxId = modi.linked_product.product_tax_id
285
+ } else {
286
+ taxId = modi.tax_id
287
+ }
288
+ }
289
+
290
+ modi.tax_id = taxId
291
+ let promoDiscount = (modi.promotion_discount) ? modi.promotion_discount : 0
292
+ let pointsDisouunt = (modi.points_discount) ? modi.points_discount : 0
293
+ promoDiscount = parseFloat(promoDiscount).toFixed(2)
294
+ let afterDicsount = (modi.modifier_item_price * modi.quantity) * element.quantity - promoDiscount
295
+ afterDicsount = afterDicsount - pointsDisouunt
296
+ afterDicsount = parseFloat(afterDicsount).toFixed(2)
297
+
298
+ afterDicsount = (afterDicsount < 0) ? 0 : afterDicsount
299
+
300
+ cart.cartTotal = parseFloat(cart.cartTotal) + parseFloat(afterDicsount)
301
+ cart.cartTotal = parseFloat(cart.cartTotal).toFixed(2)
302
+
303
+ getTaxSettings2(taxId, tax_settings, iepsTax).then(async (modiItemTaxs) => {
304
+
305
+ let lastPrice = afterDicsount
306
+ if (modiItemTaxs.length > 0) {
307
+ await getBeforeTaxPriceOfItem(modiItemTaxs, lastPrice, taxType, modi.quantity * element.quantity).then((resp) => {
308
+ lastPrice = resp.beforeTax;
309
+ let lastPriceIeps = +resp.beforeTaxIeps;
310
+ let iepsTaxRate = +resp.iepsTaxRate;
311
+ let iepsTaxAmount = +resp.iepsTaxAmount;
312
+ let iepsTaxRateQuantity = +resp.iepsTaxRateQuantity;
313
+ let itemTotalTax = 0;
314
+ let tax_array = []
315
+
316
+ modiItemTaxs.forEach(async (modiItemTax, modiTaxItemIndex) => {
317
+
318
+ let modiItemTaxArray = JSON.parse(JSON.stringify(modiItemTax))
319
+
320
+ if (!element.item_modifiers[modiIndex].tax_array)
321
+ element.item_modifiers[modiIndex].tax_array = []
322
+ if (!element.item_modifiers[modiIndex].tax_amount)
323
+ element.item_modifiers[modiIndex].tax_amount = 0
324
+
325
+ let taxAmount = 0
326
+
327
+ if (modiItemTaxArray.ieps_type) {
328
+ taxAmount = iepsTaxAmount;
329
+ } else {
330
+ // taxAmount = (lastPrice * startItemTax.tax_rate) / 100;
331
+ taxAmount = resp.taxAmount;
332
+ }
333
+
334
+ taxAmount = parseFloat(taxAmount).toFixed(6)
335
+ itemModiTotalTax = itemModiTotalTax + taxAmount
336
+ cart.tax_amount = parseFloat(cart.tax_amount) + parseFloat(taxAmount)
337
+ cart.tax_amount = parseFloat(cart.tax_amount).toFixed(6)
338
+
339
+ itemTotalTax = (parseFloat(itemTotalTax) + parseFloat(taxAmount)).toFixed(6);
340
+ modiItemTaxArray.tax_amount = parseFloat(taxAmount).toFixed(6);
341
+ modiItemTaxArray.base_price = modiItemTaxArray.ieps_type ? lastPriceIeps : lastPrice;
342
+ modiItemTaxArray.tax_rate = modiItemTaxArray.ieps_type ? iepsTaxRate : modiItemTaxArray.tax_rate;
343
+ modiItemTaxArray.tax_rate_quantity = iepsTaxRateQuantity;
344
+ tax_array.push(JSON.parse(JSON.stringify(modiItemTaxArray)))
345
+
346
+ element.item_modifiers[modiIndex].tax_array = tax_array;
347
+ cart = await setTaxes(cart, JSON.parse(JSON.stringify(modiItemTaxArray)));
348
+
349
+ element.item_modifiers[modiIndex].tax_amount = parseFloat(element.item_modifiers[modiIndex].tax_amount) + parseFloat(taxAmount);
350
+ element.item_modifiers[modiIndex].tax_amount = parseFloat(element.item_modifiers[modiIndex].tax_amount).toFixed(6)
351
+ element.tax_amount_modifier = parseFloat(element.tax_amount_modifier) + parseFloat(taxAmount)
352
+ element.tax_amount_modifier = parseFloat(element.tax_amount_modifier).toFixed(6)
353
+ element.total_tax_amount = parseFloat(element.total_tax_amount) + parseFloat(taxAmount)
354
+ element.total_tax_amount = parseFloat(element.total_tax_amount).toFixed(6)
355
+
356
+ if (modiIndex == element.item_modifiers.length - 1) {
357
+
358
+ resolve({ 'cart': cart, "element": element });
359
+ }
360
+
361
+
362
+ });
363
+ })
364
+ }
365
+ else {
366
+ if (modiIndex == element.item_modifiers.length - 1) {
367
+
368
+ resolve({ 'cart': cart, "element": element });
369
+ }
370
+ }
371
+ })
372
+ })
373
+ }
374
+ else {
375
+ resolve({ 'cart': cart, "element": element });
376
+ }
377
+ })
378
+ }
379
+ function calculatePackageModiTax(cart, itemIndex, element, tax_settings, afterDicsount, taxType) {
380
+ return new Promise(async (resolve, reject) => {
381
+ element.package_items.forEach((packageItem, packageItemIndex) => {
382
+ element.package_items[packageItemIndex].tax_amount_modifier = 0
383
+ if (packageItem.modifiers.length > 0) {
384
+
385
+ packageItem.modifiers.forEach((modi, modiIndex) => {
386
+ let itemModiTotalTax = 0;
387
+ let taxId = []
388
+ let iepsTax;
389
+ if (modi.is_tax_rate_same == 1) {
390
+ if (modi.linked_product && modi.linked_product.product_tax_id && Array.isArray(modi.linked_product.product_tax_id)) {
391
+ taxId = modi.linked_product.product_tax_id
392
+ iepsTax = modi.linked_product.ieps_tax
393
+ } else {
394
+ taxId = packageItem.tax_id
395
+ iepsTax = []
396
+ }
397
+ }
398
+ else {
399
+ if (modi.linked_product && modi.linked_product.product_tax_id) {
400
+ taxId = modi.linked_product.product_tax_id
401
+ } else {
402
+ taxId = modi.tax_id
403
+ }
404
+ }
405
+
406
+ modi.tax_id = taxId
407
+
408
+ let promoDiscount = (modi.promotion_discount) ? modi.promotion_discount : 0
409
+ let pointsDisouunt = (modi.points_discount) ? modi.points_discount : 0
410
+ let afterDicsount = (modi.modifier_item_price * modi.quantity) * element.quantity - promoDiscount
411
+ afterDicsount = afterDicsount - pointsDisouunt
412
+ afterDicsount = parseFloat(afterDicsount).toFixed(2)
413
+
414
+ afterDicsount = (afterDicsount < 0) ? 0 : afterDicsount
415
+
416
+ cart.cartTotal = parseFloat(cart.cartTotal) + parseFloat(afterDicsount)
417
+ cart.cartTotal = parseFloat(cart.cartTotal).toFixed(2)
418
+
419
+ getTaxSettings2(taxId, tax_settings, iepsTax).then(async (modiItemTaxs) => {
420
+
421
+ let lastPrice = afterDicsount
422
+
423
+ if (modiItemTaxs.length > 0) {
424
+ await getBeforeTaxPriceOfItem(modiItemTaxs, lastPrice, taxType, modi.quantity * element.quantity).then((resp) => {
425
+ lastPrice = resp.beforeTax;
426
+ let lastPriceIeps = +resp.beforeTaxIeps;
427
+ let iepsTaxRate = +resp.iepsTaxRate;
428
+ let iepsTaxAmount = +resp.iepsTaxAmount;
429
+ let iepsTaxRateQuantity = +resp.iepsTaxRateQuantity;
430
+ let itemTotalTax = 0;
431
+ let tax_array = []
432
+ modiItemTaxs.forEach(async (modiItemTax, modiTaxItemIndex) => {
433
+ let modiItemTaxArray = JSON.parse(JSON.stringify(modiItemTax))
434
+ if (!element.package_items[packageItemIndex].modifiers[modiIndex].tax_array) {
435
+ element.package_items[packageItemIndex].modifiers[modiIndex].tax_array = []
436
+ }
437
+
438
+ if (!element.package_items[packageItemIndex].modifiers[modiIndex].tax_amount) {
439
+ element.package_items[packageItemIndex].modifiers[modiIndex].tax_amount = 0
440
+ }
441
+
442
+ let taxAmount = 0
443
+
444
+ if (modiItemTaxArray.ieps_type) {
445
+ taxAmount = iepsTaxAmount;
446
+ } else {
447
+ // taxAmount = (lastPrice * startItemTax.tax_rate) / 100;
448
+ taxAmount = resp.taxAmount;
449
+ }
450
+ taxAmount = parseFloat(taxAmount).toFixed(6)
451
+
452
+ itemModiTotalTax = itemModiTotalTax + taxAmount;
453
+ cart.tax_amount = parseFloat(cart.tax_amount) + parseFloat(taxAmount)
454
+ cart.tax_amount = parseFloat(cart.tax_amount).toFixed(6)
455
+
456
+
457
+ // modiItemTax.base_price = that.taxType == 1 ? parseFloat(afterDicsount).toFixed(2) : (parseFloat(afterDicsount) - parseFloat(taxAmount)).toFixed(2)
458
+ modiItemTaxArray.tax_amount = parseFloat(taxAmount).toFixed(6);
459
+ modiItemTaxArray.base_price = modiItemTaxArray.ieps_type ? lastPriceIeps : lastPrice;
460
+ modiItemTaxArray.tax_rate = modiItemTaxArray.ieps_type ? iepsTaxRate : modiItemTaxArray.tax_rate;
461
+ modiItemTaxArray.tax_rate_quantity = iepsTaxRateQuantity;
462
+ tax_array.push(JSON.parse(JSON.stringify(modiItemTaxArray)))
463
+
464
+ // cart[itemIndex].item_modifiers[modiIndex].tax_array.push(JSON.parse(JSON.stringify(modiItemTax)))
465
+ element.package_items[packageItemIndex].modifiers[modiIndex].tax_array = tax_array;
466
+ cart = await setTaxes(cart, JSON.parse(JSON.stringify(modiItemTaxArray)))
467
+
468
+ element.package_items[packageItemIndex].modifiers[modiIndex].tax_amount = parseFloat(element.package_items[packageItemIndex].modifiers[modiIndex].tax_amount) + parseFloat(taxAmount);
469
+ element.package_items[packageItemIndex].tax_amount_modifier = (parseFloat(element.package_items[packageItemIndex].tax_amount_modifier) + parseFloat(taxAmount)).toFixed(6)
470
+ element.package_items[packageItemIndex].total_tax_amount = (parseFloat(element.package_items[packageItemIndex].total_tax_amount) + parseFloat(taxAmount)).toFixed(6)
471
+ element.tax_amount_modifier = (parseFloat(element.tax_amount_modifier) + parseFloat(taxAmount)).toFixed(6)
472
+ element.total_tax_amount = (parseFloat(element.total_tax_amount) + parseFloat(taxAmount)).toFixed(6)
473
+
474
+ if (modiIndex == packageItem.modifiers.length - 1) {
475
+
476
+ resolve({ 'cart': cart, "element": element });
477
+ }
478
+
479
+ });
480
+ })
481
+ }
482
+ else {
483
+ if (modiIndex == packageItem.modifiers.length - 1) {
484
+
485
+ resolve({ 'cart': cart, "element": element });
486
+ }
487
+ }
488
+
489
+
490
+ })
491
+
492
+ })
493
+ }
494
+ else {
495
+ resolve({ 'cart': cart, "element": element });
496
+ }
497
+ });
498
+ })
499
+ }
500
+ function setPackageTaxes(item, ele) {
501
+ return new Promise(async (resolve, reject) => {
502
+ let index = -1;
503
+ if (ele.ieps_type) {
504
+ index = item.tax_array.findIndex((res) => {
505
+ return res.tax_id == ele.tax_id && res.ieps_type == ele.ieps_type
506
+ });
507
+ } else {
508
+ index = item.tax_array.findIndex((res) => {
509
+ return !res.ieps_type && res.tax_id == ele.tax_id
510
+ });
511
+ }
512
+ if (index != -1) {
513
+ item.tax_array[index].tax_amount = parseFloat(item.tax_array[index].tax_amount) + parseFloat(ele.tax_amount)
514
+ item.tax_array[index].tax_amount = parseFloat(item.tax_array[index].tax_amount).toFixed(6)
515
+ if (item.tax_array[index].tax_rate_quantity)
516
+ item.tax_array[index].tax_rate_quantity = parseFloat(item.tax_array[index].tax_rate_quantity) + parseFloat(ele.tax_rate_quantity)
517
+ item.tax_array[index].base_price = parseFloat(item.tax_array[index].base_price) + parseFloat(ele.base_price)
518
+ item.tax_array[index].base_price = parseFloat(item.tax_array[index].base_price).toFixed(6)
519
+ }
520
+ else {
521
+ item.tax_array.push(ele)
522
+ }
523
+ item.tax_array.sort((a, b) => {
524
+ return a.tax_sequence - b.tax_sequence
525
+ })
526
+ if (item.tax_array[0] && !item.tax_array[0].ieps_type && item.tax_array[1] && item.tax_array[1].ieps_type && item.tax_array[1].ieps_type == 2) {
527
+ item.tax_array[1].base_price = (item.tax_array[0].base_price > 0) ? item.tax_array[0].base_price - item.tax_array[1].tax_rate_quantity : 0;
528
+ item.tax_array[1].base_price = parseFloat(item.tax_array[1].base_price).toFixed(6)
529
+ item.tax_array[1].tax_amount = item.tax_array[1].tax_rate_quantity
530
+ let iepsTaxRate = (item.tax_array[0].base_price > 0) ? item.tax_array[1].tax_rate_quantity / item.tax_array[1].base_price : 0;
531
+ iepsTaxRate = parseFloat(iepsTaxRate).toFixed(6)
532
+ item.tax_array[1].tax_rate = iepsTaxRate
533
+ }
534
+ resolve(item);
535
+ })
536
+ }
537
+
538
+ function getTaxSettings2(itemTax, taxSettings, iepsTax = '') {
539
+ return new Promise(function (resolve, reject) {
540
+ let count = 0;
541
+ let settings = [];
542
+ let taxes = [];
543
+
544
+ if (itemTax && itemTax != undefined) {
545
+ taxes = [...itemTax];
546
+ // Handle ieps tax
547
+ if (iepsTax && iepsTax.status && iepsTax.status == 1 && iepsTax.ieps_details) {
548
+ if (iepsTax.ieps_details.type == 1) {
549
+ taxes.push(iepsTax.ieps_details);
550
+ }
551
+ }
552
+
553
+ taxes.forEach(function (element) {
554
+ count++;
555
+ let index = taxSettings.findIndex(function (res) {
556
+ return res.tax_id == element.tax_id;
557
+ });
558
+
559
+ if (index >= 0) {
560
+ const taxDetail = Object.assign({}, taxSettings[index]);
561
+ if (element.type) {
562
+ taxDetail.tax_label = 'IEPS';
563
+ taxDetail.ieps_type = 1;
564
+ }
565
+ settings.push(taxDetail);
566
+ }
567
+
568
+ if (count == taxes.length) {
569
+ // Handle ieps tax
570
+ if (iepsTax && iepsTax.status && iepsTax.status == 1 && iepsTax.ieps_details) {
571
+ if (iepsTax.ieps_details.type == 2) {
572
+ const absoluteTax = {
573
+ base_price_effected: 0,
574
+ tax_sequence: 2,
575
+ tax_label: 'IEPS',
576
+ ieps_type: 2,
577
+ tax_id: 'absolute',
578
+ tax_rate: iepsTax.ieps_details.tax_id,
579
+ };
580
+ settings.push(absoluteTax);
581
+ }
582
+ }
583
+ // settings = settings.sort((a, b) => (Number(b.tax_sequence) > Number(a.tax_sequence)) ? 1 : -1);
584
+ resolve(settings);
585
+ }
586
+ });
587
+ } else {
588
+ resolve([]);
589
+ }
590
+ });
591
+ }
592
+
593
+ function isJson(str) {
594
+ try {
595
+ JSON.parse(str);
596
+ } catch (e) {
597
+ return false;
598
+ }
599
+ return true;
600
+ }
601
+
602
+ async function getBeforeTaxPriceOfItem(taxes, price, taxType, quantity) {
603
+ return new Promise((resolve, reject) => {
604
+ let beforeTax = +price;
605
+ let beforeTaxIeps = 0;
606
+ let taxRate = 0;
607
+ let taxAmount = 0;
608
+ let iepsTaxRate = 0;
609
+ let iepsTaxAmount=0;
610
+ let iepsTaxRateQuantity = 0;
611
+ let totalTax = 0;
612
+ let firstAmount = beforeTax ;
613
+
614
+ taxes.forEach((tax) => {
615
+ if (!tax.ieps_type) {
616
+ taxRate += parseFloat(tax.tax_rate);
617
+ totalTax += parseFloat(tax.tax_rate);
618
+ }
619
+ if (tax.ieps_type && tax.ieps_type == 1) {
620
+ totalTax += parseFloat(tax.tax_rate);
621
+ }
622
+ });
623
+
624
+ // Calculate taxAmount based on tax type 1 = exclusive and 2 = inclusive
625
+ if (taxType == 2) {
626
+ beforeTax = (beforeTax / (1 + totalTax / 100)).toFixed(2);
627
+ }
628
+
629
+ // ieps tax type = 1 precentage 2 absoulte
630
+ taxes.forEach((tax) => {
631
+ if (tax.ieps_type && tax.ieps_type == 2) {
632
+ // Adjust beforeTax based on tax type
633
+ if (beforeTax >= tax.tax_rate) {
634
+ beforeTaxIeps = taxType == 1 ? beforeTax : beforeTax - tax.tax_rate * quantity;
635
+ beforeTaxIeps = parseFloat(beforeTaxIeps).toFixed(2)
636
+ iepsTaxRate = tax.tax_rate * quantity / beforeTaxIeps
637
+ iepsTaxRateQuantity = tax.tax_rate * quantity
638
+ iepsTaxRate = parseFloat(iepsTaxRate)
639
+ iepsTaxAmount = (tax.tax_rate * quantity).toFixed(2);
640
+ }
641
+ }
642
+ else if (tax.ieps_type && tax.ieps_type == 1) {
643
+ beforeTaxIeps = beforeTax ;
644
+ iepsTaxRate = tax.tax_rate
645
+ iepsTaxAmount = (firstAmount - beforeTax - taxAmount).toFixed(2);
646
+ }
647
+ else{
648
+ taxAmount = ((beforeTax * tax.tax_rate) / 100).toFixed(2);
649
+ }
650
+ });
651
+ resolve({ beforeTax, taxAmount, beforeTaxIeps, iepsTaxRate,iepsTaxAmount,iepsTaxRateQuantity });
652
+ });
653
+ }
654
+ function setTaxes(cart, ele) {
655
+ let index = -1;
656
+ if (ele.ieps_type) {
657
+ index = cart.merged_tax_array.findIndex((res) => {
658
+ return res.tax_id == ele.tax_id && res.ieps_type == ele.ieps_type
659
+ });
660
+ } else {
661
+ index = cart.merged_tax_array.findIndex((res) => {
662
+ return !res.ieps_type && res.tax_id == ele.tax_id
663
+ });
664
+ }
665
+ if (index != -1) {
666
+ cart.merged_tax_array[index].tax_amount = parseFloat(cart.merged_tax_array[index].tax_amount) + parseFloat(ele.tax_amount)
667
+ cart.merged_tax_array[index].tax_amount = parseFloat(cart.merged_tax_array[index].tax_amount).toFixed(6)
668
+ if (cart.merged_tax_array[index].tax_rate_quantity)
669
+ cart.merged_tax_array[index].tax_rate_quantity = parseFloat(cart.merged_tax_array[index].tax_rate_quantity) + parseFloat(ele.tax_rate_quantity)
670
+ cart.merged_tax_array[index].base_price = parseFloat(cart.merged_tax_array[index].base_price) + parseFloat(ele.base_price)
671
+ cart.merged_tax_array[index].base_price = parseFloat(cart.merged_tax_array[index].base_price).toFixed(6)
672
+ }
673
+ else {
674
+ cart.merged_tax_array.push(ele)
675
+ }
676
+ cart.merged_tax_array.sort((a, b) => {
677
+ return a.tax_sequence - b.tax_sequence
678
+ })
679
+ if (cart.merged_tax_array[0] && !cart.merged_tax_array[0].ieps_type && cart.merged_tax_array[1] && cart.merged_tax_array[1].ieps_type && cart.merged_tax_array[1].ieps_type == 2) {
680
+ cart.merged_tax_array[1].base_price = (cart.merged_tax_array[0].base_price > 0) ? cart.merged_tax_array[0].base_price - cart.merged_tax_array[1].tax_rate_quantity : 0;
681
+ cart.merged_tax_array[1].base_price = parseFloat(cart.merged_tax_array[1].base_price).toFixed(6)
682
+ cart.merged_tax_array[1].tax_amount = cart.merged_tax_array[1].tax_rate_quantity
683
+ let iepsTaxRate = (cart.merged_tax_array[0].base_price > 0) ? cart.merged_tax_array[1].tax_rate_quantity / cart.merged_tax_array[1].base_price : 0;
684
+ iepsTaxRate = parseFloat(iepsTaxRate).toFixed(6)
685
+ cart.merged_tax_array[1].tax_rate = iepsTaxRate
686
+ }
687
+ return cart;
688
+ }
689
+
690
+ module.exports = { calculateTax2 }