@things-factory/worksheet-base 5.0.0-alpha.2 → 5.0.0-alpha.22

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 (75) hide show
  1. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +299 -2
  2. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  3. package/dist-server/controllers/outbound/loading-worksheet-controller.js +10 -0
  4. package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/outbound/packing-worksheet-controller.js +7 -0
  6. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/outbound/picking-worksheet-controller.js +327 -11
  8. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/outbound/returning-worksheet-controller.js +4 -0
  10. package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/render-invoices.js +103 -65
  12. package/dist-server/controllers/render-invoices.js.map +1 -1
  13. package/dist-server/controllers/worksheet-controller.js +14 -0
  14. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  15. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js +27 -23
  16. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js.map +1 -1
  17. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js +16 -2
  18. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js.map +1 -1
  19. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +2 -1
  20. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  21. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +0 -17
  22. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  23. package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
  24. package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
  25. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js +15 -0
  26. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js.map +1 -0
  27. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +3 -2
  28. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
  29. package/dist-server/graphql/resolvers/worksheet/unloading/index.js +3 -1
  30. package/dist-server/graphql/resolvers/worksheet/unloading/index.js.map +1 -1
  31. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js +15 -0
  32. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js.map +1 -0
  33. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js +15 -0
  34. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js.map +1 -0
  35. package/dist-server/graphql/resolvers/worksheet/unloading/unload.js.map +1 -1
  36. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +3 -1
  37. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
  38. package/dist-server/graphql/resolvers/worksheet/worksheet.js +191 -187
  39. package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
  40. package/dist-server/graphql/resolvers/worksheet/worksheets.js +255 -250
  41. package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
  42. package/dist-server/graphql/types/worksheet/index.js +16 -0
  43. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  44. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +1 -0
  45. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  46. package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
  47. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  48. package/dist-server/index.js +5 -0
  49. package/dist-server/index.js.map +1 -1
  50. package/package.json +17 -17
  51. package/server/controllers/inbound/unloading-worksheet-controller.ts +361 -6
  52. package/server/controllers/outbound/loading-worksheet-controller.ts +13 -0
  53. package/server/controllers/outbound/packing-worksheet-controller.ts +9 -0
  54. package/server/controllers/outbound/picking-worksheet-controller.ts +434 -17
  55. package/server/controllers/outbound/returning-worksheet-controller.ts +5 -0
  56. package/server/controllers/render-invoices.ts +119 -72
  57. package/server/controllers/worksheet-controller.ts +17 -2
  58. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.ts +35 -25
  59. package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +25 -6
  60. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +3 -3
  61. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +0 -18
  62. package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
  63. package/server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.ts +24 -0
  64. package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +6 -2
  65. package/server/graphql/resolvers/worksheet/unloading/index.ts +4 -0
  66. package/server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.ts +26 -0
  67. package/server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.ts +24 -0
  68. package/server/graphql/resolvers/worksheet/unloading/unload.ts +3 -1
  69. package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +3 -1
  70. package/server/graphql/resolvers/worksheet/worksheet.ts +195 -191
  71. package/server/graphql/resolvers/worksheet/worksheets.ts +328 -325
  72. package/server/graphql/types/worksheet/index.ts +16 -0
  73. package/server/graphql/types/worksheet/worksheet-detail-info.ts +1 -0
  74. package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
  75. package/server/index.ts +5 -0
@@ -170,6 +170,11 @@ exports.Mutation = `
170
170
  worksheetNo: String!
171
171
  ): Worksheet @privilege(category: "worksheet_control", privilege: "mutation") @transaction
172
172
 
173
+ undoSerialNumberPicking (
174
+ worksheetDetailName: String!
175
+ inventoryItemId: String!
176
+ ): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
177
+
173
178
  unload (
174
179
  worksheetDetailName: String!
175
180
  inventory: InventoryPatch!
@@ -187,6 +192,12 @@ exports.Mutation = `
187
192
  inventory: InventoryPatch!
188
193
  ): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
189
194
 
195
+ scanSerialNumberUnload (
196
+ worksheetDetailName: String!
197
+ serialNumber: String!
198
+ inventory: InventoryPatch!
199
+ ): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
200
+
190
201
  cycleCountAdjustment (
191
202
  cycleCountNo: String!
192
203
  ): Boolean @transaction
