@things-factory/sales-base 8.0.0-beta.9 → 8.0.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.
Files changed (178) hide show
  1. package/dist-server/tsconfig.tsbuildinfo +1 -1
  2. package/package.json +13 -13
  3. package/server/constants/attachment-type.ts +9 -0
  4. package/server/constants/index.ts +7 -0
  5. package/server/constants/load-type.ts +4 -0
  6. package/server/constants/order.ts +203 -0
  7. package/server/constants/product-group-type.ts +4 -0
  8. package/server/constants/release-good.ts +9 -0
  9. package/server/constants/transfer-order-type.ts +6 -0
  10. package/server/constants/validation-error-code.ts +3 -0
  11. package/server/constants/vas-target-type.ts +25 -0
  12. package/server/controllers/ecommerce/ecommerce-controller.ts +122 -0
  13. package/server/controllers/ecommerce/index.ts +2 -0
  14. package/server/controllers/ecommerce/sellercraft-controller.ts +182 -0
  15. package/server/controllers/index.ts +2 -0
  16. package/server/controllers/order-controller.ts +296 -0
  17. package/server/errors/index.ts +1 -0
  18. package/server/errors/validation-error.ts +25 -0
  19. package/server/index.ts +5 -0
  20. package/server/migrations/index.ts +9 -0
  21. package/server/service/arrival-notice/arrival-notice-mutation.ts +1152 -0
  22. package/server/service/arrival-notice/arrival-notice-query.ts +549 -0
  23. package/server/service/arrival-notice/arrival-notice-types.ts +310 -0
  24. package/server/service/arrival-notice/arrival-notice.ts +202 -0
  25. package/server/service/arrival-notice/index.ts +9 -0
  26. package/server/service/claim/claim-mutation.ts +308 -0
  27. package/server/service/claim/claim-query.ts +122 -0
  28. package/server/service/claim/claim-types.ts +130 -0
  29. package/server/service/claim/claim.ts +140 -0
  30. package/server/service/claim/index.ts +9 -0
  31. package/server/service/claim-detail/claim-detail-mutation.ts +102 -0
  32. package/server/service/claim-detail/claim-detail-query.ts +55 -0
  33. package/server/service/claim-detail/claim-detail-types.ts +47 -0
  34. package/server/service/claim-detail/claim-detail.ts +69 -0
  35. package/server/service/claim-detail/index.ts +9 -0
  36. package/server/service/claim-order/claim-order-mutation.ts +101 -0
  37. package/server/service/claim-order/claim-order-query.ts +47 -0
  38. package/server/service/claim-order/claim-order-types.ts +35 -0
  39. package/server/service/claim-order/claim-order.ts +81 -0
  40. package/server/service/claim-order/index.ts +9 -0
  41. package/server/service/collection-order/collection-order-mutation.ts +245 -0
  42. package/server/service/collection-order/collection-order-query.ts +97 -0
  43. package/server/service/collection-order/collection-order-types.ts +165 -0
  44. package/server/service/collection-order/collection-order.ts +135 -0
  45. package/server/service/collection-order/index.ts +9 -0
  46. package/server/service/delivery-order/delivery-order-mutation.ts +967 -0
  47. package/server/service/delivery-order/delivery-order-query.ts +631 -0
  48. package/server/service/delivery-order/delivery-order-types.ts +268 -0
  49. package/server/service/delivery-order/delivery-order.ts +258 -0
  50. package/server/service/delivery-order/index.ts +9 -0
  51. package/server/service/draft-release-good/draft-release-good-mutation.ts +765 -0
  52. package/server/service/draft-release-good/draft-release-good-query.ts +354 -0
  53. package/server/service/draft-release-good/draft-release-good-type.ts +261 -0
  54. package/server/service/draft-release-good/draft-release-good.ts +284 -0
  55. package/server/service/draft-release-good/index.ts +9 -0
  56. package/server/service/goods-receival-note/goods-receival-note-mutation.ts +129 -0
  57. package/server/service/goods-receival-note/goods-receival-note-query.ts +280 -0
  58. package/server/service/goods-receival-note/goods-receival-note-types.ts +105 -0
  59. package/server/service/goods-receival-note/goods-receival-note.ts +127 -0
  60. package/server/service/goods-receival-note/index.ts +9 -0
  61. package/server/service/index.ts +238 -0
  62. package/server/service/inventory-check/index.ts +9 -0
  63. package/server/service/inventory-check/inventory-check-mutation.ts +149 -0
  64. package/server/service/inventory-check/inventory-check-query.ts +48 -0
  65. package/server/service/inventory-check/inventory-check-types.ts +48 -0
  66. package/server/service/inventory-check/inventory-check.ts +90 -0
  67. package/server/service/invoice/index.ts +9 -0
  68. package/server/service/invoice/invoice-mutation.ts +95 -0
  69. package/server/service/invoice/invoice-query.ts +53 -0
  70. package/server/service/invoice/invoice-types.ts +279 -0
  71. package/server/service/invoice/invoice.ts +230 -0
  72. package/server/service/invoice-product/index.ts +9 -0
  73. package/server/service/invoice-product/invoice-product-mutation.ts +54 -0
  74. package/server/service/invoice-product/invoice-product-query.ts +54 -0
  75. package/server/service/invoice-product/invoice-product-types.ts +84 -0
  76. package/server/service/invoice-product/invoice-product.ts +92 -0
  77. package/server/service/job-sheet/index.ts +9 -0
  78. package/server/service/job-sheet/job-sheet-mutation.ts +92 -0
  79. package/server/service/job-sheet/job-sheet-query.ts +112 -0
  80. package/server/service/job-sheet/job-sheet-types.ts +78 -0
  81. package/server/service/job-sheet/job-sheet.ts +102 -0
  82. package/server/service/manifest/index.ts +6 -0
  83. package/server/service/manifest/manifest-mutation.ts +190 -0
  84. package/server/service/manifest/manifest-query.ts +149 -0
  85. package/server/service/manifest/manifest-type.ts +84 -0
  86. package/server/service/manifest/manifest.ts +114 -0
  87. package/server/service/order-inventory/index.ts +9 -0
  88. package/server/service/order-inventory/order-inventory-mutation.ts +54 -0
  89. package/server/service/order-inventory/order-inventory-query.ts +722 -0
  90. package/server/service/order-inventory/order-inventory-types.ts +238 -0
  91. package/server/service/order-inventory/order-inventory.ts +401 -0
  92. package/server/service/order-product/index.ts +9 -0
  93. package/server/service/order-product/order-product-mutation.ts +48 -0
  94. package/server/service/order-product/order-product-query.ts +89 -0
  95. package/server/service/order-product/order-product-types.ts +335 -0
  96. package/server/service/order-product/order-product.ts +362 -0
  97. package/server/service/order-tote/index.ts +9 -0
  98. package/server/service/order-tote/order-tote-mutation.ts +31 -0
  99. package/server/service/order-tote/order-tote-query.ts +112 -0
  100. package/server/service/order-tote/order-tote-types.ts +47 -0
  101. package/server/service/order-tote/order-tote.ts +73 -0
  102. package/server/service/order-tote-item/index.ts +9 -0
  103. package/server/service/order-tote-item/order-tote-item-mutation.ts +31 -0
  104. package/server/service/order-tote-item/order-tote-item-query.ts +82 -0
  105. package/server/service/order-tote-item/order-tote-item-types.ts +56 -0
  106. package/server/service/order-tote-item/order-tote-item.ts +72 -0
  107. package/server/service/order-tote-seal/index.ts +9 -0
  108. package/server/service/order-tote-seal/order-tote-seal-mutation.ts +31 -0
  109. package/server/service/order-tote-seal/order-tote-seal-query.ts +59 -0
  110. package/server/service/order-tote-seal/order-tote-seal-types.ts +41 -0
  111. package/server/service/order-tote-seal/order-tote-seal.ts +46 -0
  112. package/server/service/order-vas/index.ts +9 -0
  113. package/server/service/order-vas/order-vas-mutation.ts +20 -0
  114. package/server/service/order-vas/order-vas-query.ts +72 -0
  115. package/server/service/order-vas/order-vas-types.ts +159 -0
  116. package/server/service/order-vas/order-vas.ts +207 -0
  117. package/server/service/others/index.ts +5 -0
  118. package/server/service/others/other-query.ts +563 -0
  119. package/server/service/others/other-types.ts +115 -0
  120. package/server/service/purchase-order/index.ts +9 -0
  121. package/server/service/purchase-order/purchase-order-mutation.ts +458 -0
  122. package/server/service/purchase-order/purchase-order-query.ts +90 -0
  123. package/server/service/purchase-order/purchase-order-types.ts +154 -0
  124. package/server/service/purchase-order/purchase-order.ts +172 -0
  125. package/server/service/purchase-order-other-charge/index.ts +9 -0
  126. package/server/service/purchase-order-other-charge/purchase-order-other-charge-mutation.ts +31 -0
  127. package/server/service/purchase-order-other-charge/purchase-order-other-charge-query.ts +52 -0
  128. package/server/service/purchase-order-other-charge/purchase-order-other-charge-types.ts +44 -0
  129. package/server/service/purchase-order-other-charge/purchase-order-other-charge.ts +68 -0
  130. package/server/service/release-good/index.ts +9 -0
  131. package/server/service/release-good/release-good-mutation.ts +1686 -0
  132. package/server/service/release-good/release-good-query.ts +980 -0
  133. package/server/service/release-good/release-good-types.ts +662 -0
  134. package/server/service/release-good/release-good.ts +490 -0
  135. package/server/service/retail-replenishment-order/index.ts +9 -0
  136. package/server/service/retail-replenishment-order/retail-replenishment-order-mutation.ts +382 -0
  137. package/server/service/retail-replenishment-order/retail-replenishment-order-query.ts +54 -0
  138. package/server/service/retail-replenishment-order/retail-replenishment-order-types.ts +101 -0
  139. package/server/service/retail-replenishment-order/retail-replenishment-order.ts +115 -0
  140. package/server/service/return-order/index.ts +9 -0
  141. package/server/service/return-order/return-order-mutation.ts +516 -0
  142. package/server/service/return-order/return-order-query.ts +226 -0
  143. package/server/service/return-order/return-order-types.ts +196 -0
  144. package/server/service/return-order/return-order.ts +127 -0
  145. package/server/service/reverse-kitting-order/index.ts +9 -0
  146. package/server/service/reverse-kitting-order/reverse-kitting-order-mutation.ts +500 -0
  147. package/server/service/reverse-kitting-order/reverse-kitting-order-query.ts +197 -0
  148. package/server/service/reverse-kitting-order/reverse-kitting-order-type.ts +173 -0
  149. package/server/service/reverse-kitting-order/reverse-kitting-order.ts +121 -0
  150. package/server/service/reverse-kitting-order-inventory/index.ts +9 -0
  151. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-mutation.ts +129 -0
  152. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-query.ts +52 -0
  153. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-type.ts +95 -0
  154. package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory.ts +143 -0
  155. package/server/service/shipping-order/index.ts +9 -0
  156. package/server/service/shipping-order/shipping-order-mutation.ts +61 -0
  157. package/server/service/shipping-order/shipping-order-query.ts +61 -0
  158. package/server/service/shipping-order/shipping-order-types.ts +89 -0
  159. package/server/service/shipping-order/shipping-order.ts +129 -0
  160. package/server/service/transfer-order/index.ts +9 -0
  161. package/server/service/transfer-order/transfer-order-mutation.ts +309 -0
  162. package/server/service/transfer-order/transfer-order-query.ts +66 -0
  163. package/server/service/transfer-order/transfer-order-types.ts +97 -0
  164. package/server/service/transfer-order/transfer-order.ts +117 -0
  165. package/server/service/vas/index.ts +9 -0
  166. package/server/service/vas/vas-mutation.ts +106 -0
  167. package/server/service/vas/vas-query.ts +60 -0
  168. package/server/service/vas/vas-types.ts +71 -0
  169. package/server/service/vas/vas.ts +77 -0
  170. package/server/service/vas-order/index.ts +9 -0
  171. package/server/service/vas-order/vas-order-mutation.ts +259 -0
  172. package/server/service/vas-order/vas-order-query.ts +119 -0
  173. package/server/service/vas-order/vas-order-types.ts +49 -0
  174. package/server/service/vas-order/vas-order.ts +81 -0
  175. package/server/utils/datetime-util.ts +54 -0
  176. package/server/utils/index.ts +3 -0
  177. package/server/utils/inventory-util.ts +1155 -0
  178. package/server/utils/order-no-generator.ts +146 -0
