@things-factory/worksheet-base 5.0.0-alpha.3 → 5.0.0-alpha.30
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/inbound/unloading-worksheet-controller.js +301 -2
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/loading-worksheet-controller.js +10 -0
- package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/packing-worksheet-controller.js +172 -7
- package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +352 -11
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/returning-worksheet-controller.js +11 -1
- package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/sorting-worksheet-controller.js +110 -3
- package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/render-grn.js +27 -3
- package/dist-server/controllers/render-grn.js.map +1 -1
- package/dist-server/controllers/render-invoices.js +103 -65
- package/dist-server/controllers/render-invoices.js.map +1 -1
- package/dist-server/controllers/render-orientage-do.js.map +1 -1
- package/dist-server/controllers/render-orientage-grn.js +1 -0
- package/dist-server/controllers/render-orientage-grn.js.map +1 -1
- package/dist-server/controllers/render-ro-do.js +65 -1
- package/dist-server/controllers/render-ro-do.js.map +1 -1
- package/dist-server/controllers/worksheet-controller.js +15 -0
- package/dist-server/controllers/worksheet-controller.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js +30 -1
- package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js +27 -23
- package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +3 -0
- package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js +16 -2
- package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/index.js +2 -1
- package/dist-server/graphql/resolvers/worksheet/packing/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/packing.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +152 -132
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +13 -10
- package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +0 -17
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
- package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js +4 -7
- package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js +6 -0
- package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +3 -2
- package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading/index.js +3 -1
- package/dist-server/graphql/resolvers/worksheet/unloading/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/unloading/unload.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +3 -1
- package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +4 -5
- package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +4 -2
- package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
- package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js +11 -0
- package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js.map +1 -0
- package/dist-server/graphql/types/worksheet/index.js +30 -4
- package/dist-server/graphql/types/worksheet/index.js.map +1 -1
- package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +3 -0
- package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
- package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
- package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
- package/dist-server/graphql/types/worksheet-detail/index.js +0 -2
- package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
- package/dist-server/index.js +4 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/utils/inventory-util.js +14 -25
- package/dist-server/utils/inventory-util.js.map +1 -1
- package/package.json +17 -17
- package/server/controllers/inbound/unloading-worksheet-controller.ts +363 -6
- package/server/controllers/outbound/loading-worksheet-controller.ts +13 -0
- package/server/controllers/outbound/packing-worksheet-controller.ts +224 -9
- package/server/controllers/outbound/picking-worksheet-controller.ts +465 -16
- package/server/controllers/outbound/returning-worksheet-controller.ts +12 -1
- package/server/controllers/outbound/sorting-worksheet-controller.ts +149 -4
- package/server/controllers/render-grn.ts +39 -5
- package/server/controllers/render-invoices.ts +119 -72
- package/server/controllers/render-orientage-do.ts +11 -11
- package/server/controllers/render-orientage-grn.ts +12 -11
- package/server/controllers/render-ro-do.ts +93 -8
- package/server/controllers/worksheet-controller.ts +18 -2
- package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +35 -2
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.ts +35 -25
- package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +2 -0
- package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +25 -6
- package/server/graphql/resolvers/worksheet/packing/index.ts +3 -1
- package/server/graphql/resolvers/worksheet/packing/packing.ts +5 -4
- package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +9 -4
- package/server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.ts +24 -0
- package/server/graphql/resolvers/worksheet/packing-worksheet.ts +167 -145
- package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +15 -11
- package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +0 -18
- package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
- package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +5 -7
- package/server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.ts +24 -0
- package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +5 -4
- package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +5 -4
- package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +6 -0
- package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +6 -2
- package/server/graphql/resolvers/worksheet/unloading/index.ts +4 -0
- package/server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.ts +26 -0
- package/server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.ts +24 -0
- package/server/graphql/resolvers/worksheet/unloading/unload.ts +3 -1
- package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +3 -1
- package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +10 -12
- package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +4 -2
- package/server/graphql/types/worksheet/find-release-orders-by-task-no.ts +8 -0
- package/server/graphql/types/worksheet/index.ts +30 -4
- package/server/graphql/types/worksheet/worksheet-detail-info.ts +3 -0
- package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
- package/server/graphql/types/worksheet-detail/index.ts +0 -2
- package/server/index.ts +4 -0
- package/server/utils/inventory-util.ts +15 -23
|
@@ -20,11 +20,14 @@ import {
|
|
|
20
20
|
VAS_TYPES
|
|
21
21
|
} from '@things-factory/sales-base'
|
|
22
22
|
import { Domain } from '@things-factory/shell'
|
|
23
|
+
import { PartnerSetting, Setting } from '@things-factory/setting-base'
|
|
23
24
|
import {
|
|
24
25
|
Inventory,
|
|
26
|
+
INVENTORY_ITEM_SOURCE,
|
|
25
27
|
INVENTORY_STATUS,
|
|
26
28
|
INVENTORY_TRANSACTION_TYPE,
|
|
27
29
|
InventoryHistory,
|
|
30
|
+
InventoryItem,
|
|
28
31
|
InventoryNoGenerator,
|
|
29
32
|
Location,
|
|
30
33
|
Pallet,
|
|
@@ -33,7 +36,7 @@ import {
|
|
|
33
36
|
|
|
34
37
|
import { RULE_TYPE, WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
|
|
35
38
|
import { Worksheet, WorksheetDetail } from '../../entities'
|
|
36
|
-
import { DateGenerator } from '../../utils'
|
|
39
|
+
import { DateGenerator, generateInventoryHistory } from '../../utils'
|
|
37
40
|
import { VasWorksheetController } from '../vas/vas-worksheet-controller'
|
|
38
41
|
|
|
39
42
|
export type UnloadingWorksheetDetail = Partial<WorksheetDetail> & {
|
|
@@ -241,6 +244,189 @@ export class UnloadingWorksheetController extends VasWorksheetController {
|
|
|
241
244
|
}
|
|
242
245
|
}
|
|
243
246
|
|
|
247
|
+
async scanSerialNumberUnload(
|
|
248
|
+
worksheetDetailName: string,
|
|
249
|
+
serialNumber: string,
|
|
250
|
+
inventory: Partial<Inventory>
|
|
251
|
+
): Promise<void> {
|
|
252
|
+
const worksheetDetail: WorksheetDetail = await this.trxMgr.getRepository(WorksheetDetail).findOne({
|
|
253
|
+
where: {
|
|
254
|
+
name: worksheetDetailName,
|
|
255
|
+
status: Not(Equal(WORKSHEET_STATUS.DEACTIVATED))
|
|
256
|
+
},
|
|
257
|
+
relations: [
|
|
258
|
+
'bizplace',
|
|
259
|
+
'worksheet',
|
|
260
|
+
'worksheet.arrivalNotice',
|
|
261
|
+
'worksheet.returnOrder',
|
|
262
|
+
'worksheet.bufferLocation',
|
|
263
|
+
'worksheet.bufferLocation.warehouse',
|
|
264
|
+
'targetProduct',
|
|
265
|
+
'targetProduct.product',
|
|
266
|
+
'targetProduct.product.productDetails',
|
|
267
|
+
'targetProduct.product.productDetails.childProductDetail',
|
|
268
|
+
'targetInventory',
|
|
269
|
+
'targetInventory.product',
|
|
270
|
+
'targetInventory.product.productDetails',
|
|
271
|
+
'targetInventory.product.productDetails.childProductDetail'
|
|
272
|
+
]
|
|
273
|
+
})
|
|
274
|
+
if (!worksheetDetail) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(worksheetDetailName))
|
|
275
|
+
|
|
276
|
+
if (!inventory?.palletId)
|
|
277
|
+
inventory.palletId = await generateId({
|
|
278
|
+
domain: this.domain,
|
|
279
|
+
type: RULE_TYPE.LOT_NUMBER_ID,
|
|
280
|
+
seed: { date: DateGenerator.generateDate() }
|
|
281
|
+
})
|
|
282
|
+
|
|
283
|
+
const bizplace: Bizplace = worksheetDetail.bizplace
|
|
284
|
+
const worksheet: Worksheet = worksheetDetail.worksheet
|
|
285
|
+
const arrivalNotice: ArrivalNotice = worksheet.arrivalNotice
|
|
286
|
+
const returnOrder: ReturnOrder = worksheet.returnOrder
|
|
287
|
+
const targetProduct: OrderProduct = worksheetDetail.targetProduct
|
|
288
|
+
const targetInventory: OrderInventory = worksheetDetail.targetInventory
|
|
289
|
+
const product: Product = Boolean(arrivalNotice) ? targetProduct.product : targetInventory.product
|
|
290
|
+
const packingType: string = Boolean(arrivalNotice) ? targetProduct.packingType : targetInventory.packingType
|
|
291
|
+
const packingSize: number = Boolean(arrivalNotice) ? targetProduct.packingSize : targetInventory.packingSize
|
|
292
|
+
const batchId: string = Boolean(arrivalNotice) ? targetProduct.batchId : targetInventory.batchId
|
|
293
|
+
let qty: number = 0
|
|
294
|
+
let uom: string = Boolean(arrivalNotice) ? targetProduct.uom : targetInventory.uom
|
|
295
|
+
const cartonId: string = inventory.cartonId
|
|
296
|
+
const orderId: string = Boolean(arrivalNotice) ? arrivalNotice.id : returnOrder.id
|
|
297
|
+
await this.checkSerialNumberDuplication(serialNumber, product)
|
|
298
|
+
|
|
299
|
+
qty++
|
|
300
|
+
|
|
301
|
+
const invQb: SelectQueryBuilder<Inventory> = await this.trxMgr
|
|
302
|
+
.getRepository(Inventory)
|
|
303
|
+
.createQueryBuilder('INV')
|
|
304
|
+
.where('INV.domain_id = :domainId', { domainId: this.domain.id })
|
|
305
|
+
.andWhere('INV.bizplace_id = :bizplaceId', { bizplaceId: bizplace.id })
|
|
306
|
+
.andWhere('INV.product_id = :productId', { productId: product.id })
|
|
307
|
+
.andWhere('INV.batch_id = :batchId', { batchId: batchId })
|
|
308
|
+
.andWhere('INV.packing_type = :packingType', { packingType: packingType })
|
|
309
|
+
.andWhere('INV.packing_size = :packingSize', { packingSize: packingSize })
|
|
310
|
+
|
|
311
|
+
if (arrivalNotice) invQb.andWhere('INV.ref_order_id = :arrivalNoticeId', { arrivalNoticeId: arrivalNotice.id })
|
|
312
|
+
else if (returnOrder) invQb.andWhere('INV.ref_order_id = :returnOrderId', { returnOrderId: returnOrder.id })
|
|
313
|
+
|
|
314
|
+
if (inventory?.expirationDate) {
|
|
315
|
+
invQb.andWhere('INV.expiration_date = :expirationDate', {
|
|
316
|
+
expirationDate: inventory.expirationDate
|
|
317
|
+
})
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
if (inventory?.cartonId) invQb.andWhere('INV.carton_id = :cartonId', { cartonId: inventory.cartonId })
|
|
321
|
+
else invQb.andWhere('INV.pallet_id = :palletId', { palletId: inventory.palletId })
|
|
322
|
+
|
|
323
|
+
let foundInventory: Inventory = await invQb.getOne()
|
|
324
|
+
|
|
325
|
+
const batchIdRef: string = Boolean(arrivalNotice) ? targetProduct.batchIdRef : null
|
|
326
|
+
const remark: string = Boolean(arrivalNotice) ? targetProduct.remark : targetInventory.remark
|
|
327
|
+
const manufactureDate: number = Boolean(arrivalNotice) ? targetProduct.manufactureDate : null
|
|
328
|
+
const location: Location = worksheet.bufferLocation
|
|
329
|
+
const warehouse: Warehouse = location.warehouse
|
|
330
|
+
const zone: string = location.zone
|
|
331
|
+
const unitCost: number = Boolean(arrivalNotice)
|
|
332
|
+
? targetProduct?.unitPrice
|
|
333
|
+
? ((targetProduct.packQty * targetProduct.unitPrice + targetProduct.miscAmt - targetProduct.discountAmt) *
|
|
334
|
+
(1 + targetProduct.taxRate / 100)) /
|
|
335
|
+
targetProduct.packQty
|
|
336
|
+
: 0
|
|
337
|
+
: null
|
|
338
|
+
|
|
339
|
+
if (!foundInventory) {
|
|
340
|
+
let newInventory: Partial<Inventory> = new Inventory()
|
|
341
|
+
newInventory.bizplace = bizplace
|
|
342
|
+
newInventory.domain = this.domain
|
|
343
|
+
newInventory.name = InventoryNoGenerator.inventoryName()
|
|
344
|
+
newInventory.palletId = inventory.palletId
|
|
345
|
+
newInventory.cartonId = inventory.cartonId
|
|
346
|
+
newInventory.batchId = batchId
|
|
347
|
+
newInventory.batchIdRef = batchIdRef
|
|
348
|
+
newInventory.product = product
|
|
349
|
+
newInventory.packingType = packingType
|
|
350
|
+
newInventory.packingSize = packingSize
|
|
351
|
+
newInventory.uom = uom
|
|
352
|
+
newInventory.remark = remark
|
|
353
|
+
newInventory.qty = qty
|
|
354
|
+
newInventory.uomValue =
|
|
355
|
+
Math.round(
|
|
356
|
+
qty *
|
|
357
|
+
(Boolean(arrivalNotice)
|
|
358
|
+
? targetProduct.uomValue
|
|
359
|
+
: targetInventory.returnUomValue / targetInventory.returnQty) *
|
|
360
|
+
100
|
|
361
|
+
) / 100
|
|
362
|
+
newInventory.manufactureDate = manufactureDate
|
|
363
|
+
newInventory.refOrderId = orderId
|
|
364
|
+
newInventory.unitCost = unitCost
|
|
365
|
+
if (inventory.reusablePallet?.id) {
|
|
366
|
+
newInventory.reusablePallet = await this.trxMgr.getRepository(Pallet).findOne(inventory.reusablePallet.id)
|
|
367
|
+
}
|
|
368
|
+
newInventory.orderProductId = Boolean(arrivalNotice) ? targetProduct.id : null
|
|
369
|
+
newInventory.orderInventoryId = Boolean(returnOrder) ? targetInventory.id : null
|
|
370
|
+
newInventory.warehouse = warehouse
|
|
371
|
+
newInventory.location = location
|
|
372
|
+
newInventory.zone = zone
|
|
373
|
+
newInventory.status = INVENTORY_STATUS.CHECKED
|
|
374
|
+
newInventory.creator = this.user
|
|
375
|
+
|
|
376
|
+
if (inventory?.expirationDate) {
|
|
377
|
+
newInventory.expirationDate = new Date(inventory.expirationDate)
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
if (arrivalNotice) {
|
|
381
|
+
targetProduct.actualPalletQty++
|
|
382
|
+
targetProduct.actualPackQty = Boolean(targetProduct.actualPackQty) ? targetProduct.actualPackQty + qty : qty
|
|
383
|
+
} else if (returnOrder) {
|
|
384
|
+
targetInventory.actualPalletQty++
|
|
385
|
+
targetInventory.actualPackQty = Boolean(targetInventory.actualPackQty)
|
|
386
|
+
? targetInventory.actualPackQty + qty
|
|
387
|
+
: qty
|
|
388
|
+
}
|
|
389
|
+
foundInventory = await this.trxMgr.getRepository(Inventory).save(newInventory)
|
|
390
|
+
} else {
|
|
391
|
+
const updatedQty: number = foundInventory.qty + qty
|
|
392
|
+
foundInventory.expirationDate = new Date(foundInventory.expirationDate)
|
|
393
|
+
foundInventory.qty = updatedQty
|
|
394
|
+
foundInventory.uomValue +=
|
|
395
|
+
Math.round(
|
|
396
|
+
qty *
|
|
397
|
+
(Boolean(arrivalNotice)
|
|
398
|
+
? targetProduct.uomValue
|
|
399
|
+
: targetInventory.returnUomValue / targetInventory.returnQty) *
|
|
400
|
+
100
|
|
401
|
+
) / 100
|
|
402
|
+
if (arrivalNotice) targetProduct.actualPackQty = targetProduct.actualPackQty + qty
|
|
403
|
+
else if (returnOrder) targetInventory.actualPackQty = targetInventory.actualPackQty + qty
|
|
404
|
+
foundInventory = await this.trxMgr.getRepository(Inventory).save(foundInventory)
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
let inventoryItem: InventoryItem = new InventoryItem()
|
|
408
|
+
inventoryItem.name = InventoryNoGenerator.inventoryItemName()
|
|
409
|
+
inventoryItem.serialNumber = serialNumber
|
|
410
|
+
inventoryItem.status = foundInventory.status
|
|
411
|
+
inventoryItem.inboundOrderId = foundInventory.refOrderId
|
|
412
|
+
inventoryItem.product = product
|
|
413
|
+
inventoryItem.inventory = foundInventory
|
|
414
|
+
inventoryItem.source = INVENTORY_ITEM_SOURCE.INBOUND
|
|
415
|
+
inventoryItem.domain = this.domain
|
|
416
|
+
inventoryItem.creator = this.user
|
|
417
|
+
inventoryItem.updater = this.user
|
|
418
|
+
|
|
419
|
+
await this.trxMgr.getRepository(InventoryItem).save(inventoryItem)
|
|
420
|
+
|
|
421
|
+
if (arrivalNotice) {
|
|
422
|
+
targetProduct.updater = this.user
|
|
423
|
+
this.updateOrderTargets([targetProduct])
|
|
424
|
+
} else if (returnOrder) {
|
|
425
|
+
targetInventory.updater = this.user
|
|
426
|
+
this.updateOrderTargets([targetInventory])
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
244
430
|
async scanProductUnload(
|
|
245
431
|
worksheetDetailName: string,
|
|
246
432
|
productBarcode: string,
|
|
@@ -561,6 +747,7 @@ export class UnloadingWorksheetController extends VasWorksheetController {
|
|
|
561
747
|
targetProduct.status = ORDER_PRODUCT_STATUS.UNLOADING
|
|
562
748
|
} else {
|
|
563
749
|
targetProduct.actualPackQty--
|
|
750
|
+
// targetProduct.actualPalletQty--
|
|
564
751
|
}
|
|
565
752
|
targetProduct.updater = this.user
|
|
566
753
|
await this.updateOrderTargets([targetProduct])
|
|
@@ -587,6 +774,7 @@ export class UnloadingWorksheetController extends VasWorksheetController {
|
|
|
587
774
|
targetInventory.status = ORDER_PRODUCT_STATUS.UNLOADING
|
|
588
775
|
} else {
|
|
589
776
|
targetInventory.actualPackQty--
|
|
777
|
+
// targetInventory.actualPalletQty--
|
|
590
778
|
}
|
|
591
779
|
targetInventory.updater = this.user
|
|
592
780
|
await this.updateOrderTargets([targetInventory])
|
|
@@ -656,6 +844,60 @@ export class UnloadingWorksheetController extends VasWorksheetController {
|
|
|
656
844
|
}
|
|
657
845
|
}
|
|
658
846
|
|
|
847
|
+
async undoSerialNumberUnload(worksheetDetailName: string, inventoryItemId: string): Promise<void> {
|
|
848
|
+
const worksheetDetail: WorksheetDetail = await this.trxMgr.getRepository(WorksheetDetail).findOne({
|
|
849
|
+
where: { name: worksheetDetailName, domain: this.domain, status: Not(Equal(WORKSHEET_STATUS.DEACTIVATED)) },
|
|
850
|
+
relations: [
|
|
851
|
+
'worksheet',
|
|
852
|
+
'worksheet.arrivalNotice',
|
|
853
|
+
'worksheet.returnOrder',
|
|
854
|
+
'targetProduct',
|
|
855
|
+
'targetProduct.product'
|
|
856
|
+
]
|
|
857
|
+
})
|
|
858
|
+
|
|
859
|
+
let worksheet: Worksheet = worksheetDetail.worksheet
|
|
860
|
+
let arrivalNotice: ArrivalNotice = worksheet.arrivalNotice
|
|
861
|
+
let returnOrder: ReturnOrder = worksheet.returnOrder
|
|
862
|
+
let targetInventory: OrderInventory = worksheetDetail.targetInventory
|
|
863
|
+
let targetProduct: OrderProduct = worksheetDetail.targetProduct
|
|
864
|
+
let inventoryItem: InventoryItem = await this.trxMgr.getRepository(InventoryItem).findOne({
|
|
865
|
+
where: { domain: this.domain, id: inventoryItemId },
|
|
866
|
+
relations: ['inventory', 'product']
|
|
867
|
+
})
|
|
868
|
+
let inventory: Inventory = inventoryItem.inventory
|
|
869
|
+
|
|
870
|
+
await this.trxMgr.getRepository(InventoryItem).delete(inventoryItem.id)
|
|
871
|
+
|
|
872
|
+
inventory.qty--
|
|
873
|
+
inventory.uomValue =
|
|
874
|
+
Math.round(
|
|
875
|
+
inventory.qty *
|
|
876
|
+
(Boolean(arrivalNotice)
|
|
877
|
+
? targetProduct.uomValue
|
|
878
|
+
: targetInventory.returnUomValue / targetInventory.returnQty) *
|
|
879
|
+
100
|
|
880
|
+
) / 100
|
|
881
|
+
await this.trxMgr
|
|
882
|
+
.getRepository(Inventory)
|
|
883
|
+
.update({ id: inventory.id }, { qty: inventory.qty, uomValue: inventory.uomValue })
|
|
884
|
+
|
|
885
|
+
targetProduct.actualPackQty--
|
|
886
|
+
|
|
887
|
+
const inventoryItems: InventoryItem[] = await this.trxMgr.getRepository(InventoryItem).find({
|
|
888
|
+
where: { domain: this.domain, inboundOrderId: arrivalNotice.id, inventory }
|
|
889
|
+
})
|
|
890
|
+
|
|
891
|
+
if (inventoryItems?.length == 0) {
|
|
892
|
+
await this.trxMgr.getRepository(Inventory).delete(inventory.id)
|
|
893
|
+
|
|
894
|
+
targetProduct.actualPalletQty--
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
targetProduct.updater = this.user
|
|
898
|
+
await this.updateOrderTargets([targetProduct])
|
|
899
|
+
}
|
|
900
|
+
|
|
659
901
|
async activateUnloading(
|
|
660
902
|
worksheetNo: string,
|
|
661
903
|
unloadingWorksheetDetails: UnloadingWorksheetDetail[]
|
|
@@ -715,6 +957,70 @@ export class UnloadingWorksheetController extends VasWorksheetController {
|
|
|
715
957
|
return worksheet
|
|
716
958
|
}
|
|
717
959
|
|
|
960
|
+
async getProductScanningVal(arrivalNotice: ArrivalNotice) {
|
|
961
|
+
let productScanning: string = 'false'
|
|
962
|
+
const enableProductScanning: Setting = await this.trxMgr.getRepository(Setting).findOne({
|
|
963
|
+
where: { domain: this.domain, category: 'id-rule', name: 'enable-product-scanning' }
|
|
964
|
+
})
|
|
965
|
+
|
|
966
|
+
if (enableProductScanning) productScanning = enableProductScanning.value
|
|
967
|
+
|
|
968
|
+
const partnerEnableProductScanning: PartnerSetting = await this.trxMgr.getRepository(PartnerSetting).findOne({
|
|
969
|
+
where: { setting: enableProductScanning, domain: this.domain, partnerDomain: arrivalNotice.bizplace?.domain }
|
|
970
|
+
})
|
|
971
|
+
|
|
972
|
+
if (partnerEnableProductScanning) productScanning = partnerEnableProductScanning.value
|
|
973
|
+
|
|
974
|
+
return productScanning
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
async getInputQtyVal(arrivalNotice: ArrivalNotice) {
|
|
978
|
+
let inputQty: string = 'false'
|
|
979
|
+
const enableInputQty: Setting = await this.trxMgr.getRepository(Setting).findOne({
|
|
980
|
+
where: { domain: this.domain, category: 'id-rule', name: 'enable-input-qty' }
|
|
981
|
+
})
|
|
982
|
+
|
|
983
|
+
if (enableInputQty) inputQty = enableInputQty.value
|
|
984
|
+
|
|
985
|
+
const partnerEnableInputQty: PartnerSetting = await this.trxMgr.getRepository(PartnerSetting).findOne({
|
|
986
|
+
where: { setting: enableInputQty, domain: this.domain, partnerDomain: arrivalNotice.bizplace?.domain }
|
|
987
|
+
})
|
|
988
|
+
|
|
989
|
+
if (partnerEnableInputQty) inputQty = partnerEnableInputQty.value
|
|
990
|
+
|
|
991
|
+
return inputQty
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
// only creates inventory history upon partial or full unload when
|
|
995
|
+
// productScanning is true
|
|
996
|
+
// inputQty is false
|
|
997
|
+
async createInventoryHistory(arrivalNotice: ArrivalNotice, inventories?: Inventory[]) {
|
|
998
|
+
try {
|
|
999
|
+
if (inventories === undefined) {
|
|
1000
|
+
const inventoryList = await this.trxMgr.getRepository(Inventory).findAndCount({
|
|
1001
|
+
where: {
|
|
1002
|
+
domain: this.domain,
|
|
1003
|
+
refOrderId: arrivalNotice.id
|
|
1004
|
+
}
|
|
1005
|
+
})
|
|
1006
|
+
|
|
1007
|
+
inventories = inventoryList[0]
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
for (const inventory of inventories) {
|
|
1011
|
+
await this.transactionInventory(
|
|
1012
|
+
inventory,
|
|
1013
|
+
arrivalNotice,
|
|
1014
|
+
inventory.qty,
|
|
1015
|
+
inventory.uomValue,
|
|
1016
|
+
INVENTORY_TRANSACTION_TYPE.UNLOADING
|
|
1017
|
+
)
|
|
1018
|
+
}
|
|
1019
|
+
} catch (e) {
|
|
1020
|
+
throw e
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
|
|
718
1024
|
async completeUnloading(
|
|
719
1025
|
arrivalNoticeNo: string,
|
|
720
1026
|
unloadingWorksheetDetails: Partial<WorksheetDetail>[]
|
|
@@ -722,7 +1028,7 @@ export class UnloadingWorksheetController extends VasWorksheetController {
|
|
|
722
1028
|
let arrivalNotice: ArrivalNotice = await this.findRefOrder(
|
|
723
1029
|
ArrivalNotice,
|
|
724
1030
|
{ domain: this.domain, name: arrivalNoticeNo, status: In([ORDER_STATUS.PROCESSING, ORDER_STATUS.PUTTING_AWAY]) },
|
|
725
|
-
['orderProducts', 'releaseGood']
|
|
1031
|
+
['orderProducts', 'releaseGood', 'bizplace', 'bizplace.domain']
|
|
726
1032
|
)
|
|
727
1033
|
|
|
728
1034
|
if (arrivalNotice.crossDocking) {
|
|
@@ -785,6 +1091,47 @@ export class UnloadingWorksheetController extends VasWorksheetController {
|
|
|
785
1091
|
await this.completeWorksheet(worksheet)
|
|
786
1092
|
}
|
|
787
1093
|
|
|
1094
|
+
const productScanning = await this.getProductScanningVal(arrivalNotice)
|
|
1095
|
+
const inputQty = await this.getInputQtyVal(arrivalNotice)
|
|
1096
|
+
if (productScanning === 'true' && inputQty === 'false') await this.createInventoryHistory(arrivalNotice)
|
|
1097
|
+
|
|
1098
|
+
const inventories: Inventory[] = await this.trxMgr.getRepository(Inventory).find({
|
|
1099
|
+
where: {
|
|
1100
|
+
domain: this.domain,
|
|
1101
|
+
refOrderId: arrivalNotice.id,
|
|
1102
|
+
status: In([INVENTORY_STATUS.UNLOADED, INVENTORY_STATUS.CHECKED])
|
|
1103
|
+
},
|
|
1104
|
+
relations: ['domain', 'bizplace', 'product', 'warehouse', 'location']
|
|
1105
|
+
})
|
|
1106
|
+
|
|
1107
|
+
for (let inventory of inventories) {
|
|
1108
|
+
let inventoryItems: InventoryItem[] = await this.trxMgr.getRepository(InventoryItem).find({
|
|
1109
|
+
where: { domain: this.domain, inventory }
|
|
1110
|
+
})
|
|
1111
|
+
|
|
1112
|
+
if (inventoryItems?.length) {
|
|
1113
|
+
inventory.status = INVENTORY_STATUS.STORED
|
|
1114
|
+
|
|
1115
|
+
await Promise.all(
|
|
1116
|
+
inventoryItems.map(async inventoryItem => {
|
|
1117
|
+
await this.trxMgr
|
|
1118
|
+
.getRepository(InventoryItem)
|
|
1119
|
+
.update({ id: inventoryItem.id }, { status: INVENTORY_STATUS.STORED })
|
|
1120
|
+
})
|
|
1121
|
+
)
|
|
1122
|
+
|
|
1123
|
+
await generateInventoryHistory(
|
|
1124
|
+
inventory,
|
|
1125
|
+
arrivalNotice,
|
|
1126
|
+
INVENTORY_TRANSACTION_TYPE.UNLOADING,
|
|
1127
|
+
inventory.qty,
|
|
1128
|
+
inventory.uomValue,
|
|
1129
|
+
this.user,
|
|
1130
|
+
this.trxMgr
|
|
1131
|
+
)
|
|
1132
|
+
}
|
|
1133
|
+
}
|
|
1134
|
+
|
|
788
1135
|
let vasWorksheet: Worksheet = await this.trxMgr.getRepository(Worksheet).findOne({
|
|
789
1136
|
where: {
|
|
790
1137
|
arrivalNotice,
|
|
@@ -828,10 +1175,15 @@ export class UnloadingWorksheetController extends VasWorksheetController {
|
|
|
828
1175
|
arrivalNoticeNo: string,
|
|
829
1176
|
unloadingWorksheetDetail: Partial<WorksheetDetail>[]
|
|
830
1177
|
): Promise<Worksheet> {
|
|
831
|
-
const arrivalNotice: ArrivalNotice = await this.findRefOrder(
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
1178
|
+
const arrivalNotice: ArrivalNotice = await this.findRefOrder(
|
|
1179
|
+
ArrivalNotice,
|
|
1180
|
+
{
|
|
1181
|
+
domain: this.domain,
|
|
1182
|
+
name: arrivalNoticeNo,
|
|
1183
|
+
status: In([ORDER_STATUS.PROCESSING, ORDER_STATUS.PUTTING_AWAY])
|
|
1184
|
+
},
|
|
1185
|
+
['bizplace', 'bizplace.domain']
|
|
1186
|
+
)
|
|
835
1187
|
|
|
836
1188
|
const worksheet: Worksheet = await this.findWorksheetByRefOrder(arrivalNotice, WORKSHEET_TYPE.UNLOADING, [
|
|
837
1189
|
'worksheetDetails',
|
|
@@ -870,6 +1222,11 @@ export class UnloadingWorksheetController extends VasWorksheetController {
|
|
|
870
1222
|
})
|
|
871
1223
|
await this.trxMgr.getRepository(Inventory).save(inventories)
|
|
872
1224
|
|
|
1225
|
+
const productScanning = await this.getProductScanningVal(arrivalNotice)
|
|
1226
|
+
const inputQty = await this.getInputQtyVal(arrivalNotice)
|
|
1227
|
+
if (productScanning === 'true' && inputQty === 'false')
|
|
1228
|
+
await this.createInventoryHistory(arrivalNotice, inventories)
|
|
1229
|
+
|
|
873
1230
|
let vasWorksheet: Worksheet = await this.trxMgr.getRepository(Worksheet).findOne({
|
|
874
1231
|
where: {
|
|
875
1232
|
arrivalNotice,
|
|
@@ -118,6 +118,15 @@ export class LoadingWorksheetController extends VasWorksheetController {
|
|
|
118
118
|
const pickedQty: number = targetInventory.releaseQty
|
|
119
119
|
let inventory: Inventory = targetInventory.inventory
|
|
120
120
|
|
|
121
|
+
targetInventory.loadedAt = new Date()
|
|
122
|
+
targetInventory.loadedByUser = this.user;
|
|
123
|
+
|
|
124
|
+
let loadedBy: string[] = targetInventory.loadedBy ? (targetInventory.loadedBy).split(',') : []
|
|
125
|
+
if (!loadedBy.find(x => x == this.user.name)) {
|
|
126
|
+
loadedBy.push(this.user.name)
|
|
127
|
+
targetInventory.loadedBy = loadedBy.join(',')
|
|
128
|
+
}
|
|
129
|
+
|
|
121
130
|
if (loadedQty > pickedQty) {
|
|
122
131
|
throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('load', `loaded quantity can't exceed picked qty`))
|
|
123
132
|
} else if (loadedQty == pickedQty) {
|
|
@@ -205,6 +214,10 @@ export class LoadingWorksheetController extends VasWorksheetController {
|
|
|
205
214
|
undoTargetOrderInventory.deliveryOrder = null
|
|
206
215
|
undoTargetOrderInventory.updater = this.user
|
|
207
216
|
|
|
217
|
+
undoTargetOrderInventory.loadedAt = null
|
|
218
|
+
undoTargetOrderInventory.loadedByUser = null
|
|
219
|
+
undoTargetOrderInventory.loadedBy = null
|
|
220
|
+
|
|
208
221
|
let prevTargetInventory: OrderInventory = await this.trxMgr.getRepository(OrderInventory).findOne({
|
|
209
222
|
where: {
|
|
210
223
|
domain: this.domain,
|