@things-factory/worksheet-base 4.1.31 → 4.1.35

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 (51) hide show
  1. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +235 -0
  2. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  3. package/dist-server/controllers/outbound/picking-worksheet-controller.js +327 -39
  4. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/render-invoices.js +15 -13
  6. package/dist-server/controllers/render-invoices.js.map +1 -1
  7. package/dist-server/controllers/worksheet-controller.js +14 -0
  8. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  9. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js +16 -2
  10. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js.map +1 -1
  11. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +0 -17
  12. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  13. package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
  14. package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
  15. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js +15 -0
  16. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js.map +1 -0
  17. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +3 -2
  18. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
  19. package/dist-server/graphql/resolvers/worksheet/unloading/index.js +3 -1
  20. package/dist-server/graphql/resolvers/worksheet/unloading/index.js.map +1 -1
  21. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js +15 -0
  22. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js.map +1 -0
  23. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js +15 -0
  24. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js.map +1 -0
  25. package/dist-server/graphql/resolvers/worksheet/unloading/unload.js.map +1 -1
  26. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +3 -1
  27. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
  28. package/dist-server/graphql/types/worksheet/index.js +16 -0
  29. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  30. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +1 -0
  31. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  32. package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
  33. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  34. package/package.json +7 -7
  35. package/server/controllers/inbound/unloading-worksheet-controller.ts +277 -1
  36. package/server/controllers/outbound/picking-worksheet-controller.ts +433 -52
  37. package/server/controllers/render-invoices.ts +23 -26
  38. package/server/controllers/worksheet-controller.ts +17 -2
  39. package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +25 -6
  40. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +0 -18
  41. package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
  42. package/server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.ts +24 -0
  43. package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +6 -2
  44. package/server/graphql/resolvers/worksheet/unloading/index.ts +4 -0
  45. package/server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.ts +26 -0
  46. package/server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.ts +24 -0
  47. package/server/graphql/resolvers/worksheet/unloading/unload.ts +3 -1
  48. package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +3 -1
  49. package/server/graphql/types/worksheet/index.ts +16 -0
  50. package/server/graphql/types/worksheet/worksheet-detail-info.ts +1 -0
  51. package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
@@ -3,7 +3,7 @@ import { EntityManager, EntitySchema, Equal, FindOneOptions, In, Not } from 'typ
3
3
  import { Role, User } from '@things-factory/auth-base'
4
4
  import { Bizplace, getDomainUsers } from '@things-factory/biz-base'
5
5
  import { sendNotification } from '@things-factory/notification'