@@ -197,6 +208,11 @@ exports.Mutation = `
197
208
  inventoryIds: [String]!
198
209
  ): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
199
210
 
211
+ undoSerialNumberUnload (
212
+ worksheetDetailName: String!
213
+ inventoryItemId: String!
214
+ ): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
215
+
200
216
  completeUnloadingPartially (
201
217
  arrivalNoticeNo: String!
202
218
  worksheetDetail: [WorksheetDetailPatch!]
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/graphql/types/worksheet/index.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AACzC,yEAAmE;AACnE,6DAAuD;AACvD,mEAA6D;AAC7D,mDAA8C;AAC9C,+DAAyD;AACzD,6DAAwD;AACxD,+DAA0D;AAC1D,+DAAyD;AACzD,2EAAqE;AACrE,uEAAiE;AACjE,iFAA0E;AAC1E,mDAA8C;AAC9C,2EAAqE;AACrE,yDAAoD;AACpD,qEAA+D;AAC/D,qEAA+D;AAC/D,+DAAyD;AACzD,2CAAuC;AACvC,mEAA6D;AAC7D,qDAAgD;AAChD,qDAAgD;AAChD,uDAAkD;AAClD,2EAAqE;AAExD,QAAA,QAAQ,GAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsfrC,CAAA;AAEY,QAAA,KAAK,GAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0IlC,CAAA;AAEY,QAAA,KAAK,GAAiB;IACjC,qBAAS;IACT,uBAAU;IACV,4BAAY;IACZ,gCAAc;IACd,8BAAa;IACb,iDAAsB;IACtB,6CAAoB;IACpB,2CAAmB;IACnB,6CAAoB;IACpB,mDAAuB;IACvB,uCAAiB;IACjB,uCAAiB;IACjB,qCAAgB;IAChB,uCAAiB;IACjB,8BAAa;IACb,4BAAY;IACZ,sCAAiB;IACjB,2CAAmB;IACnB,wCAAkB;IAClB,+CAAqB;IACrB,kCAAe;IACf,mDAAuB;IACvB,mDAAuB;IACvB,wDAAyB;CAC1B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/graphql/types/worksheet/index.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AACzC,yEAAmE;AACnE,6DAAuD;AACvD,mEAA6D;AAC7D,mDAA8C;AAC9C,+DAAyD;AACzD,6DAAwD;AACxD,+DAA0D;AAC1D,+DAAyD;AACzD,2EAAqE;AACrE,uEAAiE;AACjE,iFAA0E;AAC1E,mDAA8C;AAC9C,2EAAqE;AACrE,yDAAoD;AACpD,qEAA+D;AAC/D,qEAA+D;AAC/D,+DAAyD;AACzD,2CAAuC;AACvC,mEAA6D;AAC7D,qDAAgD;AAChD,qDAAgD;AAChD,uDAAkD;AAClD,2EAAqE;AAExD,QAAA,QAAQ,GAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsgBrC,CAAA;AAEY,QAAA,KAAK,GAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0IlC,CAAA;AAEY,QAAA,KAAK,GAAiB;IACjC,qBAAS;IACT,uBAAU;IACV,4BAAY;IACZ,gCAAc;IACd,8BAAa;IACb,iDAAsB;IACtB,6CAAoB;IACpB,2CAAmB;IACnB,6CAAoB;IACpB,mDAAuB;IACvB,uCAAiB;IACjB,uCAAiB;IACjB,qCAAgB;IAChB,uCAAiB;IACjB,8BAAa;IACb,4BAAY;IACZ,sCAAiB;IACjB,2CAAmB;IACnB,wCAAkB;IAClB,+CAAqB;IACrB,kCAAe;IACf,mDAAuB;IACvB,mDAAuB;IACvB,wDAAyB;CAC1B,CAAA"}
@@ -61,6 +61,7 @@ exports.WorksheetDetailInfo = (0, apollo_server_koa_1.gql) `
61
61
  releaseGood: ReleaseGood
62
62
  actualQty: Int
63
63
  actualUomValue: Float
64
+ manufactureDate: String
64
65
  }