@@ -0,0 +1,296 @@
1
+ import { EntityManager, EntitySchema, FindOneOptions } from 'typeorm'
2
+
3
+ import { Role, User } from '@things-factory/auth-base'
4
+ import { Bizplace, getDomainUsers } from '@things-factory/biz-base'
5
+ import { ProductDetail } from '@things-factory/product-base'
6
+ import { Domain } from '@things-factory/shell'
7
+ import { Inventory } from '@things-factory/warehouse-base'
8
+
9
+ import {
10
+ ArrivalNotice,
11
+ DeliveryOrder,
12
+ InventoryCheck,
13
+ OrderInventory,
14
+ OrderProduct,
15
+ OrderVas,
16
+ ReleaseGood,
17
+ ReturnOrder,
18
+ VasOrder
19
+ } from '../service'
20
+
21
+ export type ReferenceOrderType = ArrivalNotice | ReleaseGood | VasOrder | InventoryCheck | DeliveryOrder | ReturnOrder
22
+ export type OrderTargetTypes = OrderProduct | OrderInventory | OrderVas
23
+
24
+ export enum ReferenceOrderFields {
25
+ ArrivalNotice = 'arrivalNotice',
26
+ ReleaseGood = 'releaseGood',
27
+ VasOrder = 'vasOrder',
28
+ InventoryCheck = 'inventoryCheck',
29
+ ReturnOrder = 'returnOrder'
30
+ }
31
+
32
+ export enum OrderTargetFields {
33
+ OrderProduct = 'targetProduct',
34
+ OrderInventory = 'targetInventory',
35
+ OrderVas = 'targetVas'
36
+ }
37
+
38
+ export interface BasicInterface {
39
+ domain: Domain
40
+ user: User
41
+ }
42
+
43
+ export type NotificationMsgInterface = {
44
+ title: string
45
+ body: string
46
+ url: string
47
+ data: any
48
+ }
49
+
50
+ export class OrderController {
51
+ public readonly ERROR_MSG = {
52
+ FIND: {
53
+ NO_RESULT: (condition: any) => `There's no results matched with condition ${condition}`,
54
+ NO_CHILD_RESULT: (condition: any) => `There's no child result matched with condition ${condition}`,
55
+ NOT_MATCH: (source: any, target: any) => `Unable to find matching ${target} using ${source}`
56
+ },
57
+ CREATE: {
58
+ ID_EXISTS: 'Target has ID already',
59
+ EMPTY_CREATOR: 'Cannot create without creator',
60
+ EMPTY_UPDATER: 'Cannot create without updater'
61
+ },
62
+ UPDATE: {
63
+ ID_NOT_EXISTS: `Target doesn't have ID`,
64
+ EMPTY_UPDATER: 'Cannot update without updater'
65
+ },
66
+ VALIDITY: {
67
+ UNEXPECTED_FIELD_VALUE: (field: string, expectedValue: any, actualValue: any) =>
68
+ `Expected ${field} value is ${expectedValue} but got ${actualValue}`,
69
+ DUPLICATED: (field: string, value: any) => `There is duplicated ${field} value (${value})`,
70
+ CANT_PROCEED_STEP_BY: (step: string, reason: string) => `Can't proceed to ${step} it because ${reason}`
71
+ }
72
+ }
73
+
74
+ private readonly ROLE_NAMES: Record<string, string> = {
75
+ OFFICE_ADMIN: 'Office Admin'
76
+ }
77
+
78
+ protected trxMgr: EntityManager
79
+ protected domain: Domain
80
+ protected user: User
81
+
82
+ constructor(trxMgr: EntityManager, domain: Domain, user: User) {
83
+ this.trxMgr = trxMgr
84
+ this.domain = domain
85
+ this.user = user
86
+ }
87
+
88
+ private getRefOrderField(refOrder: ReferenceOrderType): string {
89
+ if (refOrder instanceof ArrivalNotice) {
90
+ return ReferenceOrderFields.ArrivalNotice
91
+ } else if (refOrder instanceof ReleaseGood) {
92
+ return ReferenceOrderFields.ReleaseGood
93
+ } else if (refOrder instanceof VasOrder) {
94
+ return ReferenceOrderFields.VasOrder
95
+ } else if (refOrder instanceof InventoryCheck) {
96
+ return ReferenceOrderFields.InventoryCheck
97
+ } else if (refOrder instanceof ReturnOrder) {
98
+ return ReferenceOrderFields.ReturnOrder
99
+ } else {
100
+ throw new Error(
101
+ this.ERROR_MSG.VALIDITY.UNEXPECTED_FIELD_VALUE('refOrder', 'One of reference order type', refOrder)
102
+ )
103
+ }
104
+ }
105
+
106
+ private getOrderTargetField(orderTarget: OrderTargetTypes): string {
107
+ if (orderTarget instanceof OrderProduct) {
108
+ return OrderTargetFields.OrderProduct
109
+ } else if (orderTarget instanceof OrderInventory) {
110
+ return OrderTargetFields.OrderInventory
111
+ } else if (orderTarget instanceof OrderVas) {
112
+ return OrderTargetFields.OrderVas
113
+ } else {
114
+ this.ERROR_MSG.VALIDITY.UNEXPECTED_FIELD_VALUE('orderTarget', 'One of order target type', orderTarget)
115
+ }
116
+ }
117
+
118
+ /**
119
+ * @summary Find reference order (ArrivalNotice, ReleaseGood, VasOrder, etc...)
120
+ * @description
121
+ * Find and return reference order with its relations based on passed condition & reltaions
122
+ */
123
+ async findRefOrder(
124
+ entitySchema: EntitySchema,
125
+ condition: Partial<ReferenceOrderType>,
126
+ relations?: string[]
127
+ ): Promise<ReferenceOrderType> {
128
+ condition = this.tidyConditions(condition)
129
+ let findOption: FindOneOptions = { where: condition }
130
+ if (relations?.length > 0) findOption.relations = relations
131
+
132
+ const refOrder: ReferenceOrderType = await this.trxMgr.getRepository(entitySchema).findOne(findOption)
133
+ if (!refOrder) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(findOption))
134
+
135
+ return refOrder
136
+ }
137
+
138
+ /**
139
+ * @summary Valitiy checker
140
+ * @description It will try to check whether passed record has same properties with passed conditions
141
+ * Basically it will check equality of value
142
+ * If you want to check advanced validation you can pass function to customize the logic of validation
143
+ * Passed function will be call with actual value of record as parameter
144
+ */
145
+ checkRecordValidity(record: Record<string, any>, conditions: Record<string, any>): void {
146
+ for (let field in conditions) {
147
+ let isValid: boolean = false
148
+ if (typeof conditions[field] === 'function') {
149
+ isValid = conditions[field](record[field])
150
+ } else {
151
+ isValid = conditions[field] === record[field]
152
+ }
153
+
154
+ if (!isValid)
155
+ throw new Error(this.ERROR_MSG.VALIDITY.UNEXPECTED_FIELD_VALUE(field, conditions[field], record[field]))
156
+ }
157
+ }
158
+
159
+ /**
160
+ * @summary Notify to passed users
161
+ * @description Passed notification message will be sent to passed users
162
+ */
163
+ async notifyToUsers(users: User[], message: NotificationMsgInterface): Promise<void> {
164
+ const receivers: any[] = users.map(user => user.id)
165
+ /**
166
+ * @notes Temporary off sendNotification due to suspect of causing wms down
167
+ */
168
+ // await sendNotification({
169
+ // receivers,
170
+ // message
171
+ // })
172
+ }
173
+
174
+ /**
175
+ * @summary Notify to office admin
176
+ * @description Passed notification message will be sent to office admin of current domain
177
+ * default role name is defiend as ROLE_NAME.OFFICE_ADMIn by default
178
+ * You can change role name by passing roleName as parameter
179
+ */
180
+ async notifyToOfficeAdmin(message: NotificationMsgInterface, roleName?: string): Promise<void> {
181
+ const users: User[] = await this.trxMgr
182
+ .getRepository('users_roles')
183
+ .createQueryBuilder('ur')
184
+ .select('ur.users_id', 'id')
185
+ .where(qb => {
186
+ const subQuery = qb
187
+ .subQuery()
188
+ .select('role.id')
189
+ .from(Role, 'role')
190
+ .where('role.name = :roleName', { roleName: roleName || this.ROLE_NAMES.OFFICE_ADMIN })
191
+ .andWhere('role.domain_id = :domainId', { domainId: this.domain.id })
192
+ .getQuery()
193
+ return 'ur.roles_id IN ' + subQuery
194
+ })
195
+ .getRawMany()
196
+
197
+ this.notifyToUsers(users, message)
198
+ }
199
+
200
+ /**
201
+ * @summary Notify to customer of passed bizplace
202
+ * @description Passed notification message will be sent to customer of passed bizplace
203
+ */
204
+ async notifyToCustomer(bizplace: Bizplace, message: NotificationMsgInterface): Promise<void> {
205
+ const users: any[] = await getDomainUsers(bizplace, this.trxMgr)
206
+
207
+ this.notifyToUsers(users, message)
208
+ }
209
+
210
+ async createInventory(inventory: Partial<Inventory> | Partial<Inventory>[]): Promise<Inventory | Inventory[]> {
211
+ inventory = this.setStamp(inventory)
212
+ return await this.trxMgr.getRepository(Inventory).save(inventory)
213
+ }
214
+
215
+ /**
216
+ * @summary Update inventory record
217
+ * @description It will update inventory after set a stamp (domain, updater)
218
+ * The special point of this function is that this changes won't generate inventory history
219
+ * If you want to generate inventory history automatically you would better to use transactionInventory function
220
+ */
221
+ async updateInventory(inventory: Partial<Inventory> | Partial<Inventory>[]): Promise<Inventory | Inventory[]> {
222
+ if (!(inventory as any).id) throw new Error(this.ERROR_MSG.UPDATE.ID_NOT_EXISTS)
223
+ inventory = this.setStamp(inventory)
224
+ return await this.trxMgr.getRepository(Inventory).save(inventory)
225
+ }
226
+
227
+ async getChildPackingSize(
228
+ productDetails: ProductDetail[],
229
+ defaultProductDetail: ProductDetail,
230
+ unmatchingProductDetail: ProductDetail
231
+ ): Promise<number> {
232
+ let hasChildRelation: boolean = Boolean(unmatchingProductDetail?.childProductDetail)
233
+ let hasMatchingChild: boolean
234
+ let packingSize: number = 1
235
+ let currentChildProductDetail: ProductDetail
236
+
237
+ if (hasChildRelation) {
238
+ currentChildProductDetail = productDetails.find(
239
+ (productDetail: ProductDetail) => productDetail.id === unmatchingProductDetail.childProductDetail.id
240
+ )
241
+
242
+ if (!currentChildProductDetail) {
243
+ throw new Error(this.ERROR_MSG.FIND.NOT_MATCH('packing type', `GTIN (${unmatchingProductDetail.gtin})`))
244
+ }
245
+
246
+ hasMatchingChild = Boolean(defaultProductDetail.id === currentChildProductDetail.id)
247
+ if (hasMatchingChild) {
248
+ packingSize = unmatchingProductDetail.packingSize
249
+ } else {
250
+ packingSize = unmatchingProductDetail.packingSize * packingSize
251
+ }
252
+ } else {
253
+ throw new Error(this.ERROR_MSG.FIND.NO_CHILD_RESULT(`${unmatchingProductDetail.gtin}`))
254
+ }
255
+
256
+ while (hasChildRelation && !hasMatchingChild) {
257
+ if (hasMatchingChild) {
258
+ packingSize = currentChildProductDetail.packingSize * packingSize // 12 x 10
259
+ } else if (!hasMatchingChild && hasChildRelation) {
260
+ packingSize = currentChildProductDetail.packingSize * packingSize // 12 x 10
261
+ currentChildProductDetail = productDetails.find(
262
+ (productDetail: ProductDetail) => productDetail.id === currentChildProductDetail.childProductDetail.id
263
+ )
264
+
265
+ hasChildRelation = Boolean(currentChildProductDetail?.childProductDetail)
266
+ hasMatchingChild = Boolean(defaultProductDetail.id === currentChildProductDetail.id)
267
+ } else if (!hasChildRelation && !hasMatchingChild) {
268
+ throw new Error(this.ERROR_MSG.FIND.NO_RESULT(unmatchingProductDetail.gtin))
269
+ }
270
+ }
271
+
272
+ return packingSize
273
+ }
274
+
275
+ /**
276
+ * @summary set common stamp like domain, creator, updater
277
+ * @description Set common stamp to passed record
278
+ * If it doesn't have id it will handle it as creating one
279
+ * If it has id it will handle it as updating one
280
+ */
281
+ setStamp(record: Record<string, any>): Record<string, any> {
282
+ if (!record.domain) record.domain = this.domain
283
+ if (!record.id && !record.creator) record.creator = this.user
284
+ if (!record.updater) record.updater = this.user
285
+
286
+ return record
287
+ }
288
+
289
+ tidyConditions(record: Record<string, any>): Record<string, any> {
290
+ Object.keys(record).forEach((key: string) => {
291
+ if (record[key] === null || record[key] instanceof Date || Array.isArray(record[key])) delete record[key]
292
+ })
293
+
294
+ return record
295
+ }
296
+ }
@@ -0,0 +1 @@
1
+ export * from './validation-error'
@@ -0,0 +1,25 @@
1
+ import * as ERROR_CODES from '../constants/validation-error-code'
2
+
3
+ type ValidationErrorArgument = {
4
+ errorCode: string
5
+ message: string
6
+ detail?: Object
7
+ }
8
+
9
+ export class ValidationError extends Error {
10
+ static get ERROR_CODES(): any {
11
+ return {
12
+ ...ERROR_CODES
13
+ }
14
+ }
15
+
16
+ errorCode: any
17
+ detail: Object
18
+ constructor({ errorCode, message, detail }: ValidationErrorArgument) {
19
+ super(errorCode)
20
+ this.name = 'validation-error'
21
+ this.errorCode = errorCode,
22
+ this.message = message
23
+ this.detail = detail
24
+ }
25
+ }
@@ -0,0 +1,5 @@
1
+ export * from './service'
2
+ export * from './migrations'
3
+ export * from './utils'
4
+ export * from './constants'
5
+ export * from './controllers/ecommerce/sellercraft-controller'
@@ -0,0 +1,9 @@
1
+ const glob = require('glob')
2
+ const path = require('path')
3
+
4
+ export var migrations = []
5
+
6
+ glob.sync(path.resolve(__dirname, '.', '**', '*.js')).forEach(function(file) {
7
+ if (file.indexOf('index.js') !== -1) return
8
+ migrations = migrations.concat(Object.values(require(path.resolve(file))) || [])
9
+ })