@things-factory/sales-base 4.0.24 → 4.0.25
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/ecommerce/ecommerce-controller.js +7 -4
- package/dist-server/controllers/ecommerce/ecommerce-controller.js.map +1 -1
- package/dist-server/controllers/ecommerce/sellercraft-controller.js +59 -0
- package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
- package/dist-server/controllers/order-controller.js +40 -1
- package/dist-server/controllers/order-controller.js.map +1 -1
- package/dist-server/service/arrival-notice/arrival-notice-mutation.js +180 -0
- package/dist-server/service/arrival-notice/arrival-notice-mutation.js.map +1 -1
- package/dist-server/service/arrival-notice/arrival-notice-query.js +193 -1
- package/dist-server/service/arrival-notice/arrival-notice-query.js.map +1 -1
- package/dist-server/service/arrival-notice/arrival-notice-types.js +160 -2
- package/dist-server/service/arrival-notice/arrival-notice-types.js.map +1 -1
- package/dist-server/service/delivery-order/delivery-order-types.js +1 -1
- package/dist-server/service/delivery-order/delivery-order-types.js.map +1 -1
- package/dist-server/service/goods-receival-note/goods-receival-note.js +5 -0
- package/dist-server/service/goods-receival-note/goods-receival-note.js.map +1 -1
- package/dist-server/service/order-inventory/order-inventory.js +22 -1
- package/dist-server/service/order-inventory/order-inventory.js.map +1 -1
- package/dist-server/service/release-good/release-good-mutation.js +242 -81
- package/dist-server/service/release-good/release-good-mutation.js.map +1 -1
- package/dist-server/service/release-good/release-good-types.js +8 -0
- package/dist-server/service/release-good/release-good-types.js.map +1 -1
- package/dist-server/service/release-good/release-good.js +4 -0
- package/dist-server/service/release-good/release-good.js.map +1 -1
- package/dist-server/service/return-order/return-order-mutation.js +1 -1
- package/dist-server/service/return-order/return-order-mutation.js.map +1 -1
- package/dist-server/utils/inventory-util.js +89 -1
- package/dist-server/utils/inventory-util.js.map +1 -1
- package/package.json +12 -12
- package/server/controllers/ecommerce/ecommerce-controller.ts +15 -6
- package/server/controllers/ecommerce/sellercraft-controller.ts +77 -1
- package/server/controllers/order-controller.ts +55 -2
- package/server/service/arrival-notice/arrival-notice-mutation.ts +237 -1
- package/server/service/arrival-notice/arrival-notice-query.ts +214 -4
- package/server/service/arrival-notice/arrival-notice-types.ts +120 -1
- package/server/service/delivery-order/delivery-order-types.ts +1 -1
- package/server/service/goods-receival-note/goods-receival-note.ts +4 -0
- package/server/service/order-inventory/order-inventory.ts +17 -1
- package/server/service/release-good/release-good-mutation.ts +310 -119
- package/server/service/release-good/release-good-types.ts +6 -0
- package/server/service/release-good/release-good.ts +3 -0
- package/server/service/return-order/return-order-mutation.ts +1 -1
- package/server/utils/index.ts +1 -1
- package/server/utils/inventory-util.ts +129 -1
|
@@ -42,7 +42,7 @@ export class ReturnOrderMutation {
|
|
|
42
42
|
@Mutation(returns => ReturnOrder)
|
|
43
43
|
async generateReturnOrder(
|
|
44
44
|
@Ctx() context: any,
|
|
45
|
-
@Arg('file', type => [GraphQLUpload]) file: FileUpload[],
|
|
45
|
+
@Arg('file', type => [GraphQLUpload], { nullable: true }) file: FileUpload[],
|
|
46
46
|
@Arg('returnOrder', type => NewReturnOrder, { nullable: true }) returnOrder: NewReturnOrder
|
|
47
47
|
): Promise<ReturnOrder> {
|
|
48
48
|
const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
|
package/server/utils/index.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export * from './order-no-generator'
|
|
2
|
-
export * from './inventory-util'
|
|
2
|
+
export * from './inventory-util'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EntityManager, Equal, getRepository, In, Not, Raw, Repository } from 'typeorm'
|
|
1
|
+
import { EntityManager, Equal, getRepository, In, Not, Raw, Repository, SelectQueryBuilder } from 'typeorm'
|
|
2
2
|
|
|
3
3
|
import { User } from '@things-factory/auth-base'
|
|
4
4
|
import { Bizplace } from '@things-factory/biz-base'
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
} from '@things-factory/warehouse-base'
|
|
17
17
|
|
|
18
18
|
import { ValidationError } from '../errors'
|
|
19
|
+
import { ORDER_TYPES } from '../constants'
|
|
19
20
|
import {
|
|
20
21
|
ArrivalNotice,
|
|
21
22
|
DeliveryOrder,
|
|
@@ -270,6 +271,68 @@ export const InventoryUtil = {
|
|
|
270
271
|
if (duplicatedReusablePalletCnt) throw new Error(palletId + ` exists`)
|
|
271
272
|
},
|
|
272
273
|
|
|
274
|
+
/**
|
|
275
|
+
* To pre-assign inventories automatically for orderInventories in Release Goods
|
|
276
|
+
* @param product
|
|
277
|
+
* @param orderInventory
|
|
278
|
+
* @param packingType
|
|
279
|
+
* @param locationSortingRules
|
|
280
|
+
* @param customerBizplace
|
|
281
|
+
* @param domain
|
|
282
|
+
* @param trxMgr
|
|
283
|
+
* @returns orderInventories
|
|
284
|
+
*/
|
|
285
|
+
async autoAssignInventoryForRelease(
|
|
286
|
+
product: Product,
|
|
287
|
+
orderInventory: OrderInventory,
|
|
288
|
+
packingType: string,
|
|
289
|
+
locationSortingRules: any = [],
|
|
290
|
+
customerBizplace: Bizplace,
|
|
291
|
+
domain: Domain,
|
|
292
|
+
trxMgr: EntityManager
|
|
293
|
+
): Promise<OrderInventory[]> {
|
|
294
|
+
let qb: SelectQueryBuilder<Inventory> = trxMgr.getRepository(Inventory).createQueryBuilder('iv')
|
|
295
|
+
qb.leftJoinAndSelect('iv.location', 'loc')
|
|
296
|
+
.andWhere('"iv"."domain_id" = :domainId')
|
|
297
|
+
.andWhere('"iv"."bizplace_id" = :bizplaceId')
|
|
298
|
+
.andWhere('"iv"."packing_type" = :packingType')
|
|
299
|
+
.andWhere('"iv"."product_id" = :productId')
|
|
300
|
+
.andWhere('"iv"."status" = :status')
|
|
301
|
+
.andWhere('"iv"."qty" - COALESCE("iv"."locked_qty", 0) > 0')
|
|
302
|
+
.andWhere('"loc"."type" NOT IN (:...locationTypes)')
|
|
303
|
+
.setParameters({
|
|
304
|
+
domainId: domain.id,
|
|
305
|
+
bizplaceId: customerBizplace.id,
|
|
306
|
+
packingType: packingType,
|
|
307
|
+
productId: product.id,
|
|
308
|
+
status: INVENTORY_STATUS.STORED,
|
|
309
|
+
locationTypes: [LOCATION_TYPE.QUARANTINE, LOCATION_TYPE.RESERVE]
|
|
310
|
+
})
|
|
311
|
+
|
|
312
|
+
if (locationSortingRules?.length) {
|
|
313
|
+
locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {
|
|
314
|
+
idx === 0
|
|
315
|
+
? qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')
|
|
316
|
+
: qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')
|
|
317
|
+
})
|
|
318
|
+
} else {
|
|
319
|
+
qb.addOrderBy('"iv"."created_at"', 'ASC')
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
let inventories: Inventory[] = await qb.getMany()
|
|
323
|
+
if (!inventories?.length) throw new Error(`no inventories found for ${product.sku}`)
|
|
324
|
+
|
|
325
|
+
inventories = inventories.map(inventory => {
|
|
326
|
+
return {
|
|
327
|
+
...inventory,
|
|
328
|
+
remainQty: inventory.qty - (inventory?.lockedQty || 0),
|
|
329
|
+
remainUomValue: inventory.uomValue - (inventory?.lockedUomValue || 0)
|
|
330
|
+
}
|
|
331
|
+
})
|
|
332
|
+
|
|
333
|
+
return _composeTargetInventories(product, orderInventory, inventories)
|
|
334
|
+
},
|
|
335
|
+
|
|
273
336
|
/**
|
|
274
337
|
* @summary Do transaction on inventory record
|
|
275
338
|
* @description It will update inventory after set a temp (domain, updater)
|
|
@@ -617,3 +680,68 @@ export async function switchLocationStatus(
|
|
|
617
680
|
|
|
618
681
|
return location
|
|
619
682
|
}
|
|
683
|
+
|
|
684
|
+
export function _composeTargetInventories(product: Product, record: any, inventories: Inventory[]): OrderInventory[] {
|
|
685
|
+
let leftReleaseQty: number = record.releaseQty
|
|
686
|
+
let leftReleaseUomValue: number = record.releaseUomValue
|
|
687
|
+
let compReleaseQty: number = 0
|
|
688
|
+
let compReleaseUomValue: number = 0
|
|
689
|
+
let totalInventoryQty: number = inventories.reduce((total, inventory) => total + inventory.remainQty, 0)
|
|
690
|
+
|
|
691
|
+
if (totalInventoryQty < record.releaseQty) {
|
|
692
|
+
throw new Error(`invalid release qty for ${product?.sku}`)
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
let orderInventories: Partial<OrderInventory[]> = []
|
|
696
|
+
let idx = 0
|
|
697
|
+
while (compReleaseQty < record.releaseQty) {
|
|
698
|
+
const inventory = inventories[idx]
|
|
699
|
+
const {
|
|
700
|
+
packingType,
|
|
701
|
+
packingSize,
|
|
702
|
+
batchId,
|
|
703
|
+
uom
|
|
704
|
+
}: { packingType: string; packingSize: number; batchId: string; uom: string } = inventory
|
|
705
|
+
|
|
706
|
+
let orderInventory: OrderInventory = new OrderInventory()
|
|
707
|
+
|
|
708
|
+
if (inventory.remainQty > leftReleaseQty) {
|
|
709
|
+
const uomValuePerQty: number = Math.round((inventory.remainUomValue / inventory.remainQty) * 100) / 100
|
|
710
|
+
|
|
711
|
+
compReleaseQty += leftReleaseQty
|
|
712
|
+
compReleaseUomValue += leftReleaseUomValue
|
|
713
|
+
|
|
714
|
+
orderInventory = {
|
|
715
|
+
...orderInventory,
|
|
716
|
+
releaseQty: leftReleaseQty,
|
|
717
|
+
releaseUomValue: Math.round(leftReleaseQty * uomValuePerQty * 100) / 100
|
|
718
|
+
}
|
|
719
|
+
} else {
|
|
720
|
+
compReleaseQty += inventory.remainQty
|
|
721
|
+
compReleaseUomValue += inventory.remainUomValue
|
|
722
|
+
leftReleaseQty -= inventory.remainQty
|
|
723
|
+
leftReleaseUomValue -= inventory.remainUomValue
|
|
724
|
+
|
|
725
|
+
orderInventory = {
|
|
726
|
+
...orderInventory,
|
|
727
|
+
releaseQty: inventory.remainQty,
|
|
728
|
+
releaseUomValue: inventory.remainUomValue
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
orderInventories.push({
|
|
733
|
+
...orderInventory,
|
|
734
|
+
inventory,
|
|
735
|
+
packingType,
|
|
736
|
+
packingSize,
|
|
737
|
+
batchId,
|
|
738
|
+
uom,
|
|
739
|
+
product,
|
|
740
|
+
type: ORDER_TYPES.RELEASE_OF_GOODS
|
|
741
|
+
})
|
|
742
|
+
|
|
743
|
+
idx++
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
return orderInventories
|
|
747
|
+
}
|