@things-factory/worksheet-base 4.1.15 → 4.1.20

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.
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generatePickingWorksheetDetailsResolver = void 0;
4
+ const sales_base_1 = require("@things-factory/sales-base");
5
+ const setting_base_1 = require("@things-factory/setting-base");
6
+ const warehouse_base_1 = require("@things-factory/warehouse-base");
7
+ const constants_1 = require("../../../constants");
8
+ const entities_1 = require("../../../entities");
9
+ const utils_1 = require("../../../utils");
10
+ exports.generatePickingWorksheetDetailsResolver = {
11
+ async generatePickingWorksheetDetails(_, { bizplaceId, selectedItems, pickingStrategy, worksheetNo, locationSortingRules }, context) {
12
+ const { tx, user, domain } = context.state;
13
+ // 1. find related worksheet
14
+ const worksheet = await tx.getRepository(entities_1.Worksheet).findOne({
15
+ where: { name: worksheetNo, status: constants_1.WORKSHEET_STATUS.DEACTIVATED, domain },
16
+ relations: ['releaseGood']
17
+ });
18
+ if (!worksheet)
19
+ throw new Error('picking worksheet not found');
20
+ const worksheetId = worksheet.id;
21
+ // 2. search for sorting rules
22
+ const inventoryAssignmentSetting = await tx.getRepository(setting_base_1.Setting).findOne({
23
+ where: { domain, name: 'rule-for-inventory-assignment' }
24
+ });
25
+ if (!locationSortingRules && inventoryAssignmentSetting) {
26
+ locationSortingRules = [];
27
+ let locationSetting = JSON.parse(inventoryAssignmentSetting.value);
28
+ for (const key in locationSetting) {
29
+ locationSortingRules.push({ name: key, desc: locationSetting[key] == 'ASC' ? false : true });
30
+ }
31
+ }
32
+ try {
33
+ // 3. get all related inventories by strategy
34
+ let inventories = await (0, warehouse_base_1.getInventoriesByStrategy)(domain.id, bizplaceId, worksheetId, selectedItems, pickingStrategy, locationSortingRules, tx);
35
+ // 4. get worksheet details
36
+ let worksheetDetails = selectedItems.reduce((accWSD, oi) => {
37
+ const relatedInventories = inventories.filter(inv => inv.productId == oi.productId &&
38
+ inv.batchId == oi.batchId &&
39
+ inv.packingType == oi.packingType &&
40
+ inv.packingSize == oi.packingSize &&
41
+ inv.uom == oi.uom &&
42
+ inv.remainQty);
43
+ if (relatedInventories.length &&
44
+ oi.releaseQty <= inventories.reduce((totalQty, inv) => totalQty + inv.remainQty, 0)) {
45
+ let composedWSD = _composeWorksheetDetails(domain, user, worksheet.releaseGood, bizplaceId, oi, relatedInventories);
46
+ accWSD.push(...composedWSD);
47
+ }
48
+ return accWSD;
49
+ }, []);
50
+ let targetInventories = worksheetDetails.map((wsd) => wsd.targetInventory);
51
+ // 5. remove existing worksheet details and its target inventory if there's any
52
+ await _removeOldWorksheetDetails(targetInventories, worksheet.id, tx);
53
+ targetInventories = await tx.getRepository(sales_base_1.OrderInventory).save(targetInventories);
54
+ let newWorksheetDetails = [];
55
+ for (let i = 0, l = targetInventories.length; i < l; i++) {
56
+ const targetInventory = targetInventories[i];
57
+ // 6. update inventory lockedQty and lockedUomValue
58
+ await tx
59
+ .createQueryBuilder()
60
+ .update(warehouse_base_1.Inventory)
61
+ .set({
62
+ lockedQty: () => `COALESCE("locked_qty", 0) + ${targetInventory.releaseQty}`,
63
+ lockedUomValue: () => `COALESCE("locked_uom_value", 0) + ${targetInventory.releaseUomValue}`,
64
+ updater: user
65
+ })
66
+ .where('id = :id', { id: targetInventory.inventory.id })
67
+ .execute();
68
+ // 7. collect new worksheet details records
69
+ const worksheetDetail = Object.assign(new entities_1.WorksheetDetail(), {
70
+ domain,
71
+ bizplace: { id: bizplaceId },
72
+ worksheet,
73
+ name: utils_1.WorksheetNoGenerator.pickingDetail(),
74
+ seq: 0,
75
+ targetInventory,
76
+ type: constants_1.WORKSHEET_TYPE.PICKING,
77
+ status: constants_1.WORKSHEET_STATUS.DEACTIVATED,
78
+ creator: user,
79
+ updater: user
80
+ });
81
+ newWorksheetDetails.push(worksheetDetail);
82
+ }
83
+ // 8. save worksheet details
84
+ await tx.getRepository(entities_1.WorksheetDetail).save(newWorksheetDetails);
85
+ return true;
86
+ }
87
+ catch (error) {
88
+ throw error;
89
+ }
90
+ }
91
+ };
92
+ function _composeWorksheetDetails(domain, user, releaseGood, bizplaceId, record, inventories) {
93
+ let leftReleaseQty = record.releaseQty;
94
+ let leftReleaseUomValue = record.releaseUomValue;
95
+ let compReleaseQty = 0;
96
+ let compReleaseUomValue = 0;
97
+ let worksheetDetails = [];
98
+ let idx = 0;
99
+ while (compReleaseQty < record.releaseQty) {
100
+ const inv = inventories[idx];
101
+ let releaseQty = 0;
102
+ let releaseUomValue = 0;
103
+ if (inv.remainQty > leftReleaseQty) {
104
+ compReleaseQty += leftReleaseQty;
105
+ compReleaseUomValue += leftReleaseUomValue;
106
+ releaseQty = leftReleaseQty;
107
+ releaseUomValue = leftReleaseUomValue;
108
+ }
109
+ else {
110
+ compReleaseQty += inv.remainQty;
111
+ compReleaseUomValue += inv.remainUomValue;
112
+ leftReleaseQty -= inv.remainQty;
113
+ leftReleaseUomValue -= inv.remainUomValue;
114
+ releaseQty = inv.remainQty;
115
+ releaseUomValue = inv.remainUomValue;
116
+ }
117
+ let worksheetDetail = Object.assign(new entities_1.WorksheetDetail(), {
118
+ targetInventory: {
119
+ domain,
120
+ bizplace: { id: bizplaceId },
121
+ name: sales_base_1.OrderNoGenerator.orderInventory(),
122
+ releaseGood,
123
+ inventory: { id: inv.id },
124
+ product: { id: inv.productId },
125
+ batchId: inv.batchId,
126
+ batchIdRef: inv.batchIdRef,
127
+ packingType: inv.packingType,
128
+ packingSize: inv.packingSize,
129
+ releaseQty,
130
+ releaseUomValue,
131
+ creator: user,
132
+ updater: user,
133
+ status: sales_base_1.ORDER_INVENTORY_STATUS.READY_TO_PICK,
134
+ type: sales_base_1.ORDER_TYPES.RELEASE_OF_GOODS.value
135
+ }
136
+ });
137
+ worksheetDetails.push(worksheetDetail);
138
+ idx++;
139
+ }
140
+ return worksheetDetails;
141
+ }
142
+ async function _removeOldWorksheetDetails(targetInventories, worksheetId, tx) {
143
+ let orderProductJson = JSON.stringify(targetInventories.map((target) => {
144
+ return {
145
+ product_id: target.product.id,
146
+ batch_id: target.batchId,
147
+ packing_type: target.packingType,
148
+ packing_size: target.packingSize
149
+ };
150
+ }));
151
+ // get worksheetDetail IDs and their targetInventory IDs
152
+ let existingOIandWSD = await tx.query(`
153
+ SELECT wsd.id AS "worksheetDetailId", oi.id AS "orderInventoryId"
154
+ FROM order_inventories oi
155
+ INNER JOIN JSON_POPULATE_RECORDSET(NULL::order_products, $1) js ON oi.batch_id = js.batch_id
156
+ AND oi.product_id = js.product_id
157
+ AND oi.packing_type = js.packing_type
158
+ AND oi.packing_size = js.packing_size
159
+ LEFT JOIN worksheet_details wsd ON oi.id = wsd.target_inventory_id
160
+ WHERE oi.release_good_id = $2
161
+ `, [orderProductJson, worksheetId]);
162
+ // if found the records then delete, so that we can create new records
163
+ if (existingOIandWSD.length) {
164
+ await tx.getRepository(entities_1.WorksheetDetail).delete(existingOIandWSD.map((wsd) => wsd.worksheetDetailId));
165
+ await tx.getRepository(sales_base_1.OrderInventory).delete(existingOIandWSD.map((wsd) => wsd.orderInventoryId));
166
+ }
167
+ }
168
+ //# sourceMappingURL=generate-picking-worksheet-details.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-picking-worksheet-details.js","sourceRoot":"","sources":["../../../../server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Mutation = exports.Query = void 0;
4
+ const check_progressing_pallet_1 = require("./check-progressing-pallet");
4
5
  const create_worksheet_detail_1 = require("./create-worksheet-detail");
