@things-factory/worksheet-base 4.3.238 → 4.3.241
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/powrup-controller.js +3 -3
- package/dist-server/controllers/ecommerce/powrup-controller.js.map +1 -1
- package/dist-server/controllers/outbound/loading-worksheet-controller.js +36 -9
- package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/packing-worksheet-controller.js +1 -1
- package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +14 -8
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/render-ro-do.js +21 -8
- package/dist-server/controllers/render-ro-do.js.map +1 -1
- package/dist-server/controllers/vas/vas-worksheet-controller.js +157 -31
- package/dist-server/controllers/vas/vas-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/worksheet-controller.js +21 -8
- package/dist-server/controllers/worksheet-controller.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/loading/loading.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/loading/undo-loading.js +4 -4
- package/dist-server/graphql/resolvers/worksheet/loading/undo-loading.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js +62 -3
- package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/packing.js +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +1 -1
- package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +19 -2
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/vas/complete-vas.js +22 -1
- package/dist-server/graphql/resolvers/worksheet/vas/complete-vas.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/vas-worksheet.js +9 -7
- package/dist-server/graphql/resolvers/worksheet/vas-worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/worksheet.js +31 -16
- package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/create-worksheet-detail.js +3 -0
- package/dist-server/graphql/resolvers/worksheet-detail/create-worksheet-detail.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/worksheet-detail.js +1 -1
- package/dist-server/graphql/resolvers/worksheet-detail/worksheet-detail.js.map +1 -1
- package/dist-server/graphql/types/worksheet/index.js +2 -1
- package/dist-server/graphql/types/worksheet/index.js.map +1 -1
- package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +1 -0
- package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
- package/package.json +11 -11
- package/server/controllers/ecommerce/powrup-controller.ts +3 -3
- package/server/controllers/outbound/loading-worksheet-controller.ts +38 -10
- package/server/controllers/outbound/packing-worksheet-controller.ts +1 -1
- package/server/controllers/outbound/picking-worksheet-controller.ts +15 -7
- package/server/controllers/render-ro-do.ts +25 -6
- package/server/controllers/vas/vas-worksheet-controller.ts +239 -49
- package/server/controllers/worksheet-controller.ts +21 -10
- package/server/graphql/resolvers/worksheet/loading/loading.ts +0 -2
- package/server/graphql/resolvers/worksheet/loading/undo-loading.ts +5 -4
- package/server/graphql/resolvers/worksheet/loading-worksheet.ts +68 -2
- package/server/graphql/resolvers/worksheet/packing/packing.ts +1 -1
- package/server/graphql/resolvers/worksheet/packing-worksheet.ts +1 -1
- package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +1 -1
- package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +21 -2
- package/server/graphql/resolvers/worksheet/vas/complete-vas.ts +27 -2
- package/server/graphql/resolvers/worksheet/vas-worksheet.ts +7 -5
- package/server/graphql/resolvers/worksheet/worksheet.ts +34 -13
- package/server/graphql/resolvers/worksheet-detail/create-worksheet-detail.ts +5 -1
- package/server/graphql/resolvers/worksheet-detail/worksheet-detail.ts +1 -1
- package/server/graphql/types/worksheet/index.ts +2 -1
- package/server/graphql/types/worksheet/worksheet-detail-info.ts +1 -0
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import { EntityManager, Equal, In, Not } from 'typeorm'
|
|
1
|
+
import { EntityManager, Equal, In, Not, getRepository, IsNull } from 'typeorm'
|
|
2
2
|
|
|
3
|
+
import { Domain } from '@things-factory/shell'
|
|
3
4
|
import { User } from '@things-factory/auth-base'
|
|
4
5
|
import { Bizplace } from '@things-factory/biz-base'
|
|
5
6
|
import { Product } from '@things-factory/product-base'
|
|
6
7
|
import {
|
|
7
8
|
ArrivalNotice,
|
|
9
|
+
OrderInventory,
|
|
8
10
|
ORDER_STATUS,
|
|
9
11
|
ORDER_TYPES,
|
|
10
12
|
ORDER_VAS_STATUS,
|
|
13
|
+
ORDER_INVENTORY_STATUS,
|
|
11
14
|
OrderNoGenerator,
|
|
12
15
|
OrderVas,
|
|
13
16
|
ReleaseGood,
|
|
@@ -38,6 +41,8 @@ import {
|
|
|
38
41
|
} from '../../graphql/resolvers/worksheet/vas-transactions'
|
|
39
42
|
import { PackingUnits } from '../../graphql/resolvers/worksheet/vas-transactions/interfaces/repackaging'
|
|
40
43
|
import { ReferenceOrderType, WorksheetController } from '../worksheet-controller'
|
|
44
|
+
import { LoadingWorksheetController } from '../../controllers'
|
|
45
|
+
import { v4 as uuidv4 } from 'uuid'
|
|
41
46
|
|
|
42
47
|
type CompleteTransactionType = (trxMgr: EntityManager, orderVas: OrderVas, user: User) => Promise<void>
|
|
43
48
|
|
|
@@ -681,7 +686,14 @@ export class VasWorksheetController extends WorksheetController {
|
|
|
681
686
|
return inventory
|
|
682
687
|
}
|
|
683
688
|
|
|
684
|
-
async completeVAS(
|
|
689
|
+
async completeVAS(
|
|
690
|
+
tx: any,
|
|
691
|
+
domain: Domain,
|
|
692
|
+
user: User,
|
|
693
|
+
orderNo: string,
|
|
694
|
+
orderType: string,
|
|
695
|
+
vasWorksheetDetails: WorksheetDetail[]
|
|
696
|
+
): Promise<Worksheet> {
|
|
685
697
|
const ENTITY_MAP: { [key: string]: ArrivalNotice | ReleaseGood | VasOrder } = {
|
|
686
698
|
[ORDER_TYPES.ARRIVAL_NOTICE]: ArrivalNotice,
|
|
687
699
|
[ORDER_TYPES.RELEASE_OF_GOODS]: ReleaseGood,
|
|
@@ -695,7 +707,9 @@ export class VasWorksheetController extends WorksheetController {
|
|
|
695
707
|
'worksheetDetails',
|
|
696
708
|
'worksheetDetails.targetVas',
|
|
697
709
|
'worksheetDetails.targetVas.vas',
|
|
698
|
-
'worksheetDetails.targetVas.inventory'
|
|
710
|
+
'worksheetDetails.targetVas.inventory',
|
|
711
|
+
'worksheetDetails.targetVas.orderVasItems',
|
|
712
|
+
'worksheetDetails.targetVas.orderVasItems.vas'
|
|
699
713
|
])
|
|
700
714
|
|
|
701
715
|
const isPureVAS: boolean = refOrder instanceof VasOrder
|
|
@@ -735,56 +749,59 @@ export class VasWorksheetController extends WorksheetController {
|
|
|
735
749
|
}, [])
|
|
736
750
|
|
|
737
751
|
for (const targetVas of targetVASs) {
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
// await this.doOperationTransaction(targetVas)
|
|
744
|
-
// } /*else if (targetVas.operationGuide && targetVas.vas.name.toUpperCase() === VAS.REPACKAGING && issue) {
|
|
745
|
-
// await this.doOperationTransaction(targetVas)
|
|
746
|
-
// }*/
|
|
752
|
+
if (targetVas.vas) {
|
|
753
|
+
// for old vas--> can be removed later
|
|
754
|
+
const { issue }: { issue: string } = foundWorksheetDetails.find(
|
|
755
|
+
(wsd: WorksheetDetail) => wsd.targetVas.id === targetVas.id
|
|
756
|
+
)
|
|
747
757
|
|
|
748
|
-
|
|
749
|
-
await this.doOperationTransaction(targetVas)
|
|
750
|
-
|
|
758
|
+
// if (targetVas.operationGuide && (!issue || (targetVas.vas.name.toUpperCase() == VAS.REPACKAGING && issue))) {
|
|
759
|
+
// await this.doOperationTransaction(targetVas)
|
|
760
|
+
// } /*else if (targetVas.operationGuide && targetVas.vas.name.toUpperCase() === VAS.REPACKAGING && issue) {
|
|
761
|
+
// await this.doOperationTransaction(targetVas)
|
|
762
|
+
// }*/
|
|
751
763
|
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
const parentInventory: Inventory = targetVas.inventory
|
|
755
|
-
let newParentInventory: Partial<Inventory> = Object.assign({}, parentInventory)
|
|
756
|
-
newParentInventory.qty = parentInventory.qty - targetVas.qty
|
|
757
|
-
newParentInventory.uomValue = Math.round((parentInventory.uomValue - targetVas.uomValue) * 100) / 100
|
|
758
|
-
newParentInventory.lockedQty = parentInventory.lockedQty - targetVas.qty
|
|
759
|
-
newParentInventory.lockedUomValue =
|
|
760
|
-
Math.round((parentInventory.lockedUomValue - targetVas.uomValue) * 100) / 100
|
|
761
|
-
|
|
762
|
-
// update qty and uomValue for VasOrder
|
|
763
|
-
// if refOrder is from ReleaseGood, no need to update because this trxn is consider similar to LOADING trxn
|
|
764
|
-
if (refOrder instanceof VasOrder) {
|
|
765
|
-
await this.transactionInventory(
|
|
766
|
-
newParentInventory,
|
|
767
|
-
refOrder,
|
|
768
|
-
-targetVas.qty,
|
|
769
|
-
-targetVas.uomValue,
|
|
770
|
-
INVENTORY_TRANSACTION_TYPE.UNPACKED
|
|
771
|
-
)
|
|
772
|
-
} else if (refOrder instanceof ReleaseGood) {
|
|
773
|
-
await generateInventoryHistory(
|
|
774
|
-
newParentInventory,
|
|
775
|
-
refOrder,
|
|
776
|
-
INVENTORY_TRANSACTION_TYPE.UNPACKED,
|
|
777
|
-
0,
|
|
778
|
-
0,
|
|
779
|
-
this.user,
|
|
780
|
-
this.trxMgr
|
|
781
|
-
)
|
|
764
|
+
if (targetVas.operationGuide && !issue) {
|
|
765
|
+
await this.doOperationTransaction(targetVas)
|
|
782
766
|
}
|
|
783
767
|
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
768
|
+
if (targetVas?.vas?.name.toUpperCase() === VAS.UNPACKING && !(refOrder instanceof ArrivalNotice)) {
|
|
769
|
+
// Update qty and uom value of parent inventory (only applies for pure vas and RO)
|
|
770
|
+
const parentInventory: Inventory = targetVas.inventory
|
|
771
|
+
let newParentInventory: Partial<Inventory> = Object.assign({}, parentInventory)
|
|
772
|
+
newParentInventory.qty = parentInventory.qty - targetVas.qty
|
|
773
|
+
newParentInventory.uomValue = Math.round((parentInventory.uomValue - targetVas.uomValue) * 100) / 100
|
|
774
|
+
newParentInventory.lockedQty = parentInventory.lockedQty - targetVas.qty
|
|
775
|
+
newParentInventory.lockedUomValue =
|
|
776
|
+
Math.round((parentInventory.lockedUomValue - targetVas.uomValue) * 100) / 100
|
|
777
|
+
|
|
778
|
+
// update qty and uomValue for VasOrder
|
|
779
|
+
// if refOrder is from ReleaseGood, no need to update because this trxn is consider similar to LOADING trxn
|
|
780
|
+
if (refOrder instanceof VasOrder) {
|
|
781
|
+
await this.transactionInventory(
|
|
782
|
+
newParentInventory,
|
|
783
|
+
refOrder,
|
|
784
|
+
-targetVas.qty,
|
|
785
|
+
-targetVas.uomValue,
|
|
786
|
+
INVENTORY_TRANSACTION_TYPE.UNPACKED
|
|
787
|
+
)
|
|
788
|
+
} else if (refOrder instanceof ReleaseGood) {
|
|
789
|
+
await generateInventoryHistory(
|
|
790
|
+
newParentInventory,
|
|
791
|
+
refOrder,
|
|
792
|
+
INVENTORY_TRANSACTION_TYPE.UNPACKED,
|
|
793
|
+
0,
|
|
794
|
+
0,
|
|
795
|
+
this.user,
|
|
796
|
+
this.trxMgr
|
|
797
|
+
)
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
// add TERMINATED status if inventory qty = 0
|
|
801
|
+
if (newParentInventory.qty === 0) {
|
|
802
|
+
newParentInventory.status = INVENTORY_STATUS.TERMINATED
|
|
803
|
+
await this.transactionInventory(newParentInventory, refOrder, 0, 0, INVENTORY_TRANSACTION_TYPE.TERMINATED)
|
|
804
|
+
}
|
|
788
805
|
}
|
|
789
806
|
}
|
|
790
807
|
}
|
|
@@ -812,7 +829,180 @@ export class VasWorksheetController extends WorksheetController {
|
|
|
812
829
|
? ORDER_STATUS.LOADING
|
|
813
830
|
: ORDER_STATUS.DONE
|
|
814
831
|
|
|
832
|
+
const releaseGood: ReleaseGood = await getRepository(ReleaseGood).findOne({
|
|
833
|
+
domain: domain.id,
|
|
834
|
+
name: orderNo
|
|
835
|
+
})
|
|
836
|
+
|
|
837
|
+
let qbOrderVas = await getRepository(OrderVas).createQueryBuilder('ov')
|
|
838
|
+
qbOrderVas
|
|
839
|
+
.leftJoinAndSelect(OrderInventory, 'oi', 'oi.release_good_id = ov.release_good_id')
|
|
840
|
+
.leftJoinAndSelect('ov.releaseGood', 'releaseGood')
|
|
841
|
+
.leftJoinAndSelect('ov.product', 'product')
|
|
842
|
+
.leftJoinAndSelect('ov.productDetail', 'productDetail')
|
|
843
|
+
.leftJoinAndSelect('ov.newProduct', 'newProduct')
|
|
844
|
+
.leftJoinAndSelect('ov.newProductDetail', 'newProductDetail')
|
|
845
|
+
.andWhere('ov.domain_id = :domain')
|
|
846
|
+
.andWhere('ov.release_good_id = :releaseGood')
|
|
847
|
+
.andWhere('ov.new_product_id notnull')
|
|
848
|
+
.andWhere('ov.new_product_detail_id notnull')
|
|
849
|
+
.setParameters({ domain: domain.id, releaseGood: releaseGood.id })
|
|
850
|
+
|
|
851
|
+
const orderVasWithNewSku: OrderVas[] = await qbOrderVas.getMany()
|
|
852
|
+
|
|
853
|
+
// .find({
|
|
854
|
+
// domain,
|
|
855
|
+
// releaseGood,
|
|
856
|
+
// newTargetProduct: Not(IsNull()),
|
|
857
|
+
// newTargetProductDetail: Not(IsNull())
|
|
858
|
+
// })
|
|
859
|
+
|
|
860
|
+
if (orderVasWithNewSku.length > 0) {
|
|
861
|
+
// const productId = orderVasWithNewSku.map(ov => {
|
|
862
|
+
// return ov.product.id
|
|
863
|
+
// })
|
|
864
|
+
|
|
865
|
+
let qbOrderInventories = await getRepository(OrderInventory)
|
|
866
|
+
.createQueryBuilder('oi')
|
|
867
|
+
.leftJoinAndSelect('oi.product', 'product')
|
|
868
|
+
.leftJoinAndSelect('oi.productDetail', 'productDetail')
|
|
869
|
+
.leftJoinAndSelect('oi.domain', 'domain')
|
|
870
|
+
.leftJoinAndSelect('oi.bizplace', 'bizplace')
|
|
871
|
+
.leftJoinAndSelect('oi.releaseGood', 'releaseGood')
|
|
872
|
+
.leftJoinAndSelect('oi.inventory', 'inventory')
|
|
873
|
+
.leftJoinAndSelect('oi.orderProduct', 'orderProduct')
|
|
874
|
+
.andWhere('oi.domain_id = :domain')
|
|
875
|
+
.andWhere('oi.product_id IN (:...productId)')
|
|
876
|
+
// .andWhere('inventory.batch_id IN (:...batchId)')
|
|
877
|
+
.andWhere('oi.release_good_id = :releaseGood')
|
|
878
|
+
.setParameters({
|
|
879
|
+
domain: domain.id,
|
|
880
|
+
productId: orderVasWithNewSku.map(ov => {
|
|
881
|
+
return ov.product.id
|
|
882
|
+
}),
|
|
883
|
+
// batchId: orderVasWithNewSku.map(ov => {
|
|
884
|
+
// return ov.batchId
|
|
885
|
+
// }),
|
|
886
|
+
releaseGood: releaseGood.id
|
|
887
|
+
})
|
|
888
|
+
|
|
889
|
+
let orderInventoryOrderVas: OrderInventory[] = await qbOrderInventories.getMany()
|
|
890
|
+
|
|
891
|
+
let updateOrderInventory: OrderInventory[] = []
|
|
892
|
+
|
|
893
|
+
let orderInventory: OrderInventory = {}
|
|
894
|
+
|
|
895
|
+
let saveOrderInventory: OrderInventory[] = []
|
|
896
|
+
|
|
897
|
+
// for saving oi
|
|
898
|
+
let newTargetInventory: OrderInventory = new OrderInventory()
|
|
899
|
+
|
|
900
|
+
let newOi: OrderInventory
|
|
901
|
+
// fix inventory
|
|
902
|
+
orderVasWithNewSku.forEach(ov => {
|
|
903
|
+
orderInventory = orderInventoryOrderVas.filter(oi => {
|
|
904
|
+
if (oi.product.id == ov.product.id && oi.releaseQty > 0 && oi.batchId == ov.batchId) {
|
|
905
|
+
if (oi.batchId == ov.batchId) {
|
|
906
|
+
return oi
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
})
|
|
910
|
+
let qtyVas: number = ov.qty
|
|
911
|
+
|
|
912
|
+
try {
|
|
913
|
+
for (let i = 0; qtyVas !== 0; i++) {
|
|
914
|
+
const oi = orderInventory[i]
|
|
915
|
+
//update old OI
|
|
916
|
+
const updatedReleaseQty: number = qtyVas <= oi.releaseQty ? oi.releaseQty - qtyVas : 0
|
|
917
|
+
const updatedReleaseUomValue: number = parseFloat(
|
|
918
|
+
(updatedReleaseQty * (oi.releaseUomValue / oi.releaseQty)).toFixed(2)
|
|
919
|
+
)
|
|
920
|
+
updateOrderInventory = {
|
|
921
|
+
...oi,
|
|
922
|
+
releaseQty: updatedReleaseQty,
|
|
923
|
+
pickedQty: oi.pickedQty,
|
|
924
|
+
status: updatedReleaseQty == 0 ? ORDER_INVENTORY_STATUS.TERMINATED : oi.status,
|
|
925
|
+
releaseUomValue: updatedReleaseUomValue,
|
|
926
|
+
updater: user,
|
|
927
|
+
updatedAt: new Date()
|
|
928
|
+
// cuFlag: 'M'
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
saveOrderInventory.push(updateOrderInventory)
|
|
932
|
+
|
|
933
|
+
// Duplicate oi for newSKU =
|
|
934
|
+
// new OrderInventory()
|
|
935
|
+
const newOiReleaseQty: number = qtyVas <= oi.releaseQty ? qtyVas : oi.releaseQty
|
|
936
|
+
//can delete
|
|
937
|
+
// const newOiReleaseUomValue: number = parseFloat((newOiReleaseQty * (ov.newUomValue / ov.qty)).toFixed(2))
|
|
938
|
+
|
|
939
|
+
newOi = {
|
|
940
|
+
...oi,
|
|
941
|
+
id: uuidv4(),
|
|
942
|
+
name: uuidv4(),
|
|
943
|
+
// domain: orderInventory.domain,
|
|
944
|
+
// bizplace: orderInventory.bizplace,
|
|
945
|
+
// releaseGood: orderInventory.releaseGood,
|
|
946
|
+
// inventory: orderInventory.inventory,
|
|
947
|
+
orderProduct: null,
|
|
948
|
+
// status: orderInventory.status, // can remove
|
|
949
|
+
batchId: newOi ? `${newOi.batchId} , ${oi.batchId}` : oi.batchId,
|
|
950
|
+
type: ORDER_TYPES.VAS_ORDER,
|
|
951
|
+
status: ORDER_INVENTORY_STATUS.LOADING,
|
|
952
|
+
releaseQty: ov.outputQty,
|
|
953
|
+
pickedQty: 0,
|
|
954
|
+
packingType: ov.newPackingType,
|
|
955
|
+
packingSize: ov.newProductDetail.packingSize,
|
|
956
|
+
uom: ov.newUom,
|
|
957
|
+
releaseUomValue: ov.newUomValue,
|
|
958
|
+
product: ov.newProduct,
|
|
959
|
+
productId: ov.newProduct.id,
|
|
960
|
+
productDetail: ov.newProductDetail,
|
|
961
|
+
creator: user,
|
|
962
|
+
updater: user,
|
|
963
|
+
createdAt: new Date(),
|
|
964
|
+
updatedAt: new Date()
|
|
965
|
+
// cuFlag: '+'
|
|
966
|
+
}
|
|
967
|
+
qtyVas = qtyVas - newOiReleaseQty
|
|
968
|
+
newTargetInventory = newOi
|
|
969
|
+
}
|
|
970
|
+
saveOrderInventory.push(newTargetInventory)
|
|
971
|
+
} catch (e) {
|
|
972
|
+
console.log(e)
|
|
973
|
+
}
|
|
974
|
+
})
|
|
975
|
+
await tx.getRepository(OrderInventory).save(saveOrderInventory)
|
|
976
|
+
// await tx.getRepository(OrderInventory).save(updateOrderInventory)
|
|
977
|
+
// .update({ id: orderInventory.id }, updateOrderInventory)
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
let orderInventories: OrderInventory[] = await tx.getRepository(OrderInventory).find({
|
|
981
|
+
where: { domain: domain.id, releaseGood: releaseGood.id, status: Not(In([ORDER_INVENTORY_STATUS.TERMINATED])) }
|
|
982
|
+
// relations: ['product', 'productDetail', 'domain', 'bizplace', 'releaseGood', 'inventory', 'orderProduct']
|
|
983
|
+
})
|
|
984
|
+
|
|
985
|
+
// complete VAS worksheet
|
|
815
986
|
worksheet = await this.completeWorksheet(worksheet, orderStatus)
|
|
987
|
+
|
|
988
|
+
//generate and activate loading worksheet
|
|
989
|
+
if (releaseGood) {
|
|
990
|
+
const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
|
|
991
|
+
let loadingWorksheet = await this.generateWorksheet(
|
|
992
|
+
WORKSHEET_TYPE.LOADING,
|
|
993
|
+
releaseGood,
|
|
994
|
+
orderInventories,
|
|
995
|
+
ORDER_STATUS.LOADING,
|
|
996
|
+
ORDER_INVENTORY_STATUS.LOADING
|
|
997
|
+
)
|
|
998
|
+
const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
|
|
999
|
+
await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
|
|
1000
|
+
// here
|
|
1001
|
+
// const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
|
|
1002
|
+
// const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
|
|
1003
|
+
// await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
|
|
1004
|
+
}
|
|
1005
|
+
|
|
816
1006
|
return worksheet
|
|
817
1007
|
}
|
|
818
1008
|
|
|
@@ -416,7 +416,7 @@ export class WorksheetController {
|
|
|
416
416
|
let existingWorksheet: Worksheet
|
|
417
417
|
try {
|
|
418
418
|
existingWorksheet = await this.findWorksheetByRefOrder(refOrder, type)
|
|
419
|
-
} catch (e) {
|
|
419
|
+
} catch (e) {}
|
|
420
420
|
|
|
421
421
|
if (existingWorksheet)
|
|
422
422
|
throw new Error(
|
|
@@ -821,15 +821,26 @@ export class WorksheetController {
|
|
|
821
821
|
worksheetType === WORKSHEET_TYPE.PICKING_REPLENISHMENT ||
|
|
822
822
|
worksheetType === WORKSHEET_TYPE.PUTAWAY_REPLENISHMENT
|
|
823
823
|
) {
|
|
824
|
-
let targetInventories: OrderInventory[] =
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
824
|
+
let targetInventories: OrderInventory[] = []
|
|
825
|
+
if (updatedRefOrderStatus == 'VAS') {
|
|
826
|
+
targetInventories = worksheet.worksheetDetails
|
|
827
|
+
.filter((wsd: WorksheetDetail) => wsd.status !== ORDER_INVENTORY_STATUS.REPLACED)
|
|
828
|
+
.map((wsd: WorksheetDetail) => {
|
|
829
|
+
let targetInventory: OrderInventory = wsd.targetInventory
|
|
830
|
+
targetInventory.status = updatedRefOrderStatus
|
|
831
|
+
targetInventory.updater = this.user
|
|
832
|
+
return targetInventory
|
|
833
|
+
})
|
|
834
|
+
} else {
|
|
835
|
+
targetInventories = worksheet.worksheetDetails
|
|
836
|
+
.filter((wsd: WorksheetDetail) => wsd.status !== ORDER_INVENTORY_STATUS.REPLACED)
|
|
837
|
+
.map((wsd: WorksheetDetail) => {
|
|
838
|
+
let targetInventory: OrderInventory = wsd.targetInventory
|
|
839
|
+
targetInventory.status = ORDER_INVENTORY_STATUS.TERMINATED
|
|
840
|
+
targetInventory.updater = this.user
|
|
841
|
+
return targetInventory
|
|
842
|
+
})
|
|
843
|
+
}
|
|
833
844
|
await this.updateOrderTargets(targetInventories)
|
|
834
845
|
}
|
|
835
846
|
|
|
@@ -16,10 +16,8 @@ export const loadingResolver = {
|
|
|
16
16
|
{ domain, name: releaseGoodNo },
|
|
17
17
|
['bizplace', 'deliverTo']
|
|
18
18
|
)
|
|
19
|
-
|
|
20
19
|
const loadingWorksheetController: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
|
|
21
20
|
let targetInventories: OrderInventory[] = worksheetDetails.map(itm => itm.targetInventory)
|
|
22
|
-
|
|
23
21
|
const bizplace: Bizplace = releaseGood.bizplace
|
|
24
22
|
orderInfo = {
|
|
25
23
|
...orderInfo,
|
|
@@ -5,9 +5,9 @@ import { EntityManager } from 'typeorm'
|
|
|
5
5
|
import { LoadingWorksheetController } from '../../../../controllers'
|
|
6
6
|
|
|
7
7
|
export const undoLoadingResolver = {
|
|
8
|
-
async undoLoading(_: any, { deliveryOrder, palletIds }, context: any) {
|
|
8
|
+
async undoLoading(_: any, { deliveryOrder, palletIds, productIds }, context: any) {
|
|
9
9
|
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
10
|
-
await undoLoading(tx, domain, user, deliveryOrder, palletIds)
|
|
10
|
+
await undoLoading(tx, domain, user, deliveryOrder, palletIds, productIds)
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
|
|
@@ -16,8 +16,9 @@ export async function undoLoading(
|
|
|
16
16
|
domain: Domain,
|
|
17
17
|
user: User,
|
|
18
18
|
deliveryOrder: Partial<DeliveryOrder>,
|
|
19
|
-
palletIds: string[]
|
|
19
|
+
palletIds: string[],
|
|
20
|
+
productIds: string[]
|
|
20
21
|
): Promise<void> {
|
|
21
22
|
const worksheetController: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
|
|
22
|
-
await worksheetController.undoLoading(deliveryOrder, palletIds)
|
|
23
|
+
await worksheetController.undoLoading(deliveryOrder, palletIds, productIds)
|
|
23
24
|
}
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
OrderInventory,
|
|
7
7
|
ReleaseGood,
|
|
8
8
|
OrderTote,
|
|
9
|
+
OrderVas,
|
|
9
10
|
OrderToteItem
|
|
10
11
|
} from '@things-factory/sales-base'
|
|
11
12
|
import { Domain } from '@things-factory/shell'
|
|
@@ -70,6 +71,7 @@ export const loadingWorksheetResolver = {
|
|
|
70
71
|
},
|
|
71
72
|
relations: [
|
|
72
73
|
'targetInventory',
|
|
74
|
+
'targetInventory.product',
|
|
73
75
|
'targetInventory.orderProduct',
|
|
74
76
|
'targetInventory.inventory',
|
|
75
77
|
'targetInventory.inventory.location',
|
|
@@ -111,6 +113,20 @@ export const loadingWorksheetResolver = {
|
|
|
111
113
|
foundWSD.sort((a, b) => (a.toteName > b.toteName ? 1 : -1))
|
|
112
114
|
}
|
|
113
115
|
|
|
116
|
+
let foundOV: OrderVas[] = await getRepository(OrderVas).find({
|
|
117
|
+
where: {
|
|
118
|
+
domain,
|
|
119
|
+
releaseGood: releaseGood,
|
|
120
|
+
status: Not(Equal(WORKSHEET_STATUS.DONE))
|
|
121
|
+
},
|
|
122
|
+
relations: ['newProduct', 'product', 'newProductDetail']
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
if (foundOV.length > 0) {
|
|
126
|
+
foundWSD = await insertVas(foundWSD, foundOV)
|
|
127
|
+
// foundWSD = await formatLoadingDataVas(foundWSD)
|
|
128
|
+
}
|
|
129
|
+
|
|
114
130
|
let worksheetDetailInfos = foundWSD
|
|
115
131
|
.filter(itm => itm.targetInventory.releaseQty > 0)
|
|
116
132
|
.map((loadingWSD: any) => {
|
|
@@ -121,7 +137,8 @@ export const loadingWorksheetResolver = {
|
|
|
121
137
|
palletId: inventory.palletId,
|
|
122
138
|
batchId: inventory.batchId,
|
|
123
139
|
batchIdRef: inventory.batchIdRef,
|
|
124
|
-
product:
|
|
140
|
+
product: targetInventory.product,
|
|
141
|
+
pickedQty: targetInventory.pickedQty,
|
|
125
142
|
releaseQty: targetInventory.releaseQty,
|
|
126
143
|
releaseUomValue: targetInventory.releaseUomValue,
|
|
127
144
|
status: loadingWSD.status,
|
|
@@ -130,7 +147,8 @@ export const loadingWorksheetResolver = {
|
|
|
130
147
|
packingType: inventory.packingType,
|
|
131
148
|
packingSize: inventory.packingSize,
|
|
132
149
|
inventory: targetInventory.inventory,
|
|
133
|
-
toteName: loadingWSD.toteName
|
|
150
|
+
toteName: loadingWSD.toteName,
|
|
151
|
+
targetVas: loadingWSD.targetVas
|
|
134
152
|
}
|
|
135
153
|
})
|
|
136
154
|
|
|
@@ -146,3 +164,51 @@ export const loadingWorksheetResolver = {
|
|
|
146
164
|
}
|
|
147
165
|
}
|
|
148
166
|
}
|
|
167
|
+
|
|
168
|
+
export async function insertVas(wsd, ov) {
|
|
169
|
+
wsd = wsd.map(wd => {
|
|
170
|
+
for (let i = 0; i < ov.length; i++) {
|
|
171
|
+
// if (ov[i].newTargetProduct) {
|
|
172
|
+
if (wd.targetInventory.productId == ov[i].product.id && wd.targetInventory.batchId == ov[i].batchId) {
|
|
173
|
+
wd.targetVas = ov[i]
|
|
174
|
+
}
|
|
175
|
+
// }
|
|
176
|
+
}
|
|
177
|
+
return wd
|
|
178
|
+
})
|
|
179
|
+
return wsd
|
|
180
|
+
// }
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// export async function formatLoadingDataVas(wsd) {
|
|
184
|
+
// let formattedData: WorksheetDetail[] = []
|
|
185
|
+
// formattedData = wsd.map(wd => {
|
|
186
|
+
// if (wd.targetVas) {
|
|
187
|
+
// if (wd.targetVas.newTargetProduct) {
|
|
188
|
+
// const newQty = wd.targetInventory.releaseQty - wd.targetVas.qty
|
|
189
|
+
// wd.targetInventory.releaseQty = newQty
|
|
190
|
+
// wd.targetInventory.pickedQty = newQty
|
|
191
|
+
// const newSku: WorksheetDetail = {
|
|
192
|
+
// ...wd,
|
|
193
|
+
// targetVas: null,
|
|
194
|
+
// targetInventory: {
|
|
195
|
+
// ...wd.targetInventory,
|
|
196
|
+
// releaseQty: wd.targetVas.outputQty,
|
|
197
|
+
// pickedQty: wd.targetVas.outputQty,
|
|
198
|
+
// inventory: { ...wd.targetInventory.inventory, product: wd.targetVas.newTargetProduct }
|
|
199
|
+
// }
|
|
200
|
+
// }
|
|
201
|
+
// wsd.push(newSku)
|
|
202
|
+
// }
|
|
203
|
+
// }
|
|
204
|
+
// return wd
|
|
205
|
+
// })
|
|
206
|
+
|
|
207
|
+
// formattedData = wsd.splice(wd => wd.targetInventory.pickedQty == 0)
|
|
208
|
+
|
|
209
|
+
// // formattedData = formattedData.sort((a, b) =>
|
|
210
|
+
// // a.targetInventory.inventory.batchId > b ? 1 : a.targetVas && !b.targetVas ? -1 : a.targetVas && !b.targetVas ? 1 : 0
|
|
211
|
+
// // )
|
|
212
|
+
|
|
213
|
+
// return formattedData
|
|
214
|
+
// }
|
|
@@ -43,7 +43,7 @@ export async function packing(
|
|
|
43
43
|
break
|
|
44
44
|
|
|
45
45
|
case ApplicationType.POWRUP:
|
|
46
|
-
const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true })
|
|
46
|
+
const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true, platform: 'POWRUP' })
|
|
47
47
|
|
|
48
48
|
if (powrup) {
|
|
49
49
|
const powrupCtrl: PowrupController = new PowrupController(tx, domain, user)
|
|
@@ -212,7 +212,7 @@ export const packingWorksheetResolver = {
|
|
|
212
212
|
break
|
|
213
213
|
|
|
214
214
|
case ApplicationType.POWRUP:
|
|
215
|
-
const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true })
|
|
215
|
+
const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true, platform: 'POWRUP' })
|
|
216
216
|
|
|
217
217
|
if (powrup) {
|
|
218
218
|
// asynchronously get document from powrup
|
|
@@ -134,7 +134,7 @@ export async function completeBatchPicking(
|
|
|
134
134
|
break
|
|
135
135
|
|
|
136
136
|
case ApplicationType.POWRUP:
|
|
137
|
-
const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true })
|
|
137
|
+
const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true, platform: 'POWRUP' })
|
|
138
138
|
|
|
139
139
|
if (powrup) {
|
|
140
140
|
const initPowrupShipment = async (powrup: Powrup, foundReleaseGood: ReleaseGood) => {
|
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
OrderPackage,
|
|
24
24
|
OrderPackageItem,
|
|
25
25
|
OrderProduct,
|
|
26
|
+
OrderVas,
|
|
26
27
|
ReleaseGood,
|
|
27
28
|
Replenishment
|
|
28
29
|
} from '@things-factory/sales-base'
|
|
@@ -43,6 +44,7 @@ import { EcommerceController } from '../../../../controllers/ecommerce'
|
|
|
43
44
|
import { WorksheetController } from '../../../../controllers/worksheet-controller'
|
|
44
45
|
import { Worksheet, WorksheetDetail } from '../../../../entities'
|
|
45
46
|
import { createLmdParcel } from '../../../../utils'
|
|
47
|
+
import { activateVas } from '../vas/activate-vas'
|
|
46
48
|
|
|
47
49
|
export const completePickingResolver = {
|
|
48
50
|
async completePicking(_: any, { releaseGoodNo }, context: any) {
|
|
@@ -156,7 +158,7 @@ export async function completePicking(
|
|
|
156
158
|
break
|
|
157
159
|
|
|
158
160
|
case ApplicationType.POWRUP:
|
|
159
|
-
const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true })
|
|
161
|
+
const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true, platform: 'POWRUP' })
|
|
160
162
|
|
|
161
163
|
if (powrup) {
|
|
162
164
|
const initPowrupShipment = async powrup => {
|
|
@@ -400,8 +402,25 @@ export async function completePicking(
|
|
|
400
402
|
}
|
|
401
403
|
})
|
|
402
404
|
|
|
405
|
+
let orderVas: OrderVas[] = await tx.getRepository(OrderVas).find({ where: { domain: domain, releaseGood } })
|
|
406
|
+
if (orderVas) {
|
|
407
|
+
try {
|
|
408
|
+
const vasWorksheet: Worksheet = await tx
|
|
409
|
+
.getRepository(Worksheet)
|
|
410
|
+
.findOne({ where: { releaseGood, type: WORKSHEET_TYPE.VAS } })
|
|
411
|
+
|
|
412
|
+
const vasWorksheetDetails: WorksheetDetail[] = await tx
|
|
413
|
+
.getRepository(WorksheetDetail)
|
|
414
|
+
.find({ where: { domain: domain, worksheet: vasWorksheet.id } })
|
|
415
|
+
|
|
416
|
+
if (vasWorksheet) {
|
|
417
|
+
await activateVas(tx, domain, user, vasWorksheet.name, vasWorksheetDetails)
|
|
418
|
+
}
|
|
419
|
+
} catch (e) { }
|
|
420
|
+
}
|
|
421
|
+
// Can improve by applying "Else" since if got VAS user has to complete then only we generate loading worksheet
|
|
403
422
|
if (!existLoadingWorksheet && !releaseGood.courierOption && !releaseGood.packingOption) {
|
|
404
|
-
if (pickedTargetInventories.length > 0) {
|
|
423
|
+
if (pickedTargetInventories.length > 0 && orderVas.length == 0) {
|
|
405
424
|
const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
|
|
406
425
|
let loadingWorksheet: Worksheet = await loadingWSCtrl.generateLoadingWorksheet(
|
|
407
426
|
releaseGoodNo,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { User } from '@things-factory/auth-base'
|
|
2
2
|
import { ArrivalNotice, ReleaseGood } from '@things-factory/sales-base'
|
|
3
3
|
import { Domain } from '@things-factory/shell'
|
|
4
|
-
import { EntityManager } from 'typeorm'
|
|
4
|
+
import { EntityManager, getRepository, In } from 'typeorm'
|
|
5
5
|
import { WORKSHEET_TYPE } from '../../../../constants'
|
|
6
6
|
import { LoadingWorksheetController, PutawayWorksheetController, VasWorksheetController } from '../../../../controllers'
|
|
7
7
|
import { Worksheet, WorksheetDetail } from '../../../../entities'
|
|
@@ -9,6 +9,24 @@ import { Worksheet, WorksheetDetail } from '../../../../entities'
|
|
|
9
9
|
export const completeVasResolver = {
|
|
10
10
|
async completeVas(_: any, { orderNo, orderType, worksheetDetails }, context: any) {
|
|
11
11
|
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
12
|
+
if (!worksheetDetails) {
|
|
13
|
+
const releaseGood: ReleaseGood = await getRepository(ReleaseGood).findOne({
|
|
14
|
+
domain: domain.id,
|
|
15
|
+
name: orderNo
|
|
16
|
+
})
|
|
17
|
+
const worksheet: Worksheet[] = await getRepository(Worksheet).find({
|
|
18
|
+
domain: domain.id,
|
|
19
|
+
releaseGood: releaseGood.id,
|
|
20
|
+
type: WORKSHEET_TYPE.VAS
|
|
21
|
+
})
|
|
22
|
+
const worksheetId = worksheet.map(w => {
|
|
23
|
+
return w.id
|
|
24
|
+
})
|
|
25
|
+
worksheetDetails = await getRepository(WorksheetDetail).find({
|
|
26
|
+
domain: domain.id,
|
|
27
|
+
worksheet: In(worksheetId)
|
|
28
|
+
})
|
|
29
|
+
}
|
|
12
30
|
await completeVAS(tx, domain, user, orderNo, orderType, worksheetDetails)
|
|
13
31
|
}
|
|
14
32
|
}
|
|
@@ -22,7 +40,14 @@ export async function completeVAS(
|
|
|
22
40
|
worksheetDetails: WorksheetDetail[]
|
|
23
41
|
): Promise<Worksheet> {
|
|
24
42
|
const worksheetController: VasWorksheetController = new VasWorksheetController(tx, domain, user)
|
|
25
|
-
let worksheet: Worksheet = await worksheetController.completeVAS(
|
|
43
|
+
let worksheet: Worksheet = await worksheetController.completeVAS(
|
|
44
|
+
tx,
|
|
45
|
+
domain,
|
|
46
|
+
user,
|
|
47
|
+
orderNo,
|
|
48
|
+
orderType,
|
|
49
|
+
worksheetDetails
|
|
50
|
+
)
|
|
26
51
|
|
|
27
52
|
// if (orderType === ORDER_TYPES.ARRIVAL_NOTICE) {
|
|
28
53
|
// if (!worksheet.worksheetDetails?.length || !worksheet.arrivalNotice?.id) {
|