@freedom_sky/feige-lib 5.22.0 → 5.23.0

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 (165) hide show
  1. package/.eslintignore +2 -2
  2. package/.eslintrc.js +15 -15
  3. package/.prettierrc.js +6 -6
  4. package/AGENTS.md +75 -75
  5. package/CHANGE.md +38 -34
  6. package/azure-pipelines-release.yml +56 -0
  7. package/dist/announcement/enum/announcement.enum.d.ts +11 -11
  8. package/dist/announcement/enum/announcement.enum.js +15 -15
  9. package/dist/buffet/index.d.ts +46 -46
  10. package/dist/buffet/index.js +95 -95
  11. package/dist/const/const.d.ts +372 -370
  12. package/dist/const/const.js +2387 -2374
  13. package/dist/enum/ai-token.enum.d.ts +10 -10
  14. package/dist/enum/ai-token.enum.js +14 -14
  15. package/dist/enum/checkout.enum.d.ts +13 -13
  16. package/dist/enum/checkout.enum.js +17 -17
  17. package/dist/enum/common.enum.d.ts +18 -14
  18. package/dist/enum/common.enum.js +23 -18
  19. package/dist/enum/continent.enum.d.ts +8 -8
  20. package/dist/enum/continent.enum.js +11 -11
  21. package/dist/enum/dish.enum.d.ts +4 -4
  22. package/dist/enum/dish.enum.js +7 -7
  23. package/dist/enum/from.enum.d.ts +14 -14
  24. package/dist/enum/from.enum.js +17 -17
  25. package/dist/enum/member.enum.d.ts +16 -16
  26. package/dist/enum/member.enum.js +21 -21
  27. package/dist/enum/menu-io.enum.d.ts +4 -4
  28. package/dist/enum/menu-io.enum.js +7 -7
  29. package/dist/enum/order.enum.d.ts +7 -7
  30. package/dist/enum/order.enum.js +10 -10
  31. package/dist/enum/pay-company.enum.d.ts +4 -4
  32. package/dist/enum/pay-company.enum.js +7 -7
  33. package/dist/enum/printer.enum.d.ts +36 -36
  34. package/dist/enum/printer.enum.js +45 -45
  35. package/dist/enum/receptionist.enum.d.ts +8 -8
  36. package/dist/enum/receptionist.enum.js +11 -11
  37. package/dist/enum/reservation.enum.d.ts +5 -5
  38. package/dist/enum/reservation.enum.js +8 -8
  39. package/dist/enum/role.enum.d.ts +7 -7
  40. package/dist/enum/role.enum.js +10 -10
  41. package/dist/enum/sms.enum.d.ts +14 -14
  42. package/dist/enum/sms.enum.js +18 -18
  43. package/dist/enum/tax.enum.d.ts +4 -4
  44. package/dist/enum/tax.enum.js +7 -7
  45. package/dist/enum/time-menu.enum.d.ts +4 -4
  46. package/dist/enum/time-menu.enum.js +7 -7
  47. package/dist/enum/timezone.emum.d.ts +33 -33
  48. package/dist/enum/timezone.emum.js +36 -36
  49. package/dist/enum/user-status.enum.d.ts +9 -9
  50. package/dist/enum/user-status.enum.js +12 -12
  51. package/dist/enum/visit-task.enum.d.ts +13 -13
  52. package/dist/enum/visit-task.enum.js +17 -17
  53. package/dist/enum/yeepay.enum.d.ts +22 -22
  54. package/dist/enum/yeepay.enum.js +30 -30
  55. package/dist/index.d.ts +203 -202
  56. package/dist/index.js +564 -562
  57. package/dist/interfaces/common/language.interface.d.ts +13 -13
  58. package/dist/interfaces/common/language.interface.js +2 -2
  59. package/dist/interfaces/member/member-transaction.interface.d.ts +27 -27
  60. package/dist/interfaces/member/member-transaction.interface.js +2 -2
  61. package/dist/interfaces/member/member.interface.d.ts +16 -16
  62. package/dist/interfaces/member/member.interface.js +2 -2
  63. package/dist/interfaces/order/baseOrder.interface.d.ts +84 -84
  64. package/dist/interfaces/order/baseOrder.interface.js +2 -2
  65. package/dist/interfaces/order/buffetOrder.interface.d.ts +13 -13
  66. package/dist/interfaces/order/buffetOrder.interface.js +2 -2
  67. package/dist/interfaces/order/deliveryOrder.interface.d.ts +9 -9
  68. package/dist/interfaces/order/deliveryOrder.interface.js +2 -2
  69. package/dist/interfaces/order/index.d.ts +7 -7
  70. package/dist/interfaces/order/index.js +6 -6
  71. package/dist/interfaces/order/order.interface.d.ts +75 -75
  72. package/dist/interfaces/order/order.interface.js +17 -17
  73. package/dist/interfaces/order/pickupOrder.interface.d.ts +8 -8
  74. package/dist/interfaces/order/pickupOrder.interface.js +2 -2
  75. package/dist/interfaces/order/serialOrder.interface.d.ts +4 -4
  76. package/dist/interfaces/order/serialOrder.interface.js +2 -2
  77. package/dist/interfaces/order/tableOrder.interface.d.ts +7 -7
  78. package/dist/interfaces/order/tableOrder.interface.js +2 -2
  79. package/dist/interfaces/reservation/reservation.interface.d.ts +46 -46
  80. package/dist/interfaces/reservation/reservation.interface.js +2 -2
  81. package/dist/interfaces/store/classification.interface.d.ts +7 -7
  82. package/dist/interfaces/store/classification.interface.js +2 -2
  83. package/dist/interfaces/store/dish.interface.d.ts +18 -18
  84. package/dist/interfaces/store/dish.interface.js +2 -2
  85. package/dist/interfaces/store/dishSnapshot.interface.d.ts +11 -11
  86. package/dist/interfaces/store/dishSnapshot.interface.js +2 -2
  87. package/dist/interfaces/store/member.interface.d.ts +8 -8
  88. package/dist/interfaces/store/member.interface.js +2 -2
  89. package/dist/interfaces/store/menu-export.interface.d.ts +12 -12
  90. package/dist/interfaces/store/menu-export.interface.js +2 -2
  91. package/dist/interfaces/store/specification.interface.d.ts +17 -17
  92. package/dist/interfaces/store/specification.interface.js +2 -2
  93. package/dist/interfaces/store/store.interface.d.ts +300 -300
  94. package/dist/interfaces/store/store.interface.js +2 -2
  95. package/dist/interfaces/store/subscription.interface.d.ts +43 -43
  96. package/dist/interfaces/store/subscription.interface.js +2 -2
  97. package/dist/interfaces/user/user.interface.d.ts +139 -139
  98. package/dist/interfaces/user/user.interface.js +2 -2
  99. package/dist/interfaces/visit-task/visit-task.interface.d.ts +17 -17
  100. package/dist/interfaces/visit-task/visit-task.interface.js +2 -2
  101. package/dist/order/index.d.ts +22 -22
  102. package/dist/order/index.js +58 -58
  103. package/jest.config.js +189 -189
  104. package/josn-hub/orders/tax-have-price-bind-order.ts +381 -381
  105. package/josn-hub/orders/tax-order.ts +371 -371
  106. package/josn-hub/orders//346/225/264/345/215/225/344/273/267/346/240/274/351/203/275/346/230/257/350/264/237/346/225/260/347/232/204/346/203/205/345/206/265.ts +321 -321
  107. package/josn-hub/orders//346/234/211/344/270/200/344/270/252/350/217/234/347/232/204/344/273/267/346/240/274/346/230/257/350/264/237/346/225/260/347/232/204/346/203/205/345/206/265.ts +348 -348
  108. package/josn-hub/orders//347/202/271/344/272/206/344/270/215/345/212/240/344/273/267/345/222/214/345/233/272/345/256/232/345/212/240/345/207/217/344/273/267/350/247/204/346/240/274/347/232/204/350/256/242/345/215/225.ts +350 -350
  109. package/josn-hub/orders//347/202/271/344/272/206/345/233/272/345/256/232/345/212/240/344/273/267-/347/231/276/345/210/206/346/257/224/345/212/240/344/273/267/350/247/204/346/240/274/347/232/204/350/256/242/345/215/225.ts +301 -301
  110. package/josn-hub/orders//347/202/271/344/272/206/346/234/252/345/212/240/344/273/267/350/247/204/346/240/274/347/232/204/350/256/242/345/215/225.ts +321 -321
  111. package/josn-hub/orders//347/202/271/344/272/206/346/234/252/345/212/240/344/273/267/350/247/204/346/240/274/347/232/204/350/256/242/345/215/225/345/271/266/346/234/211/351/205/215/351/200/201/350/264/271.ts +159 -159
  112. package/josn-hub/orders//350/207/252/345/212/251/351/244/220/347/232/204/346/203/205/345/206/265.ts +665 -665
  113. package/josn-hub/orders//351/203/250/345/210/206/351/200/200/350/217/234/347/232/204/346/203/205/345/206/265.ts +73 -73
  114. package/package.json +59 -59
  115. package/src/announcement/enum/announcement.enum.ts +12 -12
  116. package/src/buffet/index.ts +123 -123
  117. package/src/const/const.ts +2407 -2394
  118. package/src/enum/ai-token.enum.ts +10 -10
  119. package/src/enum/checkout.enum.ts +14 -14
  120. package/src/enum/common.enum.ts +20 -15
  121. package/src/enum/continent.enum.ts +8 -8
  122. package/src/enum/dish.enum.ts +4 -4
  123. package/src/enum/from.enum.ts +14 -14
  124. package/src/enum/member.enum.ts +16 -16
  125. package/src/enum/menu-io.enum.ts +4 -4
  126. package/src/enum/order.enum.ts +7 -7
  127. package/src/enum/pay-company.enum.ts +4 -4
  128. package/src/enum/printer.enum.ts +40 -40
  129. package/src/enum/receptionist.enum.ts +8 -8
  130. package/src/enum/reservation.enum.ts +5 -5
  131. package/src/enum/role.enum.ts +7 -7
  132. package/src/enum/sms.enum.ts +14 -14
  133. package/src/enum/tax.enum.ts +4 -4
  134. package/src/enum/time-menu.enum.ts +4 -4
  135. package/src/enum/timezone.emum.ts +33 -33
  136. package/src/enum/user-status.enum.ts +9 -9
  137. package/src/enum/visit-task.enum.ts +14 -14
  138. package/src/enum/yeepay.enum.ts +27 -27
  139. package/src/index.spec.ts +1082 -1082
  140. package/src/index.ts +616 -614
  141. package/src/interfaces/common/language.interface.ts +13 -13
  142. package/src/interfaces/member/member-transaction.interface.ts +32 -32
  143. package/src/interfaces/member/member.interface.ts +16 -16
  144. package/src/interfaces/order/baseOrder.interface.ts +89 -89
  145. package/src/interfaces/order/buffetOrder.interface.ts +14 -14
  146. package/src/interfaces/order/deliveryOrder.interface.ts +10 -10
  147. package/src/interfaces/order/index.ts +7 -7
  148. package/src/interfaces/order/order.interface.ts +84 -84
  149. package/src/interfaces/order/pickupOrder.interface.ts +9 -9
  150. package/src/interfaces/order/serialOrder.interface.ts +5 -5
  151. package/src/interfaces/order/tableOrder.interface.ts +8 -8
  152. package/src/interfaces/reservation/reservation.interface.ts +48 -48
  153. package/src/interfaces/store/classification.interface.ts +7 -7
  154. package/src/interfaces/store/dish.interface.ts +18 -18
  155. package/src/interfaces/store/dishSnapshot.interface.ts +12 -12
  156. package/src/interfaces/store/member.interface.ts +9 -9
  157. package/src/interfaces/store/menu-export.interface.ts +13 -13
  158. package/src/interfaces/store/specification.interface.ts +17 -17
  159. package/src/interfaces/store/store.interface.ts +316 -316
  160. package/src/interfaces/store/subscription.interface.ts +43 -43
  161. package/src/interfaces/user/user.interface.ts +139 -139
  162. package/src/interfaces/visit-task/visit-task.interface.ts +17 -17
  163. package/src/order/currency-settlement.spec.ts +72 -0
  164. package/src/order/index.ts +91 -91
  165. package/tsconfig.json +12 -12