5
6
  const delete_worksheet_detail_1 = require("./delete-worksheet-detail");
6
- const generate_release_good_worksheet_details_1 = require("./generate-release-good-worksheet-details");
7
7
  const generate_batch_picking_worksheet_details_1 = require("./generate-batch-picking-worksheet-details");
8
8
  const generate_batch_picking_worksheet_details_by_bulk_1 = require("./generate-batch-picking-worksheet-details-by-bulk");
9
- const check_progressing_pallet_1 = require("./check-progressing-pallet");
10
- const generate_pallet_id_1 = require("./generate-pallet-id");
11
9
  const generate_carton_id_1 = require("./generate-carton-id");
10
+ const generate_pallet_id_1 = require("./generate-pallet-id");
11
+ const generate_picking_worksheet_details_1 = require("./generate-picking-worksheet-details");
12
+ const generate_release_good_worksheet_details_1 = require("./generate-release-good-worksheet-details");
12
13
  const update_worksheet_detail_1 = require("./update-worksheet-detail");
13
14
  const worksheet_detail_1 = require("./worksheet-detail");
14
15
  const worksheet_details_1 = require("./worksheet-details");
15
16
  const worksheet_details_by_product_group_1 = require("./worksheet-details-by-product-group");
16
17
  exports.Query = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, worksheet_details_1.worksheetDetailsResolver), worksheet_detail_1.worksheetDetailResolver), worksheet_details_by_product_group_1.worksheetDetailsByProductGroupResolver), check_progressing_pallet_1.checkProgressingPalletResolver), generate_pallet_id_1.generatePalletIdResolver), generate_carton_id_1.generateCartonIdResolver);
