@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.
Files changed (44) hide show
  1. package/dist-server/controllers/ecommerce/ecommerce-controller.js +7 -4
  2. package/dist-server/controllers/ecommerce/ecommerce-controller.js.map +1 -1
  3. package/dist-server/controllers/ecommerce/sellercraft-controller.js +59 -0
  4. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  5. package/dist-server/controllers/order-controller.js +40 -1
  6. package/dist-server/controllers/order-controller.js.map +1 -1
  7. package/dist-server/service/arrival-notice/arrival-notice-mutation.js +180 -0
  8. package/dist-server/service/arrival-notice/arrival-notice-mutation.js.map +1 -1
  9. package/dist-server/service/arrival-notice/arrival-notice-query.js +193 -1
  10. package/dist-server/service/arrival-notice/arrival-notice-query.js.map +1 -1
  11. package/dist-server/service/arrival-notice/arrival-notice-types.js +160 -2
  12. package/dist-server/service/arrival-notice/arrival-notice-types.js.map +1 -1
  13. package/dist-server/service/delivery-order/delivery-order-types.js +1 -1
  14. package/dist-server/service/delivery-order/delivery-order-types.js.map +1 -1
  15. package/dist-server/service/goods-receival-note/goods-receival-note.js +5 -0
  16. package/dist-server/service/goods-receival-note/goods-receival-note.js.map +1 -1
  17. package/dist-server/service/order-inventory/order-inventory.js +22 -1
  18. package/dist-server/service/order-inventory/order-inventory.js.map +1 -1
  19. package/dist-server/service/release-good/release-good-mutation.js +242 -81
  20. package/dist-server/service/release-good/release-good-mutation.js.map +1 -1
  21. package/dist-server/service/release-good/release-good-types.js +8 -0
  22. package/dist-server/service/release-good/release-good-types.js.map +1 -1
  23. package/dist-server/service/release-good/release-good.js +4 -0
  24. package/dist-server/service/release-good/release-good.js.map +1 -1
  25. package/dist-server/service/return-order/return-order-mutation.js +1 -1
  26. package/dist-server/service/return-order/return-order-mutation.js.map +1 -1
  27. package/dist-server/utils/inventory-util.js +89 -1
  28. package/dist-server/utils/inventory-util.js.map +1 -1
  29. package/package.json +12 -12
  30. package/server/controllers/ecommerce/ecommerce-controller.ts +15 -6
  31. package/server/controllers/ecommerce/sellercraft-controller.ts +77 -1
  32. package/server/controllers/order-controller.ts +55 -2
  33. package/server/service/arrival-notice/arrival-notice-mutation.ts +237 -1
  34. package/server/service/arrival-notice/arrival-notice-query.ts +214 -4
  35. package/server/service/arrival-notice/arrival-notice-types.ts +120 -1
  36. package/server/service/delivery-order/delivery-order-types.ts +1 -1
  37. package/server/service/goods-receival-note/goods-receival-note.ts +4 -0
  38. package/server/service/order-inventory/order-inventory.ts +17 -1
  39. package/server/service/release-good/release-good-mutation.ts +310 -119
  40. package/server/service/release-good/release-good-types.ts +6 -0
  41. package/server/service/release-good/release-good.ts +3 -0
  42. package/server/service/return-order/return-order-mutation.ts +1 -1
  43. package/server/utils/index.ts +1 -1
  44. package/server/utils/inventory-util.ts +129 -1
@@ -289,6 +289,9 @@ export class ReleaseGood {
289
289
  @Field({ nullable: true })
290
290
  invoice: string
291
291
 
292
+ @Column({ nullable: true })
293
+ bundleInfo: string
294
+
292
295
  @Column({ type: 'int', nullable: true })
293
296
  @Field({ nullable: true })
294
297
  noOfItems: number
@@ -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
@@ -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
+ }