@things-factory/warehouse-base 4.0.9 → 4.0.13

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 (55) hide show
  1. package/dist-server/constants/index.js +1 -0
  2. package/dist-server/constants/index.js.map +1 -1
  3. package/dist-server/constants/location.js +3 -2
  4. package/dist-server/constants/location.js.map +1 -1
  5. package/dist-server/constants/rule-type.js +8 -0
  6. package/dist-server/constants/rule-type.js.map +1 -0
  7. package/dist-server/service/inventory/inventory-mutation.js +68 -28
  8. package/dist-server/service/inventory/inventory-mutation.js.map +1 -1
  9. package/dist-server/service/inventory/inventory-query.js +119 -86
  10. package/dist-server/service/inventory/inventory-query.js.map +1 -1
  11. package/dist-server/service/inventory/inventory-types.js +16 -0
  12. package/dist-server/service/inventory/inventory-types.js.map +1 -1
  13. package/dist-server/service/inventory/inventory.js +13 -9
  14. package/dist-server/service/inventory/inventory.js.map +1 -1
  15. package/dist-server/service/inventory-change/inventory-change-mutation.js +7 -9
  16. package/dist-server/service/inventory-change/inventory-change-mutation.js.map +1 -1
  17. package/dist-server/service/inventory-change/inventory-change.js +5 -1
  18. package/dist-server/service/inventory-change/inventory-change.js.map +1 -1
  19. package/dist-server/service/inventory-history/inventory-history-query.js +28 -26
  20. package/dist-server/service/inventory-history/inventory-history-query.js.map +1 -1
  21. package/dist-server/service/inventory-history/inventory-history-types.js +4 -4
  22. package/dist-server/service/inventory-history/inventory-history-types.js.map +1 -1
  23. package/dist-server/service/inventory-history/inventory-history.js +1 -1
  24. package/dist-server/service/inventory-history/inventory-history.js.map +1 -1
  25. package/dist-server/service/location/location-query.js +1 -1
  26. package/dist-server/service/location/location-query.js.map +1 -1
  27. package/dist-server/service/location/location-types.js +24 -0
  28. package/dist-server/service/location/location-types.js.map +1 -1
  29. package/dist-server/service/location/location.js +2 -2
  30. package/dist-server/service/location/location.js.map +1 -1
  31. package/dist-server/utils/datetime-util.js +49 -0
  32. package/dist-server/utils/datetime-util.js.map +1 -0
  33. package/dist-server/utils/index.js +1 -0
  34. package/dist-server/utils/index.js.map +1 -1
  35. package/dist-server/utils/inventory-util.js +104 -37
  36. package/dist-server/utils/inventory-util.js.map +1 -1
  37. package/package.json +8 -8
  38. package/server/constants/index.ts +1 -0
  39. package/server/constants/location.ts +3 -2
  40. package/server/constants/rule-type.ts +4 -0
  41. package/server/service/inventory/inventory-mutation.ts +65 -20
  42. package/server/service/inventory/inventory-query.ts +151 -107
  43. package/server/service/inventory/inventory-types.ts +12 -0
  44. package/server/service/inventory/inventory.ts +13 -10
  45. package/server/service/inventory-change/inventory-change-mutation.ts +10 -11
  46. package/server/service/inventory-change/inventory-change.ts +6 -2
  47. package/server/service/inventory-history/inventory-history-query.ts +27 -28
  48. package/server/service/inventory-history/inventory-history-types.ts +2 -2
  49. package/server/service/inventory-history/inventory-history.ts +2 -2
  50. package/server/service/location/location-query.ts +1 -1
  51. package/server/service/location/location-types.ts +18 -0
  52. package/server/service/location/location.ts +2 -2
  53. package/server/utils/datetime-util.ts +54 -0
  54. package/server/utils/index.ts +1 -0
  55. package/server/utils/inventory-util.ts +162 -39
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DateTimeConverter = exports.DateGenerator = void 0;
4
+ class DateGenerator {
5
+ static generateDate() {
6
+ const today = new Date();
7
+ const year = today.getFullYear();
8
+ const month = today.getMonth();
9
+ const day = today.getDate();
10
+ const yy = String(year).substr(String(year).length - 2);
11
+ const mm = String(month + 1).padStart(2, '0');
12
+ const dd = String(day).padStart(2, '0');
13
+ return yy + mm + dd;
14
+ }
15
+ }
16
+ exports.DateGenerator = DateGenerator;
17
+ class DateTimeConverter {
18
+ static date(dateTime) {
19
+ let unloadDate = '';
20
+ if (dateTime) {
21
+ const unloadDateTime = new Date(dateTime);
22
+ var year = unloadDateTime.getFullYear();
23
+ var month = (1 + unloadDateTime.getMonth()).toString();
24
+ month = month.length > 1 ? month : '0' + month;
25
+ var day = unloadDateTime.getDate().toString();
26
+ day = day.length > 1 ? day : '0' + day;
27
+ unloadDate = day + '-' + month + '-' + year;
28
+ }
29
+ return unloadDate;
30
+ }
31
+ static datetime(dateTime, timezone) {
32
+ let unloadDate = '';
33
+ if (dateTime) {
34
+ const datetime = Number(dateTime);
35
+ const timezoneOffset = timezone * 60000;
36
+ const newUnloadDate = new Date(datetime - timezoneOffset).toISOString().slice(0, -1);
37
+ var dateTimeParts = newUnloadDate.split('T');
38
+ //handle date parts
39
+ var dateParts = dateTimeParts[0].split('-');
40
+ var newDate = DateTimeConverter.date(dateParts);
41
+ //handle time part
42
+ var timeParts = dateTimeParts[1].slice(0, -7);
43
+ unloadDate = newDate + ' ' + timeParts;
44
+ }
45
+ return unloadDate;
46
+ }
47
+ }
48
+ exports.DateTimeConverter = DateTimeConverter;
49
+ //# sourceMappingURL=datetime-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datetime-util.js","sourceRoot":"","sources":["../../server/utils/datetime-util.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAa;IACxB,MAAM,CAAC,YAAY;QACjB,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAA;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;QAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;QAE3B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACvD,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QAC7C,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QAEvC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IACrB,CAAC;CACF;AAbD,sCAaC;AAED,MAAa,iBAAiB;IAC5B,MAAM,CAAC,IAAI,CAAC,QAAQ;QAClB,IAAI,UAAU,GAAG,EAAE,CAAA;QACnB,IAAI,QAAQ,EAAE;YACZ,MAAM,cAAc,GAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC/C,IAAI,IAAI,GAAG,cAAc,CAAC,WAAW,EAAE,CAAA;YAEvC,IAAI,KAAK,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;YACtD,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAA;YAE9C,IAAI,GAAG,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAA;YAC7C,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAA;YAEtC,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,IAAI,CAAA;SAC5C;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ;QAChC,IAAI,UAAU,GAAG,EAAE,CAAA;QACnB,IAAI,QAAQ,EAAE;YACZ,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;YACjC,MAAM,cAAc,GAAG,QAAQ,GAAG,KAAK,CAAA;YACvC,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAEpF,IAAI,aAAa,GAAQ,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAEjD,mBAAmB;YACnB,IAAI,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC3C,IAAI,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAE/C,kBAAkB;YAClB,IAAI,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAE7C,UAAU,GAAG,OAAO,GAAG,GAAG,GAAG,SAAS,CAAA;SACvC;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;CACF;AAtCD,8CAsCC"}
@@ -12,4 +12,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  __exportStar(require("./inventory-no-generator"), exports);
14
14
  __exportStar(require("./inventory-util"), exports);
