@things-factory/operato-wms 6.0.0-alpha.12 → 6.0.0-alpha.14

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,73 @@
1
+ module.exports = {
2
+ useVirtualHostBasedDomain: false,
3
+ ormconfig: {
4
+ name: 'default',
5
+ type: 'postgres',
6
+ host: 'operato-instance-1.cijhm4n1hbst.ap-southeast-1.rds.amazonaws.com',
7
+ database: 'operato',
8
+ username: 'operato',
9
+ password: 'abcd1234',
10
+ port: 55432,
11
+ synchronize: false,
12
+ logging: true
13
+ },
14
+ reportApiUrl: 'http://localhost:8090/rest/report/show_html',
15
+ storage: {
16
+ type: 's3',
17
+ accessKeyId: 'AKIAUQEOPWEJCDH6AR5H',
18
+ secretAccessKey: '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',
19
+ bucketName: 'opa-one'
20
+ },
21
+ port: 3000,
22
+ uploads: 'uploads',
23
+ attachmentsPath: 'attachments',
24
+ SECRET: '0xD58F835B69D207A76CC5F84a70a1D0d4C79dfC95',
25
+ logger: {
26
+ file: {
27
+ filename: 'logs/application-%DATE%.log',
28
+ datePattern: 'YYYY-MM-DD-HH',
29
+ zippedArchive: true,
30
+ maxSize: '200m',
31
+ maxFiles: '1m',
32
+ level: 'info'
33
+ }
34
+ },
35
+
36
+ email: {
37
+ host: 'smtp.office365.com',
38
+ port: 587,
39
+ secure: false, // true for 465, false for other ports
40
+ auth: {
41
+ user: 'no-reply@hatiolab.com', // generated ethereal user
42
+ pass: 'h@ti0LAB1008' // generated ethereal password
43
+ },
44
+ secureConnection: false,
45
+ tls: {
46
+ ciphers: 'SSLv3'
47
+ }
48
+ },
49
+
50
+ notification: {
51
+ fcm: {
52
+ serviceAccount: {
53
+ project_id: 'operato',
54
+ private_key:
55
+ '-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDYNOfyNjPMSeG9\nzU1qs0cpVK5cVfadcUaw5g+hkQZMOMlAA7uqW2eX4vkayj7MzbYUayH+sei8044Q\nJIyl6f26dNX1VT3UgTmSmCS0v48EBEZHCgusrUGFjduLRN6OS6uvrXW1xKA18k9q\nai1C2EHCXF2AE4PTvf239RC1UIOnVePcMtT7rMTdHRO4s8OKVuSDbzIt8k1cV3Zt\nES0YsJlkELqBisYpV//2/ZSILTt39J9JzrVef03X9kkoo9p+YnNyy6tWsfQPfgJO\nybiRGBNxiyJ/E2pxRo/WqU0go9OzYJlGaSUrUx09heNiRD1b0MAOmyPDJz/6AaTk\nkU/A+kLzAgMBAAECggEADQ5s2gtR53VSujk1V/Xe8e0Di99DwaWUj5w6YhcK7/wX\nPdQRN4Fw6RLeLjL7xeG/rCNSwzm6hKSrQJL5zLnWW7XbMdyQRk6jdmnVAEv3zACi\nFH9+eFK3e+Q214XfgWz/v4p/FZdRLCYni5VBNHcwyWxLLS/V1ynzB3KM1sDiTRmI\npcT7+uTtwrKgJq64sXtFE2pYrFxDdCiyqzkhv/2ed4YIowAjpKBbbcCDKeVxVkoz\nC1P4PAzs9EeUuKSWYrWaUjN17lqtRlYeT1ylR1PIJuWqd4cKfgoEgz+lHwRPDCEX\nAYbk3nofiJIPBhSfCHrXS755wK48mY8vMwFdfCPJeQKBgQDsz4tjYTHdat5A25n5\nekwMxZwFQ5OvMV4eulwZUDMypTAYSz1iB6sDlgwKDm5omZIfuneqCEIvrqxV/kx3\n5wV/DANHO3hYxdp/NV7rM23xmqlaKZhHQbDono1Fm/LP6DEmJiD7N2eFKsXYcPpR\nSAIdCv0X3zkDQ4zRi51yJlCXzQKBgQDpufJBxCoXngiQJ2j14lWVAeOOdQ6zh5Ip\nBcDwF0X67cNSN3Wl40bS4yLFdolhEAyj5m0WPuYYXpjzhHhZ0W3V3ItdBkrmwIvy\nWOWu26qN0ZbwxVS2qVpHuj6iHWJKHuDZZUkFtJg3BeeBSOUHSA8TvjnA0xd83xeb\n8ZJasWoFvwKBgQDFs/gQ/gIdcq0exLfluh5nw0qgcmyHpNWJHdjqITS9IX/nqFkU\n0IYLtmdStf2jQiLmbkydHcvz9wZVvLqml67VBHhwLcwpgPULoskd34/4V0Dvzy4c\nv1Esw8H5zVqIDLeLu+VpFjZMzQrjyl6RIWbyTExEc84rVWfpQYAu3qIGOQKBgAFr\nXatEk7TdAtRNSPflTfu/rTAaSeKROjQBkvBiU8x4US1YpOBDBxUUyAtG8wKh5FHC\nfnsaGq+fM3KXJVv2R6J62mXQOfg4xyDLpWlwcBK4aSBBMoiBcsjouqSlZQlqMpdf\nZBgixqHe6U8BsFJg/6ZxC0y+e3AIss4Bo4/lb+1lAoGAFOexvaBh21K6W3inmRW4\nLlkVYJaBJ20OwokXg5aXjBiHxqmk7VLAuFbkpb5LOKH2xPILRQ0OEkn51yVymS3T\n9lLpHOFTQXt5tF2/F7NW7kaQJNlLr/h5jPi3O9XHeFmuaN2z150ZB6zzgjeGKzr8\ni+1fgTsRfDtNw8xkSH9qL1Y=\n-----END PRIVATE KEY-----\n',
56
+ client_email: 'firebase-adminsdk-xmm2e@operato.iam.gserviceaccount.com'
57
+ },
58
+ appConfig: {
59
+ apiKey: 'AIzaSyDdTM2BTLHSt2LNS0G5QB8G0i4KBXFiG7U',
60
+ projectId: 'operato',
61
+ messagingSenderId: 79537064975,
62
+ appId: '1:79537064975:web:32f53119e9c8c6ee2a277a'
63
+ },
64
+ serverKey:
65
+ 'AAAAEoTHTA8:APA91bGwt-4HT82Dfwf_VwbQaKT0_qHd0Y3tuW41udjWz5Lz0Ko0mEMD6WbHHSILvQpa6yuoGGKCMsrU7VW2qWRrUm3CYpyG9oSwshNm1tIhljAnOuUfwHCoawbVLwf9qlWpHt4dwCoc'
66
+ },
67
+ vapidKey: {
68
+ subject: 'mailto:heartyoh@hatiolab.com',
69
+ publicKey: 'BAkVkITsCXBIsYL1yeaBmx5_dn57we-ZXMjirPPHzC2dan82cdEnAio_53PQ-1_w3ykWCBPrrFAWQ_d9N4cFF0o',
70
+ privateKey: '4pmlt3Wk019u7nqU3Q_oGZE6LbUDjjf8DpmAcn9-iss'
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,113 @@
1
+ module.exports = {
2
+ useVirtualHostBasedDomain: false,
3
+
4
+ ormconfig: {
5
+ name: 'default',
6
+
7
+ type: 'postgres',
8
+
9
+ host: 'operato-instance-1.cijhm4n1hbst.ap-southeast-1.rds.amazonaws.com',
10
+
11
+ database: 'operato',
12
+
13
+ username: 'operato',
14
+
15
+ password: 'abcd1234',
16
+
17
+ port: 55432,
18
+
19
+ synchronize: false,
20
+
21
+ logging: true
22
+ },
23
+
24
+ reportApiUrl: 'http://localhost:8090/rest/report/show_html',
25
+
26
+ storage: {
27
+ type: 's3',
28
+
29
+ accessKeyId: 'AKIAUQEOPWEJCDH6AR5H',
30
+
31
+ secretAccessKey: 'AuDAgmODf9EJNB24OveRhTSLV/OJy6IFFoRxe8k2',
32
+
33
+ bucketName: 'opa-one'
34
+ },
35
+
36
+ port: 3000,
37
+
38
+ uploads: 'uploads',
39
+
40
+ attachmentsPath: 'attachments',
41
+
42
+ SECRET: '0xD58F835B69D207A76CC5F84a70a1D0d4C79dfC95',
43
+
44
+ logger: {
45
+ file: {
46
+ filename: 'logs/application-%DATE%.log',
47
+
48
+ datePattern: 'YYYY-MM-DD-HH',
49
+
50
+ zippedArchive: true,
51
+
52
+ maxSize: '200m',
53
+
54
+ maxFiles: '1m',
55
+
56
+ level: 'info'
57
+ }
58
+ },
59
+
60
+ email: {
61
+ host: 'smtp.office365.com',
62
+
63
+ port: 587,
64
+
65
+ secure: false, // true for 465, false for other ports
66
+
67
+ auth: {
68
+ user: 'no-reply@hatiolab.com', // generated ethereal user
69
+
70
+ pass: 'h@ti0LAB1008' // generated ethereal password
71
+ },
72
+
73
+ secureConnection: false,
74
+
75
+ tls: {
76
+ ciphers: 'SSLv3'
77
+ }
78
+ },
79
+
80
+ notification: {
81
+ fcm: {
82
+ serviceAccount: {
83
+ project_id: 'operato',
84
+
85
+ private_key:
86
+ '-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDYNOfyNjPMSeG9\nzU1qs0cpVK5cVfadcUaw5g+hkQZMOMlAA7uqW2eX4vkayj7MzbYUayH+sei8044Q\nJIyl6f26dNX1VT3UgTmSmCS0v48EBEZHCgusrUGFjduLRN6OS6uvrXW1xKA18k9q\nai1C2EHCXF2AE4PTvf239RC1UIOnVePcMtT7rMTdHRO4s8OKVuSDbzIt8k1cV3Zt\nES0YsJlkELqBisYpV//2/ZSILTt39J9JzrVef03X9kkoo9p+YnNyy6tWsfQPfgJO\nybiRGBNxiyJ/E2pxRo/WqU0go9OzYJlGaSUrUx09heNiRD1b0MAOmyPDJz/6AaTk\nkU/A+kLzAgMBAAECggEADQ5s2gtR53VSujk1V/Xe8e0Di99DwaWUj5w6YhcK7/wX\nPdQRN4Fw6RLeLjL7xeG/rCNSwzm6hKSrQJL5zLnWW7XbMdyQRk6jdmnVAEv3zACi\nFH9+eFK3e+Q214XfgWz/v4p/FZdRLCYni5VBNHcwyWxLLS/V1ynzB3KM1sDiTRmI\npcT7+uTtwrKgJq64sXtFE2pYrFxDdCiyqzkhv/2ed4YIowAjpKBbbcCDKeVxVkoz\nC1P4PAzs9EeUuKSWYrWaUjN17lqtRlYeT1ylR1PIJuWqd4cKfgoEgz+lHwRPDCEX\nAYbk3nofiJIPBhSfCHrXS755wK48mY8vMwFdfCPJeQKBgQDsz4tjYTHdat5A25n5\nekwMxZwFQ5OvMV4eulwZUDMypTAYSz1iB6sDlgwKDm5omZIfuneqCEIvrqxV/kx3\n5wV/DANHO3hYxdp/NV7rM23xmqlaKZhHQbDono1Fm/LP6DEmJiD7N2eFKsXYcPpR\nSAIdCv0X3zkDQ4zRi51yJlCXzQKBgQDpufJBxCoXngiQJ2j14lWVAeOOdQ6zh5Ip\nBcDwF0X67cNSN3Wl40bS4yLFdolhEAyj5m0WPuYYXpjzhHhZ0W3V3ItdBkrmwIvy\nWOWu26qN0ZbwxVS2qVpHuj6iHWJKHuDZZUkFtJg3BeeBSOUHSA8TvjnA0xd83xeb\n8ZJasWoFvwKBgQDFs/gQ/gIdcq0exLfluh5nw0qgcmyHpNWJHdjqITS9IX/nqFkU\n0IYLtmdStf2jQiLmbkydHcvz9wZVvLqml67VBHhwLcwpgPULoskd34/4V0Dvzy4c\nv1Esw8H5zVqIDLeLu+VpFjZMzQrjyl6RIWbyTExEc84rVWfpQYAu3qIGOQKBgAFr\nXatEk7TdAtRNSPflTfu/rTAaSeKROjQBkvBiU8x4US1YpOBDBxUUyAtG8wKh5FHC\nfnsaGq+fM3KXJVv2R6J62mXQOfg4xyDLpWlwcBK4aSBBMoiBcsjouqSlZQlqMpdf\nZBgixqHe6U8BsFJg/6ZxC0y+e3AIss4Bo4/lb+1lAoGAFOexvaBh21K6W3inmRW4\nLlkVYJaBJ20OwokXg5aXjBiHxqmk7VLAuFbkpb5LOKH2xPILRQ0OEkn51yVymS3T\n9lLpHOFTQXt5tF2/F7NW7kaQJNlLr/h5jPi3O9XHeFmuaN2z150ZB6zzgjeGKzr8\ni+1fgTsRfDtNw8xkSH9qL1Y=\n-----END PRIVATE KEY-----\n',
87
+
88
+ client_email: 'firebase-adminsdk-xmm2e@operato.iam.gserviceaccount.com'
89
+ },
90
+
91
+ appConfig: {
92
+ apiKey: 'AIzaSyDdTM2BTLHSt2LNS0G5QB8G0i4KBXFiG7U',
93
+
94
+ projectId: 'operato',
95
+
96
+ messagingSenderId: 79537064975,
97
+
98
+ appId: '1:79537064975:web:32f53119e9c8c6ee2a277a'
99
+ },
100
+
101
+ serverKey:
102
+ 'AAAAEoTHTA8:APA91bGwt-4HT82Dfwf_VwbQaKT0_qHd0Y3tuW41udjWz5Lz0Ko0mEMD6WbHHSILvQpa6yuoGGKCMsrU7VW2qWRrUm3CYpyG9oSwshNm1tIhljAnOuUfwHCoawbVLwf9qlWpHt4dwCoc'
103
+ },
104
+
105
+ vapidKey: {
106
+ subject: 'mailto:heartyoh@hatiolab.com',
107
+
108
+ publicKey: 'BAkVkITsCXBIsYL1yeaBmx5_dn57we-ZXMjirPPHzC2dan82cdEnAio_53PQ-1_w3ykWCBPrrFAWQ_d9N4cFF0o',
109
+
110
+ privateKey: '4pmlt3Wk019u7nqU3Q_oGZE6LbUDjjf8DpmAcn9-iss'
111
+ }
112
+ }
113
+ }
@@ -0,0 +1,291 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.addReleaseGoodProducts = void 0;
4
+ const typeorm_1 = require("typeorm");
5
+ const product_base_1 = require("@things-factory/product-base");
6
+ const sales_base_1 = require("@things-factory/sales-base");
7
+ const warehouse_base_1 = require("@things-factory/warehouse-base");
8
+ const worksheet_base_1 = require("@things-factory/worksheet-base");
9
+ exports.addReleaseGoodProducts = {
10
+ async addReleaseGoodProducts(_, { name, orderInventories, existingOrderInventories }, context) {
11
+ var _a, _b;
12
+ try {
13
+ const { tx, user, domain } = context.state;
14
+ let releaseGood = await tx.getRepository(sales_base_1.ReleaseGood).findOne({
15
+ where: { domain: { id: domain.id }, name: name },
16
+ relations: ['bizplace', 'orderProducts']
17
+ });
18
+ const bizplace = releaseGood.bizplace;
19
+ let pickingWorksheet = await tx.getRepository(worksheet_base_1.Worksheet).findOne({
20
+ where: { releaseGood, type: worksheet_base_1.WORKSHEET_TYPE.PICKING }
21
+ });
22
+ let loadingWorksheet = await tx.getRepository(worksheet_base_1.Worksheet).findOne({
23
+ where: { releaseGood, type: worksheet_base_1.WORKSHEET_TYPE.LOADING }
24
+ });
25
+ if (existingOrderInventories) {
26
+ for (let oi of existingOrderInventories) {
27
+ // map input to OrderInventory Object
28
+ let curOrderInv = Object.assign({}, oi);
29
+ curOrderInv.domain = domain;
30
+ curOrderInv.bizplace = bizplace;
31
+ curOrderInv.releaseGood = releaseGood;
32
+ curOrderInv.product = await tx.getRepository(product_base_1.Product).findOneBy({ id: oi.product.id });
33
+ let existingOrderInv;
34
+ if ((_a = curOrderInv === null || curOrderInv === void 0 ? void 0 : curOrderInv.inventory) === null || _a === void 0 ? void 0 : _a.id) {
35
+ const foundInv = await tx.getRepository(warehouse_base_1.Inventory).findOneBy({ id: curOrderInv.inventory.id });
36
+ curOrderInv.inventory = foundInv;
37
+ existingOrderInv = await tx.getRepository(sales_base_1.OrderInventory).findOne({
38
+ where: {
39
+ releaseGood,
40
+ product: curOrderInv.product,
41
+ batchId: curOrderInv.batchId,
42
+ packingType: curOrderInv.packingType,
43
+ inventory: foundInv
44
+ }
45
+ });
46
+ if (foundInv && foundInv.lockedQty == 0) {
47
+ foundInv.qty += Number(existingOrderInv.releaseQty);
48
+ foundInv.uomValue += Number(existingOrderInv.releaseUomValue);
49
+ foundInv.lockedQty = Number(existingOrderInv.releaseQty);
50
+ foundInv.lockedUomValue = Number(existingOrderInv.releaseUomValue);
51
+ }
52
+ if (curOrderInv.releaseQty < existingOrderInv.pickedQty) {
53
+ throw new Error(`${curOrderInv.inventory.palletId} has already picked ${existingOrderInv.pickedQty}`);
54
+ }
55
+ if (curOrderInv.releaseQty === 0) {
56
+ foundInv.lockedQty = Number(foundInv.lockedQty) - Number(existingOrderInv.releaseQty);
57
+ foundInv.lockedUomValue = Number(foundInv.lockedUomValue) - Number(existingOrderInv.releaseUomValue);
58
+ await tx.getRepository(warehouse_base_1.Inventory).save(foundInv);
59
+ if (existingOrderInv) {
60
+ // if found existing OrderInventory and worksheetDetail then qty, uomValue, and status are updated
61
+ curOrderInv = Object.assign(Object.assign({}, existingOrderInv), { releaseQty: curOrderInv.releaseQty, releaseUomValue: curOrderInv.releaseUomValue, lockedUomValue: curOrderInv.lockedUomValue, status: sales_base_1.ORDER_INVENTORY_STATUS.CANCELLED });
62
+ let existingWorksheetDetail = await tx.getRepository(worksheet_base_1.WorksheetDetail).findOne({
63
+ where: {
64
+ worksheet: pickingWorksheet,
65
+ type: worksheet_base_1.WORKSHEET_TYPE.PICKING,
66
+ targetInventory: curOrderInv
67
+ }
68
+ });
69
+ existingWorksheetDetail = Object.assign(Object.assign({}, existingWorksheetDetail), { status: worksheet_base_1.WORKSHEET_STATUS.CANCELLED });
70
+ await tx.getRepository(worksheet_base_1.WorksheetDetail).save(existingWorksheetDetail);
71
+ await tx.getRepository(sales_base_1.OrderInventory).save(curOrderInv);
72
+ }
73
+ }
74
+ else if (curOrderInv.releaseQty == existingOrderInv.pickedQty) {
75
+ curOrderInv = Object.assign(Object.assign({}, existingOrderInv), { releaseQty: curOrderInv.releaseQty, releaseUomValue: curOrderInv.releaseUomValue, lockedUomValue: curOrderInv.lockedUomValue, status: sales_base_1.ORDER_INVENTORY_STATUS.PICKED });
76
+ let existingWorksheetDetail = await tx.getRepository(worksheet_base_1.WorksheetDetail).findOne({
77
+ where: {
78
+ targetInventory: curOrderInv
79
+ }
80
+ });
81
+ existingWorksheetDetail = Object.assign(Object.assign({}, existingWorksheetDetail), { status: worksheet_base_1.WORKSHEET_STATUS.PICKED });
82
+ await tx.getRepository(worksheet_base_1.WorksheetDetail).save(existingWorksheetDetail);
83
+ await tx.getRepository(sales_base_1.OrderInventory).save(curOrderInv);
84
+ }
85
+ else {
86
+ foundInv.updater = user;
87
+ foundInv.lockedQty =
88
+ foundInv.lockedQty - Number(existingOrderInv.releaseQty) + Number(curOrderInv.releaseQty);
89
+ foundInv.lockedUomValue =
90
+ foundInv.lockedUomValue - Number(existingOrderInv.releaseUomValue) + Number(curOrderInv.releaseUomValue);
91
+ await tx.getRepository(warehouse_base_1.Inventory).save(foundInv);
92
+ if (existingOrderInv) {
93
+ // if found existing OrderInventory and worksheetDetail then qty, uomValue, and status are updated
94
+ curOrderInv = Object.assign(Object.assign({}, existingOrderInv), { releaseQty: curOrderInv.releaseQty, releaseUomValue: curOrderInv.releaseUomValue, status: sales_base_1.ORDER_INVENTORY_STATUS.PICKING });
95
+ let existingWorksheetDetail = await tx.getRepository(worksheet_base_1.WorksheetDetail).findOne({
96
+ where: {
97
+ worksheet: pickingWorksheet,
98
+ type: worksheet_base_1.WORKSHEET_TYPE.PICKING,
99
+ targetInventory: existingOrderInv
100
+ }
101
+ });
102
+ if (existingWorksheetDetail) {
103
+ if (curOrderInv.releaseQty != existingOrderInv.releaseQty) {
104
+ existingWorksheetDetail = Object.assign(Object.assign({}, existingWorksheetDetail), { status: worksheet_base_1.WORKSHEET_STATUS.DEACTIVATED });
105
+ await tx.getRepository(worksheet_base_1.WorksheetDetail).save(existingWorksheetDetail);
106
+ }
107
+ }
108
+ await tx.getRepository(sales_base_1.OrderInventory).save(curOrderInv);
109
+ }
110
+ }
111
+ if (pickingWorksheet) {
112
+ // if has picking worksheet, status will be deactivated to prevent any action from warehouse operator until office admin has confirmation
113
+ pickingWorksheet = Object.assign(Object.assign({}, pickingWorksheet), { status: worksheet_base_1.WORKSHEET_STATUS.DEACTIVATED });
114
+ await tx.getRepository(worksheet_base_1.Worksheet).save(pickingWorksheet);
115
+ }
116
+ if (loadingWorksheet) {
117
+ // if has loading worksheet, status will be deactivated to prevent any action from warehouse operator until office admin has confirmation
118
+ loadingWorksheet = Object.assign(Object.assign({}, loadingWorksheet), { status: worksheet_base_1.WORKSHEET_STATUS.DEACTIVATED });
119
+ await tx.getRepository(worksheet_base_1.Worksheet).save(loadingWorksheet);
120
+ }
121
+ }
122
+ }
123
+ }
124
+ if (orderInventories) {
125
+ for (let oi of orderInventories) {
126
+ // map input to OrderInventory Object
127
+ let newOrderInv = Object.assign({}, oi);
128
+ newOrderInv.domain = domain;
129
+ newOrderInv.bizplace = bizplace;
130
+ newOrderInv.batchId = oi.batchId;
131
+ newOrderInv.packingType = oi.packingType;
132
+ newOrderInv.status = pickingWorksheet ? sales_base_1.ORDER_INVENTORY_STATUS.PICKING : sales_base_1.ORDER_INVENTORY_STATUS.PENDING;
133
+ newOrderInv.name = sales_base_1.OrderNoGenerator.orderInventory();
134
+ newOrderInv.releaseGood = releaseGood;
135
+ newOrderInv.product = await tx.getRepository(product_base_1.Product).findOneBy({ id: oi.product.id });
136
+ newOrderInv.creator = user;
137
+ newOrderInv.updater = user;
138
+ let existingOrderInv;
139
+ let existingOrderProduct = await tx.getRepository(sales_base_1.OrderProduct).findOne({
140
+ where: {
141
+ domain: { id: domain.id },
142
+ releaseGood: { id: releaseGood.id },
143
+ batchId: oi.batchId,
144
+ packingType: oi.packingType,
145
+ product: { id: newOrderInv.product.id }
146
+ }
147
+ });
148
+ // check if it is release by inventory (has inventory value) or product
149
+ if ((_b = newOrderInv.inventory) === null || _b === void 0 ? void 0 : _b.id) {
150
+ // if release by inventory, then quantity and uomValue values are updated
151
+ const foundInv = await tx.getRepository(warehouse_base_1.Inventory).findOneBy({ id: newOrderInv.inventory.id });
152
+ newOrderInv.inventory = foundInv;
153
+ newOrderInv.uom = (oi === null || oi === void 0 ? void 0 : oi.uom) || foundInv.uom;
154
+ newOrderInv.batchIdRef = (oi === null || oi === void 0 ? void 0 : oi.batchIdRef) || foundInv.batchIdRef;
155
+ // check for existing released OrderInventory specifying product, batchId, packingType, and inventory
156
+ existingOrderInv = await tx.getRepository(sales_base_1.OrderInventory).findOne({
157
+ where: {
158
+ releaseGood,
159
+ product: newOrderInv.product,
160
+ batchId: newOrderInv.batchId,
161
+ packingType: newOrderInv.packingType,
162
+ inventory: foundInv
163
+ }
164
+ });
165
+ foundInv.lockedQty = Number(foundInv.lockedQty) + newOrderInv.releaseQty;
166
+ foundInv.lockedUomValue = Number(foundInv.lockedUomValue) + newOrderInv.releaseUomValue;
167
+ foundInv.updater = user;
168
+ let newOrderProduct = Object.assign(new sales_base_1.OrderProduct(), newOrderInv);
169
+ newOrderProduct = Object.assign(Object.assign({}, newOrderProduct), { packQty: 0, actualPackQty: 0, palletQty: 0, actualPalletQty: 0, status: sales_base_1.ORDER_PRODUCT_STATUS.ASSIGNED });
170
+ if (!existingOrderProduct)
171
+ newOrderProduct = await tx.getRepository(sales_base_1.OrderProduct).save(newOrderProduct);
172
+ newOrderInv.orderProduct = existingOrderProduct ? existingOrderProduct : newOrderProduct;
173
+ await tx.getRepository(warehouse_base_1.Inventory).save(foundInv);
174
+ }
175
+ else {
176
+ // check for existing released OrderInventory specifying product, batchId and packingType
177
+ existingOrderInv = await tx.getRepository(sales_base_1.OrderInventory).findOne({
178
+ where: {
179
+ releaseGood,
180
+ product: newOrderInv.product,
181
+ batchId: newOrderInv.batchId,
182
+ packingType: newOrderInv.packingType
183
+ }
184
+ });
185
+ }
186
+ if (existingOrderInv) {
187
+ // if found existing OrderInventory and worksheetDetail then qty, uomValue, and status are updated
188
+ newOrderInv = Object.assign(Object.assign({}, existingOrderInv), { releaseQty: existingOrderInv.status === sales_base_1.ORDER_INVENTORY_STATUS.REPLACED
189
+ ? newOrderInv.releaseQty
190
+ : existingOrderInv.releaseQty + newOrderInv.releaseQty, releaseUomValue: sales_base_1.ORDER_INVENTORY_STATUS.REPLACED
191
+ ? newOrderInv.releaseUomValue
192
+ : existingOrderInv.releaseUomValue + newOrderInv.releaseUomValue, status: existingOrderInv.status === sales_base_1.ORDER_INVENTORY_STATUS.CANCELLED
193
+ ? pickingWorksheet
194
+ ? sales_base_1.ORDER_INVENTORY_STATUS.PICKING
195
+ : sales_base_1.ORDER_INVENTORY_STATUS.PENDING
196
+ : existingOrderInv.status });
197
+ let existingWorksheetDetail = await tx.getRepository(worksheet_base_1.WorksheetDetail).findOne({
198
+ where: {
199
+ worksheet: pickingWorksheet,
200
+ type: worksheet_base_1.WORKSHEET_TYPE.PICKING,
201
+ targetInventory: existingOrderInv
202
+ }
203
+ });
204
+ if (existingWorksheetDetail) {
205
+ existingWorksheetDetail = Object.assign(Object.assign({}, existingWorksheetDetail), { targetProduct: newOrderInv.orderProduct, status: worksheet_base_1.WORKSHEET_STATUS.DEACTIVATED });
206
+ await tx.getRepository(worksheet_base_1.WorksheetDetail).save(existingWorksheetDetail);
207
+ }
208
+ }
209
+ if (pickingWorksheet) {
210
+ // if has picking worksheet, status will be deactivated to prevent any action from warehouse operator until office admin has confirmation
211
+ pickingWorksheet = Object.assign(Object.assign({}, pickingWorksheet), { status: worksheet_base_1.WORKSHEET_STATUS.DEACTIVATED });
212
+ let savedOrderInv = new sales_base_1.OrderInventory();
213
+ savedOrderInv.name = newOrderInv.name;
214
+ savedOrderInv.type = newOrderInv.type;
215
+ savedOrderInv.releaseQty = newOrderInv.releaseQty;
216
+ savedOrderInv.releaseUomValue = newOrderInv.releaseUomValue;
217
+ savedOrderInv.batchId = newOrderInv.batchId;
218
+ savedOrderInv.batchIdRef = newOrderInv.batchIdRef;
219
+ savedOrderInv.packingType = newOrderInv.packingType;
220
+ savedOrderInv.uom = newOrderInv.uom;
221
+ savedOrderInv.product = newOrderInv.product;
222
+ savedOrderInv.inventory = newOrderInv.inventory;
223
+ savedOrderInv.status = newOrderInv.status;
224
+ savedOrderInv.releaseGood = newOrderInv.releaseGood;
225
+ savedOrderInv.orderProduct = newOrderInv.orderProduct;
226
+ savedOrderInv.bizplace = newOrderInv.bizplace;
227
+ savedOrderInv.domain = domain;
228
+ savedOrderInv.creator = user;
229
+ savedOrderInv.updater = user;
230
+ if (newOrderInv === null || newOrderInv === void 0 ? void 0 : newOrderInv.id) {
231
+ // newOrderInv will have id if it was updated from existingOrderInv
232
+ // this solution will remove ix_order-inventory_0 unique error
233
+ // ** please revise this resolver in future. looks like there's few
234
+ // things that can refactor
235
+ savedOrderInv.id = newOrderInv.id;
236
+ }
237
+ savedOrderInv = await tx.getRepository(sales_base_1.OrderInventory).save(savedOrderInv);
238
+ if (!existingOrderInv && pickingWorksheet) {
239
+ // if this is a new orderInventory and has existing worksheet then generate a new worksheet detail for it
240
+ await (0, worksheet_base_1.generatePickingWorksheetDetail)(tx, domain, user, pickingWorksheet, savedOrderInv);
241
+ }
242
+ }
243
+ }
244
+ await tx.getRepository(worksheet_base_1.Worksheet).save(pickingWorksheet);
245
+ }
246
+ if (loadingWorksheet) {
247
+ // if has loading worksheet, status will be deactivated to prevent any action from warehouse operator until office admin has confirmation
248
+ loadingWorksheet = Object.assign(Object.assign({}, loadingWorksheet), { status: worksheet_base_1.WORKSHEET_STATUS.DEACTIVATED });
249
+ await tx.getRepository(worksheet_base_1.Worksheet).save(loadingWorksheet);
250
+ }
251
+ // Update Order Product Release Qty
252
+ let rgOrderProducts = await tx
253
+ .getRepository(sales_base_1.OrderProduct)
254
+ .find({ where: { domain: { id: domain.id }, releaseGood } });
255
+ await Promise.all(rgOrderProducts.map(async (op) => {
256
+ const orderInventories = await tx.getRepository(sales_base_1.OrderInventory).find({
257
+ where: {
258
+ domain: { id: domain.id },
259
+ releaseGood: { id: releaseGood.id },
260
+ orderProduct: { id: op.id },
261
+ status: (0, typeorm_1.Not)((0, typeorm_1.In)([
262
+ sales_base_1.ORDER_INVENTORY_STATUS.TERMINATED,
263
+ sales_base_1.ORDER_INVENTORY_STATUS.CANCELLED,
264
+ sales_base_1.ORDER_INVENTORY_STATUS.PENDING_CANCEL
265
+ ]))
266
+ }
267
+ });
268
+ let totalReleaseQty = orderInventories.reduce((total, currentValue) => {
269
+ total += currentValue.releaseQty;
270
+ return total;
271
+ }, 0);
272
+ let totalReleaseUomValue = orderInventories.reduce((total, currentValue) => {
273
+ total += currentValue.releaseUomValue;
274
+ return total;
275
+ }, 0);
276
+ let updateOPInfo = {
277
+ releaseQty: totalReleaseQty,
278
+ releaseUomValue: totalReleaseUomValue
279
+ };
280
+ if (totalReleaseQty <= 0) {
281
+ updateOPInfo.status = sales_base_1.ORDER_PRODUCT_STATUS.TERMINATED;
282
+ }
283
+ await tx.getRepository(sales_base_1.OrderProduct).update({ id: op.id }, updateOPInfo);
284
+ }));
285
+ }
286
+ catch (error) {
287
+ throw error;
288
+ }
289
+ }
290
+ };
291
+ //# sourceMappingURL=add-release-good-products.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-release-good-products.js","sourceRoot":"","sources":["../../../../server/graphql/resolvers/extra/add-release-good-products.ts"],"names":[],"mappings":"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","sourcesContent":["import { In, Not } from 'typeorm'\n\nimport { Bizplace } from '@things-factory/biz-base'\nimport { Product } from '@things-factory/product-base'\nimport {\n ORDER_INVENTORY_STATUS,\n ORDER_PRODUCT_STATUS,\n OrderInventory,\n OrderNoGenerator,\n OrderProduct,\n ReleaseGood\n} from '@things-factory/sales-base'\nimport { Inventory } from '@things-factory/warehouse-base'\nimport {\n generatePickingWorksheetDetail,\n Worksheet,\n WORKSHEET_STATUS,\n WORKSHEET_TYPE,\n WorksheetDetail\n} from '@things-factory/worksheet-base'\n\nexport const addReleaseGoodProducts = {\n async addReleaseGoodProducts(_: any, { name, orderInventories, existingOrderInventories }, context: ResolverContext) {\n try {\n const { tx, user, domain } = context.state\n\n let releaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({\n where: { domain: { id: domain.id }, name: name },\n relations: ['bizplace', 'orderProducts']\n })\n\n const bizplace: Bizplace = releaseGood.bizplace\n\n let pickingWorksheet: Worksheet = await tx.getRepository(Worksheet).findOne({\n where: { releaseGood, type: WORKSHEET_TYPE.PICKING }\n })\n\n let loadingWorksheet: Worksheet = await tx.getRepository(Worksheet).findOne({\n where: { releaseGood, type: WORKSHEET_TYPE.LOADING }\n })\n\n if (existingOrderInventories) {\n for (let oi of existingOrderInventories) {\n // map input to OrderInventory Object\n let curOrderInv: OrderInventory = Object.assign({}, oi)\n curOrderInv.domain = domain\n curOrderInv.bizplace = bizplace\n curOrderInv.releaseGood = releaseGood\n curOrderInv.product = await tx.getRepository(Product).findOneBy({ id: oi.product.id })\n\n let existingOrderInv: OrderInventory\n\n if (curOrderInv?.inventory?.id) {\n const foundInv: Inventory = await tx.getRepository(Inventory).findOneBy({ id: curOrderInv.inventory.id })\n curOrderInv.inventory = foundInv\n\n existingOrderInv = await tx.getRepository(OrderInventory).findOne({\n where: {\n releaseGood,\n product: curOrderInv.product,\n batchId: curOrderInv.batchId,\n packingType: curOrderInv.packingType,\n inventory: foundInv\n }\n })\n\n if (foundInv && foundInv.lockedQty == 0) {\n foundInv.qty += Number(existingOrderInv.releaseQty)\n foundInv.uomValue += Number(existingOrderInv.releaseUomValue)\n foundInv.lockedQty = Number(existingOrderInv.releaseQty)\n foundInv.lockedUomValue = Number(existingOrderInv.releaseUomValue)\n }\n\n if (curOrderInv.releaseQty < existingOrderInv.pickedQty) {\n throw new Error(`${curOrderInv.inventory.palletId} has already picked ${existingOrderInv.pickedQty}`)\n }\n\n if (curOrderInv.releaseQty === 0) {\n foundInv.lockedQty = Number(foundInv.lockedQty) - Number(existingOrderInv.releaseQty)\n foundInv.lockedUomValue = Number(foundInv.lockedUomValue) - Number(existingOrderInv.releaseUomValue)\n\n await tx.getRepository(Inventory).save(foundInv)\n\n if (existingOrderInv) {\n // if found existing OrderInventory and worksheetDetail then qty, uomValue, and status are updated\n curOrderInv = {\n ...existingOrderInv,\n releaseQty: curOrderInv.releaseQty,\n releaseUomValue: curOrderInv.releaseUomValue,\n lockedUomValue: curOrderInv.lockedUomValue,\n status: ORDER_INVENTORY_STATUS.CANCELLED\n }\n\n let existingWorksheetDetail: WorksheetDetail = await tx.getRepository(WorksheetDetail).findOne({\n where: {\n worksheet: pickingWorksheet,\n type: WORKSHEET_TYPE.PICKING,\n targetInventory: curOrderInv\n }\n })\n\n existingWorksheetDetail = {\n ...existingWorksheetDetail,\n status: WORKSHEET_STATUS.CANCELLED\n }\n await tx.getRepository(WorksheetDetail).save(existingWorksheetDetail)\n await tx.getRepository(OrderInventory).save(curOrderInv)\n }\n } else if (curOrderInv.releaseQty == existingOrderInv.pickedQty) {\n curOrderInv = {\n ...existingOrderInv,\n releaseQty: curOrderInv.releaseQty,\n releaseUomValue: curOrderInv.releaseUomValue,\n lockedUomValue: curOrderInv.lockedUomValue,\n status: ORDER_INVENTORY_STATUS.PICKED\n }\n\n let existingWorksheetDetail: WorksheetDetail = await tx.getRepository(WorksheetDetail).findOne({\n where: {\n targetInventory: curOrderInv\n }\n })\n\n existingWorksheetDetail = {\n ...existingWorksheetDetail,\n status: WORKSHEET_STATUS.PICKED\n }\n\n await tx.getRepository(WorksheetDetail).save(existingWorksheetDetail)\n await tx.getRepository(OrderInventory).save(curOrderInv)\n } else {\n foundInv.updater = user\n foundInv.lockedQty =\n foundInv.lockedQty - Number(existingOrderInv.releaseQty) + Number(curOrderInv.releaseQty)\n foundInv.lockedUomValue =\n foundInv.lockedUomValue - Number(existingOrderInv.releaseUomValue) + Number(curOrderInv.releaseUomValue)\n\n await tx.getRepository(Inventory).save(foundInv)\n\n if (existingOrderInv) {\n // if found existing OrderInventory and worksheetDetail then qty, uomValue, and status are updated\n curOrderInv = {\n ...existingOrderInv,\n releaseQty: curOrderInv.releaseQty,\n releaseUomValue: curOrderInv.releaseUomValue,\n status: ORDER_INVENTORY_STATUS.PICKING\n }\n\n let existingWorksheetDetail: WorksheetDetail = await tx.getRepository(WorksheetDetail).findOne({\n where: {\n worksheet: pickingWorksheet,\n type: WORKSHEET_TYPE.PICKING,\n targetInventory: existingOrderInv\n }\n })\n\n if (existingWorksheetDetail) {\n if (curOrderInv.releaseQty != existingOrderInv.releaseQty) {\n existingWorksheetDetail = {\n ...existingWorksheetDetail,\n status: WORKSHEET_STATUS.DEACTIVATED\n }\n\n await tx.getRepository(WorksheetDetail).save(existingWorksheetDetail)\n }\n }\n\n await tx.getRepository(OrderInventory).save(curOrderInv)\n }\n }\n\n if (pickingWorksheet) {\n // if has picking worksheet, status will be deactivated to prevent any action from warehouse operator until office admin has confirmation\n pickingWorksheet = {\n ...pickingWorksheet,\n status: WORKSHEET_STATUS.DEACTIVATED\n }\n await tx.getRepository(Worksheet).save(pickingWorksheet)\n }\n\n if (loadingWorksheet) {\n // if has loading worksheet, status will be deactivated to prevent any action from warehouse operator until office admin has confirmation\n loadingWorksheet = {\n ...loadingWorksheet,\n status: WORKSHEET_STATUS.DEACTIVATED\n }\n\n await tx.getRepository(Worksheet).save(loadingWorksheet)\n }\n }\n }\n }\n\n if (orderInventories) {\n for (let oi of orderInventories) {\n // map input to OrderInventory Object\n let newOrderInv: OrderInventory = Object.assign({}, oi)\n newOrderInv.domain = domain\n newOrderInv.bizplace = bizplace\n newOrderInv.batchId = oi.batchId\n newOrderInv.packingType = oi.packingType\n newOrderInv.status = pickingWorksheet ? ORDER_INVENTORY_STATUS.PICKING : ORDER_INVENTORY_STATUS.PENDING\n newOrderInv.name = OrderNoGenerator.orderInventory()\n newOrderInv.releaseGood = releaseGood\n newOrderInv.product = await tx.getRepository(Product).findOneBy({ id: oi.product.id })\n newOrderInv.creator = user\n newOrderInv.updater = user\n\n let existingOrderInv: OrderInventory\n\n let existingOrderProduct: OrderProduct = await tx.getRepository(OrderProduct).findOne({\n where: {\n domain: { id: domain.id },\n releaseGood: { id: releaseGood.id },\n batchId: oi.batchId,\n packingType: oi.packingType,\n product: { id: newOrderInv.product.id }\n }\n })\n\n // check if it is release by inventory (has inventory value) or product\n if (newOrderInv.inventory?.id) {\n // if release by inventory, then quantity and uomValue values are updated\n const foundInv: Inventory = await tx.getRepository(Inventory).findOneBy({ id: newOrderInv.inventory.id })\n newOrderInv.inventory = foundInv\n newOrderInv.uom = oi?.uom || foundInv.uom\n newOrderInv.batchIdRef = oi?.batchIdRef || foundInv.batchIdRef\n\n // check for existing released OrderInventory specifying product, batchId, packingType, and inventory\n existingOrderInv = await tx.getRepository(OrderInventory).findOne({\n where: {\n releaseGood,\n product: newOrderInv.product,\n batchId: newOrderInv.batchId,\n packingType: newOrderInv.packingType,\n inventory: foundInv\n }\n })\n\n foundInv.lockedQty = Number(foundInv.lockedQty) + newOrderInv.releaseQty\n foundInv.lockedUomValue = Number(foundInv.lockedUomValue) + newOrderInv.releaseUomValue\n foundInv.updater = user\n\n let newOrderProduct: OrderProduct = Object.assign(new OrderProduct(), newOrderInv)\n newOrderProduct = {\n ...newOrderProduct,\n packQty: 0,\n actualPackQty: 0,\n palletQty: 0,\n actualPalletQty: 0,\n status: ORDER_PRODUCT_STATUS.ASSIGNED\n }\n\n if (!existingOrderProduct) newOrderProduct = await tx.getRepository(OrderProduct).save(newOrderProduct)\n\n newOrderInv.orderProduct = existingOrderProduct ? existingOrderProduct : newOrderProduct\n\n await tx.getRepository(Inventory).save(foundInv)\n } else {\n // check for existing released OrderInventory specifying product, batchId and packingType\n existingOrderInv = await tx.getRepository(OrderInventory).findOne({\n where: {\n releaseGood,\n product: newOrderInv.product,\n batchId: newOrderInv.batchId,\n packingType: newOrderInv.packingType\n }\n })\n }\n\n if (existingOrderInv) {\n // if found existing OrderInventory and worksheetDetail then qty, uomValue, and status are updated\n newOrderInv = {\n ...existingOrderInv,\n releaseQty:\n existingOrderInv.status === ORDER_INVENTORY_STATUS.REPLACED\n ? newOrderInv.releaseQty\n : existingOrderInv.releaseQty + newOrderInv.releaseQty,\n releaseUomValue: ORDER_INVENTORY_STATUS.REPLACED\n ? newOrderInv.releaseUomValue\n : existingOrderInv.releaseUomValue + newOrderInv.releaseUomValue,\n status:\n existingOrderInv.status === ORDER_INVENTORY_STATUS.CANCELLED\n ? pickingWorksheet\n ? ORDER_INVENTORY_STATUS.PICKING\n : ORDER_INVENTORY_STATUS.PENDING\n : existingOrderInv.status\n }\n\n let existingWorksheetDetail: WorksheetDetail = await tx.getRepository(WorksheetDetail).findOne({\n where: {\n worksheet: pickingWorksheet,\n type: WORKSHEET_TYPE.PICKING,\n targetInventory: existingOrderInv\n }\n })\n\n if (existingWorksheetDetail) {\n existingWorksheetDetail = {\n ...existingWorksheetDetail,\n targetProduct: newOrderInv.orderProduct,\n status: WORKSHEET_STATUS.DEACTIVATED\n }\n\n await tx.getRepository(WorksheetDetail).save(existingWorksheetDetail)\n }\n }\n\n if (pickingWorksheet) {\n // if has picking worksheet, status will be deactivated to prevent any action from warehouse operator until office admin has confirmation\n pickingWorksheet = {\n ...pickingWorksheet,\n status: WORKSHEET_STATUS.DEACTIVATED\n }\n\n let savedOrderInv: OrderInventory = new OrderInventory()\n savedOrderInv.name = newOrderInv.name\n savedOrderInv.type = newOrderInv.type\n savedOrderInv.releaseQty = newOrderInv.releaseQty\n savedOrderInv.releaseUomValue = newOrderInv.releaseUomValue\n savedOrderInv.batchId = newOrderInv.batchId\n savedOrderInv.batchIdRef = newOrderInv.batchIdRef\n savedOrderInv.packingType = newOrderInv.packingType\n savedOrderInv.uom = newOrderInv.uom\n savedOrderInv.product = newOrderInv.product\n savedOrderInv.inventory = newOrderInv.inventory\n savedOrderInv.status = newOrderInv.status\n savedOrderInv.releaseGood = newOrderInv.releaseGood\n savedOrderInv.orderProduct = newOrderInv.orderProduct\n savedOrderInv.bizplace = newOrderInv.bizplace\n savedOrderInv.domain = domain\n savedOrderInv.creator = user\n savedOrderInv.updater = user\n\n if (newOrderInv?.id) {\n // newOrderInv will have id if it was updated from existingOrderInv\n // this solution will remove ix_order-inventory_0 unique error\n // ** please revise this resolver in future. looks like there's few\n // things that can refactor\n savedOrderInv.id = newOrderInv.id\n }\n\n savedOrderInv = await tx.getRepository(OrderInventory).save(savedOrderInv)\n\n if (!existingOrderInv && pickingWorksheet) {\n // if this is a new orderInventory and has existing worksheet then generate a new worksheet detail for it\n await generatePickingWorksheetDetail(tx, domain, user, pickingWorksheet, savedOrderInv)\n }\n }\n }\n\n await tx.getRepository(Worksheet).save(pickingWorksheet)\n }\n\n if (loadingWorksheet) {\n // if has loading worksheet, status will be deactivated to prevent any action from warehouse operator until office admin has confirmation\n loadingWorksheet = {\n ...loadingWorksheet,\n status: WORKSHEET_STATUS.DEACTIVATED\n }\n\n await tx.getRepository(Worksheet).save(loadingWorksheet)\n }\n\n // Update Order Product Release Qty\n let rgOrderProducts: OrderProduct[] = await tx\n .getRepository(OrderProduct)\n .find({ where: { domain: { id: domain.id }, releaseGood } })\n\n await Promise.all(\n rgOrderProducts.map(async op => {\n const orderInventories: OrderInventory[] = await tx.getRepository(OrderInventory).find({\n where: {\n domain: { id: domain.id },\n releaseGood: { id: releaseGood.id },\n orderProduct: { id: op.id },\n status: Not(\n In([\n ORDER_INVENTORY_STATUS.TERMINATED,\n ORDER_INVENTORY_STATUS.CANCELLED,\n ORDER_INVENTORY_STATUS.PENDING_CANCEL\n ])\n )\n }\n })\n\n let totalReleaseQty: number = orderInventories.reduce((total, currentValue) => {\n total += currentValue.releaseQty\n return total\n }, 0)\n\n let totalReleaseUomValue: number = orderInventories.reduce((total, currentValue) => {\n total += currentValue.releaseUomValue\n return total\n }, 0)\n\n let updateOPInfo: any = {\n releaseQty: totalReleaseQty,\n releaseUomValue: totalReleaseUomValue\n }\n\n if (totalReleaseQty <= 0) {\n updateOPInfo.status = ORDER_PRODUCT_STATUS.TERMINATED\n }\n\n await tx.getRepository(OrderProduct).update({ id: op.id }, updateOPInfo)\n })\n )\n } catch (error) {\n throw error\n }\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Mutation = void 0;
4
+ const add_release_good_products_1 = require("./add-release-good-products");
5
+ exports.Mutation = Object.assign({}, add_release_good_products_1.addReleaseGoodProducts);
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/graphql/resolvers/extra/index.ts"],"names":[],"mappings":";;;AAAA,2EAAoE;AAEvD,QAAA,QAAQ,qBAChB,kDAAsB,EAC1B","sourcesContent":["import { addReleaseGoodProducts } from './add-release-good-products'\n\nexport const Mutation = {\n ...addReleaseGoodProducts\n}\n"]}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Mutation = void 0;
4
+ exports.Mutation = `
5
+ addReleaseGoodProducts (
6
+ name: String!
7
+ orderInventories: [NewOrderInventory]
8
+ existingOrderInventories: [NewOrderInventory]
9
+ ): Boolean @privilege(category: "order_customer", privilege: "mutation") @transaction
10
+ `;
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/graphql/types/extra/index.ts"],"names":[],"mappings":";;;AAAa,QAAA,QAAQ,GAAiB;;;;;;CAMrC,CAAA","sourcesContent":["export const Mutation = /* GraphQL */ `\n addReleaseGoodProducts (\n name: String!\n orderInventories: [NewOrderInventory]\n existingOrderInventories: [NewOrderInventory]\n ): Boolean @privilege(category: \"order_customer\", privilege: \"mutation\") @transaction\n`\n"]}