@things-factory/warehouse-base 4.3.135 → 4.3.140

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 (46) hide show
  1. package/dist-server/controllers/warehouse-controller.js.map +1 -1
  2. package/dist-server/service/inventory/inventory-query.js +64 -67
  3. package/dist-server/service/inventory/inventory-query.js.map +1 -1
  4. package/dist-server/service/inventory/inventory-types.js +16 -12
  5. package/dist-server/service/inventory/inventory-types.js.map +1 -1
  6. package/dist-server/service/inventory/inventory.js +4 -0
  7. package/dist-server/service/inventory/inventory.js.map +1 -1
  8. package/dist-server/service/inventory-change/inventory-change-mutation.js +7 -3
  9. package/dist-server/service/inventory-change/inventory-change-mutation.js.map +1 -1
  10. package/dist-server/service/inventory-history/inventory-history-query.js +14 -7
  11. package/dist-server/service/inventory-history/inventory-history-query.js.map +1 -1
  12. package/dist-server/service/inventory-item/inventory-item.js +8 -3
  13. package/dist-server/service/inventory-item/inventory-item.js.map +1 -1
  14. package/dist-server/service/inventory-product/inventory-product.js +8 -3
  15. package/dist-server/service/inventory-product/inventory-product.js.map +1 -1
  16. package/dist-server/service/location/location-mutation.js +3 -1
  17. package/dist-server/service/location/location-mutation.js.map +1 -1
  18. package/dist-server/service/pallet/pallet-mutation.js +35 -33
  19. package/dist-server/service/pallet/pallet-mutation.js.map +1 -1
  20. package/dist-server/service/tote/tote-mutation.js +1 -1
  21. package/dist-server/service/tote/tote-mutation.js.map +1 -1
  22. package/dist-server/service/tote/tote-query.js +4 -3
  23. package/dist-server/service/tote/tote-query.js.map +1 -1
  24. package/dist-server/service/warehouse/warehouse-mutation.js +30 -16
  25. package/dist-server/service/warehouse/warehouse-mutation.js.map +1 -1
  26. package/dist-server/utils/inventory-util.js +86 -25
  27. package/dist-server/utils/inventory-util.js.map +1 -1
  28. package/package.json +9 -9
  29. package/server/controllers/warehouse-controller.ts +0 -1
  30. package/server/service/inventory/inventory-query.ts +77 -120
  31. package/server/service/inventory/inventory-types.ts +3 -0
  32. package/server/service/inventory/inventory.ts +3 -0
  33. package/server/service/inventory-change/inventory-change-mutation.ts +10 -5
  34. package/server/service/inventory-history/inventory-history-query.ts +16 -7
  35. package/server/service/inventory-item/inventory-item.ts +9 -2
  36. package/server/service/inventory-product/inventory-product.ts +5 -1
  37. package/server/service/location/location-mutation.ts +3 -1
  38. package/server/service/pallet/pallet-mutation.ts +50 -69
  39. package/server/service/tote/tote-mutation.ts +1 -1
  40. package/server/service/tote/tote-query.ts +6 -5
  41. package/server/service/warehouse/warehouse-mutation.ts +35 -18
  42. package/server/utils/inventory-util.ts +116 -51
  43. package/translations/en.json +4 -2
  44. package/translations/ko.json +4 -2
  45. package/translations/ms.json +4 -2
  46. package/translations/zh.json +14 -12
@@ -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 => Pallet)
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 => [Pallet])
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 results = []
57
- const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
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
- if (newRecord.owner && newRecord.owner.id) {
65
- newRecord.owner = await tx.getRepository(Bizplace).findOne(newRecord.owner.id)
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
- if (newRecord.holder && newRecord.holder.id) {
69
- newRecord.holder = await tx.getRepository(Bizplace).findOne(newRecord.holder.id)
70
- }
71
+ if (!foundPallet) {
72
+ delete patch?.id
71
73
 
72
- const result: Pallet = await tx.getRepository(Pallet).save({
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
- ...newRecord,
81
- pallet: result,
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
- results.push({ ...result, cuFlag: '+' })
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
- const result = await tx.getRepository(Pallet).save({
110
- ...pallet,
111
- ...newRecord,
112
- seq,
113
- updater: user,
114
- refOrderNo: null
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
- ...pallet,
119
- ...newRecord,
120
- pallet: result,
121
- seq,
122
- domain: 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 results
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: newRecord.name, bizplace: newRecord.bizplace } })
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
- .where('Domain.id = :domainId', { domainId: domain.id })
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 => [Warehouse])
34
+ @Mutation(returns => Boolean)
33
35
  async updateMultipleWarehouse(
34
36
  @Arg('patches', type => [WarehousePatch]) patches: WarehousePatch[],
35
37
  @Ctx() context: any
36
- ): Promise<Warehouse[]> {
37
- let results = []
38
- const _createRecords = patches.filter((patch: any) => patch.cuFlag === '+')
39
- const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
40
-
41
- if (_createRecords.length > 0) {
42
- for (let i = 0; i < _createRecords.length; i++) {
43
- const patch = _createRecords[i]
44
- const result = await createWarehouse(patch as NewWarehouse, context)
45
- results.push({ ...result, cuFlag: '+' })
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
- if (_updateRecords.length > 0) {
50
- for (let i = 0; i < _updateRecords.length; i++) {
51
- const patch: WarehousePatch = _updateRecords[i]
52
- const result = await updateWarehouse(patch.id, patch, context)
53
- results.push({ ...result, cuFlag: 'M' })
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 results
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 seq: number = 0
151
- let openingQty: number = 0
152
- let openingUomValue: number = 0
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
- qty,
175
- openingQty,
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
- delete inventoryHistory.updatedAt
183
- delete inventoryHistory.createdAt
184
- delete inventoryHistory.id
185
-
186
- let newInventoryHistory = await invHistoryRepo.save(inventoryHistory)
187
-
188
- if (remainQty == 0) {
189
- seq = seq + 1
190
- let terminatedHistory = {
191
- ...newInventoryHistory,
192
- name: InventoryNoGenerator.inventoryHistoryName(),
193
- seq: seq,
194
- status: INVENTORY_STATUS.TERMINATED,
195
- transactionType: INVENTORY_TRANSACTION_TYPE.TERMINATED,
196
- uom: inventory.uom,
197
- qty: 0,
198
- openingQty: 0,
199
- uomValue: 0,
200
- openingUomValue: 0
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
- delete terminatedHistory.id
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) + (select uom_value from inventory_histories where pallet_id = '${inventory.palletId}' and domain_id = '${domain.id}' order by seq desc limit 1)`,
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
- newInventoryHistory = await invHistoryRepo.save(terminatedHistory)
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
- if (inventory.lastSeq !== seq) {
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
@@ -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
  }
@@ -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
  }
@@ -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
  }
@@ -1,21 +1,23 @@
1
1
  {
2
- "field.location": "位置",
3
- "field.product_batch": "产品批次",
4
- "field.lot": "地块",
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.start_qty": "开始数量",
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.end_qty": "最终数量",
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
- "error.no_location_found": "[zh]no location found"
20
+ "field.unit": "单元",
21
+ "field.warehouse": "仓库",
22
+ "field.zone": "区"
21
23
  }