17
- exports.Mutation = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, update_worksheet_detail_1.updateWorksheetDetail), create_worksheet_detail_1.createWorksheetDetail), delete_worksheet_detail_1.deleteWorksheetDetail), generate_batch_picking_worksheet_details_1.generateBatchPickingWorksheetDetailsResolver), generate_batch_picking_worksheet_details_by_bulk_1.generateBatchPickingWorksheetDetailsByBulkResolver), generate_release_good_worksheet_details_1.generateReleaseGoodWorksheetDetailsResolver);
18
+ exports.Mutation = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, update_worksheet_detail_1.updateWorksheetDetail), create_worksheet_detail_1.createWorksheetDetail), delete_worksheet_detail_1.deleteWorksheetDetail), generate_batch_picking_worksheet_details_1.generateBatchPickingWorksheetDetailsResolver), generate_batch_picking_worksheet_details_by_bulk_1.generateBatchPickingWorksheetDetailsByBulkResolver), generate_picking_worksheet_details_1.generatePickingWorksheetDetailsResolver), generate_release_good_worksheet_details_1.generateReleaseGoodWorksheetDetailsResolver);
18
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/graphql/resolvers/worksheet-detail/index.ts"],"names":[],"mappings":";;;AAAA,uEAAiE;AACjE,uEAAiE;AACjE,uGAAuG;AACvG,yGAAyG;AACzG,yHAAuH;AACvH,yEAA2E;AAC3E,6DAA+D;AAC/D,6DAA+D;AAC/D,uEAAiE;AACjE,yDAA4D;AAC5D,2DAA8D;AAC9D,6FAA6F;AAEhF,QAAA,KAAK,2FACb,4CAAwB,GACxB,0CAAuB,GACvB,2EAAsC,GACtC,yDAA8B,GAC9B,6CAAwB,GACxB,6CAAwB,EAC5B;AAEY,QAAA,QAAQ,2FAChB,+CAAqB,GACrB,+CAAqB,GACrB,+CAAqB,GACrB,uFAA4C,GAC5C,qGAAkD,GAClD,qFAA2C,EAC/C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/graphql/resolvers/worksheet-detail/index.ts"],"names":[],"mappings":";;;AAAA,yEAA2E;AAC3E,uEAAiE;AACjE,uEAAiE;AACjE,yGAAyG;AACzG,yHAAuH;AACvH,6DAA+D;AAC/D,6DAA+D;AAC/D,6FAA8F;AAC9F,uGAAuG;AACvG,uEAAiE;AACjE,yDAA4D;AAC5D,2DAA8D;AAC9D,6FAA6F;AAEhF,QAAA,KAAK,2FACb,4CAAwB,GACxB,0CAAuB,GACvB,2EAAsC,GACtC,yDAA8B,GAC9B,6CAAwB,GACxB,6CAAwB,EAC5B;AAEY,QAAA,QAAQ,yGAChB,+CAAqB,GACrB,+CAAqB,GACrB,+CAAqB,GACrB,uFAA4C,GAC5C,qGAAkD,GAClD,4EAAuC,GACvC,qFAA2C,EAC/C"}
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Types = exports.Query = exports.Mutation = void 0;
4
+ const inventory_detail_1 = require("./inventory-detail");
4
5
  const new_worksheet_detail_1 = require("./new-worksheet-detail");