65
66
  `;
66
67
  //# sourceMappingURL=worksheet-detail-info.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worksheet-detail-info.js","sourceRoot":"","sources":["../../../../server/graphql/types/worksheet/worksheet-detail-info.ts"],"names":[],"mappings":";;;AAAA,yDAAuC;AAE1B,QAAA,mBAAmB,GAAG,IAAA,uBAAG,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DrC,CAAA"}
1
+ {"version":3,"file":"worksheet-detail-info.js","sourceRoot":"","sources":["../../../../server/graphql/types/worksheet/worksheet-detail-info.ts"],"names":[],"mappings":";;;AAAA,yDAAuC;AAE1B,QAAA,mBAAmB,GAAG,IAAA,uBAAG,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6DrC,CAAA"}
@@ -4,6 +4,7 @@ exports.WorksheetInfo = void 0;
4
4
  const apollo_server_koa_1 = require("apollo-server-koa");
5
5
  exports.WorksheetInfo = (0, apollo_server_koa_1.gql) `
6
6
  type WorksheetInfo {
7
+ arrivalNotice: ArrivalNotice
7
8
  releaseGood: ReleaseGood
8
9
  returnOrder: ReturnOrder
9
10
  bizplaceName: String
@@ -1 +1 @@
1
- {"version":3,"file":"worksheet-info.js","sourceRoot":"","sources":["../../../../server/graphql/types/worksheet/worksheet-info.ts"],"names":[],"mappings":";;;AAAA,yDAAuC;AAE1B,QAAA,aAAa,GAAG,IAAA,uBAAG,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2B/B,CAAA"}
1
+ {"version":3,"file":"worksheet-info.js","sourceRoot":"","sources":["../../../../server/graphql/types/worksheet/worksheet-info.ts"],"names":[],"mappings":";;;AAAA,yDAAuC;AAE1B,QAAA,aAAa,GAAG,IAAA,uBAAG,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4B/B,CAAA"}
@@ -20,5 +20,10 @@ __exportStar(require("./entities"), exports);
20
20
  __exportStar(require("./graphql"), exports);
21
21
  __exportStar(require("./graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet"), exports);
22
22
  __exportStar(require("./graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details"), exports);
23
+ __exportStar(require("./graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet"), exports);
24
+ __exportStar(require("./graphql/resolvers/worksheet/unloading/activate-unloading"), exports);
25
+ __exportStar(require("./graphql/resolvers/worksheet/picking/activate-picking"), exports);
26
+ __exportStar(require("./graphql/resolvers/worksheet/worksheets"), exports);
27
+ __exportStar(require("./graphql/resolvers/worksheet/worksheet"), exports);
23
28
  __exportStar(require("./migrations"), exports);
24
29
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oBAAiB;AAEjB,8CAA2B;AAC3B,6CAA0B;AAC1B,4CAAyB;AACzB,mHAAgG;AAChG,+GAA4F;AAC5F,+CAA4B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oBAAiB;AAEjB,8CAA2B;AAC3B,6CAA0B;AAC1B,4CAAyB;AACzB,mHAAgG;AAChG,+GAA4F;AAC5F,qHAAkG;AAClG,6FAA0E;AAC1E,yFAAsE;AACtE,2EAAwD;AACxD,0EAAuD;AACvD,+CAA4B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/worksheet-base",
3
- "version": "5.0.0-alpha.2",
3
+ "version": "5.0.0-alpha.22",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.js",
6
6
  "things-factory": true,
@@ -24,21 +24,21 @@
24
24
  "migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
25
25
  },
