@things-factory/worksheet-base 4.3.753 → 4.3.755

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 (31) hide show
  1. package/dist-server/controllers/outbound/picking-worksheet-controller.js +97 -27
  2. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  3. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +117 -24
  4. package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/render-ro-do.js +324 -96
  6. package/dist-server/controllers/render-ro-do.js.map +1 -1
  7. package/dist-server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.js +35 -1
  8. package/dist-server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.js.map +1 -1
  9. package/dist-server/graphql/resolvers/worksheet/index.js +1 -1
  10. package/dist-server/graphql/resolvers/worksheet/index.js.map +1 -1
  11. package/dist-server/graphql/resolvers/worksheet/loading/index.js +3 -1
  12. package/dist-server/graphql/resolvers/worksheet/loading/index.js.map +1 -1
  13. package/dist-server/graphql/resolvers/worksheet/loading/validate-qc-seals.js +79 -0
  14. package/dist-server/graphql/resolvers/worksheet/loading/validate-qc-seals.js.map +1 -0
  15. package/dist-server/graphql/types/worksheet/index.js +5 -1
  16. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  17. package/dist-server/graphql/types/worksheet/validate-qc-seals-result.js +12 -0
  18. package/dist-server/graphql/types/worksheet/validate-qc-seals-result.js.map +1 -0
  19. package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
  20. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  21. package/package.json +21 -21
  22. package/server/controllers/outbound/picking-worksheet-controller.ts +105 -31
  23. package/server/controllers/outbound/sorting-worksheet-controller.ts +137 -25
  24. package/server/controllers/render-ro-do.ts +378 -136
  25. package/server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.ts +49 -3
  26. package/server/graphql/resolvers/worksheet/index.ts +3 -2
  27. package/server/graphql/resolvers/worksheet/loading/index.ts +5 -0
  28. package/server/graphql/resolvers/worksheet/loading/validate-qc-seals.ts +91 -0
  29. package/server/graphql/types/worksheet/index.ts +5 -1
  30. package/server/graphql/types/worksheet/validate-qc-seals-result.ts +9 -0
  31. package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
@@ -2,6 +2,7 @@ import { activateLoadingResolver } from './activate-loading'
2
2
  import { loadingResolver } from './loading'
3
3
  import { undoLoadingResolver } from './undo-loading'
4
4
  import { completeLoadingResolver } from './complete-loading'
5
+ import { validateQcSealsResolver } from './validate-qc-seals'
5
6
 
