@things-factory/warehouse-base 4.3.135 → 4.3.138
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/controllers/warehouse-controller.js.map +1 -1
- package/dist-server/service/inventory/inventory-query.js +74 -68
- package/dist-server/service/inventory/inventory-query.js.map +1 -1
- package/dist-server/service/inventory/inventory-types.js +16 -12
- package/dist-server/service/inventory/inventory-types.js.map +1 -1
- package/dist-server/service/inventory/inventory.js +4 -0
- package/dist-server/service/inventory/inventory.js.map +1 -1
- package/dist-server/service/inventory-change/inventory-change-mutation.js +7 -3
- package/dist-server/service/inventory-change/inventory-change-mutation.js.map +1 -1
- package/dist-server/service/inventory-history/inventory-history-query.js +14 -7
- package/dist-server/service/inventory-history/inventory-history-query.js.map +1 -1
- package/dist-server/service/inventory-item/inventory-item.js +8 -3
- package/dist-server/service/inventory-item/inventory-item.js.map +1 -1
- package/dist-server/service/inventory-product/inventory-product.js +8 -3
- package/dist-server/service/inventory-product/inventory-product.js.map +1 -1
- package/dist-server/service/location/location-mutation.js +3 -1
- package/dist-server/service/location/location-mutation.js.map +1 -1
- package/dist-server/service/pallet/pallet-mutation.js +35 -33
- package/dist-server/service/pallet/pallet-mutation.js.map +1 -1
- package/dist-server/service/tote/tote-mutation.js +1 -1
- package/dist-server/service/tote/tote-mutation.js.map +1 -1
- package/dist-server/service/tote/tote-query.js +4 -3
- package/dist-server/service/tote/tote-query.js.map +1 -1
- package/dist-server/service/warehouse/warehouse-mutation.js +30 -16
- package/dist-server/service/warehouse/warehouse-mutation.js.map +1 -1
- package/dist-server/utils/inventory-util.js +86 -25
- package/dist-server/utils/inventory-util.js.map +1 -1
- package/package.json +9 -9
- package/server/controllers/warehouse-controller.ts +0 -1
- package/server/service/inventory/inventory-query.ts +88 -121
- package/server/service/inventory/inventory-types.ts +3 -0
- package/server/service/inventory/inventory.ts +3 -0
- package/server/service/inventory-change/inventory-change-mutation.ts +10 -5
- package/server/service/inventory-history/inventory-history-query.ts +16 -7
- package/server/service/inventory-item/inventory-item.ts +9 -2
- package/server/service/inventory-product/inventory-product.ts +5 -1
- package/server/service/location/location-mutation.ts +3 -1
- package/server/service/pallet/pallet-mutation.ts +50 -69
- package/server/service/tote/tote-mutation.ts +1 -1
- package/server/service/tote/tote-query.ts +6 -5
- package/server/service/warehouse/warehouse-mutation.ts +35 -18
- package/server/utils/inventory-util.ts +116 -51
- package/translations/en.json +4 -2
- package/translations/ko.json +4 -2
- package/translations/ms.json +4 -2
- package/translations/zh.json +14 -12
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
} from 'typeorm'
|
|
12
12
|
|
|
13
13
|
import { User } from '@things-factory/auth-base'
|
|
14
|
-
import { Product } from '@things-factory/product-base'
|
|
14
|
+
import { Product, ProductDetail } from '@things-factory/product-base'
|
|
15
15
|
import { Domain } from '@things-factory/shell'
|
|
16
16
|
|
|
17
17
|
@Entity()
|
|
@@ -60,6 +60,10 @@ export class InventoryProduct {
|
|
|
60
60
|
@RelationId((inventoryProduct: InventoryProduct) => inventoryProduct.product)
|
|
61
61
|
productId?: string
|
|
62
62
|
|
|
63
|
+
@ManyToOne(type => ProductDetail, { nullable: true })
|
|
64
|
+
@Field({ nullable: true })
|
|
65
|
+
productDetail: ProductDetail
|
|
66
|
+
|
|
63
67
|
@CreateDateColumn()
|
|
64
68
|
@Field({ nullable: true })
|
|
65
69
|
createdAt?: Date
|
|
@@ -77,10 +77,12 @@ export class LocationMutation {
|
|
|
77
77
|
@Mutation(returns => Boolean)
|
|
78
78
|
async deleteAllLocations(@Arg('warehouseId') warehouseId: string, @Ctx() context: any) {
|
|
79
79
|
const { tx }: { tx: EntityManager } = context.state
|
|
80
|
+
let warehouse = await tx.getRepository(Warehouse).findOne(warehouseId)
|
|
80
81
|
|
|
81
82
|
await tx.getRepository(Location).delete({
|
|
82
|
-
warehouse
|
|
83
|
+
warehouse
|
|
83
84
|
})
|
|
85
|
+
return true
|
|
84
86
|
}
|
|
85
87
|
}
|
|
86
88
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
|
|
2
|
-
import { EntityManager, In } from 'typeorm'
|
|
2
|
+
import { EntityManager, In, getRepository } from 'typeorm'
|
|
3
3
|
|
|
4
4
|
import { User } from '@things-factory/auth-base'
|
|
5
5
|
import { Bizplace } from '@things-factory/biz-base'
|
|
@@ -8,6 +8,7 @@ import { Domain } from '@things-factory/shell'
|
|
|
8
8
|
import { PalletHistory } from '../pallet-history/pallet-history'
|
|
9
9
|
import { Pallet } from './pallet'
|
|
10
10
|
import { NewPallet, PalletPatch } from './pallet-types'
|
|
11
|
+
import i18next from 'i18next'
|
|
11
12
|
|
|
12
13
|
@Resolver(Pallet)
|
|
13
14
|
export class PalletMutation {
|
|
@@ -25,12 +26,8 @@ export class PalletMutation {
|
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
@Directive('@transaction')
|
|
28
|
-
@Mutation(returns =>
|
|
29
|
-
async updatePallet(
|
|
30
|
-
@Arg('name') name: string,
|
|
31
|
-
@Arg('patch') patch: PalletPatch,
|
|
32
|
-
@Ctx() context: any
|
|
33
|
-
): Promise<Pallet> {
|
|
29
|
+
@Mutation(returns => Boolean)
|
|
30
|
+
async updatePallet(@Arg('name') name: string, @Arg('patch') patch: PalletPatch, @Ctx() context: any) {
|
|
34
31
|
const { domain, user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state
|
|
35
32
|
|
|
36
33
|
const repository = tx.getRepository(Pallet)
|
|
@@ -46,80 +43,66 @@ export class PalletMutation {
|
|
|
46
43
|
}
|
|
47
44
|
|
|
48
45
|
@Directive('@transaction')
|
|
49
|
-
@Mutation(returns =>
|
|
50
|
-
async updateMultiplePallet(
|
|
51
|
-
@Arg('patches', type => [PalletPatch]) patches: PalletPatch[],
|
|
52
|
-
@Ctx() context: any
|
|
53
|
-
): Promise<Pallet[]> {
|
|
46
|
+
@Mutation(returns => Boolean)
|
|
47
|
+
async updateMultiplePallet(@Arg('patches', type => [PalletPatch]) patches: PalletPatch[], @Ctx() context: any) {
|
|
54
48
|
const { domain, user, tx }: { domain: Domain; user: User; tx: EntityManager } = context.state
|
|
55
49
|
|
|
56
|
-
let
|
|
57
|
-
|
|
58
|
-
const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
|
|
59
|
-
|
|
60
|
-
if (_createRecords.length > 0) {
|
|
61
|
-
for (let i = 0; i < _createRecords.length; i++) {
|
|
62
|
-
const newRecord = _createRecords[i]
|
|
50
|
+
for (let patch of patches) {
|
|
51
|
+
let foundPallet: Pallet
|
|
63
52
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
53
|
+
if (patch.name) {
|
|
54
|
+
foundPallet = await getRepository(Pallet).findOne({
|
|
55
|
+
where: {
|
|
56
|
+
domain,
|
|
57
|
+
name: patch.name
|
|
58
|
+
},
|
|
59
|
+
relations: ['owner', 'holder']
|
|
60
|
+
})
|
|
61
|
+
} else if (patch.id) {
|
|
62
|
+
foundPallet = await getRepository(Pallet).findOne({
|
|
63
|
+
where: {
|
|
64
|
+
domain,
|
|
65
|
+
id: patch.id
|
|
66
|
+
},
|
|
67
|
+
relations: ['owner', 'holder']
|
|
68
|
+
})
|
|
69
|
+
}
|
|
67
70
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
+
if (!foundPallet) {
|
|
72
|
+
delete patch?.id
|
|
71
73
|
|
|
72
|
-
|
|
73
|
-
domain: domain,
|
|
74
|
-
creator: user,
|
|
75
|
-
updater: user,
|
|
76
|
-
...newRecord
|
|
77
|
-
})
|
|
74
|
+
let newPallet = await tx.getRepository(Pallet).save({ ...patch, domain, creator: user, updater: user })
|
|
78
75
|
|
|
79
76
|
await tx.getRepository(PalletHistory).save({
|
|
80
|
-
...
|
|
81
|
-
pallet:
|
|
77
|
+
...patch,
|
|
78
|
+
pallet: newPallet,
|
|
82
79
|
domain: domain,
|
|
83
80
|
creator: user,
|
|
84
81
|
updater: user,
|
|
85
82
|
transactionType: 'NEW'
|
|
86
83
|
})
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
if (_updateRecords.length > 0) {
|
|
93
|
-
for (let i = 0; i < _updateRecords.length; i++) {
|
|
94
|
-
const newRecord = _updateRecords[i]
|
|
95
|
-
const pallet = await tx.getRepository(Pallet).findOne({
|
|
96
|
-
where: { id: newRecord.id },
|
|
97
|
-
relations: ['owner', 'holder']
|
|
98
|
-
})
|
|
99
|
-
const seq = pallet.seq + 1
|
|
100
|
-
|
|
101
|
-
if (newRecord.owner && newRecord.owner.id) {
|
|
102
|
-
newRecord.owner = await tx.getRepository(Bizplace).findOne(newRecord.owner.id)
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
if (newRecord.holder && newRecord.holder.id) {
|
|
106
|
-
newRecord.holder = await tx.getRepository(Bizplace).findOne(newRecord.holder.id)
|
|
84
|
+
} else {
|
|
85
|
+
if (patch.cuFlag === '+') {
|
|
86
|
+
throw new Error(i18next.t('error.pallet (x) already exists', { x: patch.name }))
|
|
107
87
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
88
|
+
delete patch.cuFlag
|
|
89
|
+
|
|
90
|
+
let updatedPallet: any = await tx.getRepository(Pallet).update(
|
|
91
|
+
{ id: foundPallet.id },
|
|
92
|
+
{
|
|
93
|
+
...patch,
|
|
94
|
+
updater: user,
|
|
95
|
+
seq: foundPallet.seq++,
|
|
96
|
+
refOrderNo: null
|
|
97
|
+
}
|
|
98
|
+
)
|
|
116
99
|
|
|
117
100
|
let newHistory = {
|
|
118
|
-
...
|
|
119
|
-
...
|
|
120
|
-
pallet:
|
|
121
|
-
seq,
|
|
122
|
-
domain
|
|
101
|
+
...foundPallet,
|
|
102
|
+
...patch,
|
|
103
|
+
pallet: updatedPallet,
|
|
104
|
+
seq: updatedPallet.seq,
|
|
105
|
+
domain,
|
|
123
106
|
creator: user,
|
|
124
107
|
updater: user,
|
|
125
108
|
transactionType: 'UPDATE'
|
|
@@ -130,12 +113,10 @@ export class PalletMutation {
|
|
|
130
113
|
await tx.getRepository(PalletHistory).save({
|
|
131
114
|
...newHistory
|
|
132
115
|
})
|
|
133
|
-
|
|
134
|
-
results.push({ ...result, cuFlag: 'M' })
|
|
135
116
|
}
|
|
136
117
|
}
|
|
137
118
|
|
|
138
|
-
return
|
|
119
|
+
return true
|
|
139
120
|
}
|
|
140
121
|
|
|
141
122
|
@Directive('@transaction')
|
|
@@ -97,7 +97,7 @@ export class ToteMutation {
|
|
|
97
97
|
|
|
98
98
|
let foundTote = await tx
|
|
99
99
|
.getRepository(Tote)
|
|
100
|
-
.findOne({ where: { domain, name:
|
|
100
|
+
.findOne({ where: { domain, name: tote.name, bizplace: newRecord.bizplace } })
|
|
101
101
|
|
|
102
102
|
if (foundTote) {
|
|
103
103
|
throw new Error('Duplicated tote found')
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Arg, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
|
|
2
|
-
import { getRepository, IsNull } from 'typeorm'
|
|
1
|
+
import { Arg, Ctx, FieldResolver, Query, Resolver, Root, Directive } from 'type-graphql'
|
|
2
|
+
import { getRepository, IsNull, EntityManager } from 'typeorm'
|
|
3
3
|
|
|
4
4
|
import { User } from '@things-factory/auth-base'
|
|
5
5
|
import { Bizplace } from '@things-factory/biz-base'
|
|
@@ -10,6 +10,7 @@ import { ToteList } from './tote-types'
|
|
|
10
10
|
|
|
11
11
|
@Resolver(Tote)
|
|
12
12
|
export class ToteQuery {
|
|
13
|
+
@Directive('@transaction')
|
|
13
14
|
@Query(returns => ToteList)
|
|
14
15
|
async totes(
|
|
15
16
|
@Ctx() context: any,
|
|
@@ -17,14 +18,14 @@ export class ToteQuery {
|
|
|
17
18
|
@Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,
|
|
18
19
|
@Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[]
|
|
19
20
|
): Promise<ToteList> {
|
|
20
|
-
const { domain }: { domain: Domain } = context.state
|
|
21
|
+
const { domain, tx }: { domain: Domain; tx: EntityManager } = context.state
|
|
21
22
|
|
|
22
23
|
const nameFilter: any = filters.find((filter: any) => filter.name === 'name')
|
|
23
24
|
const bizplaceFilter: any = filters.find((filter: any) => filter.name === 'bizplace')
|
|
24
25
|
const statusFilter: any = filters.find((filter: any) => filter.name === 'status')
|
|
25
26
|
const deletedFilter: any = filters.find((filter: any) => filter.name === 'deleted' && filter.value == true)
|
|
26
27
|
|
|
27
|
-
const queryBuilder = getRepository(Tote).createQueryBuilder()
|
|
28
|
+
const queryBuilder = tx.getRepository(Tote).createQueryBuilder()
|
|
28
29
|
buildQuery(queryBuilder, { filters, pagination, sortings }, context)
|
|
29
30
|
|
|
30
31
|
queryBuilder
|
|
@@ -32,7 +33,7 @@ export class ToteQuery {
|
|
|
32
33
|
.leftJoinAndSelect('Tote.bizplace', 'Bizplace')
|
|
33
34
|
.leftJoinAndSelect('Tote.creator', 'Creator')
|
|
34
35
|
.leftJoinAndSelect('Tote.updater', 'Updater')
|
|
35
|
-
.
|
|
36
|
+
.andWhere('Domain.id = :domainId', { domainId: domain.id })
|
|
36
37
|
|
|
37
38
|
if (nameFilter) {
|
|
38
39
|
queryBuilder.andWhere('Tote.name ilike :name', { name: nameFilter.value })
|
|
@@ -7,6 +7,8 @@ import { Domain } from '@things-factory/shell'
|
|
|
7
7
|
import { Warehouse } from './warehouse'
|
|
8
8
|
import { NewWarehouse, WarehousePatch } from './warehouse-types'
|
|
9
9
|
|
|
10
|
+
import i18next from 'i18next'
|
|
11
|
+
|
|
10
12
|
@Resolver(Warehouse)
|
|
11
13
|
export class WarehouseMutation {
|
|
12
14
|
@Directive('@privilege(category: "warehouse", privilege: "mutation")')
|
|
@@ -29,32 +31,47 @@ export class WarehouseMutation {
|
|
|
29
31
|
|
|
30
32
|
@Directive('@privilege(category: "warehouse", privilege: "mutation")')
|
|
31
33
|
@Directive('@transaction')
|
|
32
|
-
@Mutation(returns =>
|
|
34
|
+
@Mutation(returns => Boolean)
|
|
33
35
|
async updateMultipleWarehouse(
|
|
34
36
|
@Arg('patches', type => [WarehousePatch]) patches: WarehousePatch[],
|
|
35
37
|
@Ctx() context: any
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
) {
|
|
39
|
+
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
|
40
|
+
|
|
41
|
+
for (let patch of patches) {
|
|
42
|
+
let foundWarehouse: Warehouse
|
|
43
|
+
|
|
44
|
+
if (patch?.name) {
|
|
45
|
+
foundWarehouse = await tx.getRepository(Warehouse).findOne({
|
|
46
|
+
domain,
|
|
47
|
+
name: patch.name
|
|
48
|
+
})
|
|
49
|
+
} else if (patch?.id) {
|
|
50
|
+
foundWarehouse = await tx.getRepository(Warehouse).findOne({
|
|
51
|
+
domain,
|
|
52
|
+
id: patch.id
|
|
53
|
+
})
|
|
46
54
|
}
|
|
47
|
-
}
|
|
48
55
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
56
|
+
if (!foundWarehouse) {
|
|
57
|
+
delete patch?.id
|
|
58
|
+
await tx.getRepository(Warehouse).save({ ...patch, domain, creator: user, updater: user })
|
|
59
|
+
} else {
|
|
60
|
+
if (patch.cuFlag === '+') {
|
|
61
|
+
throw new Error(i18next.t('error.warehouse (x) already exists', { x: patch.name }))
|
|
62
|
+
}
|
|
63
|
+
delete patch.cuFlag
|
|
64
|
+
await tx.getRepository(Warehouse).update(
|
|
65
|
+
{ id: foundWarehouse.id },
|
|
66
|
+
{
|
|
67
|
+
...patch,
|
|
68
|
+
updater: user
|
|
69
|
+
}
|
|
70
|
+
)
|
|
54
71
|
}
|
|
55
72
|
}
|
|
56
73
|
|
|
57
|
-
return
|
|
74
|
+
return true
|
|
58
75
|
}
|
|
59
76
|
|
|
60
77
|
@Directive('@privilege(category: "warehouse", privilege: "mutation")')
|
|
@@ -131,7 +131,7 @@ export async function generateInventoryHistory(
|
|
|
131
131
|
|
|
132
132
|
inventory = await invRepo.findOne({
|
|
133
133
|
where: { id: inventory.id },
|
|
134
|
-
relations: ['domain', 'bizplace', 'product', 'warehouse', 'location']
|
|
134
|
+
relations: ['domain', 'bizplace', 'product', 'warehouse', 'location', 'productDetail']
|
|
135
135
|
})
|
|
136
136
|
|
|
137
137
|
const domain: Domain = inventory.domain
|
|
@@ -147,68 +147,133 @@ export async function generateInventoryHistory(
|
|
|
147
147
|
}
|
|
148
148
|
})
|
|
149
149
|
|
|
150
|
-
let
|
|
151
|
-
let
|
|
152
|
-
let
|
|
153
|
-
|
|
154
|
-
if (lastInvHistory) {
|
|
155
|
-
openingQty = lastInvHistory.openingQty + lastInvHistory.qty
|
|
156
|
-
openingUomValue = lastInvHistory.openingUomValue + lastInvHistory.uomValue
|
|
157
|
-
seq = lastInvHistory.seq + 1
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
let remainQty = (openingQty || 0) + (qty || 0)
|
|
161
|
-
|
|
162
|
-
let inventoryHistory: any = new InventoryHistory()
|
|
163
|
-
|
|
164
|
-
inventoryHistory = {
|
|
165
|
-
...inventory,
|
|
166
|
-
name: InventoryNoGenerator.inventoryHistoryName(),
|
|
167
|
-
inventory,
|
|
168
|
-
seq: seq,
|
|
169
|
-
status: remainQty == 0 ? INVENTORY_STATUS.TERMINATED : inventory.status,
|
|
170
|
-
transactionType,
|
|
150
|
+
let lastSeq: number
|
|
151
|
+
let res: any
|
|
152
|
+
let inventoryHistoryFields: any = {
|
|
171
153
|
refOrderId: refOrder?.id || null,
|
|
172
154
|
orderNo: refOrder?.name || null,
|
|
173
155
|
orderRefNo: refOrder?.refNo || null,
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
uomValue,
|
|
177
|
-
openingUomValue: openingUomValue,
|
|
156
|
+
uom: inventory?.uom,
|
|
157
|
+
|
|
178
158
|
creator: user,
|
|
179
|
-
updater: user
|
|
159
|
+
updater: user,
|
|
160
|
+
domain: inventory?.domain,
|
|
161
|
+
bizplace: inventory?.bizplace,
|
|
162
|
+
reusablePallet: inventory?.reusablePallet,
|
|
163
|
+
inventory: inventory,
|
|
164
|
+
product: inventory?.product,
|
|
165
|
+
productDetail: inventory?.productDetail,
|
|
166
|
+
warehouse: inventory?.warehouse,
|
|
167
|
+
location: inventory?.location,
|
|
168
|
+
|
|
169
|
+
palletId: inventory?.palletId,
|
|
170
|
+
batchId: inventory?.batchId,
|
|
171
|
+
zone: inventory?.zone,
|
|
172
|
+
packingType: inventory?.packingType,
|
|
173
|
+
description: inventory?.description,
|
|
174
|
+
expirationDate: inventory?.expirationDate,
|
|
175
|
+
unitCost: inventory?.unitCost,
|
|
176
|
+
batchIdRef: inventory?.batchIdRef,
|
|
177
|
+
cartonId: inventory?.cartonId,
|
|
178
|
+
manufactureYear: inventory?.manufactureYear,
|
|
179
|
+
packingSize: inventory?.packingSize,
|
|
180
|
+
manufactureDate: inventory?.manufactureDate,
|
|
181
|
+
status: inventory.status
|
|
180
182
|
}
|
|
181
183
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
184
|
+
if (!lastInvHistory) {
|
|
185
|
+
res = await invHistoryRepo
|
|
186
|
+
.createQueryBuilder()
|
|
187
|
+
.insert()
|
|
188
|
+
.into(InventoryHistory)
|
|
189
|
+
.values([
|
|
190
|
+
{
|
|
191
|
+
...inventoryHistoryFields,
|
|
192
|
+
name: InventoryNoGenerator.inventoryHistoryName(),
|
|
193
|
+
status: inventory.status,
|
|
194
|
+
transactionType,
|
|
195
|
+
qty,
|
|
196
|
+
openingQty: 0,
|
|
197
|
+
uomValue,
|
|
198
|
+
openingUomValue: 0,
|
|
199
|
+
seq: 0
|
|
200
|
+
}
|
|
201
|
+
])
|
|
202
|
+
.returning('*')
|
|
203
|
+
.execute()
|
|
204
|
+
} else {
|
|
205
|
+
if (transactionType == 'PICKING' || transactionType == 'UNLOADING') {
|
|
206
|
+
const findSameOrderHistory: InventoryHistory[] = await invHistoryRepo.find({
|
|
207
|
+
domain: inventory.domain,
|
|
208
|
+
palletId: inventory.palletId,
|
|
209
|
+
refOrderId: refOrder.id
|
|
210
|
+
})
|
|
211
|
+
|
|
212
|
+
if (findSameOrderHistory.length > 0) {
|
|
213
|
+
let prevTotalQty = 0
|
|
214
|
+
let prevTotalUomValue = 0
|
|
215
|
+
for (let oh of findSameOrderHistory) {
|
|
216
|
+
prevTotalQty += oh.qty
|
|
217
|
+
prevTotalUomValue += oh.uomValue
|
|
218
|
+
}
|
|
219
|
+
qty -= prevTotalQty
|
|
220
|
+
uomValue -= prevTotalUomValue
|
|
221
|
+
}
|
|
201
222
|
}
|
|
202
223
|
|
|
203
|
-
|
|
224
|
+
res = await invHistoryRepo
|
|
225
|
+
.createQueryBuilder()
|
|
226
|
+
.insert()
|
|
227
|
+
.into(InventoryHistory)
|
|
228
|
+
.values([
|
|
229
|
+
{
|
|
230
|
+
...inventoryHistoryFields,
|
|
231
|
+
name: InventoryNoGenerator.inventoryHistoryName(),
|
|
232
|
+
transactionType,
|
|
233
|
+
qty,
|
|
234
|
+
openingQty: () =>
|
|
235
|
+
`(select opening_qty from inventory_histories where pallet_id = '${inventory.palletId}' and domain_id = '${domain.id}' order by seq desc limit 1) + (select qty from inventory_histories where pallet_id = '${inventory.palletId}' and domain_id = '${domain.id}' order by seq desc limit 1)`,
|
|
236
|
+
uomValue,
|
|
237
|
+
openingUomValue: () =>
|
|
238
|
+
`(select opening_uom_value from inventory_histories where pallet_id = '${inventory.palletId}' and domain_id = '${domain.id}' order by seq desc limit 1) + ${uomValue}`,
|
|
239
|
+
seq: () =>
|
|
240
|
+
`(select seq from inventory_histories where pallet_id = '${inventory.palletId}' and domain_id = '${domain.id}' order by seq desc limit 1) + 1`
|
|
241
|
+
}
|
|
242
|
+
])
|
|
243
|
+
.returning('*')
|
|
244
|
+
.execute()
|
|
245
|
+
}
|
|
204
246
|
|
|
205
|
-
|
|
247
|
+
let newInventoryHistory: InventoryHistory = res.generatedMaps[0]
|
|
248
|
+
lastSeq = newInventoryHistory.seq
|
|
249
|
+
|
|
250
|
+
if (newInventoryHistory.openingQty + qty == 0 && transactionType != 'UNDO_UNLOADING') {
|
|
251
|
+
let terminatedRes = await invHistoryRepo
|
|
252
|
+
.createQueryBuilder()
|
|
253
|
+
.insert()
|
|
254
|
+
.into(InventoryHistory)
|
|
255
|
+
.values([
|
|
256
|
+
{
|
|
257
|
+
...inventoryHistoryFields,
|
|
258
|
+
name: InventoryNoGenerator.inventoryHistoryName(),
|
|
259
|
+
status: INVENTORY_STATUS.TERMINATED,
|
|
260
|
+
transactionType: INVENTORY_TRANSACTION_TYPE.TERMINATED,
|
|
261
|
+
qty: 0,
|
|
262
|
+
openingQty: 0,
|
|
263
|
+
uomValue: 0,
|
|
264
|
+
openingUomValue: 0,
|
|
265
|
+
seq: () =>
|
|
266
|
+
`(select seq from inventory_histories where inventory_id = '${inventory.id}' order by seq desc limit 1) + 1`
|
|
267
|
+
}
|
|
268
|
+
])
|
|
269
|
+
.returning('seq')
|
|
270
|
+
.execute()
|
|
271
|
+
|
|
272
|
+
lastSeq = terminatedRes.generatedMaps[0].seq
|
|
206
273
|
inventory.status = INVENTORY_STATUS.TERMINATED
|
|
207
274
|
}
|
|
208
275
|
|
|
209
|
-
|
|
210
|
-
await invRepo.update(inventory.id, { lastSeq: newInventoryHistory.seq, updater: user })
|
|
211
|
-
}
|
|
276
|
+
await invRepo.update(inventory.id, { lastSeq, updater: user })
|
|
212
277
|
|
|
213
278
|
await switchLocationStatus(domain, location, user, trxMgr)
|
|
214
279
|
return newInventoryHistory
|
package/translations/en.json
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
+
"error.no_location_found": "no location found",
|
|
3
|
+
"error.pallet (x) already exists": "Pallet ({x}) already exists",
|
|
4
|
+
"error.warehouse (x) already exists": "Warehouse ({x}) already exists",
|
|
2
5
|
"field.location": "location",
|
|
3
6
|
"field.product_batch": "product batch",
|
|
4
7
|
"field.lot": "lot",
|
|
@@ -16,6 +19,5 @@
|
|
|
16
19
|
"field.qty": "qty",
|
|
17
20
|
"field.state": "state",
|
|
18
21
|
"field.date": "date",
|
|
19
|
-
"field.type": "type"
|
|
20
|
-
"error.no_location_found": "no location found"
|
|
22
|
+
"field.type": "type"
|
|
21
23
|
}
|
package/translations/ko.json
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
+
"error.no_location_found": "발견된 로케이션이 없습니다",
|
|
3
|
+
"error.pallet (x) already exists": "[ko] Pallet ({x}) already exists",
|
|
4
|
+
"error.warehouse (x) already exists": "[ko] Warehouse ({x}) already exists",
|
|
2
5
|
"field.location": "로케이션",
|
|
3
6
|
"field.product_batch": "제품 배치",
|
|
4
7
|
"field.lot": "롯트",
|
|
@@ -16,6 +19,5 @@
|
|
|
16
19
|
"field.qty": "수량",
|
|
17
20
|
"field.state": "국가",
|
|
18
21
|
"field.date": "날짜",
|
|
19
|
-
"field.type": "유형"
|
|
20
|
-
"error.no_location_found": "발견된 로케이션이 없습니다"
|
|
22
|
+
"field.type": "유형"
|
|
21
23
|
}
|
package/translations/ms.json
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
+
"error.no_location_found": "[ms]no location found",
|
|
3
|
+
"error.pallet (x) already exists": "[ms] Pallet ({x}) already exists",
|
|
4
|
+
"error.warehouse (x) already exists": "[ko] Warehouse ({x}) already exists",
|
|
2
5
|
"field.location": "lokasi",
|
|
3
6
|
"field.product_batch": "kumpulan produk",
|
|
4
7
|
"field.lot": "lot",
|
|
@@ -16,6 +19,5 @@
|
|
|
16
19
|
"field.qty": "kuantiti",
|
|
17
20
|
"field.state": "keadaan",
|
|
18
21
|
"field.date": "tarikh",
|
|
19
|
-
"field.type": "jenis"
|
|
20
|
-
"error.no_location_found": "[ms]no location found"
|
|
22
|
+
"field.type": "jenis"
|
|
21
23
|
}
|
package/translations/zh.json
CHANGED
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"field.warehouse": "仓库",
|
|
6
|
-
"field.zone": "区",
|
|
7
|
-
"field.section": "段",
|
|
8
|
-
"field.unit": "单元",
|
|
9
|
-
"field.shelf": "架子",
|
|
2
|
+
"error.no_location_found": "[zh]no location found",
|
|
3
|
+
"error.pallet (x) already exists": "[zh] Pallet ({x}) already exists",
|
|
4
|
+
"error.warehouse (x) already exists": "[ko] Warehouse ({x}) already exists",
|
|
10
5
|
"field.bizplace": "分部",
|
|
11
|
-
"field.
|
|
6
|
+
"field.date": "日期",
|
|
7
|
+
"field.end_qty": "最终数量",
|
|
12
8
|
"field.in_qty": "进口数量",
|
|
9
|
+
"field.location": "位置",
|
|
10
|
+
"field.lot": "地块",
|
|
13
11
|
"field.out_qty": "出口数量",
|
|
14
|
-
"field.
|
|
12
|
+
"field.product_batch": "产品批次",
|
|
15
13
|
"field.product": "产品",
|
|
16
14
|
"field.qty": "数量",
|
|
15
|
+
"field.section": "段",
|
|
16
|
+
"field.shelf": "架子",
|
|
17
|
+
"field.start_qty": "开始数量",
|
|
17
18
|
"field.state": "状态",
|
|
18
|
-
"field.date": "日期",
|
|
19
19
|
"field.type": "类型",
|
|
20
|
-
"
|
|
20
|
+
"field.unit": "单元",
|
|
21
|
+
"field.warehouse": "仓库",
|
|
22
|
+
"field.zone": "区"
|
|
21
23
|
}
|