@things-factory/worksheet-base 4.1.33 → 4.1.36
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/inbound/unloading-worksheet-controller.js +299 -2
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/outbound/picking-worksheet-controller.js +327 -39
- package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
- package/dist-server/controllers/render-invoices.js +16 -14
- package/dist-server/controllers/render-invoices.js.map +1 -1
- package/dist-server/controllers/worksheet-controller.js +14 -0
- package/dist-server/controllers/worksheet-controller.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js +16 -2
- package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +0 -17
- package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
- package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +3 -2
- package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading/index.js +3 -1
- package/dist-server/graphql/resolvers/worksheet/unloading/index.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js +15 -0
- package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js.map +1 -0
- package/dist-server/graphql/resolvers/worksheet/unloading/unload.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +3 -1
- package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
- package/dist-server/graphql/types/worksheet/index.js +16 -0
- 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/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
- package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
- package/package.json +8 -8
- package/server/controllers/inbound/unloading-worksheet-controller.ts +361 -6
- package/server/controllers/outbound/picking-worksheet-controller.ts +433 -52
- package/server/controllers/render-invoices.ts +24 -27
- package/server/controllers/worksheet-controller.ts +17 -2
- package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +25 -6
- package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +0 -18
- package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
- package/server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.ts +24 -0
- package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +6 -2
- package/server/graphql/resolvers/worksheet/unloading/index.ts +4 -0
- package/server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.ts +26 -0
- package/server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.ts +24 -0
- package/server/graphql/resolvers/worksheet/unloading/unload.ts +3 -1
- package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +3 -1
- package/server/graphql/types/worksheet/index.ts +16 -0
- package/server/graphql/types/worksheet/worksheet-detail-info.ts +1 -0
- 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(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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!]
|