6
- import { ProductDetail } from '@things-factory/product-base'
6
+ import { Product, ProductDetail } from '@things-factory/product-base'
7
7
  import {
8
8
  ArrivalNotice,
9
9
  DeliveryOrder,
@@ -19,7 +19,7 @@ import {
19
19
  VasOrder
20
20
  } from '@things-factory/sales-base'
21
21
  import { Domain } from '@things-factory/shell'
22
- import { Inventory, INVENTORY_STATUS, Pallet } from '@things-factory/warehouse-base'
22
+ import { Inventory, INVENTORY_STATUS, InventoryItem, Pallet } from '@things-factory/warehouse-base'
23
23
 
24
24
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../constants'
25
25
  import { Worksheet, WorksheetDetail } from '../entities'
@@ -941,6 +941,21 @@ export class WorksheetController {
941
941
  if (duplicatedCartonCnt) throw new Error(this.ERROR_MSG.VALIDITY.DUPLICATED('Carton ID', cartonId))
942
942
  }
943
943
 
944
+ /**
945
+ * @summary Check whether passed serial number is existing already
946
+ * @description It will try to count inventories which has same domain and same serial number and and not terminated one
947
+ * If there's positive result it will throw an error cause serial number is duplicated
948
+ */
949
+ async checkSerialNumberDuplication(serialNumber: string, product: Product): Promise<void> {
950
+ const duplicatedSerialNumberCnt: number = await this.trxMgr.getRepository(InventoryItem).count({
951
+ domain: this.domain,
952
+ product,
953
+ serialNumber
954
+ })
955
+
956
+ if (duplicatedSerialNumberCnt) throw new Error(this.ERROR_MSG.VALIDITY.DUPLICATED('Serial Number', serialNumber))
957
+ }
958
+
944
959
  /**
945
960
  * @summary Check for product child qty at any scanned level
946
961
  * @description It will check every level of product detail by comparing scanned level and GAN registered level.
@@ -5,6 +5,7 @@ import { EntityManager } from 'typeorm'
5
5
  import { WORKSHEET_TYPE } from '../../../../constants'
6
6
  import { LoadingWorksheetController, ReturningWorksheetController } from '../../../../controllers'
7
7
  import { Worksheet, WorksheetDetail } from '../../../../entities'
8
+ import { Sftp, SftpAPI } from '@things-factory/integration-sftp'
8
9
 
9
10
  export const completeLoadingResolver = {
10
11
  async completeLoading(_: any, { releaseGoodNo }, context: any) {
@@ -20,14 +21,19 @@ export async function completeLoading(
20
21
  releaseGoodNo: string
21
22
  ): Promise<void> {
22
23
  const worksheetController: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
23
- const releaseGood: ReleaseGood = await worksheetController.findRefOrder(ReleaseGood, {
24
- domain,
25
- name: releaseGoodNo,
26
- status: ORDER_STATUS.LOADING
27
- })
24
+ const releaseGood: ReleaseGood = await worksheetController.findRefOrder(
25
+ ReleaseGood,
26
+ {
27
+ domain,
28
+ name: releaseGoodNo,
29
+ status: ORDER_STATUS.LOADING
30
+ },
31
+ ['bizplace', 'bizplace.domain']
32
+ )
28
33
  const worksheet: Worksheet = await worksheetController.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.LOADING, [
29
34
  'worksheetDetails',
30
- 'worksheetDetails.targetInventory'
35
+ 'worksheetDetails.targetInventory',
36
+ 'worksheetDetails.targetInventory.product'
31
37
  ])
32
38
  const worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
33
39
  const targetInventories: OrderInventory[] = worksheetDetails.map((wsd: WorksheetDetail) => wsd.targetInventory)
@@ -35,6 +41,19 @@ export async function completeLoading(
35
41
  (targetInventory: OrderInventory) => targetInventory.status === ORDER_INVENTORY_STATUS.LOADING
36
42
  )
37
43
 
44
+ const customerDomain: Domain = releaseGood.bizplace.domain
45
+ let customerAvailableSftp: Sftp = await tx.getRepository(Sftp).findOne({
46
+ where: { domain: customerDomain }
47
+ })
48
+ if (customerAvailableSftp) {
49
+ let result: Sftp = await SftpAPI.createShipment(customerAvailableSftp, {
50
+ releaseGood,
51
+ orderInventories: targetInventories,
52
+ sftp: customerAvailableSftp
53
+ })
54
+ customerAvailableSftp = await tx.getRepository(Sftp).save(result)
55
+ }
56
+
38
57
  await worksheetController.completeLoading(releaseGoodNo)
39
58
 
40
59
  if (remainInventories.length) {
@@ -5,7 +5,6 @@ import { Bizplace, ContactPoint, getMyBizplace } from '@things-factory/biz-base'
5
5
  import { LastMileAPI, LastMileDelivery } from '@things-factory/integration-lmd'
6
6
  import { MarketplaceStore, MarketplaceTransporter } from '@things-factory/integration-marketplace'
7
7
  import { Sellercraft, SellercraftStatus } from '@things-factory/integration-sellercraft'
8
- import { Sftp, SftpAPI } from '@things-factory/integration-sftp'
9
8
  import {
10
9
  MarketplaceOrder,
11
10
  MarketplaceOrderItem,
@@ -213,23 +212,6 @@ export async function completePicking(
213
212
  }
214
213
  }
215
214
 
216
- const customerDomain: Domain = releaseGood.bizplace.domain
217
- let customerAvailableSftp: Sftp = await tx.getRepository(Sftp).findOne({
218
- where: { domain: customerDomain }
219
- })
220
- if (customerAvailableSftp) {
221
- const orderInventories: OrderInventory[] = await tx.getRepository(OrderInventory).find({
222
- where: { releaseGood },
223
- relations: ['product']
224
- })
225
- let result: Sftp = await SftpAPI.createShipment(customerAvailableSftp, {
226
- releaseGood,
227
- orderInventories,
228
- sftp: customerAvailableSftp
229
- })
230
- customerAvailableSftp = await tx.getRepository(Sftp).save(result)
231
- }
232
-
233
215
  if (releaseGood.packingOption) {
234
216
  const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
235
217
 
@@ -10,6 +10,7 @@ import { pickingResolver } from './picking'
10
10
  import { scanProductPickingResolver } from './scan-product-picking'
11
11
  import { scanProductBatchPickingResolver } from './scan-product-batch-picking'
12
12
  import { undoPickingAssigmentResolver } from './undo-picking-assignment'
13
+ import { undoSerialNumberPickingResolver } from './undo-serial-number-picking'
13
14
 
14
15
  export const Mutations = {
15
16
  ...assignPickingInventoriesResolver,
@@ -23,5 +24,6 @@ export const Mutations = {
23
24
  ...completePickingResolver,
24
25
  ...completeBatchPickingResolver,
25
26
  ...assignPickingWorkerResolver,
26
- ...fetchAndAssignPickingTaskResolver
27
+ ...fetchAndAssignPickingTaskResolver,
28
+ ...undoSerialNumberPickingResolver
27
29
  }
@@ -0,0 +1,24 @@
1
+ import { EntityManager } from 'typeorm'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import { Domain } from '@things-factory/shell'
5
+
6
+ import { PickingWorksheetController } from '../../../../controllers'
7
+
8
+ export const undoSerialNumberPickingResolver = {
9
+ async undoSerialNumberPicking(_: any, { worksheetDetailName, inventoryItemId }, context: any) {
10
+ const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
11
+ await undoSerialNumberPicking(tx, domain, user, worksheetDetailName, inventoryItemId)
12
+ }
13
+ }
14
+
15
+ async function undoSerialNumberPicking(
16
+ tx: EntityManager,
17
+ domain: Domain,
18
+ user: User,
19
+ worksheetDetailName: string,
20
+ inventoryItemId: string
21
+ ): Promise<void> {
22
+ const worksheetController: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
23
+ await worksheetController.undoSerialNumberPicking(worksheetDetailName, inventoryItemId)
24
+ }
@@ -1,7 +1,9 @@
1
+ import { getRepository, In } from 'typeorm'
2
+
1
3
  import { ArrivalNotice, Bizplace, ReturnOrder } from '@things-factory/sales-base'
2
4
  import { Domain } from '@things-factory/shell'
3
5
  import { Inventory, INVENTORY_STATUS } from '@things-factory/warehouse-base'
4
- import { getRepository, In } from 'typeorm'
6
+
5
7
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
6
8
  import { WorksheetDetail } from '../../../entities'
7
9
 
@@ -46,9 +48,11 @@ export const unloadedInventories = {
46
48
  })
47
49
  const items = foundInv.map((inv: Inventory) => {
48
50
  const expirationDate: Date = inv.expirationDate ? new Date(inv.expirationDate) : null
51
+ const manufactureDate: Date = inv.manufactureDate ? new Date(inv.manufactureDate) : null
49
52
  return {
50
53
  ...inv,
51
- expirationDate: expirationDate
54
+ expirationDate: expirationDate,
55
+ manufactureDate: manufactureDate
52
56
  }
53
57
  })
54
58
 
@@ -3,14 +3,18 @@ import { completeProductScanUnloadResolver } from './complete-product-scan-unloa
3
3
  import { completeUnloadingResolver } from './complete-unloading'
4
4
  import { completeUnloadingPartiallyResolver } from './complete-unloading-partially'
5
5
  import { scanProductUnloadResolver } from './scan-product-unload'
6
+ import { scanSerialNumberUnloadResolver } from './scan-serial-number-unload'
7
+ import { undoSerialNumberUnloadResolver } from './undo-serial-number-unload'
6
8
  import { undoUnloadingResolver } from './undo-unloading'
7
9
  import { unloadResolver } from './unload'
8
10
 
9
11
  export const Mutations = {
10
12
  ...activateUnloadingResolver,
11
13
  ...scanProductUnloadResolver,
14
+ ...scanSerialNumberUnloadResolver,
12
15
  ...unloadResolver,
13
16
  ...undoUnloadingResolver,
17
+ ...undoSerialNumberUnloadResolver,
14
18
  ...completeProductScanUnloadResolver,
15
19
  ...completeUnloadingResolver,
16
20
  ...completeUnloadingPartiallyResolver
@@ -0,0 +1,26 @@
1
+ import { EntityManager } from 'typeorm'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import { Domain } from '@things-factory/shell'
5
+ import { Inventory } from '@things-factory/warehouse-base'
6
+
7
+ import { UnloadingWorksheetController } from '../../../../controllers'
8
+
9
+ export const scanSerialNumberUnloadResolver = {
10
+ async scanSerialNumberUnload(_: any, { worksheetDetailName, serialNumber, inventory }, context: any) {
11
+ const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
12
+ await scanSerialNumberUnload(tx, domain, user, worksheetDetailName, serialNumber, inventory)
13
+ }
14
+ }
15
+
16
+ async function scanSerialNumberUnload(
17
+ tx: EntityManager,
18
+ domain: Domain,
19
+ user: User,
20
+ worksheetDetailName: string,
21
+ serialNumber: string,
22
+ inventory: Partial<Inventory>
23
+ ): Promise<void> {
24
+ const worksheetController: UnloadingWorksheetController = new UnloadingWorksheetController(tx, domain, user)
25
+ await worksheetController.scanSerialNumberUnload(worksheetDetailName, serialNumber, inventory)
26
+ }
@@ -0,0 +1,24 @@
1
+ import { EntityManager } from 'typeorm'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import { Domain } from '@things-factory/shell'
5
+
6
+ import { UnloadingWorksheetController } from '../../../../controllers'
7
+
8
+ export const undoSerialNumberUnloadResolver = {
9
+ async undoSerialNumberUnload(_: any, { worksheetDetailName, inventoryItemId }, context: any) {
10
+ const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
11
+ await undoSerialNumberUnload(tx, domain, user, worksheetDetailName, inventoryItemId)
12
+ }
13
+ }
14
+
15
+ async function undoSerialNumberUnload(
16
+ tx: EntityManager,
17
+ domain: Domain,
18
+ user: User,
19
+ worksheetDetailName: string,
20
+ inventoryItemId: string
21
+ ): Promise<void> {
22
+ const worksheetController: UnloadingWorksheetController = new UnloadingWorksheetController(tx, domain, user)
23
+ await worksheetController.undoSerialNumberUnload(worksheetDetailName, inventoryItemId)
24
+ }
@@ -1,7 +1,9 @@
1
+ import { EntityManager } from 'typeorm'
2
+
1
3
  import { User } from '@things-factory/auth-base'
2
4
  import { Domain } from '@things-factory/shell'
3
5
  import { Inventory } from '@things-factory/warehouse-base'
4
- import { EntityManager } from 'typeorm'
6
+
5
7
  import { UnloadingWorksheetController } from '../../../../controllers'
6
8
 
7
9
  export const unloadResolver = {
@@ -59,6 +59,7 @@ export const unloadingWorksheetResolver = {
59
59
 
60
60
  return {
61
61
  worksheetInfo: {
62
+ arrivalNotice,
62
63
  bizplaceName: customerBizplace.name,
63
64
  partnerDomainId: customerBizplace?.domain.id,
64
65
  customerCompanyDomainId: customerCompanyDomain.id,
@@ -90,7 +91,8 @@ export const unloadingWorksheetResolver = {
90
91
  actualPackQty: targetProduct.actualPackQty,
91
92
  remark: targetProduct.remark,
92
93
  issue: productWSD.issue,
93
- status: productWSD.status
94
+ status: productWSD.status,
95
+ manufactureDate: targetProduct.manufactureDate ? new Date(targetProduct.manufactureDate) : null
94
96
  }
95
97
  })
96
98
  }
@@ -168,6 +168,11 @@ export const Mutation = /* GraphQL */ `
168
168
  worksheetNo: String!
169
169
  ): Worksheet @privilege(category: "worksheet_control", privilege: "mutation") @transaction
170
170
 
171
+ undoSerialNumberPicking (
172
+ worksheetDetailName: String!
173
+ inventoryItemId: String!
174
+ ): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
175
+
171
176
  unload (
172
177
  worksheetDetailName: String!
173
178
  inventory: InventoryPatch!
@@ -185,6 +190,12 @@ export const Mutation = /* GraphQL */ `
185
190
  inventory: InventoryPatch!
186
191
  ): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