package/dist/index.js CHANGED
@@ -1,562 +1,564 @@
1
- "use strict";
2
- function __export(m) {
3
- for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
4
- }
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- var const_1 = require("./const/const");
7
- exports.CONST = const_1.CONST;
8
- var printer_enum_1 = require("./enum/printer.enum");
9
- exports.PrintStatusEnum = printer_enum_1.PrintStatusEnum;
10
- exports.PrinterDeviceTypeEnum = printer_enum_1.PrinterDeviceTypeEnum;
11
- exports.PrinterWidthEnum = printer_enum_1.PrinterWidthEnum;
12
- var dish_enum_1 = require("./enum/dish.enum");
13
- __export(require("./enum/common.enum"));
14
- __export(require("./enum/time-menu.enum"));
15
- __export(require("./enum/printer.enum"));
16
- __export(require("./enum/member.enum"));
17
- __export(require("./enum/sms.enum"));
18
- __export(require("./enum/ai-token.enum"));
19
- __export(require("./enum/checkout.enum"));
20
- __export(require("./enum/yeepay.enum"));
21
- __export(require("./enum/timezone.emum"));
22
- __export(require("./enum/order.enum"));
23
- __export(require("./enum/tax.enum"));
24
- __export(require("./enum/dish.enum"));
25
- __export(require("./enum/user-status.enum"));
26
- __export(require("./enum/visit-task.enum"));
27
- __export(require("./enum/receptionist.enum"));
28
- __export(require("./enum/from.enum"));
29
- __export(require("./enum/role.enum"));
30
- __export(require("./enum/continent.enum"));
31
- __export(require("./enum/reservation.enum"));
32
- __export(require("./announcement/enum/announcement.enum"));
33
- var menu_io_enum_1 = require("./enum/menu-io.enum");
34
- exports.MenuImportModeEnum = menu_io_enum_1.MenuImportModeEnum;
35
- __export(require("./interfaces/order"));
36
- var pay_company_enum_1 = require("./enum/pay-company.enum");
37
- exports.PayCompanyEnum = pay_company_enum_1.PayCompanyEnum;
38
- var moment = require("moment");
39
- exports.moment = moment;
40
- var big_js_1 = require("big.js");
41
- exports.Big = big_js_1.default;
42
- var tax_enum_1 = require("./enum/tax.enum");
43
- var order_enum_1 = require("./enum/order.enum");
44
- var index_1 = require("./buffet/index");
45
- __export(require("./buffet/index"));
46
- __export(require("./order/index"));
47
- /**
48
- * 小数转化为金额,去除分位之后的尾数
49
- *
50
- * @param {number} num 需要转换的数字
51
- * @returns {number} 返回只保留两位小数的money
52
- */
53
- function parseMoney(num) {
54
- return Math.round(num * 100) / 100;
55
- }
56
- exports.parseMoney = parseMoney;
57
- /**
58
- * 计算加了规格后的菜品单价
59
- *
60
- * @param {Content} conent 单个菜品内容
61
- * @returns {number} 返回订单总金额
62
- *
63
- */
64
- function calcDishFinalPrice(conent) {
65
- var addPrice = 0;
66
- var originPrice = conent.dishSnapshot.type === dish_enum_1.DishType.Weigh
67
- ? conent.weight * conent.dishSnapshot.price
68
- : conent.dishSnapshot.price;
69
- var selectedSpecifications = conent.dishSnapshot.selectedSpecifications || [];
70
- selectedSpecifications.forEach(function (specification) {
71
- if (!specification) {
72
- return;
73
- }
74
- specification.content.forEach(function (item) {
75
- if (item.fareType == const_1.CONST.FARE_TYPE.FIXED) {
76
- addPrice += item.fare;
77
- }
78
- else if (item.fareType == const_1.CONST.FARE_TYPE.PERCENTAGE) {
79
- addPrice += (originPrice * item.fare) / 100;
80
- }
81
- });
82
- });
83
- var dishPrice = originPrice + addPrice;
84
- if (dishPrice < 0) {
85
- dishPrice = 0;
86
- }
87
- return parseMoney(dishPrice);
88
- }
89
- exports.calcDishFinalPrice = calcDishFinalPrice;
90
- /**
91
- * 利用订单计算总价
92
- *
93
- * @param {object} order 订单
94
- * @returns {number} 返回订单总金额
95
- *
96
- */
97
- function calcTotalPrice(order) {
98
- var totalPrice = 0;
99
- order.content.forEach(function (orderContentItem) {
100
- var _a;
101
- totalPrice += calcContentPrice({
102
- orderContentItem: orderContentItem,
103
- buffetItem: (_a = order.buffet) === null || _a === void 0 ? void 0 : _a.snapshot,
104
- orderType: order.type,
105
- adultNum: order.adultNum,
106
- childNum: order.childNum,
107
- contents: order.content,
108
- });
109
- });
110
- if (order.deliveryFee && !order.selfPickUp) {
111
- totalPrice += order.deliveryFee;
112
- }
113
- if (order.type === order_enum_1.OrderTypeEnum.Buffet) {
114
- totalPrice += index_1.calcBuffetTotalPrice(order.buffet.snapshot, order.adultNum, order.childNum);
115
- }
116
- return parseMoney(totalPrice);
117
- }
118
- exports.calcTotalPrice = calcTotalPrice;
119
- /**
120
- *
121
- */
122
- function calcContentPrice(_a) {
123
- var orderContentItem = _a.orderContentItem, buffetItem = _a.buffetItem, orderType = _a.orderType, adultNum = _a.adultNum, childNum = _a.childNum, contents = _a.contents;
124
- if (orderType === order_enum_1.OrderTypeEnum.Buffet) {
125
- var buffetDishItem = index_1.getDishItemInBuffet({ dishId: orderContentItem.dishSnapshot._id, buffet: buffetItem });
126
- if (buffetDishItem) {
127
- var maxUpperLimit = index_1.getMaxBuffetDishUpperLimit({
128
- buffetDishItem: buffetDishItem,
129
- adultNum: adultNum,
130
- childNum: childNum,
131
- });
132
- var beforeCount = getOrderedCountByDishId(orderContentItem.dishSnapshot._id, contents, orderContentItem._id);
133
- var maxUpperLimitForThisItem = Math.max(maxUpperLimit - beforeCount, 0);
134
- if (maxUpperLimitForThisItem >= orderContentItem.count) {
135
- return 0;
136
- }
137
- else {
138
- return (orderContentItem.count - maxUpperLimitForThisItem) * calcDishFinalPrice(orderContentItem);
139
- }
140
- }
141
- else {
142
- return orderContentItem.count * calcDishFinalPrice(orderContentItem);
143
- }
144
- }
145
- else {
146
- return orderContentItem.count * calcDishFinalPrice(orderContentItem);
147
- }
148
- }
149
- exports.calcContentPrice = calcContentPrice;
150
- /**
151
- * @param dishId
152
- * @param contents
153
- * @param beforeKey
154
- */
155
- function getOrderedCountByDishId(dishId, contents, beforeKey) {
156
- var count = 0;
157
- for (var _i = 0, _a = contents.filter(function (content) { return String(content.dishSnapshot._id) === String(dishId); }); _i < _a.length; _i++) {
158
- var content = _a[_i];
159
- if (beforeKey && String(content._id) === String(beforeKey))
160
- break;
161
- count += content.count;
162
- }
163
- return count;
164
- }
165
- exports.getOrderedCountByDishId = getOrderedCountByDishId;
166
- /**
167
- * 计算处理后的应收金额
168
- *
169
- * @param {object} order 订单
170
- * @param {Array} processArr 结账处理过程
171
- * @param noTax
172
- * @param taxEnable
173
- * @returns {object} 返回应收订单总金额,以及处理计算过程
174
- */
175
- function calcReceivablePrice(order, processArr, noTax) {
176
- if (noTax === void 0) { noTax = false; }
177
- var _a, _b;
178
- var totalDiscountPrice = 0;
179
- var resultProcessArr = [];
180
- var totalPrice = calcTotalPrice(order);
181
- var receivablePrice = totalPrice;
182
- var sortedProcessArr = processArr.sort(function (a, b) {
183
- return (const_1.CONST.RECEIVABLE_PROCESSING_TYPE[b.type.toUpperCase()].SORT -
184
- const_1.CONST.RECEIVABLE_PROCESSING_TYPE[a.type.toUpperCase()].SORT);
185
- });
186
- var totalMarkDown = 0;
187
- var receivablePriceAfterDiscount = receivablePrice;
188
- sortedProcessArr.forEach(function (process) {
189
- if (process.type === const_1.CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE) {
190
- var rate_1 = -(10 - process.value) / 10;
191
- var volume_1 = 0;
192
- order.content.forEach(function (orderContentItem) {
193
- var _a;
194
- if (orderContentItem.dishSnapshot.noFullOrderDiscount) {
195
- return;
196
- }
197
- var dishTotalPrice = calcContentPrice({
198
- orderContentItem: orderContentItem,
199
- buffetItem: (_a = order.buffet) === null || _a === void 0 ? void 0 : _a.snapshot,
200
- orderType: order.type,
201
- adultNum: order.adultNum,
202
- childNum: order.childNum,
203
- contents: order.content,
204
- });
205
- totalDiscountPrice += dishTotalPrice;
206
- volume_1 += dishTotalPrice * rate_1;
207
- });
208
- if (order.type === order_enum_1.OrderTypeEnum.Buffet) {
209
- var buffetTotalPrice = index_1.calcBuffetTotalPrice(order.buffet.snapshot, order.adultNum, order.childNum);
210
- totalDiscountPrice += buffetTotalPrice;
211
- volume_1 += buffetTotalPrice * rate_1;
212
- }
213
- resultProcessArr.push({
214
- type: process.type,
215
- value: process.value,
216
- volume: volume_1,
217
- });
218
- receivablePrice += volume_1;
219
- receivablePriceAfterDiscount = receivablePrice;
220
- }
221
- else if (process.type === const_1.CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE) {
222
- var volume = -process.value;
223
- resultProcessArr.push({
224
- type: process.type,
225
- value: process.value,
226
- volume: volume,
227
- });
228
- receivablePrice += volume;
229
- totalMarkDown += -volume;
230
- }
231
- else if (process.type === const_1.CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE) {
232
- var pow = Math.pow(10, process.value - 2);
233
- var result = Math.floor(receivablePrice / pow) * pow;
234
- var volume = -(receivablePrice - result);
235
- resultProcessArr.push({
236
- type: process.type,
237
- value: process.value,
238
- volume: volume,
239
- });
240
- receivablePrice += volume;
241
- totalMarkDown += -volume;
242
- }
243
- });
244
- var taxObj = {};
245
- if (order.taxType === tax_enum_1.TaxTypeEnum.PriceNoTaxBindDish && !noTax) {
246
- order.content.forEach(function (orderContentItem) {
247
- var _a, _b;
248
- if (!orderContentItem.dishSnapshot.taxes || orderContentItem.dishSnapshot.taxes.length === 0) {
249
- return;
250
- }
251
- var discountValue = (_a = sortedProcessArr.find(function (process) { return process.type === const_1.CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE; })) === null || _a === void 0 ? void 0 : _a.value;
252
- var dishTotalPrice = calcContentPrice({
253
- orderContentItem: orderContentItem,
254
- buffetItem: (_b = order.buffet) === null || _b === void 0 ? void 0 : _b.snapshot,
255
- orderType: order.type,
256
- adultNum: order.adultNum,
257
- childNum: order.childNum,
258
- contents: order.content,
259
- });
260
- if (discountValue && !orderContentItem.dishSnapshot.noFullOrderDiscount) {
261
- var rate = -(10 - discountValue) / 10;
262
- dishTotalPrice += dishTotalPrice * rate;
263
- }
264
- var sharedMarkDown = (totalMarkDown * dishTotalPrice) / receivablePriceAfterDiscount;
265
- orderContentItem.dishSnapshot.taxes.forEach(function (tax) {
266
- var taxFare = (dishTotalPrice - sharedMarkDown) * tax.rate;
267
- var taxKey = tax.name + "(" + big_js_1.default(tax.rate).times(100) + "%)";
268
- taxObj[taxKey] = (taxObj[taxKey] || 0) + parseMoney(taxFare);
269
- });
270
- });
271
- // buffet price
272
- if (order.type === order_enum_1.OrderTypeEnum.Buffet) {
273
- var discountValue = (_a = sortedProcessArr.find(function (process) { return process.type === const_1.CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE; })) === null || _a === void 0 ? void 0 : _a.value;
274
- var buffetTotalPrice_1 = index_1.calcBuffetTotalPrice((_b = order.buffet) === null || _b === void 0 ? void 0 : _b.snapshot, order.adultNum, order.childNum);
275
- if (discountValue) {
276
- var rate = -(10 - discountValue) / 10;
277
- buffetTotalPrice_1 += buffetTotalPrice_1 * rate;
278
- }
279
- var sharedMarkDown_1 = (totalMarkDown * buffetTotalPrice_1) / receivablePriceAfterDiscount;
280
- order.buffet.taxes.forEach(function (tax) {
281
- var taxFare = (buffetTotalPrice_1 - sharedMarkDown_1) * tax.rate;
282
- var taxKey = tax.name + "(" + big_js_1.default(tax.rate).times(100) + "%)";
283
- taxObj[taxKey] = (taxObj[taxKey] || 0) + parseMoney(taxFare);
284
- });
285
- }
286
- }
287
- else if (order.taxType === tax_enum_1.TaxTypeEnum.PriceHaveTaxBindOrder && !noTax) {
288
- var totalTaxRate_1 = 0;
289
- order.priceHaveTaxBindOrderTaxes.forEach(function (item) {
290
- totalTaxRate_1 += item.rate;
291
- });
292
- var totalTaxFare_1 = receivablePrice - receivablePrice / (totalTaxRate_1 + 1);
293
- order.priceHaveTaxBindOrderTaxes.forEach(function (item) {
294
- var taxFare = (item.rate / totalTaxRate_1) * totalTaxFare_1;
295
- var taxKey = item.name + "(" + big_js_1.default(item.rate).times(100) + "%)";
296
- taxObj[taxKey] = (taxObj[taxKey] || 0) + parseMoney(taxFare);
297
- });
298
- }
299
- var taxArr = [];
300
- for (var name_1 in taxObj) {
301
- taxArr.push({
302
- name: name_1,
303
- volume: taxObj[name_1],
304
- });
305
- if (order.taxType === tax_enum_1.TaxTypeEnum.PriceNoTaxBindDish) {
306
- receivablePrice += taxObj[name_1];
307
- }
308
- }
309
- taxArr.sort(function (item1, item2) { return item1.name - item2.name; });
310
- return {
311
- resultProcessArr: resultProcessArr,
312
- receivablePrice: parseMoney(receivablePrice),
313
- taxArr: taxArr,
314
- totalPrice: totalPrice,
315
- totalDiscountPrice: totalDiscountPrice,
316
- };
317
- }
318
- exports.calcReceivablePrice = calcReceivablePrice;
319
- /**
320
- * 计算已收金额
321
- *
322
- * @param {Array} checkoutArr 结账记录
323
- * @returns {number} 返回已收总金额
324
- */
325
- function calcReceived(checkoutArr) {
326
- if (!checkoutArr) {
327
- checkoutArr = [];
328
- }
329
- var totalPaid = 0;
330
- checkoutArr.forEach(function (checkout) {
331
- if (!checkout.retreated) {
332
- totalPaid += checkout.amount;
333
- }
334
- });
335
- return parseMoney(totalPaid);
336
- }
337
- exports.calcReceived = calcReceived;
338
- /**
339
- * 计算剩余金额,去除尾数
340
- *
341
- * @param {number} receivablePrice 应收
342
- * @param {number} received 已收
343
- * @returns {number} 返回已收总金额
344
- */
345
- function calcLeft(receivablePrice, received) {
346
- var left = receivablePrice - received;
347
- return parseMoney(left);
348
- }
349
- exports.calcLeft = calcLeft;
350
- /**
351
- * 获得可读的订单处理过程
352
- *
353
- * @param {Process} process 订单处理过程
354
- * @returns {string} 返回可读字符串
355
- */
356
- function getReadbleProcess(process) {
357
- var result = '';
358
- if (process.type === const_1.CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE) {
359
- result = '打' + process.value + '折';
360
- }
361
- else {
362
- result = const_1.CONST.RECEIVABLE_PROCESSING_TYPE[process.type.toUpperCase()].TEXT;
363
- }
364
- return result;
365
- }
366
- exports.getReadbleProcess = getReadbleProcess;
367
- var CHECK_STORE_SUBSCRIPTION_REASON;
368
- (function (CHECK_STORE_SUBSCRIPTION_REASON) {
369
- CHECK_STORE_SUBSCRIPTION_REASON[CHECK_STORE_SUBSCRIPTION_REASON["NeedBuy"] = 1] = "NeedBuy";
370
- CHECK_STORE_SUBSCRIPTION_REASON[CHECK_STORE_SUBSCRIPTION_REASON["Expires"] = 2] = "Expires";
371
- })(CHECK_STORE_SUBSCRIPTION_REASON = exports.CHECK_STORE_SUBSCRIPTION_REASON || (exports.CHECK_STORE_SUBSCRIPTION_REASON = {}));
372
- /**
373
- * 检查店铺是否开通了特定的功能
374
- *
375
- * @param {Store} store 店铺
376
- * @param {string} moduleId 功能id
377
- * @param {string | Date | number} now 对比时间
378
- * @returns {string} 返回可读字符串
379
- */
380
- function checkStoreSubscription(store, moduleId, now) {
381
- var result;
382
- var reason;
383
- // 检查永久开通
384
- if (store.subscription && store.subscription[moduleId] && store.subscription[moduleId].permanent) {
385
- return {
386
- result: true,
387
- reason: reason,
388
- };
389
- }
390
- // 非永久开通,检查过期时间
391
- if (!(store.subscription && store.subscription[moduleId] && store.subscription[moduleId].expires)) {
392
- result = false;
393
- reason = CHECK_STORE_SUBSCRIPTION_REASON.NeedBuy;
394
- }
395
- else if (moment(store.subscription[moduleId].expires).isBefore(now ? moment(now) : moment())) {
396
- result = false;
397
- reason = CHECK_STORE_SUBSCRIPTION_REASON.Expires;
398
- }
399
- else {
400
- result = true;
401
- }
402
- return {
403
- result: result,
404
- reason: reason,
405
- };
406
- }
407
- exports.checkStoreSubscription = checkStoreSubscription;
408
- /**
409
- * 根据店铺获取当前应该用的语言
410
- *
411
- * @param {Store} store 店铺
412
- * @param {string} wantLang 想要的语言
413
- * @param {string | Date | number} now 对比时间
414
- * @returns {object} 返回当前语言和可用语言
415
- */
416
- function getCurrentLangAndRange(store, wantLang, now) {
417
- var result = store.defaultLang;
418
- var langs = [store.defaultLang]; //可用语言范围
419
- if (checkStoreSubscription(store, const_1.CONST.BUSINESS.SUPER_MULTI_LANGUAGE.ID, now).result) {
420
- langs = const_1.CONST.LANGUAGE.map(function (lang) { return lang.code; });
421
- }
422
- else if (checkStoreSubscription(store, const_1.CONST.BUSINESS.MULTI_LANGUAGE.ID, now).result) {
423
- langs = store.subscription.multiLanguage.allow;
424
- }
425
- if (wantLang && langs.filter(function (item) { return wantLang.includes(item); }).length > 0) {
426
- result = wantLang;
427
- }
428
- return {
429
- currentLang: result,
430
- availableLangs: langs,
431
- };
432
- }
433
- exports.getCurrentLangAndRange = getCurrentLangAndRange;
434
- /**
435
- * 在语言对象中找到当前语言最匹配的值,
436
- * 1. 精确匹配
437
- * 2. 如果没有精确匹配,寻找默认语言
438
- * 3. 如果默认语言也没有匹配,则返回第一个不为空的语言
439
- * 4. 如果都为空,那么返回undefinded
440
- *
441
- * @param {object} names 语言
442
- * @param {string} currentLang 目标语言
443
- * @param {string} defaultLang 默认语言
444
- * @returns {string} 返回当前语言的值
445
- */
446
- function getNameFromNames(names, currentLang, defaultLang) {
447
- return (names &&
448
- (names[currentLang] || names[defaultLang] || names[Object.keys(names).filter(function (name) { return names[name]; })[0]]));
449
- }
450
- exports.getNameFromNames = getNameFromNames;
451
- /**
452
- * 根据语言返回处理过的店铺数据
453
- *
454
- * @param {Store} store 店铺
455
- * @param {string} currentLang 目标语言
456
- * @param {string} defaultLang 默认语言
457
- * @returns {object} 返回当前语言和可用语言
458
- */
459
- function getStoreByLanguage(store, currentLang, defaultLang) {
460
- store.name = getNameFromNames(store.names, currentLang, defaultLang) || store.name;
461
- store.description = getNameFromNames(store.descriptions, currentLang, defaultLang) || store.description;
462
- store.classifications.forEach(function (classification) {
463
- classification.name = getNameFromNames(classification.names, currentLang, defaultLang) || classification.name;
464
- });
465
- store.dishes.forEach(function (dish) {
466
- dish.name = getNameFromNames(dish.names, currentLang, defaultLang) || dish.name;
467
- dish.description = getNameFromNames(dish.descriptions, currentLang, defaultLang) || dish.description;
468
- });
469
- store.specifications.forEach(function (specifications) {
470
- specifications.name = getNameFromNames(specifications.names, currentLang, defaultLang) || specifications.name;
471
- specifications.content.forEach(function (content) {
472
- content.name = getNameFromNames(content.names, currentLang, defaultLang) || content.name;
473
- });
474
- });
475
- return store;
476
- }
477
- exports.getStoreByLanguage = getStoreByLanguage;
478
- /**
479
- * 根据语言返回处理过的店铺数据
480
- *
481
- * @param {Content} content 订单内容
482
- * @param {string} currentLang 目标语言
483
- * @param {string} defaultLang 默认语言
484
- * @returns {Content} 返回当前语言的订单
485
- */
486
- function getContentByLanguage(content, currentLang, defaultLang) {
487
- var dish = content.dishSnapshot;
488
- dish.name = getNameFromNames(dish.names, currentLang, defaultLang) || dish.name;
489
- if (dish.selectedSpecifications) {
490
- dish.selectedSpecifications &&
491
- dish.selectedSpecifications.forEach(function (specification) {
492
- specification.name =
493
- getNameFromNames(specification.names, currentLang, defaultLang) || specification.name;
494
- specification.content.forEach(function (tag) {
495
- tag.name = getNameFromNames(tag.names, currentLang, defaultLang) || tag.name;
496
- });
497
- });
498
- }
499
- return content;
500
- }
501
- /**
502
- * 根据语言返回处理过的订单数据
503
- *
504
- * @param {Order} order 店铺
505
- * @param {string} currentLang 目标语言
506
- * @param {string} defaultLang 默认语言
507
- * @returns {Order} 返回当前语言的订单
508
- */
509
- function getOrderByLanguage(order, currentLang, defaultLang) {
510
- if (order.content) {
511
- order.content.map(function (dishGroup) {
512
- return getContentByLanguage(dishGroup, currentLang, defaultLang);
513
- });
514
- }
515
- if (order.tasks) {
516
- order.tasks.forEach(function (task) {
517
- if (task.content) {
518
- task.content.map(function (dishGroup) {
519
- return getContentByLanguage(dishGroup, currentLang, defaultLang);
520
- });
521
- }
522
- });
523
- }
524
- return order;
525
- }
526
- exports.getOrderByLanguage = getOrderByLanguage;
527
- /**
528
- * 根据电话区号返回语言码,如果没找到,返回英文
529
- *
530
- * @param {string} countryCode 区号
531
- * @returns {string} 语言代码的小写格式
532
- */
533
- function getLanguageFromCountryCode(countryCode) {
534
- var data = {
535
- '86': 'zh',
536
- };
537
- var languageCode = data[String(countryCode)] || 'en';
538
- return languageCode;
539
- }
540
- exports.getLanguageFromCountryCode = getLanguageFromCountryCode;
541
- /**
542
- * 根据dishID返回已经下单的数量
543
- *
544
- * @param {Order} order 店铺
545
- * @param dishId
546
- * @returns {number} 返回当前数量
547
- */
548
- function getDishCountByIdInAllUncanceledTasks(order, dishId) {
549
- var count = 0;
550
- if (order.tasks) {
551
- count = order.tasks
552
- .filter(function (task) { return task.status !== const_1.CONST.STATUS.CANCELLED; })
553
- .reduce(function (count, task) {
554
- return (count +
555
- task.content
556
- .filter(function (item) { return String(item.dishSnapshot._id) === String(dishId); })
557
- .reduce(function (value, item) { return value + item.count; }, 0));
558
- }, 0);
559
- }
560
- return count;
561
- }
562
- exports.getDishCountByIdInAllUncanceledTasks = getDishCountByIdInAllUncanceledTasks;
1
+ "use strict";
2
+ function __export(m) {
3
+ for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
4
+ }
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var const_1 = require("./const/const");
7
+ exports.CONST = const_1.CONST;
8
+ var printer_enum_1 = require("./enum/printer.enum");
9
+ exports.PrintStatusEnum = printer_enum_1.PrintStatusEnum;
10
+ exports.PrinterDeviceTypeEnum = printer_enum_1.PrinterDeviceTypeEnum;
11
+ exports.PrinterWidthEnum = printer_enum_1.PrinterWidthEnum;
12
+ var dish_enum_1 = require("./enum/dish.enum");
13
+ __export(require("./enum/common.enum"));
14
+ __export(require("./enum/time-menu.enum"));
15
+ __export(require("./enum/printer.enum"));
16
+ __export(require("./enum/member.enum"));
17
+ __export(require("./enum/sms.enum"));
18
+ __export(require("./enum/ai-token.enum"));
19
+ __export(require("./enum/checkout.enum"));
20
+ __export(require("./enum/yeepay.enum"));
21
+ __export(require("./enum/timezone.emum"));
22
+ __export(require("./enum/order.enum"));
23
+ __export(require("./enum/tax.enum"));
24
+ __export(require("./enum/dish.enum"));
25
+ __export(require("./enum/user-status.enum"));
26
+ __export(require("./enum/visit-task.enum"));
27
+ __export(require("./enum/receptionist.enum"));
28
+ __export(require("./enum/from.enum"));
29
+ __export(require("./enum/role.enum"));
30
+ __export(require("./enum/continent.enum"));
31
+ __export(require("./enum/reservation.enum"));
32
+ __export(require("./announcement/enum/announcement.enum"));
33
+ var menu_io_enum_1 = require("./enum/menu-io.enum");
34
+ exports.MenuImportModeEnum = menu_io_enum_1.MenuImportModeEnum;
35
+ __export(require("./interfaces/order"));
36
+ var pay_company_enum_1 = require("./enum/pay-company.enum");
37
+ exports.PayCompanyEnum = pay_company_enum_1.PayCompanyEnum;
38
+ var moment = require("moment");
39
+ exports.moment = moment;
40
+ var big_js_1 = require("big.js");
41
+ exports.Big = big_js_1.default;
42
+ var tax_enum_1 = require("./enum/tax.enum");
43
+ var order_enum_1 = require("./enum/order.enum");
44
+ var index_1 = require("./buffet/index");
45
+ __export(require("./buffet/index"));
46
+ __export(require("./order/index"));
47
+ /**
48
+ * 小数转化为金额,去除分位之后的尾数
49
+ *
50
+ * @param {number} num 需要转换的数字
51
+ * @returns {number} 返回只保留两位小数的money
52
+ */
53
+ function parseMoney(num) {
54
+ return Math.round(num * 100) / 100;
55
+ }
56
+ exports.parseMoney = parseMoney;
57
+ /**
58
+ * 计算加了规格后的菜品单价
59
+ *
60
+ * @param {Content} conent 单个菜品内容
61
+ * @returns {number} 返回订单总金额
62
+ *
63
+ */
64
+ function calcDishFinalPrice(conent) {
65
+ var addPrice = 0;
66
+ var originPrice = conent.dishSnapshot.type === dish_enum_1.DishType.Weigh
67
+ ? conent.weight * conent.dishSnapshot.price
68
+ : conent.dishSnapshot.price;
69
+ var selectedSpecifications = conent.dishSnapshot.selectedSpecifications || [];
70
+ selectedSpecifications.forEach(function (specification) {
71
+ if (!specification) {
72
+ return;
73
+ }
74
+ specification.content.forEach(function (item) {
75
+ if (item.fareType == const_1.CONST.FARE_TYPE.FIXED) {
76
+ addPrice += item.fare;
77
+ }
78
+ else if (item.fareType == const_1.CONST.FARE_TYPE.PERCENTAGE) {
79
+ addPrice += (originPrice * item.fare) / 100;
80
+ }
81
+ });
82
+ });
83
+ var dishPrice = originPrice + addPrice;
84
+ if (dishPrice < 0) {
85
+ dishPrice = 0;
86
+ }
87
+ return parseMoney(dishPrice);
88
+ }
89
+ exports.calcDishFinalPrice = calcDishFinalPrice;
90
+ /**
91
+ * 利用订单计算总价
92
+ *
93
+ * @param {object} order 订单
94
+ * @returns {number} 返回订单总金额
95
+ *
96
+ */
97
+ function calcTotalPrice(order) {
98
+ var totalPrice = 0;
99
+ order.content.forEach(function (orderContentItem) {
100
+ var _a;
101
+ totalPrice += calcContentPrice({
102
+ orderContentItem: orderContentItem,
103
+ buffetItem: (_a = order.buffet) === null || _a === void 0 ? void 0 : _a.snapshot,
104
+ orderType: order.type,
105
+ adultNum: order.adultNum,
106
+ childNum: order.childNum,
107
+ contents: order.content,
108
+ });
109
+ });
110
+ if (order.deliveryFee && !order.selfPickUp) {
111
+ totalPrice += order.deliveryFee;
112
+ }
113
+ if (order.type === order_enum_1.OrderTypeEnum.Buffet) {
114
+ totalPrice += index_1.calcBuffetTotalPrice(order.buffet.snapshot, order.adultNum, order.childNum);
115
+ }
116
+ return parseMoney(totalPrice);
117
+ }
118
+ exports.calcTotalPrice = calcTotalPrice;
119
+ /**
120
+ *
121
+ */
122
+ function calcContentPrice(_a) {
123
+ var orderContentItem = _a.orderContentItem, buffetItem = _a.buffetItem, orderType = _a.orderType, adultNum = _a.adultNum, childNum = _a.childNum, contents = _a.contents;
124
+ if (orderType === order_enum_1.OrderTypeEnum.Buffet) {
125
+ var buffetDishItem = index_1.getDishItemInBuffet({ dishId: orderContentItem.dishSnapshot._id, buffet: buffetItem });
126
+ if (buffetDishItem) {
127
+ var maxUpperLimit = index_1.getMaxBuffetDishUpperLimit({
128
+ buffetDishItem: buffetDishItem,
129
+ adultNum: adultNum,
130
+ childNum: childNum,
131
+ });
132
+ var beforeCount = getOrderedCountByDishId(orderContentItem.dishSnapshot._id, contents, orderContentItem._id);
133
+ var maxUpperLimitForThisItem = Math.max(maxUpperLimit - beforeCount, 0);
134
+ if (maxUpperLimitForThisItem >= orderContentItem.count) {
135
+ return 0;
136
+ }
137
+ else {
138
+ return (orderContentItem.count - maxUpperLimitForThisItem) * calcDishFinalPrice(orderContentItem);
139
+ }
140
+ }
141
+ else {
142
+ return orderContentItem.count * calcDishFinalPrice(orderContentItem);
143
+ }
144
+ }
145
+ else {
146
+ return orderContentItem.count * calcDishFinalPrice(orderContentItem);
147
+ }
148
+ }
149
+ exports.calcContentPrice = calcContentPrice;
150
+ /**
151
+ * @param dishId
152
+ * @param contents
153
+ * @param beforeKey
154
+ */
155
+ function getOrderedCountByDishId(dishId, contents, beforeKey) {
156
+ var count = 0;
157
+ for (var _i = 0, _a = contents.filter(function (content) { return String(content.dishSnapshot._id) === String(dishId); }); _i < _a.length; _i++) {
158
+ var content = _a[_i];
159
+ if (beforeKey && String(content._id) === String(beforeKey))
160
+ break;
161
+ count += content.count;
162
+ }
163
+ return count;
164
+ }
165
+ exports.getOrderedCountByDishId = getOrderedCountByDishId;
166
+ /**
167
+ * 计算处理后的应收金额
168
+ *
169
+ * @param {object} order 订单
170
+ * @param {Array} processArr 结账处理过程
171
+ * @param noTax
172
+ * @param taxEnable
173
+ * @returns {object} 返回应收订单总金额,以及处理计算过程
174
+ */
175
+ function calcReceivablePrice(order, processArr, noTax) {
176
+ if (noTax === void 0) { noTax = false; }
177
+ var _a, _b;
178
+ var totalDiscountPrice = 0;
179
+ var resultProcessArr = [];
180
+ var totalPrice = calcTotalPrice(order);
181
+ var receivablePrice = totalPrice;
182
+ var sortedProcessArr = processArr.sort(function (a, b) {
183
+ return (const_1.CONST.RECEIVABLE_PROCESSING_TYPE[b.type.toUpperCase()].SORT -
184
+ const_1.CONST.RECEIVABLE_PROCESSING_TYPE[a.type.toUpperCase()].SORT);
185
+ });
186
+ var totalMarkDown = 0;
187
+ var receivablePriceAfterDiscount = receivablePrice;
188
+ sortedProcessArr.forEach(function (process) {
189
+ if (process.type === const_1.CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE) {
190
+ var rate_1 = -(10 - process.value) / 10;
191
+ var volume_1 = 0;
192
+ order.content.forEach(function (orderContentItem) {
193
+ var _a;
194
+ if (orderContentItem.dishSnapshot.noFullOrderDiscount) {
195
+ return;
196
+ }
197
+ var dishTotalPrice = calcContentPrice({
198
+ orderContentItem: orderContentItem,
199
+ buffetItem: (_a = order.buffet) === null || _a === void 0 ? void 0 : _a.snapshot,
200
+ orderType: order.type,
201
+ adultNum: order.adultNum,
202
+ childNum: order.childNum,
203
+ contents: order.content,
204
+ });
205
+ totalDiscountPrice += dishTotalPrice;
206
+ volume_1 += dishTotalPrice * rate_1;
207
+ });
208
+ if (order.type === order_enum_1.OrderTypeEnum.Buffet) {
209
+ var buffetTotalPrice = index_1.calcBuffetTotalPrice(order.buffet.snapshot, order.adultNum, order.childNum);
210
+ totalDiscountPrice += buffetTotalPrice;
211
+ volume_1 += buffetTotalPrice * rate_1;
212
+ }
213
+ resultProcessArr.push({
214
+ type: process.type,
215
+ value: process.value,
216
+ volume: volume_1,
217
+ });
218
+ receivablePrice += volume_1;
219
+ receivablePriceAfterDiscount = receivablePrice;
220
+ }
221
+ else if (process.type === const_1.CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE) {
222
+ var volume = -process.value;
223
+ resultProcessArr.push({
224
+ type: process.type,
225
+ value: process.value,
226
+ volume: volume,
227
+ });
228
+ receivablePrice += volume;
229
+ totalMarkDown += -volume;
230
+ }
231
+ else if (process.type === const_1.CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE) {
232
+ var pow = Math.pow(10, process.value - 2);
233
+ var result = Math.floor(receivablePrice / pow) * pow;
234
+ var volume = -(receivablePrice - result);
235
+ resultProcessArr.push({
236
+ type: process.type,
237
+ value: process.value,
238
+ volume: volume,
239
+ });
240
+ receivablePrice += volume;
241
+ totalMarkDown += -volume;
242
+ }
243
+ });
244
+ var taxObj = {};
245
+ if (order.taxType === tax_enum_1.TaxTypeEnum.PriceNoTaxBindDish && !noTax) {
246
+ order.content.forEach(function (orderContentItem) {
247
+ var _a, _b;
248
+ if (!orderContentItem.dishSnapshot.taxes || orderContentItem.dishSnapshot.taxes.length === 0) {
249
+ return;
250
+ }
251
+ var discountValue = (_a = sortedProcessArr.find(function (process) { return process.type === const_1.CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE; })) === null || _a === void 0 ? void 0 : _a.value;
252
+ var dishTotalPrice = calcContentPrice({
253
+ orderContentItem: orderContentItem,
254
+ buffetItem: (_b = order.buffet) === null || _b === void 0 ? void 0 : _b.snapshot,
255
+ orderType: order.type,
256
+ adultNum: order.adultNum,
257
+ childNum: order.childNum,
258
+ contents: order.content,
259
+ });
260
+ if (discountValue && !orderContentItem.dishSnapshot.noFullOrderDiscount) {
261
+ var rate = -(10 - discountValue) / 10;
262
+ dishTotalPrice += dishTotalPrice * rate;
263
+ }
264
+ var sharedMarkDown = (totalMarkDown * dishTotalPrice) / receivablePriceAfterDiscount;
265
+ orderContentItem.dishSnapshot.taxes.forEach(function (tax) {
266
+ var taxFare = (dishTotalPrice - sharedMarkDown) * tax.rate;
267
+ var taxKey = tax.name + "(" + big_js_1.default(tax.rate).times(100) + "%)";
268
+ taxObj[taxKey] = (taxObj[taxKey] || 0) + parseMoney(taxFare);
269
+ });
270
+ });
271
+ // buffet price
272
+ if (order.type === order_enum_1.OrderTypeEnum.Buffet) {
273
+ var discountValue = (_a = sortedProcessArr.find(function (process) { return process.type === const_1.CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE; })) === null || _a === void 0 ? void 0 : _a.value;
274
+ var buffetTotalPrice_1 = index_1.calcBuffetTotalPrice((_b = order.buffet) === null || _b === void 0 ? void 0 : _b.snapshot, order.adultNum, order.childNum);
275
+ if (discountValue) {
276
+ var rate = -(10 - discountValue) / 10;
277
+ buffetTotalPrice_1 += buffetTotalPrice_1 * rate;
278
+ }
279
+ var sharedMarkDown_1 = (totalMarkDown * buffetTotalPrice_1) / receivablePriceAfterDiscount;
280
+ order.buffet.taxes.forEach(function (tax) {
281
+ var taxFare = (buffetTotalPrice_1 - sharedMarkDown_1) * tax.rate;
282
+ var taxKey = tax.name + "(" + big_js_1.default(tax.rate).times(100) + "%)";
283
+ taxObj[taxKey] = (taxObj[taxKey] || 0) + parseMoney(taxFare);
284
+ });
285
+ }
286
+ }
287
+ else if (order.taxType === tax_enum_1.TaxTypeEnum.PriceHaveTaxBindOrder && !noTax) {
288
+ var totalTaxRate_1 = 0;
289
+ order.priceHaveTaxBindOrderTaxes.forEach(function (item) {
290
+ totalTaxRate_1 += item.rate;
291
+ });
292
+ var totalTaxFare_1 = receivablePrice - receivablePrice / (totalTaxRate_1 + 1);
293
+ order.priceHaveTaxBindOrderTaxes.forEach(function (item) {
294
+ var taxFare = (item.rate / totalTaxRate_1) * totalTaxFare_1;
295
+ var taxKey = item.name + "(" + big_js_1.default(item.rate).times(100) + "%)";
296
+ taxObj[taxKey] = (taxObj[taxKey] || 0) + parseMoney(taxFare);
297
+ });
298
+ }
299
+ var taxArr = [];
300
+ for (var name_1 in taxObj) {
301
+ taxArr.push({
302
+ name: name_1,
303
+ volume: taxObj[name_1],
304
+ });
305
+ if (order.taxType === tax_enum_1.TaxTypeEnum.PriceNoTaxBindDish) {
306
+ receivablePrice += taxObj[name_1];
307
+ }
308
+ }
309
+ taxArr.sort(function (item1, item2) { return item1.name - item2.name; });
310
+ return {
311
+ resultProcessArr: resultProcessArr,
312
+ receivablePrice: parseMoney(receivablePrice),
313
+ taxArr: taxArr,
314
+ totalPrice: totalPrice,
315
+ totalDiscountPrice: totalDiscountPrice,
316
+ };
317
+ }
318
+ exports.calcReceivablePrice = calcReceivablePrice;
319
+ /**
320
+ * 计算已收金额
321
+ *
322
+ * @param {Array} checkoutArr 结账记录
323
+ * @returns {number} 返回已收总金额
324
+ */
325
+ function calcReceived(checkoutArr) {
326
+ if (!checkoutArr) {
327
+ checkoutArr = [];
328
+ }
329
+ var totalPaid = 0;
330
+ checkoutArr.forEach(function (checkout) {
331
+ if (!checkout.retreated) {
332
+ totalPaid += checkout.amount;
333
+ }
334
+ });
335
+ return parseMoney(totalPaid);
336
+ }
337
+ exports.calcReceived = calcReceived;
338
+ /**
339
+ * 计算剩余金额,去除尾数
340
+ *
341
+ * @param {number} receivablePrice 应收
342
+ * @param {number} received 已收
343
+ * @param {string} currency 可选货币符号,大额货币只结算整数余额
344
+ * @returns {number} 返回已收总金额
345
+ */
346
+ function calcLeft(receivablePrice, received, currency) {
347
+ var left = receivablePrice - received;
348
+ var amount = parseMoney(left);
349
+ return const_1.CONST.LARGE_CURRENCY.includes(currency) ? Math.floor(amount) : amount;
350
+ }
351
+ exports.calcLeft = calcLeft;
352
+ /**
353
+ * 获得可读的订单处理过程
354
+ *
355
+ * @param {Process} process 订单处理过程
356
+ * @returns {string} 返回可读字符串
357
+ */
358
+ function getReadbleProcess(process) {
359
+ var result = '';
360
+ if (process.type === const_1.CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE) {
361
+ result = '打' + process.value + '折';
362
+ }
363
+ else {
364
+ result = const_1.CONST.RECEIVABLE_PROCESSING_TYPE[process.type.toUpperCase()].TEXT;
365
+ }
366
+ return result;
367
+ }
368
+ exports.getReadbleProcess = getReadbleProcess;
369
+ var CHECK_STORE_SUBSCRIPTION_REASON;
370
+ (function (CHECK_STORE_SUBSCRIPTION_REASON) {
371
+ CHECK_STORE_SUBSCRIPTION_REASON[CHECK_STORE_SUBSCRIPTION_REASON["NeedBuy"] = 1] = "NeedBuy";
372
+ CHECK_STORE_SUBSCRIPTION_REASON[CHECK_STORE_SUBSCRIPTION_REASON["Expires"] = 2] = "Expires";
373
+ })(CHECK_STORE_SUBSCRIPTION_REASON = exports.CHECK_STORE_SUBSCRIPTION_REASON || (exports.CHECK_STORE_SUBSCRIPTION_REASON = {}));
374
+ /**
375
+ * 检查店铺是否开通了特定的功能
376
+ *
377
+ * @param {Store} store 店铺
378
+ * @param {string} moduleId 功能id
379
+ * @param {string | Date | number} now 对比时间
380
+ * @returns {string} 返回可读字符串
381
+ */
382
+ function checkStoreSubscription(store, moduleId, now) {
383
+ var result;
384
+ var reason;
385
+ // 检查永久开通
386
+ if (store.subscription && store.subscription[moduleId] && store.subscription[moduleId].permanent) {
387
+ return {
388
+ result: true,
389
+ reason: reason,
390
+ };
391
+ }
392
+ // 非永久开通,检查过期时间
393
+ if (!(store.subscription && store.subscription[moduleId] && store.subscription[moduleId].expires)) {
394
+ result = false;
395
+ reason = CHECK_STORE_SUBSCRIPTION_REASON.NeedBuy;
396
+ }
397
+ else if (moment(store.subscription[moduleId].expires).isBefore(now ? moment(now) : moment())) {
398
+ result = false;
399
+ reason = CHECK_STORE_SUBSCRIPTION_REASON.Expires;
400
+ }
401
+ else {
402
+ result = true;
403
+ }
404
+ return {
405
+ result: result,
406
+ reason: reason,
407
+ };
408
+ }
409
+ exports.checkStoreSubscription = checkStoreSubscription;
410
+ /**
411
+ * 根据店铺获取当前应该用的语言
412
+ *
413
+ * @param {Store} store 店铺
414
+ * @param {string} wantLang 想要的语言
415
+ * @param {string | Date | number} now 对比时间
416
+ * @returns {object} 返回当前语言和可用语言
417
+ */
418
+ function getCurrentLangAndRange(store, wantLang, now) {
419
+ var result = store.defaultLang;
420
+ var langs = [store.defaultLang]; //可用语言范围
421
+ if (checkStoreSubscription(store, const_1.CONST.BUSINESS.SUPER_MULTI_LANGUAGE.ID, now).result) {
422
+ langs = const_1.CONST.LANGUAGE.map(function (lang) { return lang.code; });
423
+ }
424
+ else if (checkStoreSubscription(store, const_1.CONST.BUSINESS.MULTI_LANGUAGE.ID, now).result) {
425
+ langs = store.subscription.multiLanguage.allow;
426
+ }
427
+ if (wantLang && langs.filter(function (item) { return wantLang.includes(item); }).length > 0) {
428
+ result = wantLang;
429
+ }
430
+ return {
431
+ currentLang: result,
432
+ availableLangs: langs,
433
+ };
434
+ }
435
+ exports.getCurrentLangAndRange = getCurrentLangAndRange;
436
+ /**
437
+ * 在语言对象中找到当前语言最匹配的值,
438
+ * 1. 精确匹配
439
+ * 2. 如果没有精确匹配,寻找默认语言
440
+ * 3. 如果默认语言也没有匹配,则返回第一个不为空的语言
441
+ * 4. 如果都为空,那么返回undefinded
442
+ *
443
+ * @param {object} names 语言
444
+ * @param {string} currentLang 目标语言
445
+ * @param {string} defaultLang 默认语言
446
+ * @returns {string} 返回当前语言的值
447
+ */
448
+ function getNameFromNames(names, currentLang, defaultLang) {
449
+ return (names &&
450
+ (names[currentLang] || names[defaultLang] || names[Object.keys(names).filter(function (name) { return names[name]; })[0]]));
451
+ }
452
+ exports.getNameFromNames = getNameFromNames;
453
+ /**
454
+ * 根据语言返回处理过的店铺数据
455
+ *
456
+ * @param {Store} store 店铺
457
+ * @param {string} currentLang 目标语言
458
+ * @param {string} defaultLang 默认语言
459
+ * @returns {object} 返回当前语言和可用语言
460
+ */
461
+ function getStoreByLanguage(store, currentLang, defaultLang) {
462
+ store.name = getNameFromNames(store.names, currentLang, defaultLang) || store.name;
463
+ store.description = getNameFromNames(store.descriptions, currentLang, defaultLang) || store.description;
464
+ store.classifications.forEach(function (classification) {
465
+ classification.name = getNameFromNames(classification.names, currentLang, defaultLang) || classification.name;
466
+ });
467
+ store.dishes.forEach(function (dish) {
468
+ dish.name = getNameFromNames(dish.names, currentLang, defaultLang) || dish.name;
469
+ dish.description = getNameFromNames(dish.descriptions, currentLang, defaultLang) || dish.description;
470
+ });
471
+ store.specifications.forEach(function (specifications) {
472
+ specifications.name = getNameFromNames(specifications.names, currentLang, defaultLang) || specifications.name;
473
+ specifications.content.forEach(function (content) {
474
+ content.name = getNameFromNames(content.names, currentLang, defaultLang) || content.name;
475
+ });
476
+ });
477
+ return store;
478
+ }
479
+ exports.getStoreByLanguage = getStoreByLanguage;
480
+ /**
481
+ * 根据语言返回处理过的店铺数据
482
+ *
483
+ * @param {Content} content 订单内容
484
+ * @param {string} currentLang 目标语言
485
+ * @param {string} defaultLang 默认语言
486
+ * @returns {Content} 返回当前语言的订单
487
+ */
488
+ function getContentByLanguage(content, currentLang, defaultLang) {
489
+ var dish = content.dishSnapshot;
490
+ dish.name = getNameFromNames(dish.names, currentLang, defaultLang) || dish.name;
491
+ if (dish.selectedSpecifications) {
492
+ dish.selectedSpecifications &&
493
+ dish.selectedSpecifications.forEach(function (specification) {
494
+ specification.name =
495
+ getNameFromNames(specification.names, currentLang, defaultLang) || specification.name;
496
+ specification.content.forEach(function (tag) {
497
+ tag.name = getNameFromNames(tag.names, currentLang, defaultLang) || tag.name;
498
+ });
499
+ });
500
+ }
501
+ return content;
502
+ }
503
+ /**
504
+ * 根据语言返回处理过的订单数据
505
+ *
506
+ * @param {Order} order 店铺
507
+ * @param {string} currentLang 目标语言
508
+ * @param {string} defaultLang 默认语言
509
+ * @returns {Order} 返回当前语言的订单
510
+ */
511
+ function getOrderByLanguage(order, currentLang, defaultLang) {
512
+ if (order.content) {
513
+ order.content.map(function (dishGroup) {
514
+ return getContentByLanguage(dishGroup, currentLang, defaultLang);
515
+ });
516
+ }
517
+ if (order.tasks) {
518
+ order.tasks.forEach(function (task) {
519
+ if (task.content) {
520
+ task.content.map(function (dishGroup) {
521
+ return getContentByLanguage(dishGroup, currentLang, defaultLang);
522
+ });
523
+ }
524
+ });
525
+ }
526
+ return order;
527
+ }
528
+ exports.getOrderByLanguage = getOrderByLanguage;
529
+ /**
530
+ * 根据电话区号返回语言码,如果没找到,返回英文
531
+ *
532
+ * @param {string} countryCode 区号
533
+ * @returns {string} 语言代码的小写格式
534
+ */
535
+ function getLanguageFromCountryCode(countryCode) {
536
+ var data = {
537
+ '86': 'zh',
538
+ };
539
+ var languageCode = data[String(countryCode)] || 'en';
540
+ return languageCode;
541
+ }
542
+ exports.getLanguageFromCountryCode = getLanguageFromCountryCode;
543
+ /**
544
+ * 根据dishID返回已经下单的数量
545
+ *
546
+ * @param {Order} order 店铺
547
+ * @param dishId
548
+ * @returns {number} 返回当前数量
549
+ */
550
+ function getDishCountByIdInAllUncanceledTasks(order, dishId) {
551
+ var count = 0;
552
+ if (order.tasks) {
553
+ count = order.tasks
554
+ .filter(function (task) { return task.status !== const_1.CONST.STATUS.CANCELLED; })
555
+ .reduce(function (count, task) {
556
+ return (count +
557
+ task.content
558
+ .filter(function (item) { return String(item.dishSnapshot._id) === String(dishId); })
559
+ .reduce(function (value, item) { return value + item.count; }, 0));
560
+ }, 0);
561
+ }
562
+ return count;
563
+ }
564
+ exports.getDishCountByIdInAllUncanceledTasks = getDishCountByIdInAllUncanceledTasks;