26
26
  "dependencies": {
27
- "@things-factory/auth-base": "^5.0.0-alpha.2",
28
- "@things-factory/biz-base": "^5.0.0-alpha.2",
29
- "@things-factory/document-template-base": "^5.0.0-alpha.2",
30
- "@things-factory/id-rule-base": "^5.0.0-alpha.2",
31
- "@things-factory/integration-lmd": "^5.0.0-alpha.2",
32
- "@things-factory/integration-marketplace": "^5.0.0-alpha.2",
33
- "@things-factory/integration-sellercraft": "^5.0.0-alpha.2",
34
- "@things-factory/integration-sftp": "^5.0.0-alpha.2",
35
- "@things-factory/marketplace-base": "^5.0.0-alpha.2",
36
- "@things-factory/notification": "^5.0.0-alpha.2",
37
- "@things-factory/sales-base": "^5.0.0-alpha.2",
38
- "@things-factory/setting-base": "^5.0.0-alpha.2",
39
- "@things-factory/shell": "^5.0.0-alpha.2",
40
- "@things-factory/transport-base": "^5.0.0-alpha.2",
41
- "@things-factory/warehouse-base": "^5.0.0-alpha.2"
27
+ "@things-factory/auth-base": "^5.0.0-alpha.22",
28
+ "@things-factory/biz-base": "^5.0.0-alpha.22",
29
+ "@things-factory/document-template-base": "^5.0.0-alpha.22",
30
+ "@things-factory/id-rule-base": "^5.0.0-alpha.22",
31
+ "@things-factory/integration-lmd": "^5.0.0-alpha.22",
32
+ "@things-factory/integration-marketplace": "^5.0.0-alpha.22",
33
+ "@things-factory/integration-sellercraft": "^5.0.0-alpha.22",
34
+ "@things-factory/integration-sftp": "^5.0.0-alpha.22",
35
+ "@things-factory/marketplace-base": "^5.0.0-alpha.22",
36
+ "@things-factory/notification": "^5.0.0-alpha.22",
37
+ "@things-factory/sales-base": "^5.0.0-alpha.22",
38
+ "@things-factory/setting-base": "^5.0.0-alpha.22",
39
+ "@things-factory/shell": "^5.0.0-alpha.22",
40
+ "@things-factory/transport-base": "^5.0.0-alpha.22",
41
+ "@things-factory/warehouse-base": "^5.0.0-alpha.22"
42
42
  },
43
- "gitHead": "055536f981d229d51ae63f46585036b35fa86602"
43
+ "gitHead": "8e06de9c59237f1800b2ff4f1c53162a0228342a"
44
44
  }
@@ -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,
@@ -656,6 +842,60 @@ export class UnloadingWorksheetController extends VasWorksheetController {
656
842
  }
657
843
  }
658
844
 
