@things-factory/warehouse-base 8.0.69 → 8.0.72

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.
@@ -29,6 +29,7 @@ export declare class InventoryQuery {
29
29
  checkInventoryOwner(palletId: string, bizplaceName: string, context: ResolverContext): Promise<Boolean>;
30
30
  inventoriesByBundle(context: ResolverContext, filters?: Filter[], pagination?: Pagination, sortings?: Sorting[]): Promise<InventoryBundleGroupDetail>;
31
31
  inventoriesGroupByProduct(params: ListParam, context: ResolverContext): Promise<InventoryList>;
32
+ getInventoriesByPalletAndProductId(palletName: string, productId: string, context: ResolverContext): Promise<Inventory[]>;
32
33
  domain(inventory: Inventory): Promise<Domain>;
33
34
  updater(inventory: Inventory): Promise<User>;
34
35
  creator(inventory: Inventory): Promise<User>;
@@ -813,6 +813,20 @@ let InventoryQuery = class InventoryQuery {
813
813
  throw error;
814
814
  }
815
815
  }
816
+ // 팔레트 이름과 제품 ID를 기준으로 유효한 재고 조회
817
+ async getInventoriesByPalletAndProductId(palletName, productId, context) {
818
+ const { domain, tx } = context.state;
819
+ const inventoryRepo = tx.getRepository(inventory_1.Inventory);
820
+ const inventories = await inventoryRepo
821
+ .createQueryBuilder('i')
822
+ .where('i.domain_id = :domainId', { domainId: domain.id })
823
+ .andWhere('i.aux_info_3 = :palletName', { palletName })
824
+ .andWhere('i.product_id = :productId', { productId })
825
+ .andWhere('i.status = :status', { status: 'STORED' })
826
+ .andWhere('i.qty - i.locked_qty > 0')
827
+ .getMany();
828
+ return inventories;
829
+ }
816
830
  async domain(inventory) {
817
831
  return await (0, shell_1.getRepository)(shell_1.Domain).findOneBy({ id: inventory.domainId });
818
832
  }
@@ -1012,6 +1026,17 @@ tslib_1.__decorate([
1012
1026
  tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
1013
1027
  tslib_1.__metadata("design:returntype", Promise)
1014
1028
  ], InventoryQuery.prototype, "inventoriesGroupByProduct", null);
