@things-factory/operato-hub 4.3.366 → 4.3.368

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/dist-server/routers/api/restful-apis/v1/company/index.js +1 -0
  2. package/dist-server/routers/api/restful-apis/v1/company/index.js.map +1 -1
  3. package/dist-server/routers/api/restful-apis/v1/company/upsert-product.js +227 -0
  4. package/dist-server/routers/api/restful-apis/v1/company/upsert-product.js.map +1 -0
  5. package/dist-server/routers/api/restful-apis/v1/utils/params.js +81 -1
  6. package/dist-server/routers/api/restful-apis/v1/utils/params.js.map +1 -1
  7. package/dist-server/routers/api/restful-apis/v1/warehouse/dispatch-delivery-order.js +17 -16
  8. package/dist-server/routers/api/restful-apis/v1/warehouse/dispatch-delivery-order.js.map +1 -1
  9. package/dist-server/routers/api/restful-apis/v1/warehouse/get-manifest-details.js +138 -0
  10. package/dist-server/routers/api/restful-apis/v1/warehouse/get-manifest-details.js.map +1 -0
  11. package/dist-server/routers/api/restful-apis/v1/warehouse/get-onhand-inventory-list.js +2 -0
  12. package/dist-server/routers/api/restful-apis/v1/warehouse/get-onhand-inventory-list.js.map +1 -1
  13. package/dist-server/routers/api/restful-apis/v1/warehouse/index.js +1 -0
  14. package/dist-server/routers/api/restful-apis/v1/warehouse/index.js.map +1 -1
  15. package/package.json +14 -14
  16. package/server/routers/api/restful-apis/v1/company/index.ts +1 -0
  17. package/server/routers/api/restful-apis/v1/company/upsert-product.ts +322 -0
  18. package/server/routers/api/restful-apis/v1/utils/params.ts +81 -1
  19. package/server/routers/api/restful-apis/v1/warehouse/dispatch-delivery-order.ts +10 -10
  20. package/server/routers/api/restful-apis/v1/warehouse/get-manifest-details.ts +140 -0
  21. package/server/routers/api/restful-apis/v1/warehouse/get-onhand-inventory-list.ts +2 -0
  22. package/server/routers/api/restful-apis/v1/warehouse/index.ts +1 -0