845
+ async undoSerialNumberUnload(worksheetDetailName: string, inventoryItemId: string): Promise<void> {
846
+ const worksheetDetail: WorksheetDetail = await this.trxMgr.getRepository(WorksheetDetail).findOne({
847
+ where: { name: worksheetDetailName, domain: this.domain, status: Not(Equal(WORKSHEET_STATUS.DEACTIVATED)) },
848
+ relations: [
849
+ 'worksheet',
850
+ 'worksheet.arrivalNotice',
851
+ 'worksheet.returnOrder',
852
+ 'targetProduct',
853
+ 'targetProduct.product'
854
+ ]
855
+ })
856
+
857
+ let worksheet: Worksheet = worksheetDetail.worksheet
858
+ let arrivalNotice: ArrivalNotice = worksheet.arrivalNotice
859
+ let returnOrder: ReturnOrder = worksheet.returnOrder
860
+ let targetInventory: OrderInventory = worksheetDetail.targetInventory
861
+ let targetProduct: OrderProduct = worksheetDetail.targetProduct
862
+ let inventoryItem: InventoryItem = await this.trxMgr.getRepository(InventoryItem).findOne({
863
+ where: { domain: this.domain, id: inventoryItemId },
864
+ relations: ['inventory', 'product']
865
+ })
866
+ let inventory: Inventory = inventoryItem.inventory
867
+
868
+ await this.trxMgr.getRepository(InventoryItem).delete(inventoryItem.id)
869
+
870
+ inventory.qty--
871
+ inventory.uomValue =
872
+ Math.round(
873
+ inventory.qty *
874
+ (Boolean(arrivalNotice)
875
+ ? targetProduct.uomValue
876
+ : targetInventory.returnUomValue / targetInventory.returnQty) *
877
+ 100
878
+ ) / 100
879
+ await this.trxMgr
880
+ .getRepository(Inventory)
881
+ .update({ id: inventory.id }, { qty: inventory.qty, uomValue: inventory.uomValue })
882
+
883
+ targetProduct.actualPackQty--
884
+
885
+ const inventoryItems: InventoryItem[] = await this.trxMgr.getRepository(InventoryItem).find({
886
+ where: { domain: this.domain, inboundOrderId: arrivalNotice.id, inventory }
887
+ })
888
+
889
+ if (inventoryItems?.length == 0) {
890
+ await this.trxMgr.getRepository(Inventory).delete(inventory.id)
891
+
892
+ targetProduct.actualPalletQty--
893
+ }
894
+
895
+ targetProduct.updater = this.user
896
+ await this.updateOrderTargets([targetProduct])
897
+ }
898
+
659
899
  async activateUnloading(
660
900
  worksheetNo: string,
661
901
  unloadingWorksheetDetails: UnloadingWorksheetDetail[]
@@ -715,6 +955,70 @@ export class UnloadingWorksheetController extends VasWorksheetController {
715
955
  return worksheet
716
956
  }
717
957
 
958
+ async getProductScanningVal(arrivalNotice: ArrivalNotice) {
959
+ let productScanning: string = 'false'
960
+ const enableProductScanning: Setting = await this.trxMgr.getRepository(Setting).findOne({
961
+ where: { domain: this.domain, category: 'id-rule', name: 'enable-product-scanning' }
962
+ })
963
+
964
+ if (enableProductScanning) productScanning = enableProductScanning.value
965
+
966
+ const partnerEnableProductScanning: PartnerSetting = await this.trxMgr.getRepository(PartnerSetting).findOne({
967
+ where: { setting: enableProductScanning, domain: this.domain, partnerDomain: arrivalNotice.bizplace?.domain }
968
+ })
969
+
970
+ if (partnerEnableProductScanning) productScanning = partnerEnableProductScanning.value
971
+
972
+ return productScanning
973
+ }
974
+
975
+ async getInputQtyVal(arrivalNotice: ArrivalNotice) {
976
+ let inputQty: string = 'false'
977
+ const enableInputQty: Setting = await this.trxMgr.getRepository(Setting).findOne({
978
+ where: { domain: this.domain, category: 'id-rule', name: 'enable-input-qty' }
979
+ })
980
+
981
+ if (enableInputQty) inputQty = enableInputQty.value
982
+
983
+ const partnerEnableInputQty: PartnerSetting = await this.trxMgr.getRepository(PartnerSetting).findOne({
984
+ where: { setting: enableInputQty, domain: this.domain, partnerDomain: arrivalNotice.bizplace?.domain }
985
+ })
986
+
987
+ if (partnerEnableInputQty) inputQty = partnerEnableInputQty.value
988
+
989
+ return inputQty
990
+ }
991
+
992
+ // only creates inventory history upon partial or full unload when
993
+ // productScanning is true
994
+ // inputQty is false
995
+ async createInventoryHistory(arrivalNotice: ArrivalNotice, inventories?: Inventory[]) {
996
+ try {
997
+ if (inventories === undefined) {
998
+ const inventoryList = await this.trxMgr.getRepository(Inventory).findAndCount({
999
+ where: {
1000
+ domain: this.domain,
1001
+ refOrderId: arrivalNotice.id
1002
+ }
1003
+ })
1004
+
1005
+ inventories = inventoryList[0]
1006
+ }
1007
+
1008
+ for (const inventory of inventories) {
1009
+ await this.transactionInventory(
1010
+ inventory,
1011
+ arrivalNotice,
1012
+ inventory.qty,
1013
+ inventory.uomValue,
1014
+ INVENTORY_TRANSACTION_TYPE.UNLOADING
1015
+ )
1016
+ }
1017
+ } catch (e) {
1018
+ throw e
1019
+ }
1020
+ }
1021
+
718
1022
  async completeUnloading(
719
1023
  arrivalNoticeNo: string,
720
1024
  unloadingWorksheetDetails: Partial<WorksheetDetail>[]
@@ -722,7 +1026,7 @@ export class UnloadingWorksheetController extends VasWorksheetController {
722
1026
  let arrivalNotice: ArrivalNotice = await this.findRefOrder(
723
1027
  ArrivalNotice,
724
1028
  { domain: this.domain, name: arrivalNoticeNo, status: In([ORDER_STATUS.PROCESSING, ORDER_STATUS.PUTTING_AWAY]) },
725
- ['orderProducts', 'releaseGood']
1029
+ ['orderProducts', 'releaseGood', 'bizplace', 'bizplace.domain']
726
1030
  )
727
1031
 
728
1032
  if (arrivalNotice.crossDocking) {
@@ -785,6 +1089,47 @@ export class UnloadingWorksheetController extends VasWorksheetController {
785
1089
  await this.completeWorksheet(worksheet)
786
1090
  }
787
1091
 
1092
+ const productScanning = await this.getProductScanningVal(arrivalNotice)
1093
+ const inputQty = await this.getInputQtyVal(arrivalNotice)
1094
+ if (productScanning === 'true' && inputQty === 'false') await this.createInventoryHistory(arrivalNotice)
1095
+
1096
+ const inventories: Inventory[] = await this.trxMgr.getRepository(Inventory).find({
1097
+ where: {
1098
+ domain: this.domain,
1099
+ refOrderId: arrivalNotice.id,
1100
+ status: In([INVENTORY_STATUS.UNLOADED, INVENTORY_STATUS.CHECKED])
1101
+ },
1102
+ relations: ['domain', 'bizplace', 'product', 'warehouse', 'location']
1103
+ })
1104
+
1105
+ for (let inventory of inventories) {
1106
+ let inventoryItems: InventoryItem[] = await this.trxMgr.getRepository(InventoryItem).find({
1107
+ where: { domain: this.domain, inventory }
1108
+ })
1109
+
1110
+ if (inventoryItems?.length) {
1111
+ inventory.status = INVENTORY_STATUS.STORED
1112
+
1113
+ await Promise.all(
1114
+ inventoryItems.map(async inventoryItem => {
1115
+ await this.trxMgr
1116
+ .getRepository(InventoryItem)
1117
+ .update({ id: inventoryItem.id }, { status: INVENTORY_STATUS.STORED })
1118
+ })
1119
+ )
1120
+
1121
+ await generateInventoryHistory(
1122
+ inventory,
1123
+ arrivalNotice,
1124
+ INVENTORY_TRANSACTION_TYPE.UNLOADING,
1125
+ inventory.qty,
1126
+ inventory.uomValue,
1127
+ this.user,
1128
+ this.trxMgr
1129
+ )
1130
+ }
1131
+ }
1132
+
788
1133
  let vasWorksheet: Worksheet = await this.trxMgr.getRepository(Worksheet).findOne({
789
1134
  where: {
790
1135
  arrivalNotice,
@@ -828,10 +1173,15 @@ export class UnloadingWorksheetController extends VasWorksheetController {
828
1173
  arrivalNoticeNo: string,
829
1174
  unloadingWorksheetDetail: Partial<WorksheetDetail>[]
830
1175
  ): Promise<Worksheet> {
831
- const arrivalNotice: ArrivalNotice = await this.findRefOrder(ArrivalNotice, {
832
- name: arrivalNoticeNo,
833
- status: In([ORDER_STATUS.PROCESSING, ORDER_STATUS.PUTTING_AWAY])
834
- })
1176
+ const arrivalNotice: ArrivalNotice = await this.findRefOrder(
1177
+ ArrivalNotice,
1178
+ {
1179
+ domain: this.domain,
1180
+ name: arrivalNoticeNo,
1181
+ status: In([ORDER_STATUS.PROCESSING, ORDER_STATUS.PUTTING_AWAY])
1182
+ },
1183
+ ['bizplace', 'bizplace.domain']
1184
+ )
835
1185
 
836
1186
  const worksheet: Worksheet = await this.findWorksheetByRefOrder(arrivalNotice, WORKSHEET_TYPE.UNLOADING, [
837
1187
  'worksheetDetails',
@@ -870,6 +1220,11 @@ export class UnloadingWorksheetController extends VasWorksheetController {
870
1220
  })
871
1221
  await this.trxMgr.getRepository(Inventory).save(inventories)
872
1222
 
1223
+ const productScanning = await this.getProductScanningVal(arrivalNotice)
1224
+ const inputQty = await this.getInputQtyVal(arrivalNotice)
1225
+ if (productScanning === 'true' && inputQty === 'false')
1226
+ await this.createInventoryHistory(arrivalNotice, inventories)
1227
+
873
1228
  let vasWorksheet: Worksheet = await this.trxMgr.getRepository(Worksheet).findOne({
874
1229
  where: {
875
1230
  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,
@@ -144,6 +144,15 @@ export class PackingWorksheetController extends VasWorksheetController {
144
144
  throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('pack', `packed quantity can't exceed release qty`))
145
145
  }
146
146
 
147
+ targetInventory.packedAt = new Date()
148
+ targetInventory.packedByUser = this.user;
149
+
150
+ let packedBy: string[] = targetInventory.packedBy ? (targetInventory.packedBy).split(',') : []
151
+ if (!packedBy.find(x => x == this.user.name)) {
152
+ packedBy.push(this.user.name)
153
+ targetInventory.packedBy = packedBy.join(',')
154
+ }
155
+
147
156
  if (targetInventory.packedQty == pickedQty) {
148
157
  targetInventory.status = ORDER_INVENTORY_STATUS.PACKED
149
158
  await this.updateOrderTargets([targetInventory])