6
+ const pallet_info_1 = require("./pallet-info");
5
7
  const worksheet_detail_1 = require("./worksheet-detail");
6
8
  const worksheet_detail_list_1 = require("./worksheet-detail-list");
7
9
  const worksheet_detail_patch_1 = require("./worksheet-detail-patch");
8
- const pallet_info_1 = require("./pallet-info");
9
- const inventory_detail_1 = require("./inventory-detail");
10
10
  exports.Mutation = `
11
11
  createWorksheetDetail (
12
12
  worksheetDetail: NewWorksheetDetail!
@@ -46,6 +46,14 @@ exports.Mutation = `
46
46
  pickingStrategy: String!
47
47
  ): Boolean @transaction
48
48
 
49
+ generatePickingWorksheetDetails(
50
+ bizplaceId: String!
51
+ selectedItems: [OrderInventoryPatch]!
52
+ pickingStrategy: String!
53
+ worksheetNo: String!
54
+ locationSortingRules: [Sorting]
55
+ ): Boolean @transaction
56
+
49
57
  `;
50
58
  exports.Query = `
51
59
  worksheetDetails(filters: [Filter], pagination: Pagination, sortings: [Sorting]): WorksheetDetailList @transaction
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/graphql/types/worksheet-detail/index.ts"],"names":[],"mappings":";;;AAAA,iEAA2D;AAC3D,yDAAoD;AACpD,mEAA6D;AAC7D,qEAA+D;AAC/D,+CAA0C;AAC1C,yDAAoD;AAEvC,QAAA,QAAQ,GAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCrC,CAAA;AAEY,QAAA,KAAK,GAAiB;;;;;;;CAOlC,CAAA;AAEY,QAAA,KAAK,GAAG;IACnB,kCAAe;IACf,yCAAkB;IAClB,6CAAoB;IACpB,2CAAmB;IACnB,wBAAU;IACV,kCAAe;CAChB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/graphql/types/worksheet-detail/index.ts"],"names":[],"mappings":";;;AAAA,yDAAoD;AACpD,iEAA2D;AAC3D,+CAA0C;AAC1C,yDAAoD;AACpD,mEAA6D;AAC7D,qEAA+D;AAElD,QAAA,QAAQ,GAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+CrC,CAAA;AAEY,QAAA,KAAK,GAAiB;;;;;;;CAOlC,CAAA;AAEY,QAAA,KAAK,GAAG;IACnB,kCAAe;IACf,yCAAkB;IAClB,6CAAoB;IACpB,2CAAmB;IACnB,wBAAU;IACV,kCAAe;CAChB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/worksheet-base",
3
- "version": "4.1.15",
3
+ "version": "4.1.20",
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": "^4.1.15",
28
- "@things-factory/biz-base": "^4.1.15",
29
- "@things-factory/document-template-base": "^4.1.15",
30
- "@things-factory/id-rule-base": "^4.1.15",
31
- "@things-factory/integration-lmd": "^4.1.15",
32
- "@things-factory/integration-marketplace": "^4.1.15",
33
- "@things-factory/integration-sellercraft": "^4.1.15",
34
- "@things-factory/integration-sftp": "^4.1.15",
35
- "@things-factory/marketplace-base": "^4.1.15",
36
- "@things-factory/notification": "^4.1.15",
37
- "@things-factory/sales-base": "^4.1.15",
38
- "@things-factory/setting-base": "^4.1.15",
39
- "@things-factory/shell": "^4.1.15",
40
- "@things-factory/transport-base": "^4.1.15",
41
- "@things-factory/warehouse-base": "^4.1.15"
27
+ "@things-factory/auth-base": "^4.1.19",
28
+ "@things-factory/biz-base": "^4.1.19",
29
+ "@things-factory/document-template-base": "^4.1.19",
30
+ "@things-factory/id-rule-base": "^4.1.19",
31
+ "@things-factory/integration-lmd": "^4.1.19",
32
+ "@things-factory/integration-marketplace": "^4.1.19",
33
+ "@things-factory/integration-sellercraft": "^4.1.19",
34
+ "@things-factory/integration-sftp": "^4.1.20",
35
+ "@things-factory/marketplace-base": "^4.1.19",
36
+ "@things-factory/notification": "^4.1.19",
37
+ "@things-factory/sales-base": "^4.1.20",
38
+ "@things-factory/setting-base": "^4.1.19",
39
+ "@things-factory/shell": "^4.1.19",
40
+ "@things-factory/transport-base": "^4.1.19",
41
+ "@things-factory/warehouse-base": "^4.1.19"
42
42
  },
