@things-factory/warehouse-base 5.0.14 → 6.0.0-alpha.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.
- package/dist-server/controllers/ecommerce/ecommerce-controller.js +1 -1
- package/dist-server/controllers/ecommerce/ecommerce-controller.js.map +1 -1
- package/dist-server/controllers/ecommerce/sellercraft-controller.js +64 -60
- package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
- package/dist-server/controllers/warehouse-controller.js +7 -5
- package/dist-server/controllers/warehouse-controller.js.map +1 -1
- package/dist-server/service/inventory/inventory-mutation.js +6 -6
- package/dist-server/service/inventory/inventory-mutation.js.map +1 -1
- package/dist-server/service/inventory/inventory-query.js +217 -195
- package/dist-server/service/inventory/inventory-query.js.map +1 -1
- package/dist-server/service/inventory/inventory-types.js +14 -15
- package/dist-server/service/inventory/inventory-types.js.map +1 -1
- package/dist-server/service/inventory/inventory.js +62 -42
- package/dist-server/service/inventory/inventory.js.map +1 -1
- package/dist-server/service/inventory-change/inventory-change-mutation.js +252 -216
- package/dist-server/service/inventory-change/inventory-change-mutation.js.map +1 -1
- package/dist-server/service/inventory-change/inventory-change-query.js +6 -7
- package/dist-server/service/inventory-change/inventory-change-query.js.map +1 -1
- package/dist-server/service/inventory-change/inventory-change.js +7 -7
- package/dist-server/service/inventory-change/inventory-change.js.map +1 -1
- package/dist-server/service/inventory-history/inventory-history-mutation.js +1 -1
- package/dist-server/service/inventory-history/inventory-history-mutation.js.map +1 -1
- package/dist-server/service/inventory-history/inventory-history-query.js +89 -99
- package/dist-server/service/inventory-history/inventory-history-query.js.map +1 -1
- package/dist-server/service/inventory-history/inventory-history-types.js +3 -3
- package/dist-server/service/inventory-history/inventory-history-types.js.map +1 -1
- package/dist-server/service/inventory-history/inventory-history.js +7 -7
- package/dist-server/service/inventory-history/inventory-history.js.map +1 -1
- package/dist-server/service/inventory-item/inventory-item-mutation.js +10 -10
- package/dist-server/service/inventory-item/inventory-item-mutation.js.map +1 -1
- package/dist-server/service/inventory-item/inventory-item-query.js +18 -17
- package/dist-server/service/inventory-item/inventory-item-query.js.map +1 -1
- package/dist-server/service/inventory-item/inventory-item-type.js +4 -5
- package/dist-server/service/inventory-item/inventory-item-type.js.map +1 -1
- package/dist-server/service/inventory-item/inventory-item.js +5 -5
- package/dist-server/service/inventory-item/inventory-item.js.map +1 -1
- package/dist-server/service/inventory-item-change/inventory-item-change-mutation.js +4 -4
- package/dist-server/service/inventory-item-change/inventory-item-change-mutation.js.map +1 -1
- package/dist-server/service/inventory-item-change/inventory-item-change-query.js +7 -9
- package/dist-server/service/inventory-item-change/inventory-item-change-query.js.map +1 -1
- package/dist-server/service/inventory-item-change/inventory-item-change-type.js +6 -7
- package/dist-server/service/inventory-item-change/inventory-item-change-type.js.map +1 -1
- package/dist-server/service/inventory-item-change/inventory-item-change.js +3 -4
- package/dist-server/service/inventory-item-change/inventory-item-change.js.map +1 -1
- package/dist-server/service/inventory-product/inventory-product-mutation.js +4 -4
- package/dist-server/service/inventory-product/inventory-product-mutation.js.map +1 -1
- package/dist-server/service/inventory-product/inventory-product-query.js +7 -9
- package/dist-server/service/inventory-product/inventory-product-query.js.map +1 -1
- package/dist-server/service/inventory-product/inventory-product-type.js +1 -2
- package/dist-server/service/inventory-product/inventory-product-type.js.map +1 -1
- package/dist-server/service/inventory-product/inventory-product.js +5 -5
- package/dist-server/service/inventory-product/inventory-product.js.map +1 -1
- package/dist-server/service/location/location-mutation.js +5 -5
- package/dist-server/service/location/location-mutation.js.map +1 -1
- package/dist-server/service/location/location-query.js +17 -19
- package/dist-server/service/location/location-query.js.map +1 -1
- package/dist-server/service/location/location-types.js +3 -3
- package/dist-server/service/location/location-types.js.map +1 -1
- package/dist-server/service/location/location.js +14 -14
- package/dist-server/service/location/location.js.map +1 -1
- package/dist-server/service/movement/movement-mutation.js +6 -5
- package/dist-server/service/movement/movement-mutation.js.map +1 -1
- package/dist-server/service/movement/movement-query.js +15 -15
- package/dist-server/service/movement/movement-query.js.map +1 -1
- package/dist-server/service/movement/movement-types.js +4 -5
- package/dist-server/service/movement/movement-types.js.map +1 -1
- package/dist-server/service/movement/movement.js +5 -5
- package/dist-server/service/movement/movement.js.map +1 -1
- package/dist-server/service/pallet/pallet-mutation.js +5 -5
- package/dist-server/service/pallet/pallet-mutation.js.map +1 -1
- package/dist-server/service/pallet/pallet-query.js +9 -11
- package/dist-server/service/pallet/pallet-query.js.map +1 -1
- package/dist-server/service/pallet/pallet-types.js +5 -6
- package/dist-server/service/pallet/pallet-types.js.map +1 -1
- package/dist-server/service/pallet/pallet.js +6 -6
- package/dist-server/service/pallet/pallet.js.map +1 -1
- package/dist-server/service/pallet-count/pallet-count-mutation.js +1 -1
- package/dist-server/service/pallet-count/pallet-count-mutation.js.map +1 -1
- package/dist-server/service/pallet-count/pallet-count-query.js +6 -8
- package/dist-server/service/pallet-count/pallet-count-query.js.map +1 -1
- package/dist-server/service/pallet-count/pallet-count.js +3 -4
- package/dist-server/service/pallet-count/pallet-count.js.map +1 -1
- package/dist-server/service/pallet-history/pallet-history-mutation.js +1 -1
- package/dist-server/service/pallet-history/pallet-history-mutation.js.map +1 -1
- package/dist-server/service/pallet-history/pallet-history-query.js +6 -8
- package/dist-server/service/pallet-history/pallet-history-query.js.map +1 -1
- package/dist-server/service/pallet-history/pallet-history.js +6 -6
- package/dist-server/service/pallet-history/pallet-history.js.map +1 -1
- package/dist-server/service/reduced-inventory-history/reduced-inventory-history.js +1 -1
- package/dist-server/service/reduced-inventory-history/reduced-inventory-history.js.map +1 -1
- package/dist-server/service/tote/tote-mutation.js +4 -4
- package/dist-server/service/tote/tote-mutation.js.map +1 -1
- package/dist-server/service/tote/tote-query.js +12 -13
- package/dist-server/service/tote/tote-query.js.map +1 -1
- package/dist-server/service/tote/tote-types.js +2 -3
- package/dist-server/service/tote/tote-types.js.map +1 -1
- package/dist-server/service/tote/tote.js +5 -5
- package/dist-server/service/tote/tote.js.map +1 -1
- package/dist-server/service/warehouse/warehouse-mutation.js +1 -1
- package/dist-server/service/warehouse/warehouse-mutation.js.map +1 -1
- package/dist-server/service/warehouse/warehouse-query.js +9 -10
- package/dist-server/service/warehouse/warehouse-query.js.map +1 -1
- package/dist-server/service/warehouse/warehouse.js +12 -12
- package/dist-server/service/warehouse/warehouse.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/dist-server/utils/inventory-util.js +16 -16
- package/dist-server/utils/inventory-util.js.map +1 -1
- package/package.json +8 -8
- package/server/controllers/ecommerce/ecommerce-controller.ts +1 -1
- package/server/controllers/ecommerce/sellercraft-controller.ts +75 -65
- package/server/controllers/warehouse-controller.ts +9 -4
- package/server/service/inventory/inventory-mutation.ts +28 -24
- package/server/service/inventory/inventory-query.ts +269 -304
- package/server/service/inventory/inventory.ts +50 -35
- package/server/service/inventory-change/inventory-change-mutation.ts +305 -256
- package/server/service/inventory-change/inventory-change-query.ts +9 -9
- package/server/service/inventory-history/inventory-history-mutation.ts +12 -15
- package/server/service/inventory-history/inventory-history-query.ts +158 -133
- package/server/service/inventory-item/inventory-item-mutation.ts +20 -17
- package/server/service/inventory-item/inventory-item-query.ts +28 -18
- package/server/service/inventory-item-change/inventory-item-change-mutation.ts +12 -9
- package/server/service/inventory-item-change/inventory-item-change-query.ts +10 -8
- package/server/service/inventory-product/inventory-product-mutation.ts +16 -12
- package/server/service/inventory-product/inventory-product-query.ts +7 -8
- package/server/service/location/location-mutation.ts +24 -24
- package/server/service/location/location-query.ts +27 -23
- package/server/service/location/location.ts +11 -10
- package/server/service/movement/movement-mutation.ts +7 -8
- package/server/service/movement/movement-query.ts +18 -16
- package/server/service/pallet/pallet-mutation.ts +18 -20
- package/server/service/pallet/pallet-query.ts +13 -14
- package/server/service/pallet-count/pallet-count-mutation.ts +20 -17
- package/server/service/pallet-count/pallet-count-query.ts +6 -7
- package/server/service/pallet-history/pallet-history-mutation.ts +15 -15
- package/server/service/pallet-history/pallet-history-query.ts +7 -8
- package/server/service/reduced-inventory-history/reduced-inventory-history.ts +1 -1
- package/server/service/tote/tote-mutation.ts +23 -22
- package/server/service/tote/tote-query.ts +18 -14
- package/server/service/warehouse/warehouse-mutation.ts +21 -18
- package/server/service/warehouse/warehouse-query.ts +11 -11
- package/server/service/warehouse/warehouse.ts +7 -7
- package/server/utils/inventory-util.ts +10 -10
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
|
|
2
|
-
import {
|
|
2
|
+
import { In, MoreThan, Not } from 'typeorm'
|
|
3
3
|
|
|
4
|
-
import { Privilege, User } from '@things-factory/auth-base'
|
|
5
4
|
import { Bizplace } from '@things-factory/biz-base'
|
|
6
5
|
import { generateId } from '@things-factory/id-rule-base'
|
|
7
6
|
import { MarketplaceStore } from '@things-factory/integration-marketplace'
|
|
8
7
|
import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
|
|
9
|
-
import { sendNotification } from '@things-factory/notification'
|
|
10
8
|
import { Product } from '@things-factory/product-base'
|
|
11
9
|
import { PartnerSetting, Setting } from '@things-factory/setting-base'
|
|
12
10
|
import { Domain } from '@things-factory/shell'
|
|
@@ -30,9 +28,9 @@ export class InventoryChangeMutation {
|
|
|
30
28
|
@Mutation(returns => InventoryChange)
|
|
31
29
|
async createInventoryChange(
|
|
32
30
|
@Arg('inventoryChange') inventoryChange: NewInventoryChange,
|
|
33
|
-
@Ctx() context:
|
|
31
|
+
@Ctx() context: ResolverContext
|
|
34
32
|
): Promise<InventoryChange> {
|
|
35
|
-
const { domain, user, tx }
|
|
33
|
+
const { domain, user, tx } = context.state
|
|
36
34
|
|
|
37
35
|
return await tx.getRepository(InventoryChange).save({
|
|
38
36
|
...inventoryChange,
|
|
@@ -47,9 +45,9 @@ export class InventoryChangeMutation {
|
|
|
47
45
|
async updateInventoryChange(
|
|
48
46
|
@Arg('name') name: string,
|
|
49
47
|
@Arg('patch') patch: InventoryChangePatch,
|
|
50
|
-
@Ctx() context:
|
|
48
|
+
@Ctx() context: ResolverContext
|
|
51
49
|
): Promise<InventoryChange> {
|
|
52
|
-
const { domain, user, tx }
|
|
50
|
+
const { domain, user, tx } = context.state
|
|
53
51
|
|
|
54
52
|
const repository = tx.getRepository(InventoryChange)
|
|
55
53
|
const inventoryChange = await repository.findOne({
|
|
@@ -67,9 +65,9 @@ export class InventoryChangeMutation {
|
|
|
67
65
|
@Mutation(returns => [InventoryChange])
|
|
68
66
|
async updateMultipleInventoryChange(
|
|
69
67
|
@Arg('patches', type => [InventoryChangePatch]) patches: InventoryChangePatch[],
|
|
70
|
-
@Ctx() context:
|
|
68
|
+
@Ctx() context: ResolverContext
|
|
71
69
|
): Promise<InventoryChange[]> {
|
|
72
|
-
const { domain, user, tx }
|
|
70
|
+
const { domain, user, tx } = context.state
|
|
73
71
|
let results = []
|
|
74
72
|
const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
|
|
75
73
|
const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
|
|
@@ -93,7 +91,7 @@ export class InventoryChangeMutation {
|
|
|
93
91
|
if (_updateRecords.length > 0) {
|
|
94
92
|
for (let i = 0; i < _updateRecords.length; i++) {
|
|
95
93
|
const newRecord = _updateRecords[i]
|
|
96
|
-
const inventoryChange = await inventoryChangeRepo.
|
|
94
|
+
const inventoryChange = await inventoryChangeRepo.findOneBy({ id: newRecord.id })
|
|
97
95
|
|
|
98
96
|
const result = await inventoryChangeRepo.save({
|
|
99
97
|
...inventoryChange,
|
|
@@ -110,8 +108,8 @@ export class InventoryChangeMutation {
|
|
|
110
108
|
|
|
111
109
|
@Directive('@transaction')
|
|
112
110
|
@Mutation(returns => Boolean)
|
|
113
|
-
async deleteInventoryChange(@Arg('name') name: string, @Ctx() context:
|
|
114
|
-
const { domain, tx }
|
|
111
|
+
async deleteInventoryChange(@Arg('name') name: string, @Ctx() context: ResolverContext): Promise<Boolean> {
|
|
112
|
+
const { domain, tx } = context.state
|
|
115
113
|
|
|
116
114
|
await tx.getRepository(InventoryChange).delete({ domain: domain, name })
|
|
117
115
|
return true
|
|
@@ -119,8 +117,11 @@ export class InventoryChangeMutation {
|
|
|
119
117
|
|
|
120
118
|
@Directive('@transaction')
|
|
121
119
|
@Mutation(returns => Boolean)
|
|
122
|
-
async deleteInventoryChanges(
|
|
123
|
-
|
|
120
|
+
async deleteInventoryChanges(
|
|
121
|
+
@Arg('names', type => [String]) names: string[],
|
|
122
|
+
@Ctx() context: ResolverContext
|
|
123
|
+
): Promise<Boolean> {
|
|
124
|
+
const { domain, tx } = context.state
|
|
124
125
|
|
|
125
126
|
await tx.getRepository(InventoryChange).delete({
|
|
126
127
|
domain: domain,
|
|
@@ -134,273 +135,298 @@ export class InventoryChangeMutation {
|
|
|
134
135
|
@Mutation(returns => Boolean)
|
|
135
136
|
async submitInventoryChanges(
|
|
136
137
|
@Arg('patches', type => [InventoryPatch]) patches: InventoryPatch[],
|
|
137
|
-
@Ctx() context:
|
|
138
|
+
@Ctx() context: ResolverContext
|
|
138
139
|
) {
|
|
139
|
-
const { domain, user, tx }
|
|
140
|
+
const { domain, user, tx } = context.state
|
|
141
|
+
try {
|
|
142
|
+
const _createRecords = []
|
|
143
|
+
const _updateRecords = []
|
|
144
|
+
|
|
145
|
+
for (let i = 0; i < patches.length; i++) {
|
|
146
|
+
let foundExistingPallet = await tx
|
|
147
|
+
.getRepository(Inventory)
|
|
148
|
+
.createQueryBuilder('iv')
|
|
149
|
+
.where('iv.domain_id = :domain_id', { domain_id: domain.id })
|
|
150
|
+
.andWhere('(iv.pallet_id = :pallet_id or iv.id = :id)', {
|
|
151
|
+
pallet_id: patches[i]?.palletId,
|
|
152
|
+
id: patches[i]?.id
|
|
153
|
+
})
|
|
154
|
+
.getOne()
|
|
140
155
|
|
|
141
|
-
|
|
142
|
-
|
|
156
|
+
//remove any unchanged records
|
|
157
|
+
for (const [key, value] of Object.entries(patches[i])) {
|
|
158
|
+
if (foundExistingPallet && key != 'id' && key != 'cuFlag' && value == foundExistingPallet[key]) {
|
|
159
|
+
delete patches[i][key]
|
|
160
|
+
}
|
|
161
|
+
}
|
|
143
162
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
163
|
+
// skip process when no processable data found
|
|
164
|
+
if (Object.keys(patches[i]).filter(x => x != 'id' && x != 'cuFlag').length == 0) {
|
|
165
|
+
continue
|
|
166
|
+
}
|
|
148
167
|
|
|
149
|
-
|
|
150
|
-
foundExistingPallet = await tx.getRepository(Inventory).findOne({
|
|
151
|
-
where: { id: patches[i]?.id }
|
|
152
|
-
})
|
|
153
|
-
}
|
|
168
|
+
const invLockedQty: number = foundExistingPallet?.lockedQty == null ? 0 : foundExistingPallet?.lockedQty
|
|
154
169
|
|
|
155
|
-
|
|
170
|
+
if (patches[i]?.qty < invLockedQty) {
|
|
171
|
+
throw new Error(
|
|
172
|
+
'Adjusted qty value should not be lower than released qty, kindly contact our support for assistance'
|
|
173
|
+
)
|
|
174
|
+
}
|
|
156
175
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
176
|
+
if (foundExistingPallet) {
|
|
177
|
+
delete patches[i].serialNumbers
|
|
178
|
+
_updateRecords.push(patches[i])
|
|
179
|
+
} else {
|
|
180
|
+
_createRecords.push(patches[i])
|
|
181
|
+
}
|
|
161
182
|
}
|
|
162
183
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
}
|
|
169
|
-
}
|
|
184
|
+
const inventoryChangeRepo = tx.getRepository(InventoryChange)
|
|
185
|
+
const inventoryItemChangeRepo = tx.getRepository(InventoryItemChange)
|
|
186
|
+
if (_createRecords.length > 0) {
|
|
187
|
+
for (let i = 0; i < _createRecords.length; i++) {
|
|
188
|
+
const newRecord = _createRecords[i]
|
|
170
189
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
190
|
+
var location = await tx.getRepository(Location).findOne({
|
|
191
|
+
where: { id: newRecord.location.id },
|
|
192
|
+
relations: ['warehouse']
|
|
193
|
+
})
|
|
194
|
+
newRecord.location = location
|
|
195
|
+
newRecord.zone = location.zone
|
|
196
|
+
newRecord.warehouse = location.warehouse
|
|
176
197
|
|
|
177
|
-
|
|
178
|
-
where: { id: newRecord.location.id },
|
|
179
|
-
relations: ['warehouse']
|
|
180
|
-
})
|
|
181
|
-
newRecord.location = location
|
|
182
|
-
newRecord.zone = location.zone
|
|
183
|
-
newRecord.warehouse = location.warehouse
|
|
198
|
+
newRecord.bizplace = await tx.getRepository(Bizplace).findOneBy({ id: newRecord.bizplace.id })
|
|
184
199
|
|
|
185
|
-
|
|
200
|
+
var product: Product = await tx.getRepository(Product).findOne(newRecord.product.id)
|
|
201
|
+
newRecord.product = product
|
|
186
202
|
|
|
187
|
-
|
|
188
|
-
|
|
203
|
+
newRecord.status = 'PENDING'
|
|
204
|
+
newRecord.transactionType = 'NEW'
|
|
189
205
|
|
|
190
|
-
|
|
191
|
-
|
|
206
|
+
newRecord.expirationDate =
|
|
207
|
+
((newRecord?.expirationDate && new Date(newRecord.expirationDate).getFullYear()) || 0) < 2000
|
|
208
|
+
? null
|
|
209
|
+
: newRecord.expirationDate
|
|
192
210
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
:
|
|
211
|
+
const newInventoryChange: InventoryChange = await inventoryChangeRepo.save({
|
|
212
|
+
...newRecord,
|
|
213
|
+
id: undefined,
|
|
214
|
+
name: InventoryNoGenerator.inventoryName(),
|
|
215
|
+
domain: domain,
|
|
216
|
+
creator: user,
|
|
217
|
+
updater: user
|
|
218
|
+
})
|
|
197
219
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
domain: domain,
|
|
203
|
-
creator: user,
|
|
204
|
-
updater: user
|
|
205
|
-
})
|
|
220
|
+
if (newRecord?.serialNumbers) {
|
|
221
|
+
let serialNumbers: string = newRecord.serialNumbers
|
|
222
|
+
let newSerialNumbers: any = serialNumbers.split(',')
|
|
223
|
+
let inventoryItemChanges: InventoryItemChange[] = []
|
|
206
224
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
225
|
+
for (let i = 0; i < newSerialNumbers.length; i++) {
|
|
226
|
+
let newSerialNumber: string = newSerialNumbers[i]
|
|
227
|
+
let inventoryItemChange: any = {
|
|
228
|
+
serialNumber: newSerialNumber,
|
|
229
|
+
type: INVENTORY_ITEM_CHANGE_TYPE.NEW
|
|
230
|
+
}
|
|
211
231
|
|
|
212
|
-
|
|
213
|
-
let newSerialNumber: string = newSerialNumbers[i]
|
|
214
|
-
let inventoryItemChange: any = {
|
|
215
|
-
serialNumber: newSerialNumber,
|
|
216
|
-
type: INVENTORY_ITEM_CHANGE_TYPE.NEW
|
|
232
|
+
inventoryItemChanges.push(inventoryItemChange)
|
|
217
233
|
}
|
|
218
234
|
|
|
219
|
-
|
|
235
|
+
newRecord.inventoryItemChangesJson = JSON.stringify(inventoryItemChanges)
|
|
220
236
|
}
|
|
221
237
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
if (inventoryItemChanges?.length != newRecord?.qty) {
|
|
230
|
-
throw new Error('Serial Numbers not tally with quantity')
|
|
238
|
+
// create new inventory items
|
|
239
|
+
if (newRecord?.inventoryItemChangesJson) {
|
|
240
|
+
const inventoryItemChanges: InventoryItemChange[] = JSON.parse(newRecord.inventoryItemChangesJson)
|
|
241
|
+
if (product?.isRequireSerialNumberScanningInbound) {
|
|
242
|
+
if (inventoryItemChanges?.length != newRecord?.qty) {
|
|
243
|
+
throw new Error('Serial Numbers not tally with quantity')
|
|
244
|
+
}
|
|
231
245
|
}
|
|
232
|
-
}
|
|
233
246
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
247
|
+
let newInventoryItemChanges: InventoryItemChange[] = []
|
|
248
|
+
|
|
249
|
+
inventoryItemChanges.map(inventoryItemChange => {
|
|
250
|
+
let newInventoryItemChange: InventoryItemChange = new InventoryItemChange()
|
|
251
|
+
newInventoryItemChange.name = InventoryNoGenerator.inventoryName()
|
|
252
|
+
newInventoryItemChange.serialNumber = inventoryItemChange.serialNumber
|
|
253
|
+
newInventoryItemChange.type = inventoryItemChange.type
|
|
254
|
+
newInventoryItemChange.status = newInventoryChange.status
|
|
255
|
+
newInventoryItemChange.inventoryItem =
|
|
256
|
+
newInventoryItemChange?.type == INVENTORY_ITEM_CHANGE_TYPE.NEW
|
|
257
|
+
? null
|
|
258
|
+
: newInventoryItemChange.inventoryItem
|
|
259
|
+
newInventoryItemChange.inventoryChange = newInventoryChange
|
|
260
|
+
newInventoryItemChange.domain = domain
|
|
261
|
+
newInventoryItemChange.creator = user
|
|
262
|
+
newInventoryItemChange.updater = user
|
|
263
|
+
|
|
264
|
+
newInventoryItemChanges.push(newInventoryItemChange)
|
|
265
|
+
})
|
|
253
266
|
|
|
254
|
-
|
|
267
|
+
await inventoryItemChangeRepo.save(newInventoryItemChanges)
|
|
268
|
+
}
|
|
255
269
|
}
|
|
256
270
|
}
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
if (_updateRecords.length > 0) {
|
|
260
|
-
for (let i = 0; i < _updateRecords.length; i++) {
|
|
261
|
-
const updateRecord = _updateRecords[i]
|
|
262
271
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
})
|
|
272
|
+
if (_updateRecords.length > 0) {
|
|
273
|
+
for (let i = 0; i < _updateRecords.length; i++) {
|
|
274
|
+
const updateRecord = _updateRecords[i]
|
|
267
275
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
where: { domain, id: updateRecord?.id },
|
|
276
|
+
let existingRecord = await tx.getRepository(Inventory).findOne({
|
|
277
|
+
where: { domain, palletId: updateRecord?.palletId },
|
|
271
278
|
relations: ['location', 'warehouse', 'product', 'bizplace']
|
|
272
279
|
})
|
|
273
|
-
}
|
|
274
280
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
updateRecord.zone = location.zone
|
|
282
|
-
updateRecord.warehouse = location.warehouse
|
|
283
|
-
}
|
|
281
|
+
if (!existingRecord) {
|
|
282
|
+
existingRecord = await tx.getRepository(Inventory).findOne({
|
|
283
|
+
where: { domain, id: updateRecord?.id },
|
|
284
|
+
relations: ['location', 'warehouse', 'product', 'bizplace']
|
|
285
|
+
})
|
|
286
|
+
}
|
|
284
287
|
|
|
285
|
-
|
|
286
|
-
|
|
288
|
+
if (!!updateRecord?.location?.id) {
|
|
289
|
+
var location = await tx.getRepository(Location).findOne({
|
|
290
|
+
where: { id: updateRecord.location.id },
|
|
291
|
+
relations: ['warehouse']
|
|
292
|
+
})
|
|
293
|
+
updateRecord.location = location
|
|
294
|
+
updateRecord.zone = location.zone
|
|
295
|
+
updateRecord.warehouse = location.warehouse
|
|
296
|
+
}
|
|
287
297
|
|
|
288
|
-
|
|
298
|
+
if (!!updateRecord?.bizplace?.id)
|
|
299
|
+
updateRecord.bizplace = await tx.getRepository(Bizplace).findOne(updateRecord.bizplace.id)
|
|
289
300
|
|
|
290
|
-
|
|
291
|
-
product = await tx.getRepository(Product).findOne(updateRecord.product.id)
|
|
292
|
-
updateRecord.product = product
|
|
293
|
-
} else {
|
|
294
|
-
product = existingRecord.product
|
|
295
|
-
}
|
|
301
|
+
let product: Product
|
|
296
302
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
303
|
+
if (!!updateRecord?.product?.id) {
|
|
304
|
+
product = await tx.getRepository(Product).findOne(updateRecord.product.id)
|
|
305
|
+
updateRecord.product = product
|
|
306
|
+
} else {
|
|
307
|
+
product = existingRecord.product
|
|
308
|
+
}
|
|
300
309
|
|
|
301
|
-
|
|
310
|
+
updateRecord.transactionType == 'MISSING'
|
|
311
|
+
? (updateRecord.transactionType = 'MISSING')
|
|
312
|
+
: (updateRecord.transactionType = 'CHANGES')
|
|
302
313
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
palletId: existingRecord.palletId,
|
|
310
|
-
...updateRecord,
|
|
311
|
-
id: undefined,
|
|
312
|
-
name: InventoryNoGenerator.inventoryName(),
|
|
313
|
-
inventory: existingRecord,
|
|
314
|
-
domain: domain,
|
|
315
|
-
creator: user,
|
|
316
|
-
updater: user
|
|
317
|
-
})
|
|
314
|
+
updateRecord.status = 'PENDING'
|
|
315
|
+
|
|
316
|
+
updateRecord.expirationDate =
|
|
317
|
+
((updateRecord?.expirationDate && new Date(updateRecord.expirationDate).getFullYear()) || 0) < 2000
|
|
318
|
+
? null
|
|
319
|
+
: updateRecord.expirationDate
|
|
318
320
|
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
321
|
+
const updatedInventoryChange: InventoryChange = await inventoryChangeRepo.save({
|
|
322
|
+
palletId: existingRecord.palletId,
|
|
323
|
+
...updateRecord,
|
|
324
|
+
id: undefined,
|
|
325
|
+
name: InventoryNoGenerator.inventoryName(),
|
|
326
|
+
inventory: existingRecord,
|
|
327
|
+
domain: domain,
|
|
328
|
+
creator: user,
|
|
329
|
+
updater: user
|
|
323
330
|
})
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
331
|
+
|
|
332
|
+
// create new inventory items
|
|
333
|
+
if (updateRecord?.inventoryItemChangesJson) {
|
|
334
|
+
const originalInventoryItems: InventoryItem[] = await tx.getRepository(InventoryItem).find({
|
|
335
|
+
where: { domain: { id: domain.id }, inventory: { id: existingRecord.id }, status: Not('DELETED') }
|
|
336
|
+
})
|
|
337
|
+
const inventoryItemChanges: InventoryItemChange[] = JSON.parse(updateRecord.inventoryItemChangesJson)
|
|
338
|
+
if (product?.isRequireSerialNumberScanningInbound) {
|
|
339
|
+
// const combinedInventoryItems: any[] = [...originalInventoryItems, ...inventoryItemChanges]
|
|
340
|
+
let qty: number = updateRecord?.qty ? updateRecord.qty : existingRecord.qty
|
|
341
|
+
|
|
342
|
+
if (originalInventoryItems.length == 0) {
|
|
343
|
+
if (inventoryItemChanges.length !== qty) {
|
|
344
|
+
throw new Error('Serial Numbers not tally with quantity')
|
|
345
|
+
}
|
|
346
|
+
} else {
|
|
347
|
+
if (originalInventoryItems?.length - inventoryItemChanges.length !== qty) {
|
|
348
|
+
throw new Error('Serial Numbers not tally with quantity')
|
|
349
|
+
}
|
|
350
|
+
}
|
|
330
351
|
}
|
|
331
|
-
}
|
|
332
352
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
+
let newInventoryItemChanges: InventoryItemChange[] = []
|
|
354
|
+
|
|
355
|
+
inventoryItemChanges.map(inventoryItemChange => {
|
|
356
|
+
let newInventoryItemChange: InventoryItemChange = new InventoryItemChange()
|
|
357
|
+
newInventoryItemChange.name = InventoryNoGenerator.inventoryName()
|
|
358
|
+
newInventoryItemChange.serialNumber = inventoryItemChange.serialNumber
|
|
359
|
+
newInventoryItemChange.type = inventoryItemChange.type
|
|
360
|
+
newInventoryItemChange.status = updatedInventoryChange.status
|
|
361
|
+
newInventoryItemChange.inventory = updatedInventoryChange.inventory
|
|
362
|
+
newInventoryItemChange.inventoryItem =
|
|
363
|
+
newInventoryItemChange?.type == INVENTORY_ITEM_CHANGE_TYPE.NEW
|
|
364
|
+
? null
|
|
365
|
+
: inventoryItemChange.inventoryItem
|
|
366
|
+
newInventoryItemChange.inventoryChange = updatedInventoryChange
|
|
367
|
+
newInventoryItemChange.domain = domain
|
|
368
|
+
newInventoryItemChange.creator = user
|
|
369
|
+
newInventoryItemChange.updater = user
|
|
370
|
+
|
|
371
|
+
newInventoryItemChanges.push(newInventoryItemChange)
|
|
372
|
+
})
|
|
353
373
|
|
|
354
|
-
|
|
374
|
+
await inventoryItemChangeRepo.save(newInventoryItemChanges)
|
|
375
|
+
}
|
|
355
376
|
}
|
|
356
377
|
}
|
|
357
|
-
}
|
|
358
378
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
.
|
|
364
|
-
.
|
|
365
|
-
.
|
|
366
|
-
.
|
|
367
|
-
.
|
|
368
|
-
.
|
|
369
|
-
.
|
|
370
|
-
.
|
|
371
|
-
.
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
379
|
+
/**
|
|
380
|
+
* @notes Temporary off sendNotification due to suspect of causing wms down
|
|
381
|
+
*/
|
|
382
|
+
// const notificationApprover: any = await tx
|
|
383
|
+
// .getRepository(Privilege)
|
|
384
|
+
// .createQueryBuilder('p')
|
|
385
|
+
// .select('u.*')
|
|
386
|
+
// .addSelect('r.*')
|
|
387
|
+
// .innerJoin('p.roles', 'r')
|
|
388
|
+
// .innerJoin('r.users', 'u')
|
|
389
|
+
// .where('p.name = :name', { name: 'mutation' })
|
|
390
|
+
// .andWhere('p.category = :category', { category: 'inventory' })
|
|
391
|
+
// .andWhere('r.domain_id = :domainId', { domainId: domain.id })
|
|
392
|
+
// .groupBy('u.id')
|
|
393
|
+
// .addGroupBy('r.id')
|
|
394
|
+
// .getRawMany()
|
|
395
|
+
|
|
396
|
+
// if (_updateRecords.some(res => res.transactionType == 'MISSING')) {
|
|
397
|
+
// if (notificationApprover?.length && context.header?.referer) {
|
|
398
|
+
// const receivers: any[] = notificationApprover.map(user => user.id)
|
|
399
|
+
// const msg = {
|
|
400
|
+
// title: `Missing stock identified. Review this transaction in Inventory Adjustment Approval.`,
|
|
401
|
+
// body: ``,
|
|
402
|
+
// url: context.header.referer,
|
|
403
|
+
// data: { url: context.header.referer }
|
|
404
|
+
// }
|
|
405
|
+
// await sendNotification({
|
|
406
|
+
// receivers,
|
|
407
|
+
// message: { ...msg }
|
|
408
|
+
// })
|
|
409
|
+
// }
|
|
410
|
+
// } else {
|
|
411
|
+
// if (notificationApprover?.length && context.header?.referer) {
|
|
412
|
+
// const receivers: any[] = notificationApprover.map(user => user.id)
|
|
413
|
+
// const msg = {
|
|
414
|
+
// title: `There is an inventory adjustment pending for approval, kindly review within 1 hour to avoid any operation conflict.`,
|
|
415
|
+
// body: ``,
|
|
416
|
+
// url: context.header.referer,
|
|
417
|
+
// data: { url: context.header.referer }
|
|
418
|
+
// }
|
|
419
|
+
// await sendNotification({
|
|
420
|
+
// receivers,
|
|
421
|
+
// message: { ...msg }
|
|
422
|
+
// })
|
|
423
|
+
// }
|
|
424
|
+
// }
|
|
425
|
+
|
|
426
|
+
return true
|
|
427
|
+
} catch (error) {
|
|
428
|
+
throw error
|
|
401
429
|
}
|
|
402
|
-
|
|
403
|
-
return true
|
|
404
430
|
}
|
|
405
431
|
|
|
406
432
|
@Directive('@privilege(category: "inventory_adjustment_approval", privilege: "mutation")')
|
|
@@ -408,7 +434,7 @@ export class InventoryChangeMutation {
|
|
|
408
434
|
@Mutation(returns => InventoryChangeList)
|
|
409
435
|
async approveInventoryChanges(
|
|
410
436
|
@Arg('patches', type => [InventoryChangePatch]) patches: InventoryChangePatch[],
|
|
411
|
-
@Ctx() context:
|
|
437
|
+
@Ctx() context: ResolverContext
|
|
412
438
|
): Promise<InventoryChangeList> {
|
|
413
439
|
const inventoryChangeList = await approveInventoryChanges(patches, context)
|
|
414
440
|
|
|
@@ -420,9 +446,9 @@ export class InventoryChangeMutation {
|
|
|
420
446
|
@Mutation(returns => Boolean)
|
|
421
447
|
async rejectInventoryChanges(
|
|
422
448
|
@Arg('patches', type => [InventoryChangePatch]) patches: InventoryChangePatch[],
|
|
423
|
-
@Ctx() context:
|
|
449
|
+
@Ctx() context: ResolverContext
|
|
424
450
|
): Promise<Boolean> {
|
|
425
|
-
const { domain, user, tx }
|
|
451
|
+
const { domain, user, tx } = context.state
|
|
426
452
|
|
|
427
453
|
const _inventoryChanges = await tx.getRepository(InventoryChange).find({
|
|
428
454
|
where: { id: In(patches.map(item => item.id)) },
|
|
@@ -472,10 +498,10 @@ function clean(obj) {
|
|
|
472
498
|
}
|
|
473
499
|
|
|
474
500
|
async function upsertInventoryItems(context, inventoryChange, approvalStatus, tx) {
|
|
475
|
-
const { domain, user }
|
|
501
|
+
const { domain, user } = context.state
|
|
476
502
|
|
|
477
503
|
let inventoryItemChanges: InventoryItemChange[] = await tx.getRepository(InventoryItemChange).find({
|
|
478
|
-
where: { domain, inventoryChange: inventoryChange, status: 'PENDING' },
|
|
504
|
+
where: { domain: { id: domain.id }, inventoryChange: inventoryChange, status: 'PENDING' },
|
|
479
505
|
relations: ['domain', 'inventoryItem', 'inventory', 'inventory.product', 'inventoryChange']
|
|
480
506
|
})
|
|
481
507
|
await Promise.all(
|
|
@@ -537,8 +563,8 @@ async function upsertInventoryItems(context, inventoryChange, approvalStatus, tx
|
|
|
537
563
|
)
|
|
538
564
|
}
|
|
539
565
|
|
|
540
|
-
export async function approveInventoryChanges(patches: any, context:
|
|
541
|
-
const { domain, user, tx }
|
|
566
|
+
export async function approveInventoryChanges(patches: any, context: ResolverContext) {
|
|
567
|
+
const { domain, user, tx } = context.state
|
|
542
568
|
|
|
543
569
|
// Get Selected Inventory Change Data
|
|
544
570
|
const _inventoryChanges = await tx.getRepository(InventoryChange).find({
|
|
@@ -634,7 +660,7 @@ export async function approveInventoryChanges(patches: any, context: any) {
|
|
|
634
660
|
|
|
635
661
|
// Check and set current location status
|
|
636
662
|
let currentLocationInventoryCount = await tx.getRepository(Inventory).count({
|
|
637
|
-
where: { location: inventory.location, status: 'STORED', id: Not(inventory.id) }
|
|
663
|
+
where: { location: { id: inventory.location.id }, status: 'STORED', id: Not(inventory.id) }
|
|
638
664
|
})
|
|
639
665
|
|
|
640
666
|
if (currentLocationInventoryCount == 0) {
|
|
@@ -781,7 +807,7 @@ export async function approveInventoryChanges(patches: any, context: any) {
|
|
|
781
807
|
} else {
|
|
782
808
|
let latestLocationInventoryCount = await tx.getRepository(Inventory).count({
|
|
783
809
|
where: {
|
|
784
|
-
location: newRecord.location ? newRecord.location.id : inventory.location.id,
|
|
810
|
+
location: { id: newRecord.location ? newRecord.location.id : inventory.location.id },
|
|
785
811
|
status: 'STORED',
|
|
786
812
|
id: Not(inventory.id)
|
|
787
813
|
}
|
|
@@ -801,18 +827,41 @@ export async function approveInventoryChanges(patches: any, context: any) {
|
|
|
801
827
|
|
|
802
828
|
const companyDomain: Domain = inventory.bizplace?.company.domain
|
|
803
829
|
|
|
804
|
-
const
|
|
805
|
-
|
|
806
|
-
|
|
830
|
+
const sellercraftCtrl: SellercraftController = new SellercraftController(tx, domain, user)
|
|
831
|
+
if (newRecord?.bizplace?.id && inventory.bizplace.id != newRecord?.bizplace?.id) {
|
|
832
|
+
const prevBizSC: Sellercraft = await tx.getRepository(Sellercraft).findOne({
|
|
833
|
+
where: {
|
|
834
|
+
domain: { id: inventory.bizplace?.domain.id },
|
|
835
|
+
status: SellercraftStatus.ACTIVE
|
|
836
|
+
},
|
|
837
|
+
relations: ['domain']
|
|
838
|
+
})
|
|
839
|
+
if (prevBizSC) {
|
|
840
|
+
await sellercraftCtrl.updateSellercraftStock(prevBizSC, { ...inventory, bizplace: inventory.bizplace })
|
|
841
|
+
}
|
|
842
|
+
}
|
|
807
843
|
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
844
|
+
const currentBizSC: Sellercraft = await tx.getRepository(Sellercraft).findOne({
|
|
845
|
+
where: {
|
|
846
|
+
domain: newRecord?.bizplace?.domain || inventory?.bizplace?.domain,
|
|
847
|
+
status: SellercraftStatus.ACTIVE
|
|
848
|
+
},
|
|
849
|
+
relations: ['domain']
|
|
850
|
+
})
|
|
813
851
|
|
|
814
|
-
|
|
815
|
-
|
|
852
|
+
if (currentBizSC) {
|
|
853
|
+
if (newRecord?.product?.id && newRecord?.product?.id != inventory?.product?.id)
|
|
854
|
+
await sellercraftCtrl.updateSellercraftStock(currentBizSC, {
|
|
855
|
+
...inventory,
|
|
856
|
+
bizplace: newRecord?.bizplace || inventory?.bizplace,
|
|
857
|
+
product: inventory.product
|
|
858
|
+
})
|
|
859
|
+
|
|
860
|
+
await sellercraftCtrl.updateSellercraftStock(currentBizSC, {
|
|
861
|
+
...inventory,
|
|
862
|
+
bizplace: newRecord?.bizplace || inventory?.bizplace,
|
|
863
|
+
product: newRecord?.product || inventory?.product
|
|
864
|
+
})
|
|
816
865
|
}
|
|
817
866
|
|
|
818
867
|
// check for any existing active marketplace connection, update marketplace selling qty
|
|
@@ -832,7 +881,7 @@ export async function approveInventoryChanges(patches: any, context: any) {
|
|
|
832
881
|
|
|
833
882
|
// Adding Inventory
|
|
834
883
|
else {
|
|
835
|
-
const total = await tx.getRepository(Inventory).
|
|
884
|
+
const total = await tx.getRepository(Inventory).countBy({
|
|
836
885
|
createdAt: MoreThan(new Date(year, month, date))
|
|
837
886
|
})
|
|
838
887
|
|
|
@@ -869,7 +918,7 @@ export async function approveInventoryChanges(patches: any, context: any) {
|
|
|
869
918
|
newRecord.palletId = palletId
|
|
870
919
|
|
|
871
920
|
const warehouseCartonSetting: Setting = await tx.getRepository(Setting).findOne({
|
|
872
|
-
where: { domain, category: 'id-rule', name: 'enable-carton-label' }
|
|
921
|
+
where: { domain: { id: domain.id }, category: 'id-rule', name: 'enable-carton-label' }
|
|
873
922
|
})
|
|
874
923
|
|
|
875
924
|
const partnerCartonSetting: PartnerSetting = await tx.getRepository(PartnerSetting).findOne({
|