6
7
  export const Mutations = {
7
8
  ...activateLoadingResolver,
@@ -9,3 +10,7 @@ export const Mutations = {
9
10
  ...undoLoadingResolver,
10
11
  ...completeLoadingResolver
11
12
  }
13
+
14
+ export const Query = {
15
+ ...validateQcSealsResolver
16
+ }
@@ -0,0 +1,91 @@
1
+ import { EntityManager, IsNull } from 'typeorm'
2
+ import { Domain } from '@things-factory/shell'
3
+ import { User } from '@things-factory/auth-base'
4
+ import { OrderTote, OrderToteSeal, ReleaseGood } from '@things-factory/sales-base'
5
+ import { Setting } from '@things-factory/setting-base'
6
+
7
+ export const validateQcSealsResolver = {
8
+ async validateQcSeals(
9
+ _: any,
10
+ { releaseGoodNo },
11
+ context: any
12
+ ): Promise<{ valid: boolean; error?: string; minimumSealNumber?: number }> {
13
+ const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
14
+
15
+ try {
16
+ const releaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
17
+ where: { domain, name: releaseGoodNo },
18
+ relations: ['bizplace', 'bizplace.domain']
19
+ })
20
+
21
+ if (!releaseGood) {
22
+ return { valid: false, error: 'Release good not found', minimumSealNumber: 0 }
23
+ }
24
+
25
+ // Check enable-tote-scanning setting
26
+ let enableToteScanningSetting: Setting = await tx.getRepository(Setting).findOne({
27
+ where: {
28
+ domain: domain,
29
+ category: 'id-rule',
30
+ name: 'enable-tote-scanning'
31
+ }
32
+ })
33
+
34
+ // Check minimum-seal-number setting (needed for banner display)
35
+ let minimumSealNumberSetting: Setting = await tx.getRepository(Setting).findOne({
36
+ where: {
37
+ domain: domain,
38
+ category: 'id-rule',
39
+ name: 'minimum-seal-number'
40
+ }
41
+ })
42
+
43
+ const minimumSealNumber = parseInt(minimumSealNumberSetting?.value || '0', 10)
44
+
45
+ if (enableToteScanningSetting) {
46
+ // enable-tote-scanning is numeric: 0 = disabled, >= 1 = enabled
47
+ const enableToteScanningValue = parseInt(enableToteScanningSetting.value || '0', 10)
48
+
49
+ if (enableToteScanningValue >= 1) {
50
+ // Check if there are unsealed totes (closedDate is null)
51
+ const foundNotSealedOrderTote = await tx
52
+ .getRepository(OrderTote)
53
+ .findOne({ where: { releaseGood, closedDate: IsNull() } })
54
+
55
+ if (foundNotSealedOrderTote) {
56
+ return {
57
+ valid: false,
58
+ error: `Please seal the tote(s) before proceeding. Minimum ${minimumSealNumber} seal(s) required.`,
59
+ minimumSealNumber
60
+ }
61
+ }
62
+
63
+ // If minimum-seal-number > 0, validate seal counts per tote
64
+ if (minimumSealNumber > 0) {
65
+ // Get all order totes for this release good
66
+ const orderTotes: OrderTote[] = await tx.getRepository(OrderTote).find({
67
+ where: { releaseGood },
68
+ relations: ['orderToteSeals']
69
+ })
70
+
71
+ // Validate each tote has at least minimum-seal-number seals
72
+ for (const orderTote of orderTotes) {
73
+ const sealCount = orderTote.orderToteSeals?.length || 0
74
+ if (sealCount < minimumSealNumber) {
75
+ return {
76
+ valid: false,
77
+ error: `Tote ${orderTote.name} has ${sealCount} seal(s), but minimum ${minimumSealNumber} seal(s) required`,
78
+ minimumSealNumber
79
+ }
80
+ }
81
+ }
82
+ }
83
+ }
84
+ }
85
+
86
+ return { valid: true, minimumSealNumber }
87
+ } catch (error) {
88
+ return { valid: false, error: error.message || 'Validation failed', minimumSealNumber: 0 }
89
+ }
90
+ }
91
+ }
@@ -22,6 +22,7 @@ import { ProductApproval } from './product-approval'
22
22
  import { ReleaseGoodWorksheet } from './release-good-worksheet'
23
23
  import { ReturnOrderWorksheet } from './return-order-worksheet'
24
24
  import { SellercraftDocument } from './sellercraft-document'
25
+ import { ValidateQcSealsResult } from './validate-qc-seals-result'
25
26
  import { VasOrderWorksheet } from './vas-order-worksheet'
26
27
  import { WebspertDocument } from './webspert-document'
27
28
  import { Worksheet } from './worksheet'
@@ -864,6 +865,8 @@ export const Query = /* GraphQL */ `
864
865
  findSortingReleaseOrdersByTaskNo(taskNo: String!): FindReleaseOrdersByTaskNo @privilege(category: "worksheet", privilege: "query") @transaction
865
866
 
866
867
  findReleaseOrdersByTaskNo(taskNo: String!): FindReleaseOrdersByTaskNo @privilege(category: "worksheet", privilege: "query") @transaction
868
+
869
+ validateQcSeals(releaseGoodNo: String!): ValidateQcSealsResult @privilege(category: "worksheet", privilege: "query") @transaction
867
870
  `
868
871
 
869
872
  export const Types = /* GraphQL */ [
@@ -898,5 +901,6 @@ export const Types = /* GraphQL */ [
898
901
  DeliveryOrderRO,
899
902
  GenerateBatchPickInfo,
900
903
  MultipleReleaseGoodWorksheet,
901
- LocationFilter
904
+ LocationFilter,
905
+ ValidateQcSealsResult
902
906
  ]
@@ -0,0 +1,9 @@
1
+ import { gql } from 'apollo-server-koa'
2
+
3
+ export const ValidateQcSealsResult = gql`
4
+ type ValidateQcSealsResult {
5
+ valid: Boolean!
6
+ error: String
7
+ minimumSealNumber: Int
8
+ }
9
+ `
@@ -14,6 +14,7 @@ export const WorksheetInfo = gql`
14
14
  marketplaceStatus: String
15
15
  customerCompanyDomainId: String
16
16
  binLocationName: String
17
+ isReleaseGoodScan: Boolean
17
18
  bizplace: Bizplace
18
19
  containerNo: String
19
20
  airwayBill: String