187
192
 
193
+ scanSerialNumberUnload (
194
+ worksheetDetailName: String!
195
+ serialNumber: String!
196
+ inventory: InventoryPatch!
197
+ ): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
198
+
188
199
  cycleCountAdjustment (
189
200
  cycleCountNo: String!
190
201
  ): Boolean @transaction
@@ -195,6 +206,11 @@ export const Mutation = /* GraphQL */ `
195
206
  inventoryIds: [String]!
196
207
  ): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
197
208
 
209
+ undoSerialNumberUnload (
210
+ worksheetDetailName: String!
211
+ inventoryItemId: String!
212
+ ): Boolean @privilege(category: "worksheet_execute", privilege: "mutation") @transaction
213
+
198
214
  completeUnloadingPartially (
199
215
  arrivalNoticeNo: String!
200
216
  worksheetDetail: [WorksheetDetailPatch!]
@@ -59,5 +59,6 @@ export const WorksheetDetailInfo = gql`
59
59
  releaseGood: ReleaseGood
60
60
  actualQty: Int
61
61
  actualUomValue: Float
62
+ manufactureDate: String
62
63
  }
63
64
  `
@@ -2,6 +2,7 @@ import { gql } from 'apollo-server-koa'
2
2
 
3
3
  export const WorksheetInfo = gql`
4
4
  type WorksheetInfo {
5
+ arrivalNotice: ArrivalNotice
5
6
  releaseGood: ReleaseGood
6
7
  returnOrder: ReturnOrder
7
8
  bizplaceName: String