43
- "gitHead": "d4839545ae5c0a29d1ab0237d90f724bba252d2b"
43
+ "gitHead": "0b69ffb74cfc1810aebe5824cc5076224d9bad02"
44
44
  }
@@ -0,0 +1,243 @@
1
+ import { EntityManager } from 'typeorm'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import {
5
+ ORDER_INVENTORY_STATUS,
6
+ ORDER_TYPES,
7
+ OrderInventory,
8
+ OrderInventoryPatch,
9
+ OrderNoGenerator,
10
+ ReleaseGood
11
+ } from '@things-factory/sales-base'
12
+ import { Setting } from '@things-factory/setting-base'
13
+ import { Domain } from '@things-factory/shell'
14
+ import { getInventoriesByStrategy, Inventory } from '@things-factory/warehouse-base'
15
+
16
+ import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../constants'
17
+ import { Worksheet, WorksheetDetail } from '../../../entities'
18
+ import { WorksheetNoGenerator } from '../../../utils'
19
+
20
+ export const generatePickingWorksheetDetailsResolver = {
21
+ async generatePickingWorksheetDetails(
22
+ _: any,
23
+ { bizplaceId, selectedItems, pickingStrategy, worksheetNo, locationSortingRules },
24
+ context: any
25
+ ): Promise<Boolean> {
26
+ const { tx, user, domain }: { tx: EntityManager; user: User; domain: Domain } = context.state
27
+
28
+ // 1. find related worksheet
29
+ const worksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
30
+ where: { name: worksheetNo, status: WORKSHEET_STATUS.DEACTIVATED, domain },
31
+ relations: ['releaseGood']
32
+ })
33
+
34
+ if (!worksheet) throw new Error('picking worksheet not found')
35
+ const worksheetId = worksheet.id
36
+
37
+ // 2. search for sorting rules
38
+ const inventoryAssignmentSetting: Setting = await tx.getRepository(Setting).findOne({
39
+ where: { domain, name: 'rule-for-inventory-assignment' }
40
+ })
41
+
42
+ if (!locationSortingRules && inventoryAssignmentSetting) {
43
+ locationSortingRules = []
44
+ let locationSetting = JSON.parse(inventoryAssignmentSetting.value)
45
+ for (const key in locationSetting) {
46
+ locationSortingRules.push({ name: key, desc: locationSetting[key] == 'ASC' ? false : true })
47
+ }
48
+ }
49
+
50
+ try {
51
+ // 3. get all related inventories by strategy
52
+ let inventories: any[] = await getInventoriesByStrategy(
53
+ domain.id,
54
+ bizplaceId,
55
+ worksheetId,
56
+ selectedItems,
57
+ pickingStrategy,
58
+ locationSortingRules,
59
+ tx
60
+ )
61
+
62
+ // 4. get worksheet details
63
+ let worksheetDetails: WorksheetDetail[] = selectedItems.reduce(
64
+ (accWSD: WorksheetDetail[], oi: OrderInventoryPatch) => {
65
+ const relatedInventories = inventories.filter(
66
+ inv =>
67
+ inv.productId == oi.productId &&
68
+ inv.batchId == oi.batchId &&
69
+ inv.packingType == oi.packingType &&
70
+ inv.packingSize == oi.packingSize &&
71
+ inv.uom == oi.uom &&
72
+ inv.remainQty
73
+ )
74
+
75
+ if (
76
+ relatedInventories.length &&
77
+ oi.releaseQty <= inventories.reduce((totalQty: number, inv) => totalQty + inv.remainQty, 0)
78
+ ) {
79
+ let composedWSD: WorksheetDetail[] = _composeWorksheetDetails(
80
+ domain,
81
+ user,
82
+ worksheet.releaseGood,
83
+ bizplaceId,
84
+ oi,
85
+ relatedInventories
86
+ )
87
+
88
+ accWSD.push(...composedWSD)
89
+ }
90
+
91
+ return accWSD
92
+ },
93
+ []
94
+ )
95
+
96
+ let targetInventories: OrderInventory = worksheetDetails.map((wsd: WorksheetDetail) => wsd.targetInventory)
97
+
98
+ // 5. remove existing worksheet details and its target inventory if there's any
99
+ await _removeOldWorksheetDetails(targetInventories, worksheet.id, tx)
100
+
101
+ targetInventories = await tx.getRepository(OrderInventory).save(targetInventories)
102
+
103
+ let newWorksheetDetails: WorksheetDetail[] = []
104
+
105
+ for (let i = 0, l = targetInventories.length; i < l; i++) {
106
+ const targetInventory: OrderInventory = targetInventories[i]
107
+
108
+ // 6. update inventory lockedQty and lockedUomValue
109
+ await tx
110
+ .createQueryBuilder()
111
+ .update(Inventory)
112
+ .set({
113
+ lockedQty: () => `COALESCE("locked_qty", 0) + ${targetInventory.releaseQty}`,
114
+ lockedUomValue: () => `COALESCE("locked_uom_value", 0) + ${targetInventory.releaseUomValue}`,
115
+ updater: user
116
+ })
117
+ .where('id = :id', { id: targetInventory.inventory.id })
118
+ .execute()
119
+
120
+ // 7. collect new worksheet details records
121
+ const worksheetDetail: WorksheetDetail = Object.assign(new WorksheetDetail(), {
122
+ domain,
123
+ bizplace: { id: bizplaceId },
124
+ worksheet,
125
+ name: WorksheetNoGenerator.pickingDetail(),
126
+ seq: 0,
127
+ targetInventory,
128
+ type: WORKSHEET_TYPE.PICKING,
129
+ status: WORKSHEET_STATUS.DEACTIVATED,
130
+ creator: user,
131
+ updater: user
132
+ })
133
+
134
+ newWorksheetDetails.push(worksheetDetail)
135
+ }
136
+
137
+ // 8. save worksheet details
138
+ await tx.getRepository(WorksheetDetail).save(newWorksheetDetails)
139
+
140
+ return true
141
+ } catch (error) {
142
+ throw error
143
+ }
144
+ }
145
+ }
146
+
147
+ function _composeWorksheetDetails(
148
+ domain: Domain,
149
+ user: User,
150
+ releaseGood: ReleaseGood,
151
+ bizplaceId: string,
152
+ record: OrderInventoryPatch,
153
+ inventories: Inventory[]
154
+ ): WorksheetDetail[] {
155
+ let leftReleaseQty: number = record.releaseQty
156
+ let leftReleaseUomValue: number = record.releaseUomValue
157
+ let compReleaseQty: number = 0
158
+ let compReleaseUomValue: number = 0
159
+
160
+ let worksheetDetails: Partial<WorksheetDetail[]> = []
161
+ let idx = 0
162
+
163
+ while (compReleaseQty < record.releaseQty) {
164
+ const inv = inventories[idx]
165
+ let releaseQty: number = 0
166
+ let releaseUomValue: number = 0
167
+
168
+ if (inv.remainQty > leftReleaseQty) {
169
+ compReleaseQty += leftReleaseQty
170
+ compReleaseUomValue += leftReleaseUomValue
171
+ releaseQty = leftReleaseQty
172
+ releaseUomValue = leftReleaseUomValue
173
+ } else {
174
+ compReleaseQty += inv.remainQty
175
+ compReleaseUomValue += inv.remainUomValue
176
+ leftReleaseQty -= inv.remainQty
177
+ leftReleaseUomValue -= inv.remainUomValue
178
+ releaseQty = inv.remainQty
179
+ releaseUomValue = inv.remainUomValue
180
+ }
181
+
182
+ let worksheetDetail: WorksheetDetail = Object.assign(new WorksheetDetail(), {
183
+ targetInventory: {
184
+ domain,
185
+ bizplace: { id: bizplaceId },
186
+ name: OrderNoGenerator.orderInventory(),
187
+ releaseGood,
188
+ inventory: { id: inv.id },
189
+ product: { id: inv.productId },
190
+ batchId: inv.batchId,
191
+ batchIdRef: inv.batchIdRef,
192
+ packingType: inv.packingType,
193
+ packingSize: inv.packingSize,
194
+ releaseQty,
195
+ releaseUomValue,
196
+ creator: user,
197
+ updater: user,
198
+ status: ORDER_INVENTORY_STATUS.READY_TO_PICK,
199
+ type: ORDER_TYPES.RELEASE_OF_GOODS.value
200
+ }
201
+ })
202
+
203
+ worksheetDetails.push(worksheetDetail)
204
+
205
+ idx++
206
+ }
207
+
208
+ return worksheetDetails
209
+ }
210
+
211
+ async function _removeOldWorksheetDetails(targetInventories: OrderInventory[], worksheetId: string, tx: EntityManager) {
212
+ let orderProductJson = JSON.stringify(
213
+ targetInventories.map((target: OrderInventory) => {
214
+ return {
215
+ product_id: target.product.id,
216
+ batch_id: target.batchId,
217
+ packing_type: target.packingType,
218
+ packing_size: target.packingSize
219
+ }
220
+ })
221
+ )
222
+
223
+ // get worksheetDetail IDs and their targetInventory IDs
224
+ let existingOIandWSD: WorksheetDetail[] = await tx.query(
225
+ `
226
+ SELECT wsd.id AS "worksheetDetailId", oi.id AS "orderInventoryId"
227
+ FROM order_inventories oi
228
+ INNER JOIN JSON_POPULATE_RECORDSET(NULL::order_products, $1) js ON oi.batch_id = js.batch_id
229
+ AND oi.product_id = js.product_id
230
+ AND oi.packing_type = js.packing_type
231
+ AND oi.packing_size = js.packing_size
232
+ LEFT JOIN worksheet_details wsd ON oi.id = wsd.target_inventory_id
233
+ WHERE oi.release_good_id = $2
234
+ `,
235
+ [orderProductJson, worksheetId]
236
+ )
237
+
238
+ // if found the records then delete, so that we can create new records
239
+ if (existingOIandWSD.length) {
240
+ await tx.getRepository(WorksheetDetail).delete(existingOIandWSD.map((wsd: any) => wsd.worksheetDetailId))
241
+ await tx.getRepository(OrderInventory).delete(existingOIandWSD.map((wsd: any) => wsd.orderInventoryId))
242
+ }
243
+ }
@@ -1,11 +1,12 @@
1
+ import { checkProgressingPalletResolver } from './check-progressing-pallet'
1
2
  import { createWorksheetDetail } from './create-worksheet-detail'