15
+ __exportStar(require("./datetime-util"), exports);
15
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2DAAwC;AACxC,mDAAgC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2DAAwC;AACxC,mDAAgC;AAChC,kDAA+B"}
@@ -1,11 +1,94 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getProductBundleInventory = exports.checkPalletIdenticallity = exports.checkPalletDuplication = exports.switchLocationStatus = exports.generateInventoryHistory = void 0;
3
+ exports.getProductBundleInventory = exports.checkPalletIdenticallity = exports.checkPalletDuplication = exports.switchLocationStatus = exports.generateInventoryHistory = exports.InventoryUtil = void 0;
4
4
  const typeorm_1 = require("typeorm");
5
5
  const product_base_1 = require("@things-factory/product-base");
6
6
  const constants_1 = require("../constants");
7
7
  const service_1 = require("../service");
8
8
  const utils_1 = require("../utils");
9
+ class InventoryUtil {
10
+ constructor(trxMgr, domain, user) {
11
+ this.ERROR_MSG = {
12
+ FIND: {
13
+ NO_RESULT: (condition) => `There's no results matched with condition ${condition}`,
14
+ NO_CHILD_RESULT: (condition) => `There's no child result matched with condition ${condition}`,
15
+ NOT_MATCH: (source, target) => `Unable to find matching ${target} using ${source}`
16
+ },
17
+ ORDER_ITEM: {
18
+ NO_MATCHING_RESULT: (condition, condition2) => `Current item with ${condition} (${condition2}) not belong to this order`,
19
+ EXCESS_QTY: (condition, condition2, condition3) => `Excess qty is scanned for item ${condition}, ${condition2} (${condition3})`
20
+ },
21
+ PRODUCT: {
22
+ NO_MATCHING_RESULT: (condition, condition2) => `Order packing type and packing size not match with product master, ${condition} (${condition2})`,
23
+ BARCODE_NOT_EXIST: (condition, condition2, condition3) => `Product barcode - ${condition} with ${condition2} ${condition3}, not exist in master data.`
24
+ },
25
+ CREATE: {
26
+ ID_EXISTS: 'Target has ID already',
27
+ EMPTY_CREATOR: 'Cannot create without creator',
28
+ EMPTY_UPDATER: 'Cannot create without updater'
29
+ },
30
+ UPDATE: {
31
+ ID_NOT_EXISTS: `Target doesn't have ID`,
32
+ EMPTY_UPDATER: 'Cannot update without updater'
33
+ },
34
+ VALIDITY: {
35
+ UNEXPECTED_FIELD_VALUE: (field, expectedValue, actualValue) => `Expected ${field} value is ${expectedValue} but got ${actualValue}`,
36
+ DUPLICATED: (field, value) => `There is duplicated ${field} value (${value})`,
37
+ CANT_PROCEED_STEP_BY: (step, reason) => `Can't proceed to ${step} because ${reason}`
38
+ }
39
+ };
40
+ this.trxMgr = trxMgr;
41
+ this.domain = domain;
42
+ this.user = user;
43
+ }
44
+ async createInventory(inventory) {
45
+ inventory = this.setStamp(inventory);
46
+ return await this.trxMgr.getRepository(service_1.Inventory).save(inventory);
47
+ }
48
+ /**
49
+ * @summary Update inventory record
50
+ * @description It will update inventory after set a stamp (domain, updater)
51
+ * The special point of this function is that this changes won't generate inventory history
52
+ * If you want to generate inventory history automatically you would better to use transactionInventory function
53
+ */
54
+ async updateInventory(inventory) {
55
+ if (!inventory.id)
56
+ throw new Error(this.ERROR_MSG.UPDATE.ID_NOT_EXISTS);
57
+ inventory = this.setStamp(inventory);
58
+ return await this.trxMgr.getRepository(service_1.Inventory).save(inventory);
59
+ }
60
+ /**
61
+ * @summary Do transaction on inventory record
62
+ * @description It will update inventory after set a temp (domain, updater)
63
+ * and then generate inventory history based on current changes
64
+ */
65
+ async transactionInventory(inventory, refOrder, changedQty, changedUom, transactionType) {
66
+ if (inventory.id) {
67
+ inventory = await this.updateInventory(inventory);
68
+ }
69
+ else {
70
+ inventory = await this.createInventory(inventory);
71
+ }
72
+ await generateInventoryHistory(inventory, refOrder, transactionType, changedQty, changedUom, this.user, this.trxMgr);
73
+ return inventory;
74
+ }
75
+ /**
76
+ * @summary set common stamp like domain, creator, updater
77
+ * @description Set common stamp to passed record
78
+ * If it doesn't have id it will handle it as creating one
79
+ * If it has id it will handle it as updating one
80
+ */
81
+ setStamp(record) {
82
+ if (!record.domain)
83
+ record.domain = this.domain;
84
+ if (!record.id && !record.creator)
85
+ record.creator = this.user;
86
+ if (!record.updater)
87
+ record.updater = this.user;
88
+ return record;
89
+ }
90
+ }
91
+ exports.InventoryUtil = InventoryUtil;
9
92
  /**
10
93
  * @description It will insert new record into inventory histories table.
11
94
  * seq will be calculated based on number of records for one specific pallet id (provided by inventory object)
@@ -33,50 +116,34 @@ async function generateInventoryHistory(inventory, refOrder, transactionType, qt
33
116
  let openingUomValue = 0;
34
117
  if (seq) {
35
118
  const lastInvHistory = await invHistoryRepo.findOne({
36
- domain: inventory.domain,
37
- palletId: inventory.palletId,
38
- seq: seq - 1
119
+ where: {
120
+ domain: inventory.domain,
121
+ palletId: inventory.palletId,
122
+ },
123
+ order: {
124
+ seq: 'DESC'
125
+ },
39
126
  });
40
127
  openingQty = lastInvHistory.openingQty + lastInvHistory.qty;
41
128
  openingUomValue = lastInvHistory.openingUomValue + lastInvHistory.uomValue;
42
129
  }
130
+ let remainQty = ((openingQty || 0) + (qty || 0));
43
131
  let inventoryHistory = new service_1.InventoryHistory();
44
- inventoryHistory.name = utils_1.InventoryNoGenerator.inventoryHistoryName();
45
- inventoryHistory.description = inventory.description;
46
- inventoryHistory.seq = seq;
47
- inventoryHistory.palletId = inventory.palletId;
48
- inventoryHistory.cartonId = inventory.cartonId;
49
- inventoryHistory.batchId = inventory.batchId;
50
- inventoryHistory.batchIdRef = inventory.batchIdRef;
51
- inventoryHistory.status = inventory.status;
52
- inventoryHistory.transactionType = transactionType;
53
- inventoryHistory.refOrderId = (refOrder === null || refOrder === void 0 ? void 0 : refOrder.id) || null;
54
- inventoryHistory.orderNo = (refOrder === null || refOrder === void 0 ? void 0 : refOrder.name) || null;
55
- inventoryHistory.orderRefNo = (refOrder === null || refOrder === void 0 ? void 0 : refOrder.refNo) || null;
56
- inventoryHistory.inventory = inventory;
57
- inventoryHistory.product = inventory.product;
58
- inventoryHistory.reusablePallet = inventory.reusablePallet;
59
- inventoryHistory.zone = inventory.zone;
60
- inventoryHistory.warehouse = inventory.warehouse;
61
- inventoryHistory.location = inventory.location;
62
- inventoryHistory.expirationDate = inventory.expirationDate;
63
- inventoryHistory.packingType = inventory.packingType;
64
- inventoryHistory.uom = inventory.uom;
65
- inventoryHistory.qty = qty;
66
- inventoryHistory.openingQty = openingQty;
67
- inventoryHistory.uomValue = uomValue;
68
- inventoryHistory.openingUomValue = openingUomValue;
69
- inventoryHistory.unitCost = inventory.unitCost;
70
- inventoryHistory.domain = inventory.domain;
71
- inventoryHistory.bizplace = inventory.bizplace;
72
- inventoryHistory.creator = user;
73
- inventoryHistory.updater = user;
74
- inventoryHistory = await invHistoryRepo.save(inventoryHistory);
132
+ inventoryHistory = Object.assign(Object.assign({}, inventory), { name: utils_1.InventoryNoGenerator.inventoryHistoryName(), inventory, seq: seq - 1, status: remainQty == 0 ? constants_1.INVENTORY_STATUS.TERMINATED : inventory.status, transactionType, refOrderId: (refOrder === null || refOrder === void 0 ? void 0 : refOrder.id) || null, orderNo: (refOrder === null || refOrder === void 0 ? void 0 : refOrder.name) || null, orderRefNo: (refOrder === null || refOrder === void 0 ? void 0 : refOrder.refNo) || null, qty,
133
+ openingQty,
134
+ uomValue, openingUomValue: openingUomValue, creator: user, updater: user });
135
+ let newInventoryHistory = await invHistoryRepo.save(inventoryHistory);
136
+ if (remainQty == 0) {
137
+ let terminatedHistory = Object.assign(Object.assign({}, newInventoryHistory), { name: utils_1.InventoryNoGenerator.inventoryHistoryName(), seq: seq + 1, status: constants_1.INVENTORY_STATUS.TERMINATED, transactionType: constants_1.INVENTORY_TRANSACTION_TYPE.TERMINATED, uom: inventory.uom, qty: 0, openingQty: 0, uomValue: 0, openingUomValue: 0 });
138
+ delete terminatedHistory.id;
139
+ newInventoryHistory = await invHistoryRepo.save(terminatedHistory);
140
+ inventory.status = constants_1.INVENTORY_STATUS.TERMINATED;
141
+ }
75
142
  if (inventory.lastSeq !== seq) {
76
- await invRepo.save(Object.assign(Object.assign({}, inventory), { lastSeq: inventoryHistory.seq, updater: user }));
143
+ await invRepo.save(Object.assign(Object.assign({}, inventory), { lastSeq: newInventoryHistory.seq, updater: user }));
77
144
  }
78
145
  await switchLocationStatus(domain, location, user, trxMgr);
79
- return inventoryHistory;
146
+ return newInventoryHistory;
80
147
  }
81
148
  exports.generateInventoryHistory = generateInventoryHistory;
82
149
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"inventory-util.js","sourceRoot":"","sources":["../../server/utils/inventory-util.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inventory-util.js","sourceRoot":"","sources":["../../server/utils/inventory-util.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/warehouse-base",
3
- "version": "4.0.9",
3
+ "version": "4.0.13",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.js",
6
6
  "things-factory": true,
@@ -24,12 +24,12 @@
24
24
  "migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
25
25
  },
26
26
  "dependencies": {
27
- "@things-factory/biz-base": "^4.0.9",
28
- "@things-factory/id-rule-base": "^4.0.9",
29
- "@things-factory/integration-sellercraft": "^4.0.9",
30
- "@things-factory/marketplace-base": "^4.0.9",
31
- "@things-factory/product-base": "^4.0.9",
32
- "@things-factory/setting-base": "^4.0.9"
27
+ "@things-factory/biz-base": "^4.0.13",
28
+ "@things-factory/id-rule-base": "^4.0.13",
29
+ "@things-factory/integration-sellercraft": "^4.0.13",
30
+ "@things-factory/marketplace-base": "^4.0.13",
31
+ "@things-factory/product-base": "^4.0.13",
32
+ "@things-factory/setting-base": "^4.0.13"
33
33
  },
34
- "gitHead": "81c8ae24487cfe79da62717f12bb6752761911ae"
34
+ "gitHead": "a542fdd4e7c447c3b571fe91c92f5919561bdc2c"
35
35
  }
@@ -1,3 +1,4 @@
1
1
  export * from './inventory'
2
2
  export * from './location'
3
3
  export * from './pallet'
4
+ export * from './rule-type'
@@ -8,6 +8,7 @@ export const LOCATION_TYPE = {
8
8
  BUFFER: 'BUFFER',
9
9
  SHELF: 'SHELF',
10
10
  FLOOR: 'FLOOR',
11
- MIXED: 'MIXED',
12
- BIN: 'BIN'
11
+ BIN: 'BIN',
12
+ QUARANTINE: 'QUARANTINE',
13
+ RESERVE: 'RESERVE'
13
14
  }
@@ -0,0 +1,4 @@
1
+ export const RULE_TYPE = {
2
+ LOT_NUMBER_ID: 'inbound_pallet_id',
3
+ CARTON_NUMBER_ID: 'inbound_carton_id'
4
+ }
@@ -4,10 +4,11 @@ import { EntityManager, In, MoreThan, SelectQueryBuilder } from 'typeorm'
4
4
  import { User } from '@things-factory/auth-base'
5
5
  import { Bizplace } from '@things-factory/biz-base'
6
6
  import { Product } from '@things-factory/product-base'
7
+ import { generateId } from '@things-factory/id-rule-base'
7
8
  import { Domain } from '@things-factory/shell'
8
9
 
9
- import { INVENTORY_STATUS, INVENTORY_TRANSACTION_TYPE } from '../../constants'
10
- import { generateInventoryHistory, InventoryNoGenerator } from '../../utils'
10
+ import { RULE_TYPE, INVENTORY_STATUS, INVENTORY_TRANSACTION_TYPE } from '../../constants'
11
+ import { generateInventoryHistory, InventoryNoGenerator, InventoryUtil, DateGenerator } from '../../utils'
11
12
  import { InventoryHistory } from '../inventory-history/inventory-history'
12
13
  import { Location } from '../location/location'
13
14
  import { Inventory } from './inventory'
@@ -334,10 +335,12 @@ export class InventoryMutation {
334
335
  @Directive('@transaction')
335
336
  @Mutation(returns => Boolean)
336
337
  async inventoryTransfer(
337
- @Arg('palletId') palletId: string,
338
- @Arg('cartonId') cartonId: string,
338
+ @Arg('originPalletId') originPalletId: string,
339
+ @Arg('palletId', { nullable: true }) palletId: string,
340
+ @Arg('cartonId', { nullable: true }) cartonId: string,
339
341
  @Arg('fromLocationName') fromLocationName: string,
340
342
  @Arg('toLocationName') toLocationName: string,
343
+ @Arg('qty') qty: number,
341
344
  @Ctx() context: any
342
345
  ): Promise<Boolean> {
343
346
  const { domain, user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state
@@ -349,36 +352,78 @@ export class InventoryMutation {
349
352
  })
350
353
  if (!toLocation) throw new Error(`To location doesn't exists`)
351
354
 
352
- const fromLocation: Location = await tx.getRepository(Location).findOne({
353
- where: { domain: domain, name: fromLocationName },
354
- relations: ['domain', 'warehouse']
355
- })
356
- if (!toLocation) throw new Error(`From location doesn't exists`)
355
+ if (qty < 0) throw new Error(`Invalid quantity`)
357
356
 
358
357
  // 2. search for related inventory
359
358
  const invQb: SelectQueryBuilder<Inventory> = await tx
360
359
  .getRepository(Inventory)
361
360
  .createQueryBuilder('INV')
361
+ .innerJoinAndSelect('INV.location', 'loc')
362
+ .innerJoinAndSelect('INV.product', 'product')
363
+ .innerJoinAndSelect('INV.bizplace', 'bizplace')
364
+ .leftJoinAndSelect('INV.refInventory', 'refInventory')
365
+ .leftJoinAndSelect('INV.reusablePallet', 'reusablePallet')
366
+ .leftJoinAndSelect('INV.productDetail', 'productDetail')
362
367
  .where('INV.domain_id = :domainId', { domainId: domain.id })
363
- .andWhere('INV.location_id = :fromLocationId', { fromLocationId: fromLocation.id })
368
+ .andWhere('INV.pallet_id = :palletId', { palletId: originPalletId })
369
+
370
+ let inventory: Inventory = await invQb.getOne()
371
+ if (!inventory) throw new Error('Inventory not found')
372
+
373
+ if (qty > (inventory.qty - (inventory?.lockedQty > 0 ? inventory.lockedQty : 0))) throw new Error('Transfer quantity exceeded inventory quantity')
374
+
375
+ if (toLocation.name == inventory.location.name) throw new Error('Inventory is in current location')
376
+
377
+ let transactionInventory = new InventoryUtil(tx, domain, user)
378
+
379
+ const partialTransferFunc = async function (inventory, qty, toLocation, palletId, context) {
380
+ const { user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state
381
+
382
+ if (qty < (inventory.qty - (inventory?.lockedQty > 0 ? inventory.lockedQty : 0))) {
383
+ if (!palletId || palletId.trim() == '') throw new Error('Require new lot id for partial transfer')
384
+
385
+ let transferQty = qty
386
+ let transferUomValue = ((inventory.uomValue / inventory.qty) * qty)
387
+ let newInventory = { ...inventory, palletId, location: toLocation, warehouse: toLocation.warehouse, zone: toLocation.zone, creator: user, updater: user }
388
+
389
+ delete newInventory.id
390
+ delete newInventory.createdAt
391
+ delete newInventory.updatedAt
364
392
 
365
- if (cartonId) invQb.andWhere('INV.carton_id = :cartonId', { cartonId: cartonId })
366
- else invQb.andWhere('INV.pallet_id = :palletId', { palletId: palletId })
393
+ newInventory.qty = transferQty
394
+ newInventory.lockedQty = 0
395
+ newInventory.uomValue = transferUomValue
396
+ newInventory.lockedUomValue = 0
367
397
 
368
- let inventories: Inventory[] = await invQb.getMany()
369
- if (!inventories?.length) throw new Error('Inventory not found')
398
+ await transactionInventory.transactionInventory({ ...inventory, qty: inventory.qty - transferQty, uomValue: inventory.uomValue - transferUomValue }, null, -transferQty, -transferUomValue, INVENTORY_TRANSACTION_TYPE.RELOCATE)
370
399
 
371
- await Promise.all(
372
- inventories.map(async (inventory: Inventory) => {
400
+ await transactionInventory.transactionInventory(newInventory, null, transferQty, transferUomValue, INVENTORY_TRANSACTION_TYPE.RELOCATE)
401
+ } else {
373
402
  inventory.warehouse = toLocation.warehouse
374
403
  inventory.location = toLocation
375
404
  inventory.zone = toLocation.zone
376
405
  inventory.updater = user
377
- inventory = await tx.getRepository(Inventory).save(inventory)
378
406
 
379
- await generateInventoryHistory(inventory, null, INVENTORY_TRANSACTION_TYPE.RELOCATE, 0, 0, user, tx)
380
- })
381
- )
407
+ await transactionInventory.transactionInventory(inventory, null, 0, 0, INVENTORY_TRANSACTION_TYPE.RELOCATE)
408
+ }
409
+ }
410
+
411
+ if (inventory.cartonId && inventory.cartonId != '') {
412
+ if (!cartonId) throw new Error('Require carton id')
413
+ inventory.cartonId = cartonId
414
+
415
+ if (qty < (inventory.qty - (inventory?.lockedQty > 0 ? inventory.lockedQty : 0))) {
416
+ palletId = await generateId({
417
+ domain: domain,
418
+ type: RULE_TYPE.LOT_NUMBER_ID,
419
+ seed: { date: DateGenerator.generateDate() }
420
+ })
421
+ }
422
+
423
+ await partialTransferFunc(inventory, qty, toLocation, palletId, context)
424
+ } else {
425
+ await partialTransferFunc(inventory, qty, toLocation, palletId, context)
426
+ }
382
427
 
383
428
  return true
384
429
  }