1029
+ tslib_1.__decorate([
1030
+ (0, type_graphql_1.Directive)('@privilege(category: "inventory", privilege: "query", domainOwnerGranted: true)'),
1031
+ (0, type_graphql_1.Directive)('@transaction'),
1032
+ (0, type_graphql_1.Query)(returns => [inventory_1.Inventory]),
1033
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('palletName')),
1034
+ tslib_1.__param(1, (0, type_graphql_1.Arg)('productId')),
1035
+ tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
1036
+ tslib_1.__metadata("design:type", Function),
1037
+ tslib_1.__metadata("design:paramtypes", [String, String, Object]),
1038
+ tslib_1.__metadata("design:returntype", Promise)
1039
+ ], InventoryQuery.prototype, "getInventoriesByPalletAndProductId", null);
1015
1040
  tslib_1.__decorate([
1016
1041
  (0, type_graphql_1.FieldResolver)(type => shell_1.Domain),
1017
1042
  tslib_1.__param(0, (0, type_graphql_1.Root)()),
@@ -1 +1 @@
1
- {"version":3,"file":"inventory-query.js","sourceRoot":"","sources":["../../../server/service/inventory/inventory-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'\nimport { Brackets, EntityManager, Equal, Not, OrderByCondition, Repository, SelectQueryBuilder } from 'typeorm'\n\nimport { User } from '@things-factory/auth-base'\nimport { Bizplace, getPartnersCompanyBizplaces, getPermittedBizplaceIds } from '@things-factory/biz-base'\nimport { logger } from '@things-factory/env'\nimport { Product, ProductBundleSetting } from '@things-factory/product-base'\nimport { Setting } from '@things-factory/setting-base'\nimport {\n buildQuery,\n Domain,\n Filter,\n getQueryBuilderFromListParams,\n getRepository,\n ListParam,\n Pagination,\n Sorting\n} from '@things-factory/shell'\n\nimport { INVENTORY_STATUS, LOCATION_TYPE } from '../../constants'\nimport { InventoryChange } from '../inventory-change/inventory-change'\nimport { Inventory } from './inventory'\nimport { InventoryBundleGroupDetail, InventoryList } from './inventory-types'\n\n@Resolver(Inventory)\nexport class InventoryQuery {\n /**\n * Combined single query resolver to perform extraction of data with or without pagination\n * @param context\n * @param filters\n * @param pagination\n * @param sortings\n * @param locationSortingRules\n * @param exportItem\n * @returns\n */\n @Directive('@privilege(category: \"inventory\", privilege: \"query\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Query(returns => InventoryList)\n async inventories(\n @Ctx() context: ResolverContext,\n @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],\n @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,\n @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[],\n @Arg('locationSortingRules', type => [Sorting], { nullable: true }) locationSortingRules?: Sorting[],\n @Arg('exportItem', type => Boolean, { nullable: true }) exportItem?: Boolean\n ): Promise<InventoryList> {\n const { domain, user, tx } = context.state\n const { page, limit } = pagination || {}\n\n try {\n //Define special filters\n const productFilters = filters.find((filter: any) => filter.name == 'productInfo')\n const remainOnlyParam = filters.find((filter: any) => filter.name == 'remainOnly')\n const bizplace = filters.find((filter: any) => filter.name === 'bizplace')\n\n filters = filters.filter(x => ['productInfo', 'remainOnly'].indexOf(x.name) < 0)\n\n const params = { filters, pagination }\n\n const remainOnly: boolean = remainOnlyParam?.value || false\n\n const qb: SelectQueryBuilder<Inventory> = getQueryBuilderFromListParams({\n repository: tx.getRepository(Inventory),\n params,\n domain,\n alias: 'inventory',\n searchables: ['warehouse', 'product', 'batchId', 'location', 'palletId', 'lot']\n })\n\n qb.leftJoinAndSelect('inventory.bizplace', 'bizplace')\n .leftJoinAndSelect('inventory.product', 'product')\n .leftJoinAndSelect('product.productDetails', 'productDetail', 'productDetail.id = inventory.product_detail_id')\n .leftJoinAndSelect('inventory.warehouse', 'warehouse')\n .leftJoinAndSelect('inventory.location', 'location')\n .leftJoinAndSelect('inventory.creator', 'creator')\n .leftJoinAndSelect('inventory.updater', 'updater')\n\n if (!bizplace) {\n const bizplaces = await getPermittedBizplaceIds(domain, user)\n\n qb.andWhere(\n new Brackets(qb => {\n qb.orWhere('inventory.bizplace_id IN (:...bizplaces)', { bizplaces })\n })\n )\n }\n\n // To get aggregated serial number in csv and total number of stored serial number\n qb.leftJoinAndSelect(\n subQuery => {\n return subQuery\n .select('inventoryItems.inventory_id', 'inventory_item_inventory_id')\n .addSelect(`SUM(case when \"inventoryItems\".\"status\" = 'STORED' then 1 else 0 end)`, 'inventory_item_count')\n .addSelect(`string_agg(inventoryItems.serial_number, ', ')`, 'serial_numbers')\n .from('inventory_items', 'inventoryItems')\n .where(`inventoryItems.domain_id = :domainId`, { domainId: domain.id })\n .andWhere(`inventoryItems.status = :ivicStatus`, { ivicStatus: INVENTORY_STATUS.STORED })\n .groupBy('inventoryItems.inventory_id')\n },\n 'inventoryItems',\n '\"inventoryItems\".\"inventory_item_inventory_id\" = \"inventory\".\"id\"'\n )\n\n // To get inventory with remaining qty\n if (remainOnly) {\n qb.andWhere('inventory.qty > 0')\n .andWhere('CASE WHEN inventory.lockedQty IS NULL THEN 0 ELSE inventory.lockedQty END >= 0')\n .andWhere('inventory.qty - CASE WHEN inventory.lockedQty IS NULL THEN 0 ELSE inventory.lockedQty END > 0')\n }\n\n // Filter based on multiple product parameters and allow to search in csv format\n if (productFilters) {\n let productFilterValue = `%${productFilters.value.toLowerCase()}%`\n qb.andWhere(qb => {\n const subQuery = qb\n .subQuery()\n .select()\n .from(Product, `products`)\n .where(`products.id = Inventory.product_id`) // @chrislim Does the uppercase I in Inventory affect? I can see the rest are in lowercase i\n .andWhere(\n new Brackets(qb => {\n qb.where('Lower(products.sku) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.name) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.description) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.brand) LIKE :productInfo', { productInfo: productFilterValue })\n })\n )\n .getQuery()\n return `EXISTS ${subQuery}`\n })\n }\n\n // Apply sorting based on child data\n if (sortings?.length !== 0) {\n const arrChildSortData = ['bizplace', 'product', 'location', 'warehouse', 'zone']\n const sort: OrderByCondition = (sortings || []).reduce(\n (acc, sort) => ({\n ...acc,\n [arrChildSortData.indexOf(sort.name) >= 0 ? sort.name + '.name' : 'inventory.' + sort.name]: sort.desc\n ? 'DESC'\n : 'ASC'\n }),\n {}\n )\n qb.orderBy(sort)\n }\n\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach(rule => {\n qb.addOrderBy(`location.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n\n // Fetch all row for exporting\n if (exportItem != true && page && limit) {\n qb.offset((page - 1) * limit).limit(limit)\n }\n\n let items = (await qb.getRawMany()).map(item => {\n return {\n ...new Inventory(item),\n serialNumbers: item.serial_numbers\n }\n })\n let total = await qb.getCount()\n\n return {\n items,\n total\n }\n } catch (error) {\n logger.error(`inventory-query[inventories]`, error)\n throw error\n }\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => Inventory)\n async inventory(@Arg('palletId') palletId: string, @Ctx() context: ResolverContext): Promise<Inventory> {\n const { domain } = context.state\n\n return await getRepository(Inventory).findOne({\n where: { domain: { id: domain.id }, palletId },\n relations: ['domain', 'bizplace', 'product', 'location', 'warehouse', 'creator', 'updater']\n })\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => Inventory)\n async inventoryById(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Inventory> {\n const { domain } = context.state\n\n return await getRepository(Inventory).findOne({\n where: { domain: { id: domain.id }, id },\n relations: ['domain', 'bizplace', 'product', 'location', 'warehouse', 'creator', 'updater']\n })\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => Inventory)\n async inventoryByPallet(@Arg('palletId') palletId: string, @Ctx() context: ResolverContext): Promise<Inventory> {\n const { domain } = context.state\n\n return await getRepository(Inventory).findOne({\n where: { domain: { id: domain.id }, palletId, status: Not(Equal(INVENTORY_STATUS.TERMINATED)) },\n relations: ['domain', 'bizplace', 'product', 'location', 'warehouse', 'creator', 'updater']\n })\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => InventoryList)\n async renewInventoriesGroupByProduct(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<InventoryList> {\n const { domain } = context.state\n const qtySorter = params.sortings?.find(i => i.name === 'qty')\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(Inventory),\n params,\n alias: 'i',\n domain,\n searchables: ['productName', 'productSKU', 'productType'],\n filtersMap: {\n productName: {\n relationColumn: 'product',\n columnName: 'name'\n },\n productSKU: {\n relationColumn: 'product',\n columnName: 'sku'\n },\n productType: {\n relationColumn: 'product',\n columnName: 'type'\n }\n }\n })\n\n queryBuilder\n .select('product.id', 'productId')\n .addSelect('product.name', 'productName')\n .addSelect('product.sku', 'productSKU')\n .addSelect('product.type', 'productType')\n .addSelect('product.primaryValue', 'primaryValue')\n .addSelect('product.primaryUnit', 'primaryUnit')\n .addSelect('product.auxUnit1', 'auxUnit1')\n .addSelect('product.minQty', 'minQty')\n .addSelect('product.maxQty', 'maxQty')\n .addSelect('i.product_color', 'productColor')\n .addSelect('i.product_quality', 'productQuality')\n .addSelect('i.work_category', 'workCategory')\n .addSelect('product.width', 'width') // TODO 인벤토리에서 가져와야 할꺼 같음\n .addSelect('product.height', 'height')\n .addSelect('product.depth', 'depth')\n .addSelect('i.packing_type', 'packingType')\n .addSelect('COALESCE(SUM(i.qty), 0)', 'qty')\n .addSelect('COALESCE(SUM(i.locked_qty), 0)', 'lockedQty')\n .addSelect('COALESCE(SUM(i.uom_value), 0)', 'uomValue')\n .addSelect('COALESCE(SUM(i.locked_uom_value), 0)', 'lockedUomValue')\n .innerJoin('i.product', 'product', 'product.deleted_at IS NULL')\n .andWhere('i.status = :status', { status: INVENTORY_STATUS.STORED })\n .andWhere('i.expiration_date >= now()')\n .andWhere('product.domain_id = :domain', { domain: domain.id })\n .groupBy('product.id')\n .addGroupBy('i.product_color')\n .addGroupBy('i.product_quality')\n .addGroupBy('i.packing_type')\n .addGroupBy('i.work_category')\n\n if (qtySorter) {\n queryBuilder.orderBy('qty', qtySorter.desc ? 'DESC' : 'ASC')\n }\n\n queryBuilder.addOrderBy('product.sku', 'ASC')\n\n const items = await queryBuilder.getRawMany()\n return { items, total: items.length }\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Query(returns => InventoryList)\n async inventoriesByProduct(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<InventoryList> {\n try {\n const { domain, user, tx } = context.state\n let permittedBizplaceIds: string[] = await getPermittedBizplaceIds(domain, user)\n const partnersCompanyBizplaces: Bizplace[] = await getPartnersCompanyBizplaces(domain, user)\n\n const page = params.pagination.page\n const limit = params.pagination.limit\n\n let bizplaceFilter = params.filters.find(filter => filter.name == 'bizplace')\n let productFilter = params.filters.find(filter => filter.name == 'product')\n let packingTypeFilter = params.filters.find(filter => filter.name == 'packingType')\n let availableStockFilter = params.filters.find(filter => filter.name == 'availableStock')\n let lowStockFilter = params.filters.find(filter => filter.name == 'lowStock')\n let overStockFilter = params.filters.find(filter => filter.name == 'overStock')\n let quarantineStockFilter = params.filters.find(filter => filter.name == 'quarantineStock')\n let reserveStockFilter = params.filters.find(filter => filter.name == 'reserveStock')\n let productTypeFilter = params.filters.find(filter => filter.name == 'type')\n\n if (bizplaceFilter) {\n const bizplaceQueryBuilder: SelectQueryBuilder<Bizplace> = getRepository(Bizplace).createQueryBuilder('b')\n bizplaceQueryBuilder\n .innerJoin('companies', 'c2', ' c2.domain_id = b.domain_id')\n .innerJoin('bizplaces', 'b2', 'b2.company_id = c2.id')\n .where('b2.id = :bizplaceId', { bizplaceId: bizplaceFilter.value })\n\n let bizplaceList = await bizplaceQueryBuilder.getMany()\n\n permittedBizplaceIds = [\n ...permittedBizplaceIds.filter(itm => itm == bizplaceFilter.value),\n ...bizplaceList.map(bz => bz.id),\n ...partnersCompanyBizplaces.map(biz => biz.id)\n ]\n }\n\n let bizplaceQuery = ''\n if (permittedBizplaceIds.length > 0) {\n bizplaceQuery = `AND EXISTS (\n SELECT * FROM (VALUES ${permittedBizplaceIds.map(id => `('${id}')`).join(',')})\n AS bizFilter(bizplace_id)\n WHERE bizFilter.bizplace_id::uuid = \"Inventory\".\"bizplace_id\"\n )`\n } else {\n bizplaceQuery = `1 = 0`\n }\n\n let productQuery = ''\n if (productFilter) {\n let productValue = productFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n productQuery = `AND (\n Lower(\"Product\".\"name\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"sku\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"brand\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"description\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"name\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"sku\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"description\") LIKE ANY(ARRAY[${productValue}])\n )`\n }\n\n if (productTypeFilter) {\n let productTypeValue = productTypeFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n productQuery =\n productQuery +\n ` AND (\n Lower(\"Product\".\"type\") LIKE ANY(ARRAY[${productTypeValue}])\n )`\n }\n\n let qtyStockQuery = ''\n\n let availableStockQuery = ''\n\n if (reserveStockFilter?.value) {\n qtyStockQuery += `\\nAND SUM(\"reserveQty\") > 0`\n }\n\n if (quarantineStockFilter?.value) {\n qtyStockQuery += `\\nAND SUM(\"quarantineQty\") > 0`\n }\n\n if (availableStockFilter?.value) {\n qtyStockQuery += ` AND SUM(\"availableQty\") > 0`\n }\n\n if (availableStockFilter?.value) {\n availableStockQuery = ` AND SUM(\"Inventory\".\"qty\") > 0`\n }\n\n if (availableStockFilter?.value && quarantineStockFilter?.value) {\n qtyStockQuery = ''\n qtyStockQuery += `\\nAND (SUM(\"availableQty\") > 0 \\n OR SUM(\"quarantineQty\") > 0)`\n }\n\n if (availableStockFilter?.value && reserveStockFilter?.value) {\n qtyStockQuery = ''\n qtyStockQuery += `\\nAND (SUM(\"availableQty\") > 0 \\n OR SUM(\"reserveQty\") > 0)`\n }\n\n if (quarantineStockFilter?.value && reserveStockFilter?.value) {\n qtyStockQuery = ''\n qtyStockQuery += `\\nAND (SUM(\"quarantineQty\") > 0 \\n OR SUM(\"reserveQty\") > 0)`\n }\n\n let inventoryQuery = ''\n if (packingTypeFilter) {\n let packingTypeValue = packingTypeFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n\n inventoryQuery =\n inventoryQuery +\n ` AND (\n Lower(\"Inventory\".\"packing_type\") LIKE ANY(ARRAY[${packingTypeValue}])\n )`\n }\n\n let thresholdQuery = ''\n if (lowStockFilter?.value && overStockFilter?.value) {\n throw new Error('invalid filter combination')\n } else if (lowStockFilter?.value && !overStockFilter?.value) {\n thresholdQuery = `AND SUM(COALESCE(\"minQty\", 0)) > SUM(\"availableQty\")`\n } else if (!lowStockFilter?.value && overStockFilter?.value) {\n thresholdQuery = `AND SUM(COALESCE(\"maxQty\", 0)) > 0 AND SUM(COALESCE(\"maxQty\", 0)) < SUM(\"availableQty\")`\n }\n\n await tx.query(\n `\n CREATE TEMP TABLE order_inventories_by_products AS (\n SELECT \"product_id\", \"packing_type\", sum(\"release_qty\") AS \"total_release_qty\" FROM order_inventories oi \n WHERE \"type\" = 'RELEASE_OF_GOODS'\n AND \"domain_id\" = $1\n AND \"inventory_id\" ISNULL\n AND \"status\" IN ('PENDING','PENDING_RECEIVE','PENDING_WORKSHEET','READY_TO_PICK'/*, 'PENDING_SPLIT' kiv sebab kalau pending split, ada yang dah assign tapi belum delete*/)\n GROUP BY \"product_id\", \"packing_type\"\n )`,\n [domain.id]\n )\n\n await tx.query(\n `\n create temp table temp_inv_history AS \n (\n SELECT \"Product\".\"id\" AS \"id\", \"Product\".\"sku\" AS \"sku\", \"Product\".\"brand\" AS \"brand\", \"Product\".\"name\" AS \"name\", \"Product\".\"type\" AS \"type\", \"Product\".\"description\" AS \"description\", \n \"Inventory\".\"packing_type\" AS \"packingType\",\n \"Product\".\"weight\" AS \"weight\", \"ProductRef\".\"id\" AS \"productRefId\", \n \"ProductRef\".\"description\" AS \"productRefDesciption\", \"Bizplace\".\"id\" AS \"bizplaceId\", \"Bizplace\".\"name\" AS \"bizplaceName\", SUM(\"Inventory\".\"qty\") AS \"qty\" ,\n CASE WHEN SUM(\"Inventory\".\"qty\") > 0 THEN SUM(COALESCE(\"Inventory\".\"unit_cost\", 0) * \"Inventory\".\"qty\")/ SUM(\"Inventory\".\"qty\") ELSE 0 END AS \"averageUnitCost\",\n COALESCE(\"ProductDetailBizplaceSetting\".\"min_qty\", \"Product\".\"min_qty\",0) AS \"minQty\", \n COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) AS \"maxQty\",\n CASE WHEN \"Location\".\"type\" NOT IN ('${LOCATION_TYPE.QUARANTINE}','${LOCATION_TYPE.RESERVE}') \n THEN \n CASE WHEN SUM(\"Inventory\".\"qty\") > 0 \n THEN SUM(\"Inventory\".\"qty\")-SUM(COALESCE(\"Inventory\".\"locked_qty\", 0) + COALESCE(\"OrderInventoriesByProduct\".\"total_release_qty\", 0))\n ELSE 0 END\n ELSE 0 END AS \"availableQty\",\n SUM(COALESCE(\"Inventory\".\"locked_qty\", 0) + COALESCE(\"OrderInventoriesByProduct\".\"total_release_qty\", 0)) AS \"releaseQty\",\n CASE WHEN \"Location\".\"type\" = '${LOCATION_TYPE.QUARANTINE}' \n THEN \n CASE WHEN SUM(\"Inventory\".\"qty\") > 0 \n THEN SUM(\"Inventory\".\"qty\")-SUM(COALESCE(\"Inventory\".\"locked_qty\", 0) + COALESCE(\"OrderInventoriesByProduct\".\"total_release_qty\", 0))\n ELSE 0 END\n ELSE 0 END AS \"quarantineQty\",\n CASE WHEN \"Location\".\"type\" = '${LOCATION_TYPE.RESERVE}' \n THEN \n CASE WHEN SUM(\"Inventory\".\"qty\") > 0 \n THEN SUM(\"Inventory\".\"qty\")-SUM(COALESCE(\"Inventory\".\"locked_qty\", 0) + COALESCE(\"OrderInventoriesByProduct\".\"total_release_qty\", 0))\n ELSE 0 END\n ELSE 0 END AS \"reserveQty\",\n CASE WHEN \"Location\".\"type\" = '${LOCATION_TYPE.BIN}' THEN SUM(\"Inventory\".\"qty\") ELSE 0 END AS \"binQty\"\n FROM \"inventories\" \"Inventory\" \n LEFT JOIN \"products\" \"Product\" ON \"Product\".\"id\"=\"Inventory\".\"product_id\" \n LEFT JOIN \"product_details\" \"ProductDetails\" ON \"ProductDetails\".\"product_id\" = \"Product\".\"id\" \n AND \"ProductDetails\".\"is_default\"\n LEFT JOIN \"product_detail_bizplace_settings\" \"ProductDetailBizplaceSetting\" ON \"ProductDetailBizplaceSetting\".\"product_detail_id\" = \"ProductDetails\".\"id\" \n AND \"ProductDetailBizplaceSetting\".\"domain_id\" = \"Inventory\".\"domain_id\"\n LEFT JOIN \"products\" \"ProductRef\" ON \"ProductRef\".\"id\"=\"Product\".\"product_ref_id\" \n INNER JOIN \"bizplaces\" \"Bizplace\" ON \"Bizplace\".\"id\"=\"Inventory\".\"bizplace_id\"\n INNER JOIN \"locations\" \"Location\" ON \"Location\".\"id\" = \"Inventory\".\"location_id\"\n LEFT JOIN \"order_inventories_by_products\" \"OrderInventoriesByProduct\" \n ON \"OrderInventoriesByProduct\".\"product_id\" = \"Inventory\".\"product_id\"\n AND \"OrderInventoriesByProduct\".\"packing_type\" = \"Inventory\".\"packing_type\"\n WHERE \"Inventory\".\"qty\" >= 0\n AND \"Inventory\".\"status\" <> 'MISSING'\n AND \"Inventory\".\"domain_id\" = $1\n ${bizplaceQuery}\n ${productQuery}\n GROUP BY \"Product\".\"id\", \"Bizplace\".\"id\", \"ProductDetailBizplaceSetting\".\"id\", \"Inventory\".\"packing_type\", \"Location\".\"type\", \"ProductRef\".\"id\"\n HAVING 1 = 1\n ${availableStockQuery}\n )`,\n [domain.id]\n )\n\n await tx.query(\n `\n CREATE TEMP TABLE grouped_inventories_product AS (\n SELECT \"id\", \"sku\", \"brand\", \"name\", \"description\",\n \"packingType\", \"bizplaceId\", \"bizplaceName\", sum(\"averageUnitCost\") AS \"averageUnitCost\",\n\t\t sum(\"minQty\") AS \"minQty\", sum(\"maxQty\") AS \"maxQty\", \n\t\t sum(\"availableQty\") AS \"availableQty\", \n\t\t sum(\"quarantineQty\") AS \"quarantineQty\",\n\t\t sum(\"reserveQty\") AS \"reserveQty\", \n\t\t sum(\"releaseQty\") AS \"releaseQty\",\n\t\t sum(\"availableQty\" + \"quarantineQty\" + \"releaseQty\" + \"reserveQty\" - \"binQty\") AS \"warehouseQty\" \n\t FROM temp_inv_history\n\t GROUP BY \"id\", \"sku\", \"brand\", \"name\", \"description\", \"packingType\", \"bizplaceId\", \"bizplaceName\"\n\t HAVING 1=1 \n ${qtyStockQuery}\n ${thresholdQuery}\n )\n `\n )\n const results: any = await tx.query(\n `\n SELECT * FROM grouped_inventories_product\n ORDER BY \"bizplaceName\", \"sku\"\n OFFSET $1 LIMIT $2\n `,\n [(page - 1) * limit, limit]\n )\n\n const total: any = await tx.query(`SELECT COUNT(*) FROM grouped_inventories_product`)\n\n await tx.query(`drop table temp_inv_history, order_inventories_by_products, grouped_inventories_product`)\n\n return {\n items: results.map((item: any) => {\n return {\n product: {\n id: item.id,\n name: item.name,\n sku: item.sku,\n brand: item.brand,\n description: item.description,\n minQty: item.minQty,\n maxQty: item.maxQty\n },\n bizplace: {\n id: item.bizplaceId,\n name: item.bizplaceName\n },\n packingType: item.packingType,\n averageUnitCost: item.averageUnitCost,\n availableQty: item.availableQty,\n releaseQty: item.releaseQty,\n quarantineQty: item.quarantineQty,\n reserveQty: item.reserveQty,\n warehouseQty: item.warehouseQty\n }\n }),\n total: total[0].count\n }\n } catch (error) {\n throw error\n }\n }\n\n @Directive('@transaction')\n @Query(returns => InventoryList)\n async inventoriesByStrategy(\n @Ctx() context: ResolverContext,\n @Arg('worksheetId') worksheetId: string,\n @Arg('batchId') batchId: string,\n @Arg('productName') productName: string,\n @Arg('productSku') productSku: string,\n @Arg('packingType') packingType: string,\n @Arg('packingSize') packingSize: number,\n @Arg('uom') uom: string,\n @Arg('pickingStrategy') pickingStrategy: string,\n @Arg('locationSortingRules', type => [Sorting], { nullable: true }) locationSortingRules?: Sorting[],\n @Arg('bizplaceId', { nullable: true }) bizplaceId?: string\n ): Promise<InventoryList> {\n const { domain, tx } = context.state\n\n const inventoryAssignmentSetting: Setting = await tx.getRepository(Setting).findOne({\n where: { domain: { id: domain.id }, name: 'rule-for-inventory-assignment' }\n })\n\n if (!locationSortingRules && inventoryAssignmentSetting) {\n locationSortingRules = []\n let locationSetting = JSON.parse(inventoryAssignmentSetting.value)\n for (const key in locationSetting) {\n locationSortingRules.push({ name: key, desc: locationSetting[key] == 'ASC' ? false : true })\n }\n }\n\n return inventoriesByStrategy(\n {\n worksheetId,\n batchId,\n bizplaceId,\n productName,\n productSku,\n packingType,\n packingSize,\n uom,\n pickingStrategy,\n locationSortingRules\n },\n tx\n )\n }\n\n @Directive('@transaction')\n @Query(returns => Boolean)\n async checkProductIdenticality(\n @Arg('palletA') palletA: string,\n @Arg('palletB') palletB: string,\n @Ctx() context: ResolverContext\n ): Promise<Boolean> {\n const { tx } = context.state\n const invRepo: Repository<Inventory> = tx.getRepository(Inventory)\n const invA: Inventory = await invRepo.findOne({\n where: { domain: { id: context.state.domain.id }, palletId: palletA, status: INVENTORY_STATUS.STORED },\n relations: ['product']\n })\n\n const invB: Inventory = await invRepo.findOne({\n where: { domain: { id: context.state.domain.id }, palletId: palletB, status: INVENTORY_STATUS.STORED },\n relations: ['product']\n })\n\n return (\n invA?.batchId === invB?.batchId &&\n invA?.product?.id === invB?.product?.id &&\n invA?.packingType === invB?.packingType\n )\n }\n\n @Query(returns => Boolean)\n async checkCartonIdenticality(\n @Arg('cartonA') cartonA: string,\n @Arg('palletA') palletA: string,\n @Arg('cartonB') cartonB: string,\n @Ctx() context: ResolverContext\n ) {\n const invRepo: Repository<Inventory> = getRepository(Inventory)\n const invA: Inventory = await invRepo.findOne({\n where: {\n domain: { id: context.state.domain.id },\n palletId: palletA,\n cartonId: cartonA,\n status: INVENTORY_STATUS.STORED\n },\n relations: ['product']\n })\n\n const invB: Inventory = await invRepo.findOne({\n where: {\n domain: { id: context.state.domain.id },\n packingType: invA.packingType,\n packingSize: invA.packingSize,\n product: { id: invA.product.id },\n cartonId: cartonB,\n status: INVENTORY_STATUS.STORED\n },\n relations: ['product']\n })\n\n return (\n invA?.expirationDate === invB?.expirationDate &&\n invA?.product?.id === invB?.product?.id &&\n invA?.packingType === invB?.packingType &&\n invA?.packingSize === invB?.packingSize\n )\n }\n\n @Query(returns => Boolean)\n async checkInventoryOwner(\n @Arg('palletId') palletId: string,\n @Arg('bizplaceName') bizplaceName: string,\n @Ctx() context: ResolverContext\n ): Promise<Boolean> {\n const invRepo: Repository<Inventory> = getRepository(Inventory)\n const bizRepo: Repository<Bizplace> = getRepository(Bizplace)\n\n const inventory: Inventory = await invRepo.findOne({\n where: { domain: { id: context.state.domain.id }, palletId, status: INVENTORY_STATUS.STORED },\n relations: ['bizplace']\n })\n\n if (!inventory) throw new Error('This inventory status is not stored.')\n\n const ownerBizplace: Bizplace = await bizRepo.findOne({\n where: { name: bizplaceName }\n })\n\n const foundBizplace: Bizplace = inventory.bizplace\n\n return Boolean(ownerBizplace.id === foundBizplace.id)\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => InventoryBundleGroupDetail)\n async inventoriesByBundle(\n @Ctx() context: ResolverContext,\n @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],\n @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,\n @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[]\n ): Promise<InventoryBundleGroupDetail> {\n const { domain, user } = context.state\n\n const params = { filters, pagination }\n\n const productBundleId = params.filters.filter(x => x.name === 'productBundleId')[0].value\n if (!productBundleId) {\n throw new Error('params product bundle is missing')\n }\n\n const bundleReleaseQty: number = params.filters.filter(x => x.name === 'bundleReleaseQty')[0].value\n\n // remove productBundleId and bundleReleaseQty from params.filters\n params.filters = params.filters.filter(x => x.name !== 'productBundleId' && x.name !== 'bundleReleaseQty')\n\n if (!params.filters.find((filter: any) => filter.name === 'bizplace_id')) {\n params.filters.push({\n name: 'bizplace_id',\n operator: 'in',\n value: await getPermittedBizplaceIds(domain, user),\n relation: true\n })\n }\n\n const remainOnlyParam = params?.filters?.find(\n (f: { name: string; operator: string; value: any }) => f.name === 'remainOnly'\n )\n\n let remainOnly: boolean = false\n if (typeof remainOnlyParam?.value !== 'undefined') {\n remainOnly = remainOnlyParam.value\n params.filters = params.filters.filter(\n (f: { name: string; operator: string; value: any }) => f.name !== 'remainOnly'\n )\n }\n\n const unlockOnlyParam = params?.filters?.find(\n (f: { name: string; operator: string; value: any }) => f.name === 'unlockOnly'\n )\n\n let unlockOnly: boolean = false\n if (typeof unlockOnlyParam?.value !== 'undefined') {\n unlockOnly = unlockOnlyParam.value\n params.filters = params.filters.filter(\n (f: { name: string; operator: string; value: any }) => f.name !== 'unlockOnly'\n )\n }\n\n const productBundleSettings: ProductBundleSetting[] = await getRepository(ProductBundleSetting).find({\n where: { productBundle: { id: productBundleId } },\n relations: ['product', 'productBundle']\n })\n\n if (!productBundleSettings.length) {\n throw new Error('product bundle settings is not found')\n }\n\n const qb: SelectQueryBuilder<Inventory> = getRepository(Inventory).createQueryBuilder('iv')\n buildQuery(qb, params, context)\n\n qb.select('iv.product_id', 'productId')\n .addSelect('iv.batch_id', 'batchId')\n .addSelect('iv.batch_id_ref', 'batchIdRef')\n .addSelect('iv.packing_type', 'packingType')\n .addSelect('SUM(iv.qty)', 'qty')\n .addSelect('SUM(iv.locked_qty)', 'lockedQty')\n .addSelect('SUM(iv.uom_value)', 'uomValue')\n .addSelect('SUM(iv.locked_uom_value)', 'lockedUomValue')\n .addSelect('prd.sku', 'productSku')\n .addSelect('prd.name', 'productName')\n .addSelect('prd.description', 'productDescription')\n .addSelect('prd.type', 'productType')\n .addSelect('prd.primary_unit', 'uom')\n .leftJoin('iv.product', 'prd')\n\n if (remainOnly) {\n qb.andWhere('iv.qty > 0')\n .andWhere('CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END >= 0')\n .andWhere('iv.qty - CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END > 0')\n }\n\n if (unlockOnly) {\n qb.andWhere('CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END = 0')\n }\n\n qb.andWhere('iv.product_id IN (:...productIds)', {\n productIds: productBundleSettings.map(productBundle => productBundle.product.id)\n })\n .groupBy('iv.product_id')\n .addGroupBy('iv.batch_id')\n .addGroupBy('iv.batch_id_ref')\n .addGroupBy('iv.packing_type')\n .addGroupBy('prd.sku')\n .addGroupBy('prd.name')\n .addGroupBy('prd.description')\n .addGroupBy('prd.type')\n .addOrderBy('prd.name')\n .addGroupBy('prd.primary_unit')\n .addOrderBy('iv.batch_id')\n\n let bundleGroup = await qb.getRawMany()\n\n bundleGroup = bundleGroup.map((item: any) => {\n return {\n ...item,\n bundleId: productBundleId,\n remainQty: item.qty - (item.lockedQty ? item.lockedQty : 0),\n remainUomValue: item.uomValue - (item.lockedUomValue ? item.lockedUomValue : 0),\n uom: item.uom,\n bundleQty: productBundleSettings.filter(pbs => pbs.product.id === item.productId)[0].bundleQty\n }\n })\n\n const bundleSetting = productBundleSettings.map(pbs => {\n return {\n id: pbs.id,\n productId: pbs.product.id,\n bundleId: pbs.productBundle.id,\n bundleQty: pbs.bundleQty,\n releaseQty: bundleReleaseQty * pbs.bundleQty,\n productReleaseQty: 0,\n productReleaseUomValue: 0\n }\n })\n\n /** ************************ **/\n bundleGroup = bundleGroup\n .map(group => {\n const uomValue = group.remainUomValue / group.remainQty\n\n bundleSetting.forEach(setting => {\n let assigned = false\n let releaseQty = 0\n let releaseUomValue = 0\n\n if (group.productId === setting.productId) {\n if (setting.productReleaseQty < setting.releaseQty) {\n assigned = true\n const leftQty = setting.releaseQty - setting.productReleaseQty\n releaseQty = leftQty > group.remainQty ? group.remainQty : leftQty\n releaseUomValue = Math.round(releaseQty * uomValue * 100) / 100\n setting.productReleaseQty += releaseQty\n setting.productReleaseUomValue += releaseUomValue\n }\n\n group.assigned = assigned\n group.releaseQty = releaseQty\n group.releaseUomValue = releaseUomValue\n group.releaseUomValueWithUom = `${releaseUomValue} ${group.uom}`\n }\n })\n\n return group\n })\n .filter(group => group.assigned)\n /** ************************ **/\n\n return { bundleGroup, bundleSetting }\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Query(returns => InventoryList)\n async inventoriesGroupByProduct(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<InventoryList> {\n try {\n const { domain, user, tx } = context.state\n let permittedBizplaceIds: string[] = await getPermittedBizplaceIds(domain, user)\n const partnersCompanyBizplaces: Bizplace[] = await getPartnersCompanyBizplaces(domain, user)\n\n const page = params.pagination.page\n const limit = params.pagination.limit\n\n let bizplaceFilter = params.filters.find(filter => filter.name == 'bizplace')\n let productFilter = params.filters.find(filter => filter.name == 'product')\n let productTypeFilter = params.filters.find(filter => filter.name == 'type')\n let availableStockFilter = params.filters.find(filter => filter.name == 'availableStock')\n let lowStockFilter = params.filters.find(filter => filter.name == 'lowStock')\n let overStockFilter = params.filters.find(filter => filter.name == 'overStock')\n let warehouseNameFilter = params.filters.find(filter => filter.name == 'warehouseName')\n let unexpiredOnlyFilter = params.filters.find(filter => filter.name === 'unexpiredOnly')\n\n if (bizplaceFilter) {\n const bizplaceQueryBuilder: SelectQueryBuilder<Bizplace> = getRepository(Bizplace).createQueryBuilder('b')\n bizplaceQueryBuilder\n .innerJoin('companies', 'c2', ' c2.domain_id = b.domain_id')\n .innerJoin('bizplaces', 'b2', 'b2.company_id = c2.id')\n .where('b2.id = :bizplaceId', { bizplaceId: bizplaceFilter.value })\n\n let bizplaceList = await bizplaceQueryBuilder.getMany()\n\n permittedBizplaceIds = [\n ...permittedBizplaceIds.filter(itm => itm == bizplaceFilter.value),\n ...bizplaceList.map(bz => bz.id),\n ...partnersCompanyBizplaces.map(biz => biz.id)\n ]\n }\n\n let bizplaceQuery = ''\n if (permittedBizplaceIds.length > 0) {\n bizplaceQuery = `AND EXISTS (\n SELECT * FROM (VALUES ${permittedBizplaceIds.map(id => `('${id}')`).join(',')})\n AS bizFilter(bizplace_id)\n WHERE bizFilter.bizplace_id::uuid = \"Inventory\".\"bizplace_id\"\n )`\n } else {\n bizplaceQuery = `1 = 0`\n }\n\n let productQuery = ''\n if (productFilter) {\n let productValue = productFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n productQuery = `AND (\n Lower(\"Product\".\"name\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"sku\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"brand\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"description\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"name\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"sku\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"description\") LIKE ANY(ARRAY[${productValue}])\n )`\n }\n\n if (productTypeFilter) {\n let productTypeValue = productTypeFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n productQuery =\n productQuery +\n ` AND (\n Lower(\"Product\".\"type\") LIKE ANY(ARRAY[${productTypeValue}])\n )`\n }\n\n let availableStockQuery = ''\n if (availableStockFilter?.value) {\n availableStockQuery = ` AND SUM(\"Inventory\".\"qty\") > 0`\n }\n\n let unexpiredOnlyQuery = ''\n if (unexpiredOnlyFilter?.value) {\n unexpiredOnlyQuery = 'AND \"Inventory\".\"expiration_date\" >= CURRENT_DATE'\n }\n\n let thresholdQuery = ''\n if (lowStockFilter?.value) {\n thresholdQuery = `AND COALESCE(\"ProductDetailBizplaceSetting\".\"min_qty\", \"Product\".\"min_qty\",0) > SUM(\"Inventory\".\"qty\")`\n }\n\n if (overStockFilter?.value) {\n thresholdQuery = `AND COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) > 0 AND \n COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) < SUM(\"Inventory\".\"qty\")`\n }\n\n let warehouseQuery = ''\n if (warehouseNameFilter?.value) {\n warehouseQuery = `AND \"Warehouse\".\"name\" like '%${warehouseNameFilter.value}%'`\n }\n\n await tx.query(\n `\n create temp table temp_inv_history AS \n (\n SELECT \"Product\".\"id\" AS \"id\", \"Product\".\"sku\" AS \"sku\", \"Product\".\"brand\" AS \"brand\", \"Product\".\"name\" AS \"name\", \"Product\".\"type\" AS \"type\", \"Product\".\"description\" AS \"description\", \"Product\".\"primary_unit\" AS \"primaryUnit\",\n \"Product\".\"weight\" AS \"weight\", \"ProductRef\".\"id\" AS \"productRefId\", \n \"ProductRef\".\"description\" AS \"productRefDesciption\", \"Bizplace\".\"id\" AS \"bizplaceId\", \"Bizplace\".\"name\" AS \"bizplaceName\", SUM(\"Inventory\".\"qty\") AS \"qty\" , SUM(\"Inventory\".\"uom_value\") AS \"uomValue\",\n \"Warehouse\".\"id\" AS \"warehouseId\", \"Warehouse\".\"name\" AS \"warehouseName\",\n CASE WHEN SUM(\"Inventory\".\"qty\") > 0 THEN SUM(COALESCE(\"Inventory\".\"unit_cost\", 0) * \"Inventory\".\"qty\")/ SUM(\"Inventory\".\"qty\") ELSE 0 END AS \"averageUnitCost\",\n COALESCE(\"ProductDetailBizplaceSetting\".\"min_qty\", \"Product\".\"min_qty\",0) AS \"minQty\", \n COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) AS \"maxQty\"\n FROM \"inventories\" \"Inventory\" \n LEFT JOIN \"warehouses\" \"Warehouse\" ON \"Warehouse\".\"id\"=\"Inventory\".\"warehouse_id\"\n LEFT JOIN \"products\" \"Product\" ON \"Product\".\"id\"=\"Inventory\".\"product_id\" \n LEFT JOIN \"product_details\" \"ProductDetails\" ON \"ProductDetails\".\"product_id\" = \"Product\".\"id\" \n AND \"ProductDetails\".\"is_default\"\n LEFT JOIN \"product_detail_bizplace_settings\" \"ProductDetailBizplaceSetting\" ON \"ProductDetailBizplaceSetting\".\"product_detail_id\" = \"ProductDetails\".\"id\" \n AND \"ProductDetailBizplaceSetting\".\"domain_id\" = \"Inventory\".\"domain_id\"\n LEFT JOIN \"products\" \"ProductRef\" ON \"ProductRef\".\"id\"=\"Product\".\"product_ref_id\" \n INNER JOIN \"bizplaces\" \"Bizplace\" ON \"Bizplace\".\"id\"=\"Inventory\".\"bizplace_id\"\n WHERE \"Inventory\".\"qty\" >= 0\n AND \"Inventory\".\"domain_id\" = $1\n ${bizplaceQuery}\n ${productQuery}\n ${warehouseQuery}\n ${unexpiredOnlyQuery}\n GROUP BY \"Product\".\"id\", \"ProductRef\".\"id\", \"Bizplace\".\"id\", \"ProductDetailBizplaceSetting\".\"id\", \"Warehouse\".\"id\"\n HAVING 1 = 1\n ${availableStockQuery}\n ${thresholdQuery}\n )`,\n [domain.id]\n )\n\n const results: any = await tx.query(\n `\n SELECT * FROM temp_inv_history\n ORDER BY \"bizplaceName\", \"sku\" \n OFFSET $1 LIMIT $2\n `,\n [(page - 1) * limit, limit]\n )\n\n const total: any = await tx.query(`SELECT COUNT(*) FROM temp_inv_history`)\n\n tx.query(`drop table temp_inv_history`)\n\n return {\n items: results.map((item: any) => {\n return {\n product: {\n id: item.id,\n name: item.name,\n sku: item.sku,\n brand: item.brand,\n description: item.description,\n type: item.type,\n weight: item.weight,\n productRefId: item.productRefId,\n bizplaceId: item.bizplaceId,\n minQty: item.minQty,\n maxQty: item.maxQty,\n primaryUnit: item.primaryUnit\n },\n warehouse: {\n id: item.warehouseId,\n name: item.warehouseName\n },\n averageUnitCost: item.averageUnitCost,\n qty: item.qty,\n uomValue: item.uomValue\n }\n }),\n total: total[0].count\n }\n } catch (error) {\n throw error\n }\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() inventory: Inventory): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: inventory.domainId })\n }\n\n @FieldResolver(type => User)\n async updater(@Root() inventory: Inventory): Promise<User> {\n return await getRepository(User).findOneBy({ id: inventory.updaterId })\n }\n\n @FieldResolver(type => User)\n async creator(@Root() inventory: Inventory): Promise<User> {\n return await getRepository(User).findOneBy({ id: inventory.creatorId })\n }\n\n /*\n move changeCount to @FieldResolver so that system don't have\n to keep searching for this when user does not request for it \n */\n @FieldResolver(type => Number)\n async changeCount(@Root() inventory: Inventory): Promise<Number> {\n return await getRepository(InventoryChange).count({\n where: { inventory: { id: inventory.id } }\n })\n }\n\n /*\n \"purchaseOrderNo\", \"orderProductRemark\" and \"arrivalNoticeRefNo\"\n are purely for Getha's lot label. @farishelmi added these here to\n avoid logic changes in @inventories query\n */\n @FieldResolver(type => String)\n async purchaseOrderNo(@Root() inventory: Inventory): Promise<String> {\n if (!inventory.refOrderId) return ''\n\n let items: any = await getRepository(Inventory).query(`\n SELECT po.name as \"purchaseOrderNo\" FROM arrival_notices an\n LEFT JOIN purchase_orders po\n ON an.purchase_order_id = po.id\n WHERE an.id = '${inventory.refOrderId}'\n LIMIT 1\n `)\n\n return items[0]?.purchaseOrderNo || ''\n }\n\n @FieldResolver(type => String)\n async orderProductRemark(@Root() inventory: Inventory): Promise<String> {\n if (!inventory.orderProductId) return ''\n\n let items: any = await getRepository(Inventory).query(`\n SELECT op.remark as \"orderProductRemark\" FROM order_products op\n WHERE op.id = '${inventory.orderProductId}'\n LIMIT 1\n `)\n\n return items[0]?.orderProductRemark || ''\n }\n\n @FieldResolver(type => String)\n async arrivalNoticeRefNo(@Root() inventory: Inventory): Promise<String> {\n if (!inventory.refOrderId) return ''\n\n let items: any = await getRepository(Inventory).query(`\n SELECT an.ref_no as \"arrivalNoticeRefNo\" FROM arrival_notices an\n WHERE an.id = '${inventory.refOrderId}'\n LIMIT 1\n `)\n\n return items[0]?.arrivalNoticeRefNo || ''\n }\n\n @FieldResolver(type => String)\n async arrivalNoticeNo(@Root() inventory: Inventory): Promise<String> {\n if (!inventory.refOrderId) return ''\n\n let items: any = await getRepository(Inventory).query(`\n SELECT an.name as \"arrivalNoticeNo\" FROM arrival_notices an\n WHERE an.id = '${inventory.refOrderId}'\n LIMIT 1\n `)\n\n return items[0]?.arrivalNoticeNo || ''\n }\n}\n\nexport async function inventoriesByStrategy(\n {\n worksheetId,\n batchId,\n bizplaceId,\n productName,\n productSku,\n packingType,\n packingSize,\n uom,\n pickingStrategy,\n locationSortingRules\n },\n trxMgr: EntityManager\n) {\n const qb = await trxMgr.getRepository(Inventory).createQueryBuilder('INV')\n qb.innerJoinAndSelect('INV.product', 'PROD')\n .innerJoinAndSelect('INV.location', 'LOC')\n .addSelect(subQuery =>\n subQuery\n .select('COALESCE(SUM(release_qty), 0)', 'releaseQty')\n .from('order_inventories', 'OI')\n .where('\"OI\".\"inventory_id\" = \"INV\".\"id\"')\n .andWhere(\"\\\"OI\\\".\\\"status\\\" IN ('PENDING', 'PENDING_RECEIVE', 'PENDING_WORKSHEET', 'PENDING_SPLIT')\")\n .andWhere('\"OI\".\"ref_worksheet_id\" <> :worksheetId', { worksheetId: worksheetId })\n )\n .addSelect(subQuery =>\n subQuery\n .select('COALESCE(SUM(release_uom_value), 0)', 'releaseUomValue')\n .from('order_inventories', 'OI')\n .where('\"OI\".\"inventory_id\" = \"INV\".\"id\"')\n .andWhere(\"\\\"OI\\\".\\\"status\\\" IN ('PENDING', 'PENDING_RECEIVE', 'PENDING_WORKSHEET', 'PENDING_SPLIT')\")\n .andWhere('\"OI\".\"ref_worksheet_id\" <> :worksheetId', { worksheetId: worksheetId })\n )\n .andWhere('\"PROD\".\"name\" = :productName')\n .andWhere('\"PROD\".\"sku\" = :productSku')\n .andWhere('\"INV\".\"packing_type\" = :packingType')\n .andWhere('\"INV\".\"packing_size\" = :packingSize')\n .andWhere('\"INV\".\"uom\" = :uom')\n .andWhere('\"INV\".\"status\" = :status', { status: 'STORED' })\n .andWhere('\"LOC\".\"type\" NOT IN (:...locationTypes)', {\n locationTypes: [LOCATION_TYPE.QUARANTINE, LOCATION_TYPE.RESERVE]\n })\n .setParameters({\n productName,\n productSku,\n packingType,\n packingSize,\n uom\n })\n\n if (batchId !== '') {\n qb.andWhere('\"INV\".\"batch_id\" = :batchId', { batchId })\n }\n\n if (bizplaceId) {\n qb.andWhere('\"INV\".\"bizplace_id\" = :bizplaceId', { bizplaceId: bizplaceId })\n }\n\n switch (pickingStrategy.toUpperCase()) {\n case 'FIFO':\n qb.orderBy('\"INV\".\"created_at\"', 'ASC')\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n break\n\n case 'LIFO':\n qb.orderBy('\"INV\".\"created_at\"', 'DESC')\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n break\n\n case 'FEFO':\n qb.orderBy('\"INV\".\"expiration_date\"', 'ASC')\n qb.addOrderBy('\"INV\".\"created_at\"', 'ASC')\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n break\n\n case 'FMFO':\n qb.orderBy('\"INV\".\"manufacture_date\"', 'ASC')\n qb.addOrderBy('\"INV\".\"created_at\"', 'ASC')\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n break\n\n case 'LOCATION':\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n idx === 0\n ? qb.orderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n : qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n } else qb.orderBy('\"LOC\".\"name\"', 'DESC')\n break\n }\n\n const { entities, raw } = await qb.getRawAndEntities()\n const items = entities\n .map((inv: Inventory, idx: number) => {\n const qty: number = inv?.qty > 0 ? inv.qty : 0\n const uomValue: number = inv?.uomValue > 0 ? inv.uomValue : 0\n const lockedQty: number = inv.lockedQty || 0\n const lockedUomValue: number = inv.lockedUomValue || 0\n const releaseQty: number = parseInt(raw[idx].releaseQty) || 0\n const releaseUomValue: number = parseFloat(raw[idx].releaseUomValue) || 0\n\n return {\n ...inv,\n qty: qty - lockedQty - releaseQty,\n uomValue: uomValue - lockedUomValue - releaseUomValue\n }\n })\n .filter((inv: Inventory) => inv.qty)\n\n const total: number = await qb.getCount()\n return { items, total }\n}\n"]}
1
+ {"version":3,"file":"inventory-query.js","sourceRoot":"","sources":["../../../server/service/inventory/inventory-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'\nimport { Brackets, EntityManager, Equal, Not, OrderByCondition, Repository, SelectQueryBuilder } from 'typeorm'\n\nimport { User } from '@things-factory/auth-base'\nimport { Bizplace, getPartnersCompanyBizplaces, getPermittedBizplaceIds } from '@things-factory/biz-base'\nimport { logger } from '@things-factory/env'\nimport { Product, ProductBundleSetting } from '@things-factory/product-base'\nimport { Setting } from '@things-factory/setting-base'\nimport {\n buildQuery,\n Domain,\n Filter,\n getQueryBuilderFromListParams,\n getRepository,\n ListParam,\n Pagination,\n Sorting\n} from '@things-factory/shell'\n\nimport { INVENTORY_STATUS, LOCATION_TYPE } from '../../constants'\nimport { InventoryChange } from '../inventory-change/inventory-change'\nimport { Inventory } from './inventory'\nimport { InventoryBundleGroupDetail, InventoryList } from './inventory-types'\n\n@Resolver(Inventory)\nexport class InventoryQuery {\n /**\n * Combined single query resolver to perform extraction of data with or without pagination\n * @param context\n * @param filters\n * @param pagination\n * @param sortings\n * @param locationSortingRules\n * @param exportItem\n * @returns\n */\n @Directive('@privilege(category: \"inventory\", privilege: \"query\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Query(returns => InventoryList)\n async inventories(\n @Ctx() context: ResolverContext,\n @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],\n @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,\n @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[],\n @Arg('locationSortingRules', type => [Sorting], { nullable: true }) locationSortingRules?: Sorting[],\n @Arg('exportItem', type => Boolean, { nullable: true }) exportItem?: Boolean\n ): Promise<InventoryList> {\n const { domain, user, tx } = context.state\n const { page, limit } = pagination || {}\n\n try {\n //Define special filters\n const productFilters = filters.find((filter: any) => filter.name == 'productInfo')\n const remainOnlyParam = filters.find((filter: any) => filter.name == 'remainOnly')\n const bizplace = filters.find((filter: any) => filter.name === 'bizplace')\n\n filters = filters.filter(x => ['productInfo', 'remainOnly'].indexOf(x.name) < 0)\n\n const params = { filters, pagination }\n\n const remainOnly: boolean = remainOnlyParam?.value || false\n\n const qb: SelectQueryBuilder<Inventory> = getQueryBuilderFromListParams({\n repository: tx.getRepository(Inventory),\n params,\n domain,\n alias: 'inventory',\n searchables: ['warehouse', 'product', 'batchId', 'location', 'palletId', 'lot']\n })\n\n qb.leftJoinAndSelect('inventory.bizplace', 'bizplace')\n .leftJoinAndSelect('inventory.product', 'product')\n .leftJoinAndSelect('product.productDetails', 'productDetail', 'productDetail.id = inventory.product_detail_id')\n .leftJoinAndSelect('inventory.warehouse', 'warehouse')\n .leftJoinAndSelect('inventory.location', 'location')\n .leftJoinAndSelect('inventory.creator', 'creator')\n .leftJoinAndSelect('inventory.updater', 'updater')\n\n if (!bizplace) {\n const bizplaces = await getPermittedBizplaceIds(domain, user)\n\n qb.andWhere(\n new Brackets(qb => {\n qb.orWhere('inventory.bizplace_id IN (:...bizplaces)', { bizplaces })\n })\n )\n }\n\n // To get aggregated serial number in csv and total number of stored serial number\n qb.leftJoinAndSelect(\n subQuery => {\n return subQuery\n .select('inventoryItems.inventory_id', 'inventory_item_inventory_id')\n .addSelect(`SUM(case when \"inventoryItems\".\"status\" = 'STORED' then 1 else 0 end)`, 'inventory_item_count')\n .addSelect(`string_agg(inventoryItems.serial_number, ', ')`, 'serial_numbers')\n .from('inventory_items', 'inventoryItems')\n .where(`inventoryItems.domain_id = :domainId`, { domainId: domain.id })\n .andWhere(`inventoryItems.status = :ivicStatus`, { ivicStatus: INVENTORY_STATUS.STORED })\n .groupBy('inventoryItems.inventory_id')\n },\n 'inventoryItems',\n '\"inventoryItems\".\"inventory_item_inventory_id\" = \"inventory\".\"id\"'\n )\n\n // To get inventory with remaining qty\n if (remainOnly) {\n qb.andWhere('inventory.qty > 0')\n .andWhere('CASE WHEN inventory.lockedQty IS NULL THEN 0 ELSE inventory.lockedQty END >= 0')\n .andWhere('inventory.qty - CASE WHEN inventory.lockedQty IS NULL THEN 0 ELSE inventory.lockedQty END > 0')\n }\n\n // Filter based on multiple product parameters and allow to search in csv format\n if (productFilters) {\n let productFilterValue = `%${productFilters.value.toLowerCase()}%`\n qb.andWhere(qb => {\n const subQuery = qb\n .subQuery()\n .select()\n .from(Product, `products`)\n .where(`products.id = Inventory.product_id`) // @chrislim Does the uppercase I in Inventory affect? I can see the rest are in lowercase i\n .andWhere(\n new Brackets(qb => {\n qb.where('Lower(products.sku) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.name) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.description) LIKE :productInfo', { productInfo: productFilterValue })\n .orWhere('Lower(products.brand) LIKE :productInfo', { productInfo: productFilterValue })\n })\n )\n .getQuery()\n return `EXISTS ${subQuery}`\n })\n }\n\n // Apply sorting based on child data\n if (sortings?.length !== 0) {\n const arrChildSortData = ['bizplace', 'product', 'location', 'warehouse', 'zone']\n const sort: OrderByCondition = (sortings || []).reduce(\n (acc, sort) => ({\n ...acc,\n [arrChildSortData.indexOf(sort.name) >= 0 ? sort.name + '.name' : 'inventory.' + sort.name]: sort.desc\n ? 'DESC'\n : 'ASC'\n }),\n {}\n )\n qb.orderBy(sort)\n }\n\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach(rule => {\n qb.addOrderBy(`location.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n\n // Fetch all row for exporting\n if (exportItem != true && page && limit) {\n qb.offset((page - 1) * limit).limit(limit)\n }\n\n let items = (await qb.getRawMany()).map(item => {\n return {\n ...new Inventory(item),\n serialNumbers: item.serial_numbers\n }\n })\n let total = await qb.getCount()\n\n return {\n items,\n total\n }\n } catch (error) {\n logger.error(`inventory-query[inventories]`, error)\n throw error\n }\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => Inventory)\n async inventory(@Arg('palletId') palletId: string, @Ctx() context: ResolverContext): Promise<Inventory> {\n const { domain } = context.state\n\n return await getRepository(Inventory).findOne({\n where: { domain: { id: domain.id }, palletId },\n relations: ['domain', 'bizplace', 'product', 'location', 'warehouse', 'creator', 'updater']\n })\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => Inventory)\n async inventoryById(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Inventory> {\n const { domain } = context.state\n\n return await getRepository(Inventory).findOne({\n where: { domain: { id: domain.id }, id },\n relations: ['domain', 'bizplace', 'product', 'location', 'warehouse', 'creator', 'updater']\n })\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => Inventory)\n async inventoryByPallet(@Arg('palletId') palletId: string, @Ctx() context: ResolverContext): Promise<Inventory> {\n const { domain } = context.state\n\n return await getRepository(Inventory).findOne({\n where: { domain: { id: domain.id }, palletId, status: Not(Equal(INVENTORY_STATUS.TERMINATED)) },\n relations: ['domain', 'bizplace', 'product', 'location', 'warehouse', 'creator', 'updater']\n })\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => InventoryList)\n async renewInventoriesGroupByProduct(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<InventoryList> {\n const { domain } = context.state\n const qtySorter = params.sortings?.find(i => i.name === 'qty')\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(Inventory),\n params,\n alias: 'i',\n domain,\n searchables: ['productName', 'productSKU', 'productType'],\n filtersMap: {\n productName: {\n relationColumn: 'product',\n columnName: 'name'\n },\n productSKU: {\n relationColumn: 'product',\n columnName: 'sku'\n },\n productType: {\n relationColumn: 'product',\n columnName: 'type'\n }\n }\n })\n\n queryBuilder\n .select('product.id', 'productId')\n .addSelect('product.name', 'productName')\n .addSelect('product.sku', 'productSKU')\n .addSelect('product.type', 'productType')\n .addSelect('product.primaryValue', 'primaryValue')\n .addSelect('product.primaryUnit', 'primaryUnit')\n .addSelect('product.auxUnit1', 'auxUnit1')\n .addSelect('product.minQty', 'minQty')\n .addSelect('product.maxQty', 'maxQty')\n .addSelect('i.product_color', 'productColor')\n .addSelect('i.product_quality', 'productQuality')\n .addSelect('i.work_category', 'workCategory')\n .addSelect('product.width', 'width') // TODO 인벤토리에서 가져와야 할꺼 같음\n .addSelect('product.height', 'height')\n .addSelect('product.depth', 'depth')\n .addSelect('i.packing_type', 'packingType')\n .addSelect('COALESCE(SUM(i.qty), 0)', 'qty')\n .addSelect('COALESCE(SUM(i.locked_qty), 0)', 'lockedQty')\n .addSelect('COALESCE(SUM(i.uom_value), 0)', 'uomValue')\n .addSelect('COALESCE(SUM(i.locked_uom_value), 0)', 'lockedUomValue')\n .innerJoin('i.product', 'product', 'product.deleted_at IS NULL')\n .andWhere('i.status = :status', { status: INVENTORY_STATUS.STORED })\n .andWhere('i.expiration_date >= now()')\n .andWhere('product.domain_id = :domain', { domain: domain.id })\n .groupBy('product.id')\n .addGroupBy('i.product_color')\n .addGroupBy('i.product_quality')\n .addGroupBy('i.packing_type')\n .addGroupBy('i.work_category')\n\n if (qtySorter) {\n queryBuilder.orderBy('qty', qtySorter.desc ? 'DESC' : 'ASC')\n }\n\n queryBuilder.addOrderBy('product.sku', 'ASC')\n\n const items = await queryBuilder.getRawMany()\n return { items, total: items.length }\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Query(returns => InventoryList)\n async inventoriesByProduct(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<InventoryList> {\n try {\n const { domain, user, tx } = context.state\n let permittedBizplaceIds: string[] = await getPermittedBizplaceIds(domain, user)\n const partnersCompanyBizplaces: Bizplace[] = await getPartnersCompanyBizplaces(domain, user)\n\n const page = params.pagination.page\n const limit = params.pagination.limit\n\n let bizplaceFilter = params.filters.find(filter => filter.name == 'bizplace')\n let productFilter = params.filters.find(filter => filter.name == 'product')\n let packingTypeFilter = params.filters.find(filter => filter.name == 'packingType')\n let availableStockFilter = params.filters.find(filter => filter.name == 'availableStock')\n let lowStockFilter = params.filters.find(filter => filter.name == 'lowStock')\n let overStockFilter = params.filters.find(filter => filter.name == 'overStock')\n let quarantineStockFilter = params.filters.find(filter => filter.name == 'quarantineStock')\n let reserveStockFilter = params.filters.find(filter => filter.name == 'reserveStock')\n let productTypeFilter = params.filters.find(filter => filter.name == 'type')\n\n if (bizplaceFilter) {\n const bizplaceQueryBuilder: SelectQueryBuilder<Bizplace> = getRepository(Bizplace).createQueryBuilder('b')\n bizplaceQueryBuilder\n .innerJoin('companies', 'c2', ' c2.domain_id = b.domain_id')\n .innerJoin('bizplaces', 'b2', 'b2.company_id = c2.id')\n .where('b2.id = :bizplaceId', { bizplaceId: bizplaceFilter.value })\n\n let bizplaceList = await bizplaceQueryBuilder.getMany()\n\n permittedBizplaceIds = [\n ...permittedBizplaceIds.filter(itm => itm == bizplaceFilter.value),\n ...bizplaceList.map(bz => bz.id),\n ...partnersCompanyBizplaces.map(biz => biz.id)\n ]\n }\n\n let bizplaceQuery = ''\n if (permittedBizplaceIds.length > 0) {\n bizplaceQuery = `AND EXISTS (\n SELECT * FROM (VALUES ${permittedBizplaceIds.map(id => `('${id}')`).join(',')})\n AS bizFilter(bizplace_id)\n WHERE bizFilter.bizplace_id::uuid = \"Inventory\".\"bizplace_id\"\n )`\n } else {\n bizplaceQuery = `1 = 0`\n }\n\n let productQuery = ''\n if (productFilter) {\n let productValue = productFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n productQuery = `AND (\n Lower(\"Product\".\"name\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"sku\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"brand\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"description\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"name\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"sku\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"description\") LIKE ANY(ARRAY[${productValue}])\n )`\n }\n\n if (productTypeFilter) {\n let productTypeValue = productTypeFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n productQuery =\n productQuery +\n ` AND (\n Lower(\"Product\".\"type\") LIKE ANY(ARRAY[${productTypeValue}])\n )`\n }\n\n let qtyStockQuery = ''\n\n let availableStockQuery = ''\n\n if (reserveStockFilter?.value) {\n qtyStockQuery += `\\nAND SUM(\"reserveQty\") > 0`\n }\n\n if (quarantineStockFilter?.value) {\n qtyStockQuery += `\\nAND SUM(\"quarantineQty\") > 0`\n }\n\n if (availableStockFilter?.value) {\n qtyStockQuery += ` AND SUM(\"availableQty\") > 0`\n }\n\n if (availableStockFilter?.value) {\n availableStockQuery = ` AND SUM(\"Inventory\".\"qty\") > 0`\n }\n\n if (availableStockFilter?.value && quarantineStockFilter?.value) {\n qtyStockQuery = ''\n qtyStockQuery += `\\nAND (SUM(\"availableQty\") > 0 \\n OR SUM(\"quarantineQty\") > 0)`\n }\n\n if (availableStockFilter?.value && reserveStockFilter?.value) {\n qtyStockQuery = ''\n qtyStockQuery += `\\nAND (SUM(\"availableQty\") > 0 \\n OR SUM(\"reserveQty\") > 0)`\n }\n\n if (quarantineStockFilter?.value && reserveStockFilter?.value) {\n qtyStockQuery = ''\n qtyStockQuery += `\\nAND (SUM(\"quarantineQty\") > 0 \\n OR SUM(\"reserveQty\") > 0)`\n }\n\n let inventoryQuery = ''\n if (packingTypeFilter) {\n let packingTypeValue = packingTypeFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n\n inventoryQuery =\n inventoryQuery +\n ` AND (\n Lower(\"Inventory\".\"packing_type\") LIKE ANY(ARRAY[${packingTypeValue}])\n )`\n }\n\n let thresholdQuery = ''\n if (lowStockFilter?.value && overStockFilter?.value) {\n throw new Error('invalid filter combination')\n } else if (lowStockFilter?.value && !overStockFilter?.value) {\n thresholdQuery = `AND SUM(COALESCE(\"minQty\", 0)) > SUM(\"availableQty\")`\n } else if (!lowStockFilter?.value && overStockFilter?.value) {\n thresholdQuery = `AND SUM(COALESCE(\"maxQty\", 0)) > 0 AND SUM(COALESCE(\"maxQty\", 0)) < SUM(\"availableQty\")`\n }\n\n await tx.query(\n `\n CREATE TEMP TABLE order_inventories_by_products AS (\n SELECT \"product_id\", \"packing_type\", sum(\"release_qty\") AS \"total_release_qty\" FROM order_inventories oi \n WHERE \"type\" = 'RELEASE_OF_GOODS'\n AND \"domain_id\" = $1\n AND \"inventory_id\" ISNULL\n AND \"status\" IN ('PENDING','PENDING_RECEIVE','PENDING_WORKSHEET','READY_TO_PICK'/*, 'PENDING_SPLIT' kiv sebab kalau pending split, ada yang dah assign tapi belum delete*/)\n GROUP BY \"product_id\", \"packing_type\"\n )`,\n [domain.id]\n )\n\n await tx.query(\n `\n create temp table temp_inv_history AS \n (\n SELECT \"Product\".\"id\" AS \"id\", \"Product\".\"sku\" AS \"sku\", \"Product\".\"brand\" AS \"brand\", \"Product\".\"name\" AS \"name\", \"Product\".\"type\" AS \"type\", \"Product\".\"description\" AS \"description\", \n \"Inventory\".\"packing_type\" AS \"packingType\",\n \"Product\".\"weight\" AS \"weight\", \"ProductRef\".\"id\" AS \"productRefId\", \n \"ProductRef\".\"description\" AS \"productRefDesciption\", \"Bizplace\".\"id\" AS \"bizplaceId\", \"Bizplace\".\"name\" AS \"bizplaceName\", SUM(\"Inventory\".\"qty\") AS \"qty\" ,\n CASE WHEN SUM(\"Inventory\".\"qty\") > 0 THEN SUM(COALESCE(\"Inventory\".\"unit_cost\", 0) * \"Inventory\".\"qty\")/ SUM(\"Inventory\".\"qty\") ELSE 0 END AS \"averageUnitCost\",\n COALESCE(\"ProductDetailBizplaceSetting\".\"min_qty\", \"Product\".\"min_qty\",0) AS \"minQty\", \n COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) AS \"maxQty\",\n CASE WHEN \"Location\".\"type\" NOT IN ('${LOCATION_TYPE.QUARANTINE}','${LOCATION_TYPE.RESERVE}') \n THEN \n CASE WHEN SUM(\"Inventory\".\"qty\") > 0 \n THEN SUM(\"Inventory\".\"qty\")-SUM(COALESCE(\"Inventory\".\"locked_qty\", 0) + COALESCE(\"OrderInventoriesByProduct\".\"total_release_qty\", 0))\n ELSE 0 END\n ELSE 0 END AS \"availableQty\",\n SUM(COALESCE(\"Inventory\".\"locked_qty\", 0) + COALESCE(\"OrderInventoriesByProduct\".\"total_release_qty\", 0)) AS \"releaseQty\",\n CASE WHEN \"Location\".\"type\" = '${LOCATION_TYPE.QUARANTINE}' \n THEN \n CASE WHEN SUM(\"Inventory\".\"qty\") > 0 \n THEN SUM(\"Inventory\".\"qty\")-SUM(COALESCE(\"Inventory\".\"locked_qty\", 0) + COALESCE(\"OrderInventoriesByProduct\".\"total_release_qty\", 0))\n ELSE 0 END\n ELSE 0 END AS \"quarantineQty\",\n CASE WHEN \"Location\".\"type\" = '${LOCATION_TYPE.RESERVE}' \n THEN \n CASE WHEN SUM(\"Inventory\".\"qty\") > 0 \n THEN SUM(\"Inventory\".\"qty\")-SUM(COALESCE(\"Inventory\".\"locked_qty\", 0) + COALESCE(\"OrderInventoriesByProduct\".\"total_release_qty\", 0))\n ELSE 0 END\n ELSE 0 END AS \"reserveQty\",\n CASE WHEN \"Location\".\"type\" = '${LOCATION_TYPE.BIN}' THEN SUM(\"Inventory\".\"qty\") ELSE 0 END AS \"binQty\"\n FROM \"inventories\" \"Inventory\" \n LEFT JOIN \"products\" \"Product\" ON \"Product\".\"id\"=\"Inventory\".\"product_id\" \n LEFT JOIN \"product_details\" \"ProductDetails\" ON \"ProductDetails\".\"product_id\" = \"Product\".\"id\" \n AND \"ProductDetails\".\"is_default\"\n LEFT JOIN \"product_detail_bizplace_settings\" \"ProductDetailBizplaceSetting\" ON \"ProductDetailBizplaceSetting\".\"product_detail_id\" = \"ProductDetails\".\"id\" \n AND \"ProductDetailBizplaceSetting\".\"domain_id\" = \"Inventory\".\"domain_id\"\n LEFT JOIN \"products\" \"ProductRef\" ON \"ProductRef\".\"id\"=\"Product\".\"product_ref_id\" \n INNER JOIN \"bizplaces\" \"Bizplace\" ON \"Bizplace\".\"id\"=\"Inventory\".\"bizplace_id\"\n INNER JOIN \"locations\" \"Location\" ON \"Location\".\"id\" = \"Inventory\".\"location_id\"\n LEFT JOIN \"order_inventories_by_products\" \"OrderInventoriesByProduct\" \n ON \"OrderInventoriesByProduct\".\"product_id\" = \"Inventory\".\"product_id\"\n AND \"OrderInventoriesByProduct\".\"packing_type\" = \"Inventory\".\"packing_type\"\n WHERE \"Inventory\".\"qty\" >= 0\n AND \"Inventory\".\"status\" <> 'MISSING'\n AND \"Inventory\".\"domain_id\" = $1\n ${bizplaceQuery}\n ${productQuery}\n GROUP BY \"Product\".\"id\", \"Bizplace\".\"id\", \"ProductDetailBizplaceSetting\".\"id\", \"Inventory\".\"packing_type\", \"Location\".\"type\", \"ProductRef\".\"id\"\n HAVING 1 = 1\n ${availableStockQuery}\n )`,\n [domain.id]\n )\n\n await tx.query(\n `\n CREATE TEMP TABLE grouped_inventories_product AS (\n SELECT \"id\", \"sku\", \"brand\", \"name\", \"description\",\n \"packingType\", \"bizplaceId\", \"bizplaceName\", sum(\"averageUnitCost\") AS \"averageUnitCost\",\n\t\t sum(\"minQty\") AS \"minQty\", sum(\"maxQty\") AS \"maxQty\", \n\t\t sum(\"availableQty\") AS \"availableQty\", \n\t\t sum(\"quarantineQty\") AS \"quarantineQty\",\n\t\t sum(\"reserveQty\") AS \"reserveQty\", \n\t\t sum(\"releaseQty\") AS \"releaseQty\",\n\t\t sum(\"availableQty\" + \"quarantineQty\" + \"releaseQty\" + \"reserveQty\" - \"binQty\") AS \"warehouseQty\" \n\t FROM temp_inv_history\n\t GROUP BY \"id\", \"sku\", \"brand\", \"name\", \"description\", \"packingType\", \"bizplaceId\", \"bizplaceName\"\n\t HAVING 1=1 \n ${qtyStockQuery}\n ${thresholdQuery}\n )\n `\n )\n const results: any = await tx.query(\n `\n SELECT * FROM grouped_inventories_product\n ORDER BY \"bizplaceName\", \"sku\"\n OFFSET $1 LIMIT $2\n `,\n [(page - 1) * limit, limit]\n )\n\n const total: any = await tx.query(`SELECT COUNT(*) FROM grouped_inventories_product`)\n\n await tx.query(`drop table temp_inv_history, order_inventories_by_products, grouped_inventories_product`)\n\n return {\n items: results.map((item: any) => {\n return {\n product: {\n id: item.id,\n name: item.name,\n sku: item.sku,\n brand: item.brand,\n description: item.description,\n minQty: item.minQty,\n maxQty: item.maxQty\n },\n bizplace: {\n id: item.bizplaceId,\n name: item.bizplaceName\n },\n packingType: item.packingType,\n averageUnitCost: item.averageUnitCost,\n availableQty: item.availableQty,\n releaseQty: item.releaseQty,\n quarantineQty: item.quarantineQty,\n reserveQty: item.reserveQty,\n warehouseQty: item.warehouseQty\n }\n }),\n total: total[0].count\n }\n } catch (error) {\n throw error\n }\n }\n\n @Directive('@transaction')\n @Query(returns => InventoryList)\n async inventoriesByStrategy(\n @Ctx() context: ResolverContext,\n @Arg('worksheetId') worksheetId: string,\n @Arg('batchId') batchId: string,\n @Arg('productName') productName: string,\n @Arg('productSku') productSku: string,\n @Arg('packingType') packingType: string,\n @Arg('packingSize') packingSize: number,\n @Arg('uom') uom: string,\n @Arg('pickingStrategy') pickingStrategy: string,\n @Arg('locationSortingRules', type => [Sorting], { nullable: true }) locationSortingRules?: Sorting[],\n @Arg('bizplaceId', { nullable: true }) bizplaceId?: string\n ): Promise<InventoryList> {\n const { domain, tx } = context.state\n\n const inventoryAssignmentSetting: Setting = await tx.getRepository(Setting).findOne({\n where: { domain: { id: domain.id }, name: 'rule-for-inventory-assignment' }\n })\n\n if (!locationSortingRules && inventoryAssignmentSetting) {\n locationSortingRules = []\n let locationSetting = JSON.parse(inventoryAssignmentSetting.value)\n for (const key in locationSetting) {\n locationSortingRules.push({ name: key, desc: locationSetting[key] == 'ASC' ? false : true })\n }\n }\n\n return inventoriesByStrategy(\n {\n worksheetId,\n batchId,\n bizplaceId,\n productName,\n productSku,\n packingType,\n packingSize,\n uom,\n pickingStrategy,\n locationSortingRules\n },\n tx\n )\n }\n\n @Directive('@transaction')\n @Query(returns => Boolean)\n async checkProductIdenticality(\n @Arg('palletA') palletA: string,\n @Arg('palletB') palletB: string,\n @Ctx() context: ResolverContext\n ): Promise<Boolean> {\n const { tx } = context.state\n const invRepo: Repository<Inventory> = tx.getRepository(Inventory)\n const invA: Inventory = await invRepo.findOne({\n where: { domain: { id: context.state.domain.id }, palletId: palletA, status: INVENTORY_STATUS.STORED },\n relations: ['product']\n })\n\n const invB: Inventory = await invRepo.findOne({\n where: { domain: { id: context.state.domain.id }, palletId: palletB, status: INVENTORY_STATUS.STORED },\n relations: ['product']\n })\n\n return (\n invA?.batchId === invB?.batchId &&\n invA?.product?.id === invB?.product?.id &&\n invA?.packingType === invB?.packingType\n )\n }\n\n @Query(returns => Boolean)\n async checkCartonIdenticality(\n @Arg('cartonA') cartonA: string,\n @Arg('palletA') palletA: string,\n @Arg('cartonB') cartonB: string,\n @Ctx() context: ResolverContext\n ) {\n const invRepo: Repository<Inventory> = getRepository(Inventory)\n const invA: Inventory = await invRepo.findOne({\n where: {\n domain: { id: context.state.domain.id },\n palletId: palletA,\n cartonId: cartonA,\n status: INVENTORY_STATUS.STORED\n },\n relations: ['product']\n })\n\n const invB: Inventory = await invRepo.findOne({\n where: {\n domain: { id: context.state.domain.id },\n packingType: invA.packingType,\n packingSize: invA.packingSize,\n product: { id: invA.product.id },\n cartonId: cartonB,\n status: INVENTORY_STATUS.STORED\n },\n relations: ['product']\n })\n\n return (\n invA?.expirationDate === invB?.expirationDate &&\n invA?.product?.id === invB?.product?.id &&\n invA?.packingType === invB?.packingType &&\n invA?.packingSize === invB?.packingSize\n )\n }\n\n @Query(returns => Boolean)\n async checkInventoryOwner(\n @Arg('palletId') palletId: string,\n @Arg('bizplaceName') bizplaceName: string,\n @Ctx() context: ResolverContext\n ): Promise<Boolean> {\n const invRepo: Repository<Inventory> = getRepository(Inventory)\n const bizRepo: Repository<Bizplace> = getRepository(Bizplace)\n\n const inventory: Inventory = await invRepo.findOne({\n where: { domain: { id: context.state.domain.id }, palletId, status: INVENTORY_STATUS.STORED },\n relations: ['bizplace']\n })\n\n if (!inventory) throw new Error('This inventory status is not stored.')\n\n const ownerBizplace: Bizplace = await bizRepo.findOne({\n where: { name: bizplaceName }\n })\n\n const foundBizplace: Bizplace = inventory.bizplace\n\n return Boolean(ownerBizplace.id === foundBizplace.id)\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => InventoryBundleGroupDetail)\n async inventoriesByBundle(\n @Ctx() context: ResolverContext,\n @Arg('filters', type => [Filter], { nullable: true }) filters?: Filter[],\n @Arg('pagination', type => Pagination, { nullable: true }) pagination?: Pagination,\n @Arg('sortings', type => [Sorting], { nullable: true }) sortings?: Sorting[]\n ): Promise<InventoryBundleGroupDetail> {\n const { domain, user } = context.state\n\n const params = { filters, pagination }\n\n const productBundleId = params.filters.filter(x => x.name === 'productBundleId')[0].value\n if (!productBundleId) {\n throw new Error('params product bundle is missing')\n }\n\n const bundleReleaseQty: number = params.filters.filter(x => x.name === 'bundleReleaseQty')[0].value\n\n // remove productBundleId and bundleReleaseQty from params.filters\n params.filters = params.filters.filter(x => x.name !== 'productBundleId' && x.name !== 'bundleReleaseQty')\n\n if (!params.filters.find((filter: any) => filter.name === 'bizplace_id')) {\n params.filters.push({\n name: 'bizplace_id',\n operator: 'in',\n value: await getPermittedBizplaceIds(domain, user),\n relation: true\n })\n }\n\n const remainOnlyParam = params?.filters?.find(\n (f: { name: string; operator: string; value: any }) => f.name === 'remainOnly'\n )\n\n let remainOnly: boolean = false\n if (typeof remainOnlyParam?.value !== 'undefined') {\n remainOnly = remainOnlyParam.value\n params.filters = params.filters.filter(\n (f: { name: string; operator: string; value: any }) => f.name !== 'remainOnly'\n )\n }\n\n const unlockOnlyParam = params?.filters?.find(\n (f: { name: string; operator: string; value: any }) => f.name === 'unlockOnly'\n )\n\n let unlockOnly: boolean = false\n if (typeof unlockOnlyParam?.value !== 'undefined') {\n unlockOnly = unlockOnlyParam.value\n params.filters = params.filters.filter(\n (f: { name: string; operator: string; value: any }) => f.name !== 'unlockOnly'\n )\n }\n\n const productBundleSettings: ProductBundleSetting[] = await getRepository(ProductBundleSetting).find({\n where: { productBundle: { id: productBundleId } },\n relations: ['product', 'productBundle']\n })\n\n if (!productBundleSettings.length) {\n throw new Error('product bundle settings is not found')\n }\n\n const qb: SelectQueryBuilder<Inventory> = getRepository(Inventory).createQueryBuilder('iv')\n buildQuery(qb, params, context)\n\n qb.select('iv.product_id', 'productId')\n .addSelect('iv.batch_id', 'batchId')\n .addSelect('iv.batch_id_ref', 'batchIdRef')\n .addSelect('iv.packing_type', 'packingType')\n .addSelect('SUM(iv.qty)', 'qty')\n .addSelect('SUM(iv.locked_qty)', 'lockedQty')\n .addSelect('SUM(iv.uom_value)', 'uomValue')\n .addSelect('SUM(iv.locked_uom_value)', 'lockedUomValue')\n .addSelect('prd.sku', 'productSku')\n .addSelect('prd.name', 'productName')\n .addSelect('prd.description', 'productDescription')\n .addSelect('prd.type', 'productType')\n .addSelect('prd.primary_unit', 'uom')\n .leftJoin('iv.product', 'prd')\n\n if (remainOnly) {\n qb.andWhere('iv.qty > 0')\n .andWhere('CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END >= 0')\n .andWhere('iv.qty - CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END > 0')\n }\n\n if (unlockOnly) {\n qb.andWhere('CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END = 0')\n }\n\n qb.andWhere('iv.product_id IN (:...productIds)', {\n productIds: productBundleSettings.map(productBundle => productBundle.product.id)\n })\n .groupBy('iv.product_id')\n .addGroupBy('iv.batch_id')\n .addGroupBy('iv.batch_id_ref')\n .addGroupBy('iv.packing_type')\n .addGroupBy('prd.sku')\n .addGroupBy('prd.name')\n .addGroupBy('prd.description')\n .addGroupBy('prd.type')\n .addOrderBy('prd.name')\n .addGroupBy('prd.primary_unit')\n .addOrderBy('iv.batch_id')\n\n let bundleGroup = await qb.getRawMany()\n\n bundleGroup = bundleGroup.map((item: any) => {\n return {\n ...item,\n bundleId: productBundleId,\n remainQty: item.qty - (item.lockedQty ? item.lockedQty : 0),\n remainUomValue: item.uomValue - (item.lockedUomValue ? item.lockedUomValue : 0),\n uom: item.uom,\n bundleQty: productBundleSettings.filter(pbs => pbs.product.id === item.productId)[0].bundleQty\n }\n })\n\n const bundleSetting = productBundleSettings.map(pbs => {\n return {\n id: pbs.id,\n productId: pbs.product.id,\n bundleId: pbs.productBundle.id,\n bundleQty: pbs.bundleQty,\n releaseQty: bundleReleaseQty * pbs.bundleQty,\n productReleaseQty: 0,\n productReleaseUomValue: 0\n }\n })\n\n /** ************************ **/\n bundleGroup = bundleGroup\n .map(group => {\n const uomValue = group.remainUomValue / group.remainQty\n\n bundleSetting.forEach(setting => {\n let assigned = false\n let releaseQty = 0\n let releaseUomValue = 0\n\n if (group.productId === setting.productId) {\n if (setting.productReleaseQty < setting.releaseQty) {\n assigned = true\n const leftQty = setting.releaseQty - setting.productReleaseQty\n releaseQty = leftQty > group.remainQty ? group.remainQty : leftQty\n releaseUomValue = Math.round(releaseQty * uomValue * 100) / 100\n setting.productReleaseQty += releaseQty\n setting.productReleaseUomValue += releaseUomValue\n }\n\n group.assigned = assigned\n group.releaseQty = releaseQty\n group.releaseUomValue = releaseUomValue\n group.releaseUomValueWithUom = `${releaseUomValue} ${group.uom}`\n }\n })\n\n return group\n })\n .filter(group => group.assigned)\n /** ************************ **/\n\n return { bundleGroup, bundleSetting }\n }\n\n @Directive('@privilege(category: \"inventory\", privilege: \"query\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Query(returns => InventoryList)\n async inventoriesGroupByProduct(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<InventoryList> {\n try {\n const { domain, user, tx } = context.state\n let permittedBizplaceIds: string[] = await getPermittedBizplaceIds(domain, user)\n const partnersCompanyBizplaces: Bizplace[] = await getPartnersCompanyBizplaces(domain, user)\n\n const page = params.pagination.page\n const limit = params.pagination.limit\n\n let bizplaceFilter = params.filters.find(filter => filter.name == 'bizplace')\n let productFilter = params.filters.find(filter => filter.name == 'product')\n let productTypeFilter = params.filters.find(filter => filter.name == 'type')\n let availableStockFilter = params.filters.find(filter => filter.name == 'availableStock')\n let lowStockFilter = params.filters.find(filter => filter.name == 'lowStock')\n let overStockFilter = params.filters.find(filter => filter.name == 'overStock')\n let warehouseNameFilter = params.filters.find(filter => filter.name == 'warehouseName')\n let unexpiredOnlyFilter = params.filters.find(filter => filter.name === 'unexpiredOnly')\n\n if (bizplaceFilter) {\n const bizplaceQueryBuilder: SelectQueryBuilder<Bizplace> = getRepository(Bizplace).createQueryBuilder('b')\n bizplaceQueryBuilder\n .innerJoin('companies', 'c2', ' c2.domain_id = b.domain_id')\n .innerJoin('bizplaces', 'b2', 'b2.company_id = c2.id')\n .where('b2.id = :bizplaceId', { bizplaceId: bizplaceFilter.value })\n\n let bizplaceList = await bizplaceQueryBuilder.getMany()\n\n permittedBizplaceIds = [\n ...permittedBizplaceIds.filter(itm => itm == bizplaceFilter.value),\n ...bizplaceList.map(bz => bz.id),\n ...partnersCompanyBizplaces.map(biz => biz.id)\n ]\n }\n\n let bizplaceQuery = ''\n if (permittedBizplaceIds.length > 0) {\n bizplaceQuery = `AND EXISTS (\n SELECT * FROM (VALUES ${permittedBizplaceIds.map(id => `('${id}')`).join(',')})\n AS bizFilter(bizplace_id)\n WHERE bizFilter.bizplace_id::uuid = \"Inventory\".\"bizplace_id\"\n )`\n } else {\n bizplaceQuery = `1 = 0`\n }\n\n let productQuery = ''\n if (productFilter) {\n let productValue = productFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n productQuery = `AND (\n Lower(\"Product\".\"name\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"sku\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"brand\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"Product\".\"description\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"name\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"sku\") LIKE ANY(ARRAY[${productValue}])\n OR Lower(\"ProductRef\".\"description\") LIKE ANY(ARRAY[${productValue}])\n )`\n }\n\n if (productTypeFilter) {\n let productTypeValue = productTypeFilter.value\n .toLowerCase()\n .split(',')\n .map(prod => {\n return \"'%\" + prod.trim().replace(/'/g, \"''\") + \"%'\"\n })\n .join(',')\n productQuery =\n productQuery +\n ` AND (\n Lower(\"Product\".\"type\") LIKE ANY(ARRAY[${productTypeValue}])\n )`\n }\n\n let availableStockQuery = ''\n if (availableStockFilter?.value) {\n availableStockQuery = ` AND SUM(\"Inventory\".\"qty\") > 0`\n }\n\n let unexpiredOnlyQuery = ''\n if (unexpiredOnlyFilter?.value) {\n unexpiredOnlyQuery = 'AND \"Inventory\".\"expiration_date\" >= CURRENT_DATE'\n }\n\n let thresholdQuery = ''\n if (lowStockFilter?.value) {\n thresholdQuery = `AND COALESCE(\"ProductDetailBizplaceSetting\".\"min_qty\", \"Product\".\"min_qty\",0) > SUM(\"Inventory\".\"qty\")`\n }\n\n if (overStockFilter?.value) {\n thresholdQuery = `AND COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) > 0 AND \n COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) < SUM(\"Inventory\".\"qty\")`\n }\n\n let warehouseQuery = ''\n if (warehouseNameFilter?.value) {\n warehouseQuery = `AND \"Warehouse\".\"name\" like '%${warehouseNameFilter.value}%'`\n }\n\n await tx.query(\n `\n create temp table temp_inv_history AS \n (\n SELECT \"Product\".\"id\" AS \"id\", \"Product\".\"sku\" AS \"sku\", \"Product\".\"brand\" AS \"brand\", \"Product\".\"name\" AS \"name\", \"Product\".\"type\" AS \"type\", \"Product\".\"description\" AS \"description\", \"Product\".\"primary_unit\" AS \"primaryUnit\",\n \"Product\".\"weight\" AS \"weight\", \"ProductRef\".\"id\" AS \"productRefId\", \n \"ProductRef\".\"description\" AS \"productRefDesciption\", \"Bizplace\".\"id\" AS \"bizplaceId\", \"Bizplace\".\"name\" AS \"bizplaceName\", SUM(\"Inventory\".\"qty\") AS \"qty\" , SUM(\"Inventory\".\"uom_value\") AS \"uomValue\",\n \"Warehouse\".\"id\" AS \"warehouseId\", \"Warehouse\".\"name\" AS \"warehouseName\",\n CASE WHEN SUM(\"Inventory\".\"qty\") > 0 THEN SUM(COALESCE(\"Inventory\".\"unit_cost\", 0) * \"Inventory\".\"qty\")/ SUM(\"Inventory\".\"qty\") ELSE 0 END AS \"averageUnitCost\",\n COALESCE(\"ProductDetailBizplaceSetting\".\"min_qty\", \"Product\".\"min_qty\",0) AS \"minQty\", \n COALESCE(\"ProductDetailBizplaceSetting\".\"max_qty\", \"Product\".\"max_qty\",0) AS \"maxQty\"\n FROM \"inventories\" \"Inventory\" \n LEFT JOIN \"warehouses\" \"Warehouse\" ON \"Warehouse\".\"id\"=\"Inventory\".\"warehouse_id\"\n LEFT JOIN \"products\" \"Product\" ON \"Product\".\"id\"=\"Inventory\".\"product_id\" \n LEFT JOIN \"product_details\" \"ProductDetails\" ON \"ProductDetails\".\"product_id\" = \"Product\".\"id\" \n AND \"ProductDetails\".\"is_default\"\n LEFT JOIN \"product_detail_bizplace_settings\" \"ProductDetailBizplaceSetting\" ON \"ProductDetailBizplaceSetting\".\"product_detail_id\" = \"ProductDetails\".\"id\" \n AND \"ProductDetailBizplaceSetting\".\"domain_id\" = \"Inventory\".\"domain_id\"\n LEFT JOIN \"products\" \"ProductRef\" ON \"ProductRef\".\"id\"=\"Product\".\"product_ref_id\" \n INNER JOIN \"bizplaces\" \"Bizplace\" ON \"Bizplace\".\"id\"=\"Inventory\".\"bizplace_id\"\n WHERE \"Inventory\".\"qty\" >= 0\n AND \"Inventory\".\"domain_id\" = $1\n ${bizplaceQuery}\n ${productQuery}\n ${warehouseQuery}\n ${unexpiredOnlyQuery}\n GROUP BY \"Product\".\"id\", \"ProductRef\".\"id\", \"Bizplace\".\"id\", \"ProductDetailBizplaceSetting\".\"id\", \"Warehouse\".\"id\"\n HAVING 1 = 1\n ${availableStockQuery}\n ${thresholdQuery}\n )`,\n [domain.id]\n )\n\n const results: any = await tx.query(\n `\n SELECT * FROM temp_inv_history\n ORDER BY \"bizplaceName\", \"sku\" \n OFFSET $1 LIMIT $2\n `,\n [(page - 1) * limit, limit]\n )\n\n const total: any = await tx.query(`SELECT COUNT(*) FROM temp_inv_history`)\n\n tx.query(`drop table temp_inv_history`)\n\n return {\n items: results.map((item: any) => {\n return {\n product: {\n id: item.id,\n name: item.name,\n sku: item.sku,\n brand: item.brand,\n description: item.description,\n type: item.type,\n weight: item.weight,\n productRefId: item.productRefId,\n bizplaceId: item.bizplaceId,\n minQty: item.minQty,\n maxQty: item.maxQty,\n primaryUnit: item.primaryUnit\n },\n warehouse: {\n id: item.warehouseId,\n name: item.warehouseName\n },\n averageUnitCost: item.averageUnitCost,\n qty: item.qty,\n uomValue: item.uomValue\n }\n }),\n total: total[0].count\n }\n } catch (error) {\n throw error\n }\n }\n\n // 팔레트 이름과 제품 ID를 기준으로 유효한 재고 조회\n @Directive('@privilege(category: \"inventory\", privilege: \"query\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Query(returns => [Inventory])\n async getInventoriesByPalletAndProductId(\n @Arg('palletName') palletName: string,\n @Arg('productId') productId: string,\n @Ctx() context: ResolverContext\n ): Promise<Inventory[]> {\n const { domain, tx } = context.state\n const inventoryRepo = tx.getRepository(Inventory)\n\n const inventories = await inventoryRepo\n .createQueryBuilder('i')\n .where('i.domain_id = :domainId', { domainId: domain.id })\n .andWhere('i.aux_info_3 = :palletName', { palletName })\n .andWhere('i.product_id = :productId', { productId })\n .andWhere('i.status = :status', { status: 'STORED' })\n .andWhere('i.qty - i.locked_qty > 0')\n .getMany()\n\n return inventories\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() inventory: Inventory): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: inventory.domainId })\n }\n\n @FieldResolver(type => User)\n async updater(@Root() inventory: Inventory): Promise<User> {\n return await getRepository(User).findOneBy({ id: inventory.updaterId })\n }\n\n @FieldResolver(type => User)\n async creator(@Root() inventory: Inventory): Promise<User> {\n return await getRepository(User).findOneBy({ id: inventory.creatorId })\n }\n\n /*\n move changeCount to @FieldResolver so that system don't have\n to keep searching for this when user does not request for it \n */\n @FieldResolver(type => Number)\n async changeCount(@Root() inventory: Inventory): Promise<Number> {\n return await getRepository(InventoryChange).count({\n where: { inventory: { id: inventory.id } }\n })\n }\n\n /*\n \"purchaseOrderNo\", \"orderProductRemark\" and \"arrivalNoticeRefNo\"\n are purely for Getha's lot label. @farishelmi added these here to\n avoid logic changes in @inventories query\n */\n @FieldResolver(type => String)\n async purchaseOrderNo(@Root() inventory: Inventory): Promise<String> {\n if (!inventory.refOrderId) return ''\n\n let items: any = await getRepository(Inventory).query(`\n SELECT po.name as \"purchaseOrderNo\" FROM arrival_notices an\n LEFT JOIN purchase_orders po\n ON an.purchase_order_id = po.id\n WHERE an.id = '${inventory.refOrderId}'\n LIMIT 1\n `)\n\n return items[0]?.purchaseOrderNo || ''\n }\n\n @FieldResolver(type => String)\n async orderProductRemark(@Root() inventory: Inventory): Promise<String> {\n if (!inventory.orderProductId) return ''\n\n let items: any = await getRepository(Inventory).query(`\n SELECT op.remark as \"orderProductRemark\" FROM order_products op\n WHERE op.id = '${inventory.orderProductId}'\n LIMIT 1\n `)\n\n return items[0]?.orderProductRemark || ''\n }\n\n @FieldResolver(type => String)\n async arrivalNoticeRefNo(@Root() inventory: Inventory): Promise<String> {\n if (!inventory.refOrderId) return ''\n\n let items: any = await getRepository(Inventory).query(`\n SELECT an.ref_no as \"arrivalNoticeRefNo\" FROM arrival_notices an\n WHERE an.id = '${inventory.refOrderId}'\n LIMIT 1\n `)\n\n return items[0]?.arrivalNoticeRefNo || ''\n }\n\n @FieldResolver(type => String)\n async arrivalNoticeNo(@Root() inventory: Inventory): Promise<String> {\n if (!inventory.refOrderId) return ''\n\n let items: any = await getRepository(Inventory).query(`\n SELECT an.name as \"arrivalNoticeNo\" FROM arrival_notices an\n WHERE an.id = '${inventory.refOrderId}'\n LIMIT 1\n `)\n\n return items[0]?.arrivalNoticeNo || ''\n }\n}\n\nexport async function inventoriesByStrategy(\n {\n worksheetId,\n batchId,\n bizplaceId,\n productName,\n productSku,\n packingType,\n packingSize,\n uom,\n pickingStrategy,\n locationSortingRules\n },\n trxMgr: EntityManager\n) {\n const qb = await trxMgr.getRepository(Inventory).createQueryBuilder('INV')\n qb.innerJoinAndSelect('INV.product', 'PROD')\n .innerJoinAndSelect('INV.location', 'LOC')\n .addSelect(subQuery =>\n subQuery\n .select('COALESCE(SUM(release_qty), 0)', 'releaseQty')\n .from('order_inventories', 'OI')\n .where('\"OI\".\"inventory_id\" = \"INV\".\"id\"')\n .andWhere(\"\\\"OI\\\".\\\"status\\\" IN ('PENDING', 'PENDING_RECEIVE', 'PENDING_WORKSHEET', 'PENDING_SPLIT')\")\n .andWhere('\"OI\".\"ref_worksheet_id\" <> :worksheetId', { worksheetId: worksheetId })\n )\n .addSelect(subQuery =>\n subQuery\n .select('COALESCE(SUM(release_uom_value), 0)', 'releaseUomValue')\n .from('order_inventories', 'OI')\n .where('\"OI\".\"inventory_id\" = \"INV\".\"id\"')\n .andWhere(\"\\\"OI\\\".\\\"status\\\" IN ('PENDING', 'PENDING_RECEIVE', 'PENDING_WORKSHEET', 'PENDING_SPLIT')\")\n .andWhere('\"OI\".\"ref_worksheet_id\" <> :worksheetId', { worksheetId: worksheetId })\n )\n .andWhere('\"PROD\".\"name\" = :productName')\n .andWhere('\"PROD\".\"sku\" = :productSku')\n .andWhere('\"INV\".\"packing_type\" = :packingType')\n .andWhere('\"INV\".\"packing_size\" = :packingSize')\n .andWhere('\"INV\".\"uom\" = :uom')\n .andWhere('\"INV\".\"status\" = :status', { status: 'STORED' })\n .andWhere('\"LOC\".\"type\" NOT IN (:...locationTypes)', {\n locationTypes: [LOCATION_TYPE.QUARANTINE, LOCATION_TYPE.RESERVE]\n })\n .setParameters({\n productName,\n productSku,\n packingType,\n packingSize,\n uom\n })\n\n if (batchId !== '') {\n qb.andWhere('\"INV\".\"batch_id\" = :batchId', { batchId })\n }\n\n if (bizplaceId) {\n qb.andWhere('\"INV\".\"bizplace_id\" = :bizplaceId', { bizplaceId: bizplaceId })\n }\n\n switch (pickingStrategy.toUpperCase()) {\n case 'FIFO':\n qb.orderBy('\"INV\".\"created_at\"', 'ASC')\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n break\n\n case 'LIFO':\n qb.orderBy('\"INV\".\"created_at\"', 'DESC')\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n break\n\n case 'FEFO':\n qb.orderBy('\"INV\".\"expiration_date\"', 'ASC')\n qb.addOrderBy('\"INV\".\"created_at\"', 'ASC')\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n break\n\n case 'FMFO':\n qb.orderBy('\"INV\".\"manufacture_date\"', 'ASC')\n qb.addOrderBy('\"INV\".\"created_at\"', 'ASC')\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n }\n break\n\n case 'LOCATION':\n if (locationSortingRules?.length > 0) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n idx === 0\n ? qb.orderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n : qb.addOrderBy(`LOC.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n } else qb.orderBy('\"LOC\".\"name\"', 'DESC')\n break\n }\n\n const { entities, raw } = await qb.getRawAndEntities()\n const items = entities\n .map((inv: Inventory, idx: number) => {\n const qty: number = inv?.qty > 0 ? inv.qty : 0\n const uomValue: number = inv?.uomValue > 0 ? inv.uomValue : 0\n const lockedQty: number = inv.lockedQty || 0\n const lockedUomValue: number = inv.lockedUomValue || 0\n const releaseQty: number = parseInt(raw[idx].releaseQty) || 0\n const releaseUomValue: number = parseFloat(raw[idx].releaseUomValue) || 0\n\n return {\n ...inv,\n qty: qty - lockedQty - releaseQty,\n uomValue: uomValue - lockedUomValue - releaseUomValue\n }\n })\n .filter((inv: Inventory) => inv.qty)\n\n const total: number = await qb.getCount()\n return { items, total }\n}\n"]}