@@ -25,6 +25,7 @@ export const params = {
25
25
  'get-delivery-order-list': ['bizplaceId', 'doNo', 'vehicleNo', ...fromToDate, ...limitOffset],
26
26
  'get-onhand-inventory-list': ['bizplaceId', 'sku', 'batchId', 'fromDate', 'toDate', ...limitOffset],
27
27
  'get-inventory-product-group-list': ['bizplaceId', 'sku', 'batchId', ...fromToDate, ...limitOffset],
28
+ 'get-manifest-details': ['bizplaceId', 'name', 'id'],
28
29
  'add-contact-points': [
29
30
  'bizplaceId',
30
31
  'name',
@@ -425,7 +426,55 @@ export const params = {
425
426
  ],
426
427
  'complete-delivery-order': ['remark', 'bizplaceId', 'name'],
427
428
  'update-gan-to-arrived': ['ganNo', 'bizplaceId'],
428
- 'get-warehouse-bizplace-onhand-inventories': ['bizplaceId']
429
+ 'get-warehouse-bizplace-onhand-inventories': ['bizplaceId'],
430
+ 'upsert-product': [
431
+ 'sku',
432
+ 'brandSku',
433
+ 'name',
434
+ 'description',
435
+ 'type',
436
+ 'brand',
437
+ 'subBrand',
438
+ 'isRequiredCheckExpiry',
439
+ 'isRequireSerialNumberScanning',
440
+ 'isRequireSerialNumberScanningInbound',
441
+ 'isRequireSerialNumberScanningOutbound',
442
+ 'pickingStrategy',
443
+ 'minInboundShelfLife',
444
+ 'productDetails',
445
+ 'productDetails.isDefault',
446
+ 'productDetails.gtin',
447
+ 'productDetails.refCode',
448
+ 'productDetails.packingType',
449
+ 'productDetails.packingSize',
450
+ 'productDetails.uom',
451
+ 'productDetails.uomValue',
452
+ 'productDetails.costPrice',
453
+ 'productDetails.minQty',
454
+ 'productDetails.maxQty',
455
+ 'productDetails.bufferQty',
456
+ 'productDetails.weightUnit',
457
+ 'productDetails.movement',
458
+ 'productDetails.nettWeight',
459
+ 'productDetails.grossWeight',
460
+ 'productDetails.lengthUnit',
461
+ 'productDetails.width',
462
+ 'productDetails.depth',
463
+ 'productDetails.height',
464
+ 'productDetails.volume',
465
+ 'productDetails.auxUnit1',
466
+ 'productDetails.auxValue1',
467
+ 'productDetails.auxUnit2',
468
+ 'productDetails.auxValue2',
469
+ 'productDetails.auxUnit3',
470
+ 'productDetails.auxValue3',
471
+ 'productDetails.auxUnit4',
472
+ 'productDetails.auxValue4',
473
+ 'productDetails.auxUnit5',
474
+ 'productDetails.auxValue5',
475
+ 'productDetails.childProductDetail',
476
+ 'productDetails.productBarcodes.gtin'
477
+ ]
429
478
  }
430
479
 
431
480
  // Required Params
@@ -442,7 +491,38 @@ export const reqParams = {
442
491
  'get-delivery-order-list': ['bizplaceId'],
443
492
  'get-onhand-inventory-list': ['bizplaceId'],
444
493
  'get-inventory-product-group-list': ['bizplaceId'],
494
+ 'get-manifest-details': ['bizplaceId'],
445
495
  'get-warehouse-bizplace-onhand-inventories': ['bizplaceId'],
496
+ 'upsert-product': [
497
+ {
498
+ name: 'sku',
499
+ required: true,
500
+ type: 'field'
501
+ },
502
+ {
503
+ name: 'name',
504
+ required: true,
505
+ type: 'field'
506
+ },
507
+ {
508
+ name: 'type',
509
+ required: true,
510
+ type: 'field'
511
+ },
512
+ {
513
+ name: 'productDetails',
514
+ required: true,
515
+ type: 'array',
516
+ data: [
517
+ { name: 'isDefault', required: true, type: 'field' },
518
+ { name: 'gtin', required: true, type: 'field' },
519
+ { name: 'packingType', required: true, type: 'field' },
520
+ { name: 'packingSize', required: true, type: 'field' },
521
+ { name: 'uom', required: true, type: 'field' },
522
+ { name: 'uomValue', required: true, type: 'field' }
523
+ ]
524
+ }
525
+ ],
446
526
  'add-contact-points': [
447
527
  {
448
528
  name: 'name',
@@ -61,11 +61,7 @@ router.post(
61
61
  }
62
62
 
63
63
  // Drive and Vehicle Validation
64
- if (
65
- !data.transportDriver?.name ||
66
- !data.transportDriver ||
67
- (!data.transportDriver?.driverCode && !ownTransport)
68
- ) {
64
+ if (!data.transportDriver?.name || !data.transportDriver) {
69
65
  throw new ApiError('E03', 'transportDriver')
70
66
  } else if (!data.transportVehicle?.name || !data.transportVehicle) {
71
67
  throw new ApiError('E03', 'transportVehicle')
@@ -76,12 +72,16 @@ router.post(
76
72
  transportVehicle = { name: data.transportVehicle?.name }
77
73
  } else {
78
74
  // find transportDriver & transportVehicle
75
+ let transportDriverFilter: any = {
76
+ domain: domain,
77
+ name: data?.transportDriver?.name
78
+ }
79
+
80
+ if (data?.transportDriver?.driverCode) {
81
+ transportDriverFilter.driverCode = data.transportDriver.driverCode
82
+ }
79
83
  const foundTransportDriver: TransportDriver = await tx.getRepository(TransportDriver).findOne({
80
- where: {
81
- domain: domain,
82
- name: data.transportDriver?.name,
83
- driverCode: data.transportDriver?.driverCode
84
- }
84
+ where: transportDriverFilter
85
85
  })
86
86
 
87
87
  const foundTransportVehicle: TransportVehicle = await tx.getRepository(TransportVehicle).findOne({
@@ -0,0 +1,140 @@
1
+ import _ from 'lodash'
2
+ import { getRepository, SelectQueryBuilder } from 'typeorm'
3
+
4
+ import { restfulApiRouter as router } from '@things-factory/api'
5
+ import { Manifest } from '@things-factory/sales-base'
6
+
7
+ // import { OrderPackage } from '@things-factory/sales-base'
8
+ import { businessMiddleware, loggingMiddleware, validationMiddleware } from '../middlewares'
9
+ import { ApiError, ApiErrorHandler, throwInternalServerError } from '../utils/error-util'
10
+
11
+ router.get(
12
+ '/v1/warehouse/get-manifest-details',
13
+ businessMiddleware,
14
+ validationMiddleware,
15
+ loggingMiddleware,
16
+ async (context, next) => {
17
+ try {
18
+ // get contact points for that bizplace
19
+ // optional query parameter filter
20
+ let filter = { ...context.query }
21
+ const { fromDate, toDate, offset, limit } = filter
22
+
23
+ if (_.has(filter, 'id')) {
24
+ filter['id'] = filter['id']
25
+ delete filter['name']
26
+ } else if (_.has(filter, 'name')) {
27
+ filter['name'] = filter['name']
28
+ delete filter['id']
29
+ } else {
30
+ throw new ApiError('E03', 'id or name')
31
+ }
32
+
33
+ const rb: SelectQueryBuilder<Manifest> = getRepository(Manifest)
34
+ .createQueryBuilder('mf')
35
+ .innerJoinAndSelect('mf.orderPackages', 'op')
36
+ .innerJoinAndSelect('op.releaseGood', 'rg')
37
+ .innerJoinAndSelect('op.bizplace', 'bz')
38
+ .innerJoinAndSelect('op.orderPackageItems', 'opi')
39
+ .innerJoinAndSelect('opi.orderProduct', 'opr')
40
+ .innerJoinAndSelect('opr.productDetail', 'pd')
41
+ .innerJoinAndSelect('pd.product', 'p')
42
+ .where(`op.bizplace_id = :bizplaceId`, { bizplaceId: filter.bizplaceId })
43
+
44
+ if (filter.id) {
45
+ rb.andWhere(`mf.id = :id`, { id: filter.id })
46
+ } else if (filter.name) {
47
+ rb.andWhere(`mf.name = :name`, { name: filter.name })
48
+ }
49
+
50
+ const result = await rb.getOne()
51
+
52
+ let data
53
+ if (result) {
54
+ data = {
55
+ id: result.id,
56
+ name: result.name,
57
+ dispatchedAt: result.dispatchedAt,
58
+ dispatcherIdentity: result.dispatcherIdentity,
59
+ dispatcherName: result.dispatcherName,
60
+ shippingProvider: result.shippingProvider,
61
+ totalOrderPackages: result.orderPackages.length,
62
+ orderPackages: result.orderPackages.map(op => {
63
+ return {
64
+ airwayBill: op.airwayBill,
65
+ dispatchmentStatus: op.dispatchmentStatus,
66
+ id: op.id,
67
+ lastMileDeliveryId: op.lastMileDeliveryId,
68
+ lmdOption: op.lmdOption,
69
+ manifestId: op.manifestId,
70
+ manifestedAt: op.manifestedAt,
71
+ name: op.name,
72
+ packageId: op.packageId,
73
+ parcelId: op.parcelId,
74
+ status: op.status,
75
+ trackingNo: op.trackingNo,
76
+ transporter: op.transporter,
77
+ orderPackageItems: op.orderPackageItems.map(opi => {
78
+ return {
79
+ name: opi.name,
80
+ id: opi.id,
81
+ packedQty: opi.packedQty,
82
+ releaseQty: opi.releaseQty,
83
+ orderProduct: {
84
+ packingSize: opi.orderProduct.packingSize,
85
+ packingType: opi.orderProduct.packingType,
86
+ releaseQty: opi.orderProduct.releaseQty,
87
+ releaseUomValue: opi.orderProduct.releaseUomValue,
88
+ uom: opi.orderProduct.uom,
89
+ uomValue: opi.orderProduct.uomValue,
90
+ packedQty: opi.orderProduct.packedQty,
91
+ productDetail: {
92
+ id: opi.orderProduct.productDetail.id,
93
+ name: opi.orderProduct.productDetail.name,
94
+ grossWeight: opi.orderProduct.productDetail.grossWeight,
95
+ nettWeight: opi.orderProduct.productDetail.nettWeight,
96
+ weightUnit: opi.orderProduct.productDetail.weightUnit,
97
+ uom: opi.orderProduct.productDetail.uom,
98
+ uomValue: opi.orderProduct.productDetail.uomValue,
99
+ packingSize: opi.orderProduct.productDetail.packingSize,
100
+ packingType: opi.orderProduct.productDetail.packingType,
101
+ product: {
102
+ id: opi.orderProduct.productDetail.product.id,
103
+ name: opi.orderProduct.productDetail.product.name,
104
+ sku: opi.orderProduct.productDetail.product.sku,
105
+ weight: opi.orderProduct.productDetail.product.weight,
106
+ weightUnit: opi.orderProduct.productDetail.product.weightUnit
107
+ }
108
+ }
109
+ }
110
+ }
111
+ }),
112
+ releaseGood: {
113
+ id: op.releaseGood.id,
114
+ name: op.releaseGood.name,
115
+ refNo: op.releaseGood.refNo,
116
+ refNo2: op.releaseGood.refNo2,
117
+ refNo3: op.releaseGood.refNo3,
118
+ shippingFee: op.releaseGood.shippingFee,
119
+ transporter: op.releaseGood.transporter
120
+ },
121
+ bizplace: {
122
+ id: op.bizplace.id,
123
+ name: op.bizplace.name
124
+ }
125
+ }
126
+ })
127
+ }
128
+ } else {
129
+ data = {}
130
+ }
131
+
132
+ context.body = {
133
+ data
134
+ }
135
+ } catch (e) {
136
+ if (e instanceof ApiError) ApiErrorHandler(context, e)
137
+ else throwInternalServerError(context, e)
138
+ }
139
+ }
140
+ )
@@ -73,6 +73,8 @@ router.get(
73
73
  packingType: inventory.packingType,
74
74
  packingSize: inventory.packingSize,
75
75
  qty: inventory.qty,
76
+ uom: inventory.uom,
77
+ uomValue: inventory.uomValue,
76
78
  reservedQty: inventory.lockedQty,
77
79
  expirationDate: inventory.expirationDate,
78
80
  weight: inventory.product.weight
@@ -18,3 +18,4 @@ import './get-do-document'
18
18
  import './dispatch-delivery-order'
19
19
  import './update-gan-to-arrived'
20
20
  import './complete-delivery-order'
21
+ import './get-manifest-details'