2
3
  import { deleteWorksheetDetail } from './delete-worksheet-detail'
3
- import { generateReleaseGoodWorksheetDetailsResolver } from './generate-release-good-worksheet-details'
4
4
  import { generateBatchPickingWorksheetDetailsResolver } from './generate-batch-picking-worksheet-details'
5
5
  import { generateBatchPickingWorksheetDetailsByBulkResolver } from './generate-batch-picking-worksheet-details-by-bulk'
6
- import { checkProgressingPalletResolver } from './check-progressing-pallet'
7
- import { generatePalletIdResolver } from './generate-pallet-id'
8
6
  import { generateCartonIdResolver } from './generate-carton-id'
7
+ import { generatePalletIdResolver } from './generate-pallet-id'
8
+ import { generatePickingWorksheetDetailsResolver } from './generate-picking-worksheet-details'
9
+ import { generateReleaseGoodWorksheetDetailsResolver } from './generate-release-good-worksheet-details'
9
10
  import { updateWorksheetDetail } from './update-worksheet-detail'
10
11
  import { worksheetDetailResolver } from './worksheet-detail'
11
12
  import { worksheetDetailsResolver } from './worksheet-details'
@@ -26,5 +27,6 @@ export const Mutation = {
26
27
  ...deleteWorksheetDetail,
27
28
  ...generateBatchPickingWorksheetDetailsResolver,
28
29
  ...generateBatchPickingWorksheetDetailsByBulkResolver,
30
+ ...generatePickingWorksheetDetailsResolver,
29
31
  ...generateReleaseGoodWorksheetDetailsResolver
30
32
  }
@@ -1,9 +1,9 @@
1
+ import { InventoryDetail } from './inventory-detail'
1
2
  import { NewWorksheetDetail } from './new-worksheet-detail'
3
+ import { PalletInfo } from './pallet-info'
2
4
  import { WorksheetDetail } from './worksheet-detail'
3
5
  import { WorksheetDetailList } from './worksheet-detail-list'
4
6
  import { WorksheetDetailPatch } from './worksheet-detail-patch'
5
- import { PalletInfo } from './pallet-info'
6
- import { InventoryDetail } from './inventory-detail'
7
7
 
8
8
  export const Mutation = /* GraphQL */ `
9
9
  createWorksheetDetail (
@@ -44,6 +44,14 @@ export const Mutation = /* GraphQL */ `
44
44
  pickingStrategy: String!
45
45
  ): Boolean @transaction
46
46
 
47
+ generatePickingWorksheetDetails(
48
+ bizplaceId: String!
49
+ selectedItems: [OrderInventoryPatch]!
50
+ pickingStrategy: String!
51
+ worksheetNo: String!
52
+ locationSortingRules: [Sorting]
53
+ ): Boolean @transaction
54
+
47
55
  `
48
56
 
49
57
  export const Query = /* GraphQL */ `