@things-factory/sales-base 8.0.47 → 8.0.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/service/order-inventory/order-inventory-types.js +1 -1
- package/dist-server/service/order-inventory/order-inventory-types.js.map +1 -1
- package/dist-server/service/order-inventory/order-inventory.js +4 -4
- package/dist-server/service/order-inventory/order-inventory.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/dist-server/utils/inventory-util.js +1 -1
- package/dist-server/utils/inventory-util.js.map +1 -1
- package/package.json +2 -2
|
@@ -460,7 +460,7 @@ exports.InventoryUtil = {
|
|
|
460
460
|
from json_populate_recordset(NULL::order_inventories,'${json_oi}') joi
|
|
461
461
|
left join inventories i on joi.product_id = i.product_id
|
|
462
462
|
and joi.batch_id = i.batch_id
|
|
463
|
-
and joi.packing_type = i.packing_type and i.status
|
|
463
|
+
and joi.packing_type = i.packing_type and i.status IN ('STORED', 'DEFECTED')
|
|
464
464
|
and joi.uom = i.uom
|
|
465
465
|
and i.domain_id = $1
|
|
466
466
|
and i.bizplace_id = $2
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inventory-util.js","sourceRoot":"","sources":["../../server/utils/inventory-util.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, Equal, In, Not, Raw, Repository, SelectQueryBuilder } from 'typeorm'\n\nimport { User } from '@things-factory/auth-base'\nimport { Bizplace } from '@things-factory/biz-base'\nimport { Product, ProductBundle } from '@things-factory/product-base'\nimport { Domain, Filter, getRepository, ListParam } from '@things-factory/shell'\nimport {\n Inventory,\n INVENTORY_STATUS,\n InventoryHistory,\n InventoryNoGenerator,\n Location,\n LOCATION_STATUS,\n LOCATION_TYPE,\n Pallet\n} from '@things-factory/warehouse-base'\n\nimport { ORDER_TYPES } from '../constants'\nimport { ValidationError } from '../errors'\nimport {\n ArrivalNotice,\n DeliveryOrder,\n InventoryCheck,\n OrderInventory,\n ReleaseGood,\n ReturnOrder,\n ReverseKittingOrder,\n VasOrder\n} from '../service'\n\nexport type ReferenceOrderType =\n | ArrivalNotice\n | ReleaseGood\n | VasOrder\n | InventoryCheck\n | DeliveryOrder\n | ReturnOrder\n | ReverseKittingOrder\n\nexport const InventoryUtil = {\n /**\n * Get all available product belonging to list of bizplaces\n * @param {[Object]} bizplaces\n * @param {Object} params\n * @param {Object} context\n * @param {Object} trxMgr\n * @returns { object } {items, total}\n */\n async bizplaceProductInventory(\n bizplaces: Bizplace[],\n params: ListParam,\n context: ResolverContext,\n trxMgr: EntityManager\n ) {\n try {\n let filters = params.filters\n\n const { domain } = context.state\n\n const { bizplaceIds, productWhereClause, bundleWhereClause, whereClause, batchBundle, productDetailWhereClause } =\n await getConditions(bizplaces, filters, trxMgr, false)\n\n let productFilter = filters.find(itm => itm.name == 'productName')\n let inventoryBizplaceFilter = filters.find(itm => itm.name == 'bizplaceId')\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group ON COMMIT DROP AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n SUM(oi.release_qty) AS release_qty,\n SUM(oi.release_uom_value) AS release_uom_value,\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.batch_id NOTNULL\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n pd.packing_type AS \"packingType\",\n pd.packing_size AS \"packingSize\",\n pd.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n COALESCE(SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) - MAX(COALESCE(bp.bundle_product_release_qty, 0)),0) AS \"remainQty\",\n COALESCE(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)),0) AS \"remainUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)), ' ', pd.uom) AS \"remainUomValueWithUom\",\n 'SINGLE' AS \"groupType\"\n FROM products p\n INNER join product_details pd on pd.product_id = p.id\n LEFT JOIN (\n SELECT i.* FROM inventories i \n INNER JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n WHERE l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n AND i.domain_id = $1 AND i.status = 'STORED'\n ${inventoryBizplaceFilter ? `AND i.bizplace_id = '${inventoryBizplaceFilter.value}'` : ``}\n ) i ON i.product_id = pd.product_id\n AND i.packing_type = pd.packing_type \n and i.packing_size = pd.packing_size \n and i.uom = pd.uom \n LEFT JOIN oi ON i.batch_id = oi.batch_id AND p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN (\n SELECT pbs.product_id, SUM(pbs.bundle_qty * src.release_qty) AS bundle_product_release_qty, SUM(pbs.bundle_qty * src.release_uom_value) AS bundle_product_release_uom_value \n FROM product_bundle_settings pbs\n INNER JOIN json_populate_recordset(NULL::order_inventories, '${batchBundle}') src ON src.product_id = pbs.product_bundle_id\n GROUP BY pbs.product_id\n ) bp on i.product_id = bp.product_id\n WHERE p.bizplace_id IN (${bizplaceIds})\n ${productDetailWhereClause}\n ${\n productFilter\n ? `AND (\n lower(p.sku) ilike '${productFilter.value}'\n OR lower(p.name) ilike '${productFilter.value}'\n OR lower(p.description) ilike '${productFilter.value}'\n )\n `\n : ``\n }\n GROUP BY\n p.id,\n pd.packing_type,\n pd.packing_size,\n pd.uom\n UNION \n SELECT packing_type, packing_size,'UNIT' AS \"uom\", name AS \"productName\", sku AS \"productSKU\", '-' AS \"productBrand\", id AS \"productId\",\n COALESCE(MIN(FLOOR(pbs.\"availableQty\")),0) AS \"remainQty\", \n COALESCE(MIN(FLOOR(pbs.\"availableUomValue\")),0) AS \"remainUomValue\", \n CONCAT(COALESCE(MIN(FLOOR(pbs.\"availableUomValue\")),0),' UNIT') AS \"remainUomValueWithUom\", \n 'BUNDLE' AS \"groupType\"\n FROM product_bundles pb\n LEFT JOIN (\n SELECT pbs.product_id, pbs.product_bundle_id, min(pbs.bundle_qty),\n (SUM(COALESCE(i2.qty, 0)) - SUM(COALESCE(i2.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0))) / min(pbs.bundle_qty) AS \"availableQty\",\n (SUM(COALESCE(i2.uom_value, 0)) - SUM(COALESCE(i2.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0))) / min(pbs.bundle_qty) AS \"availableUomValue\"\n FROM product_bundle_settings pbs \n LEFT JOIN inventories i2 ON i2.product_id = pbs.product_id AND i2.domain_id = $1 AND i2.status = 'STORED'\n INNER JOIN locations l2 ON i2.location_id = l2.id \n LEFT JOIN oi ON oi.product_id = i2.product_id\n WHERE l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${inventoryBizplaceFilter ? `AND i2.bizplace_id = '${inventoryBizplaceFilter.value}'` : ``}\n GROUP BY \n pbs.product_id, \n pbs.product_bundle_id\n ) pbs ON pbs.product_bundle_id = pb.id\n ${bundleWhereClause}\n AND pb.bizplace_id IN (${bizplaceIds}) \n ${\n productFilter\n ? `AND (\n lower(pb.sku) ilike '${productFilter.value}'\n OR lower(pb.name) ilike '${productFilter.value}'\n OR lower(pb.description) ilike '${productFilter.value}'\n )\n `\n : ``\n }\n GROUP BY \n pb.packing_type, \n pb.packing_size, \n pb.name, \n pb.sku, \n pb.id\n )\n AS inv_prod_grp \n ${whereClause}\n order by \"productSKU\", \"productName\"\n )\n `\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(`select count(*) as total from temp_inventory_product_group`)\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(`select * from temp_inventory_product_group OFFSET $1 LIMIT $2`, [\n (params.pagination.page - 1) * params.pagination.limit,\n params.pagination.limit\n ])\n } else {\n items = await trxMgr.query(`select * from temp_inventory_product_group`)\n }\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n /**\n * Get all available product belonging to list of bizplaces\n * @param {[Object]} bizplaces\n * @param {Object} params\n * @param {Object} context\n * @param {Object} trxMgr\n * @returns { object } {items, total}\n */\n async bizplaceInventoryProductGroup(\n bizplaces: Bizplace[],\n params: ListParam,\n context: ResolverContext,\n trxMgr: EntityManager\n ) {\n try {\n let filters = params.filters\n const { domain } = context.state\n\n const { bizplaceIds, productWhereClause, bundleWhereClause, whereClause, batchBundle } = await getConditions(\n bizplaces,\n filters,\n trxMgr\n )\n\n const _groupType = filters.find(res => res.name == 'groupType')\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n round(cast(SUM(oi.release_qty) as numeric), 3) AS release_qty,\n round(cast(SUM(oi.release_uom_value) as numeric), 3) AS release_uom_value,\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.batch_id NOTNULL\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n i.batch_id AS \"batchId\",\n i.batch_id_ref AS \"batchIdRef\",\n i.packing_type AS \"packingType\",\n i.packing_size AS \"packingSize\",\n i.pallet_id as \"palletId\",\n i.created_at as \"createdAt\",\n i.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n ROUND(cast(SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) - MAX(COALESCE(bp.bundle_product_release_qty, 0)) as numeric), 3) AS \"remainQty\",\n ROUND(cast(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)) as numeric), 3) AS \"remainUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)), ' ', i.uom) AS \"remainUomValueWithUom\",\n 'SINGLE' AS \"groupType\",\n i.expiration_date as \"expirationDate\"\n FROM\n inventories i\n LEFT JOIN products p ON i.product_id = p.id\n LEFT JOIN oi ON i.batch_id = oi.batch_id AND p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n LEFT JOIN (\n SELECT pbs.product_id, SUM(pbs.bundle_qty * src.release_qty) AS bundle_product_release_qty, SUM(pbs.bundle_qty * src.release_uom_value) AS bundle_product_release_uom_value \n FROM product_bundle_settings pbs\n INNER JOIN json_populate_recordset(NULL::order_inventories,'${batchBundle}') src ON src.product_id = pbs.product_bundle_id\n GROUP BY pbs.product_id\n ) bp on i.product_id = bp.product_id\n WHERE i.domain_id = $1\n AND l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${productWhereClause}\n GROUP BY\n i.batch_id,\n i.batch_id_ref,\n p.id,\n i.packing_type,\n i.packing_size,\n i.expiration_date,\n i.pallet_id,\n i.created_at,\n i.uom\n UNION \n SELECT 'BUNDLE' AS \"batchId\", null as \"batchIdRef\", packing_type, packing_size, null AS \"palletId\", null AS \"createdAt\", 'UNIT' AS \"uom\", name AS \"productName\", sku AS \"productSKU\", 'brand' AS \"productBrand\", id AS \"productId\",\n MIN(FLOOR(pbs.\"availableQty\")) AS \"remainQty\", \n MIN(FLOOR(pbs.\"availableUomValue\")) AS \"remainUomValue\", \n CONCAT(MIN(FLOOR(pbs.\"availableUomValue\")),' UNIT') AS \"remainUomValueWithUom\",\n 'BUNDLE' AS \"groupType\",\n pbs.\"expirationDate\" as \"expirationDate\"\n FROM product_bundles pb\n INNER JOIN (\n SELECT pbs.product_id, pbs.product_bundle_id, min(pbs.bundle_qty),\n (SUM(COALESCE(i2.qty, 0)) - SUM(COALESCE(i2.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0))) / min(pbs.bundle_qty) AS \"availableQty\",\n (SUM(COALESCE(i2.uom_value, 0)) - SUM(COALESCE(i2.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0))) / min(pbs.bundle_qty) AS \"availableUomValue\", i2.expiration_date as \"expirationDate\"\n FROM product_bundle_settings pbs \n LEFT JOIN inventories i2 ON i2.product_id = pbs.product_id AND i2.domain_id = $1\n AND i2.bizplace_id IN (${bizplaceIds})\n AND i2.status = 'STORED'\n LEFT JOIN oi ON oi.product_id = i2.product_id\n GROUP BY pbs.product_id, pbs.product_bundle_id, i2.expiration_date\n ) pbs ON pbs.product_bundle_id = pb.id\n ${bundleWhereClause}\n GROUP BY pb.packing_type, pb.packing_size, pb.name, pb.sku, pb.id, pbs.\"expirationDate\"\n )\n AS inv_prod_grp\n ${whereClause}\n )\n `\n\n let filterGroupTypeQuery\n\n if (_groupType) {\n if (_groupType.value === 'SINGLE') {\n filterGroupTypeQuery = `where \"groupType\"= 'SINGLE' `\n } else {\n filterGroupTypeQuery = `where \"groupType\"= 'BUNDLE' `\n }\n }\n\n let sortingArr = params.sortings || []\n\n let sortedBy = []\n\n if (sortingArr.length > 0) {\n sortingArr.forEach(element => {\n if (element.desc) {\n sortedBy.push(`\"${element.name}\" DESC `)\n } else {\n sortedBy.push(`\"${element.name}\" `)\n }\n })\n }\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(\n `select count(*) as total from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''}`\n )\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(\n `select * from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''} ${\n sortingArr.length > 0 ? ' Order by ' + sortedBy.toString() : ''\n } OFFSET $1 LIMIT $2`,\n [(params.pagination.page - 1) * params.pagination.limit, params.pagination.limit]\n )\n } else {\n items = await trxMgr.query(\n `select * from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''} ${\n sortingArr.length > 0 ? ' Order by ' + sortedBy.toString() : ''\n }`\n )\n }\n\n await trxMgr.query(`drop table temp_inventory_product_group`)\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n async inventoryProductGroupOpenAPI(\n bizplaces: Bizplace[],\n params: ListParam,\n context: ResolverContext,\n trxMgr: EntityManager\n ) {\n try {\n let filters = params.filters\n const { domain } = context.state\n\n const { apiWhereClause } = await getConditions(bizplaces, filters, trxMgr)\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group_open_api AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n SUM(oi.release_qty) AS release_qty,\n SUM(oi.release_uom_value) AS release_uom_value,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n i.packing_type AS \"packingType\",\n i.packing_size AS \"packingSize\",\n i.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) AS \"remainQty\",\n SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) AS \"remainUomValue\",\n SUM(COALESCE(i.qty, 0)) AS \"totalQty\",\n SUM(COALESCE(i.uom_value, 0)) AS \"totalUomValue\",\n SUM(COALESCE(i.locked_qty, 0)) + MAX(COALESCE(oi.release_qty, 0)) AS \"totalLockedQty\",\n SUM(COALESCE(i.locked_uom_value, 0)) + MAX(COALESCE(oi.release_uom_value, 0)) AS \"totalLockedUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)), ' ', i.uom) AS \"remainUomValueWithUom\"\n FROM inventories i\n LEFT JOIN products p ON i.product_id = p.id\n LEFT JOIN oi ON p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n WHERE i.domain_id = $1\n AND l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${apiWhereClause}\n GROUP BY\n p.id,\n i.packing_type,\n i.packing_size,\n i.uom\n )\n AS inv_prod_grp\n )\n `\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(`select count(*) as total from temp_inventory_product_group_open_api`)\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(`select * from temp_inventory_product_group_open_api OFFSET $1 LIMIT $2`, [\n (params.pagination.page - 1) * params.pagination.limit,\n params.pagination.limit\n ])\n } else {\n items = await trxMgr.query(`select * from temp_inventory_product_group_open_api`)\n }\n\n await trxMgr.query(`drop table temp_inventory_product_group_open_api`)\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n /**\n * Validate warehouse partners product quantity\n * @param {Object} warehouseDomain -\n * @param {Object} partnerBizplace - {id}\n * @param {Object} orderInventories - [{id, qty}]\n * @param {Object} context\n * @param {Object} trxMgr\n */\n async validateWarehousePartnersProductsQuantity(\n warehouseDomain: Domain,\n partnerBizplace: Bizplace,\n orderInventories: OrderInventory[],\n context: any,\n trxMgr?: EntityManager\n ): Promise<void> {\n let json_oi = JSON.stringify(\n orderInventories\n .map(x => {\n if (x.id) return null\n\n return {\n product_id: x.product.id,\n batch_id: x.batchId,\n packing_type: x.packingType,\n release_qty: x.releaseQty,\n uom: x.uom\n }\n })\n .filter(i => i)\n )\n\n let resultQb = await trxMgr.query(\n `\n select joi.product_id as \"productId\", joi.batch_id as \"batchId\", joi.packing_type as \"packingType\", joi.uom as \"uom\", joi.release_qty as \"releaseQty\",\n ROUND(cast(sum(i.qty - coalesce(i.locked_qty,0)) - coalesce(\n (\n select sum(oi.release_qty) from order_inventories oi \n where (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n and oi.inventory_id IS null\n and oi.product_id = joi.product_id\n and oi.batch_id = joi.batch_id\n and oi.packing_type = joi.packing_type\n and oi.uom = joi.uom\n and oi.domain_id = $1\n and oi.bizplace_id = $2\n ),0) as numeric), 3) as \"availableQty\",\n ROUND(cast(sum(i.uom_value - coalesce(i.locked_uom_value ,0)) - coalesce(\n (\n select sum(oi.release_uom_value) from order_inventories oi \n where (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n and oi.inventory_id IS null\n and oi.product_id = joi.product_id\n and oi.batch_id = joi.batch_id\n and oi.packing_type = joi.packing_type\n and oi.uom = joi.uom\n and oi.domain_id = $1\n and oi.bizplace_id = $2\n ),0) as numeric), 3) as \"availableUomValue\"\n from json_populate_recordset(NULL::order_inventories,'${json_oi}') joi\n left join inventories i on joi.product_id = i.product_id \n and joi.batch_id = i.batch_id\n and joi.packing_type = i.packing_type and i.status ='STORED'\n and joi.uom = i.uom\n and i.domain_id = $1\n and i.bizplace_id = $2\n group by joi.product_id, joi.batch_id, joi.packing_type, joi.release_qty, joi.uom\n `,\n [warehouseDomain.id, partnerBizplace.id]\n )\n\n resultQb.forEach(itm => {\n if (itm.releaseQty > itm.availableQty) {\n throw new ValidationError({\n ...ValidationError.ERROR_CODES.RELEASE_QTY_OVER_LIMIT,\n detail: { data: JSON.stringify(resultQb) }\n })\n }\n })\n },\n\n async checkPalletDuplication(palletId: string, warehouseDomain: Domain, trxMgr: EntityManager): Promise<void> {\n const duplicatedPalletCnt: number = await trxMgr.getRepository(Inventory).countBy({\n domain: { id: warehouseDomain.id },\n palletId,\n status: Not(Equal(INVENTORY_STATUS.TERMINATED))\n })\n\n if (duplicatedPalletCnt) throw new Error(palletId + ` exists`)\n\n const duplicatedReusablePalletCnt: number = await trxMgr.getRepository(Pallet).count({\n where: {\n domain: { id: warehouseDomain.id },\n name: palletId\n }\n })\n\n if (duplicatedReusablePalletCnt) throw new Error(palletId + ` exists`)\n },\n\n /**\n * To pre-assign inventories automatically for orderInventories in Release Goods\n * @param product\n * @param orderInventory\n * @param packingType\n * @param locationSortingRules\n * @param customerBizplace\n * @param domain\n * @param trxMgr\n * @returns orderInventories\n */\n async autoAssignInventoryForRelease(\n product: Product,\n orderInventory: OrderInventory,\n packingType: string,\n locationSortingRules: any = [],\n customerBizplace: Bizplace,\n domain: Domain,\n trxMgr: EntityManager,\n batchId?: string\n ): Promise<OrderInventory[]> {\n let qb: SelectQueryBuilder<Inventory> = trxMgr.getRepository(Inventory).createQueryBuilder('iv')\n qb.leftJoinAndSelect('iv.location', 'loc')\n .andWhere('\"iv\".\"domain_id\" = :domainId')\n .andWhere('\"iv\".\"bizplace_id\" = :bizplaceId')\n .andWhere('\"iv\".\"packing_type\" = :packingType')\n .andWhere('\"iv\".\"product_id\" = :productId')\n .andWhere('\"iv\".\"status\" = :status')\n .andWhere('\"iv\".\"qty\" - COALESCE(\"iv\".\"locked_qty\", 0) > 0')\n .andWhere('\"loc\".\"type\" NOT IN (:...locationTypes)')\n .setParameters({\n domainId: domain.id,\n bizplaceId: customerBizplace.id,\n packingType: packingType,\n productId: product.id,\n status: INVENTORY_STATUS.STORED,\n locationTypes: [LOCATION_TYPE.QUARANTINE, LOCATION_TYPE.RESERVE]\n })\n\n if (batchId) {\n qb.andWhere('\"iv\".\"batch_id\" = :batchId', { batchId: batchId })\n }\n\n let locationSorting = function (qb: SelectQueryBuilder<Inventory>, locationSortingRules) {\n if (locationSortingRules?.length) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n idx === 0\n ? qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n : qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n } else {\n qb.addOrderBy('\"loc\".\"name\"', 'ASC')\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n }\n return qb\n }\n\n switch (product?.pickingStrategy) {\n case 'FIFO':\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n qb = locationSorting(qb, locationSortingRules)\n break\n case 'LIFO':\n qb.addOrderBy('\"iv\".\"created_at\"', 'DESC')\n qb = locationSorting(qb, locationSortingRules)\n break\n case 'FEFO':\n qb.addOrderBy('\"iv\".\"expiration_date\"', 'ASC')\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n qb = locationSorting(qb, locationSortingRules)\n break\n case 'FMFO':\n qb.addOrderBy('\"iv\".\"manufacture_date\"', 'ASC')\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n qb = locationSorting(qb, locationSortingRules)\n break\n case 'LOCATION':\n qb = locationSorting(qb, locationSortingRules)\n break\n default:\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n qb = locationSorting(qb, locationSortingRules)\n break\n }\n\n let inventories: Inventory[] = await qb.getMany()\n if (!inventories?.length) throw new Error(`no inventories found for ${product.sku}`)\n\n inventories = inventories.map(inventory => {\n return {\n ...inventory,\n remainQty: inventory.qty - (inventory?.lockedQty || 0),\n remainUomValue: inventory.uomValue - (inventory?.lockedUomValue || 0)\n }\n })\n\n return _composeTargetInventories(product, orderInventory, inventories)\n },\n\n /**\n * @summary Do transaction on inventory record\n * @description It will update inventory after set a temp (domain, updater)\n * and then generate inventory history based on current changes\n */\n async transactionInventory(\n inventory: Inventory,\n referenceOrder: ReferenceOrderType,\n changedQty: number,\n changedWeight: number,\n transactionType: string,\n user: User,\n trxMgr: EntityManager\n ): Promise<Inventory> {\n if (inventory.id) {\n inventory = (await updateInventory(inventory, trxMgr)) as any\n } else {\n inventory = (await createInventory(inventory, trxMgr)) as any\n }\n\n await generateInventoryHistory(inventory, referenceOrder, transactionType, changedQty, changedWeight, user, trxMgr)\n\n return inventory\n }\n}\n\ninterface Conditions {\n bizplaceIds: string\n productWhereClause: string\n bundleWhereClause: string\n whereClause: string\n batchBundle: string\n apiWhereClause: string\n productDetailWhereClause: string\n}\n\nasync function getConditions(\n bizplaces: Bizplace[],\n filters: Filter[],\n trxMgr: EntityManager,\n hasRemainingQty: Boolean = true\n): Promise<Conditions> {\n let bizplaceIds = bizplaces.map((bizplace: Bizplace) => `'${bizplace.id}'`).join()\n\n let productWhereClause = `\n AND i.status = 'STORED'\n AND i.bizplace_id IN (${bizplaceIds})\n `\n let apiWhereClause = `\n AND i.bizplace_id IN (${bizplaceIds})\n `\n let bundleWhereClause = `\n WHERE pb.status = 'ACTIVATED'\n `\n\n let whereClause = hasRemainingQty ? ` WHERE \"remainQty\" > 0` : ` WHERE 1 = 1`\n\n let productDetailWhereClause = ``\n\n let batchBundle: string\n if (filters?.length) {\n await Promise.all(\n filters.map(async (filter: { name: string; operator: string; value: any }) => {\n const name = filter.name\n const operator = filter.operator.toLowerCase()\n let value = filter.value\n\n switch (name) {\n case 'productId':\n if (operator == 'in')\n whereClause += `AND \"productId\" ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(itm => {\n return `'${itm}'`\n })\n .join(',')})`\n break\n\n case 'productBundleId':\n if (operator == 'in')\n whereClause += `AND \"productId\" ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(itm => {\n return `'${itm}'`\n })\n .join(',')})`\n break\n\n case 'batchId':\n whereClause += `AND LOWER(\"batchId\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'batchIdRef':\n whereClause += `AND LOWER(\"batchIdRef\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'productBrand':\n whereClause += `AND LOWER(\"productBrand\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'productSKU':\n whereClause += `AND LOWER(\"productSKU\") LIKE '${value.toLowerCase()}'`\n\n case 'productName':\n const products: Product[] = await trxMgr.getRepository(Product).find({\n select: ['id'],\n where: [\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n name: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n sku: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n description: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n }\n ]\n })\n\n const productIds: string = products\n .map((product: Product) => product.id)\n .map((id: string) => `'${id}'`)\n .join()\n\n if (productIds.length) {\n productWhereClause += `AND i.product_id IN (${productIds})`\n } else {\n productWhereClause += `AND i.product_id ISNULL`\n }\n\n // filter product bundle as product info\n const productBundles: ProductBundle[] = await trxMgr.getRepository(ProductBundle).find({\n select: ['id'],\n where: [\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n name: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n sku: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n description: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n }\n ]\n })\n\n const productBundleIds: string = productBundles\n .map((bundle: ProductBundle) => bundle.id)\n .map((id: string) => `'${id}'`)\n .join()\n\n if (productBundleIds.length) {\n bundleWhereClause += `AND pb.id IN (${productBundleIds})`\n } else {\n bundleWhereClause += `AND pb.id ISNULL`\n }\n break\n\n case 'packingType':\n whereClause += `AND LOWER(\"packingType\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'showBundle':\n whereClause += `AND LOWER(\"groupType\") LIKE 'bundle'`\n break\n\n case 'hideBundle':\n whereClause += `AND LOWER(\"groupType\") LIKE 'single'`\n break\n\n case 'batch_product':\n productWhereClause += `\n AND (i.batch_id, p.id, i.packing_type, i.packing_size) ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(\n (v: { batchId: string; productId: string; packingType: string; packingSize: string }) =>\n `('${v.batchId}', '${v.productId}', '${v.packingType}', '${v.packingSize}')`\n )\n .join()})\n `\n break\n\n case 'batch_bundle':\n bundleWhereClause += `\n ${bundleWhereClause == '' ? 'WHERE' : 'AND'} pb.id ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map((v: { productId: string }) => `('${v.productId}')`)\n .join()})\n `\n break\n\n case 'product':\n productDetailWhereClause += `\n AND (pd.product_id, pd.packing_type, pd.packing_size, pd.uom) ${\n operator === 'in' ? 'IN' : 'NOT IN'\n } (${value\n .map(\n (v: { productId: string; packingType: string; packingSize: string; uom: string }) =>\n `('${v.productId}', '${v.packingType}', '${v.packingSize}', '${v.uom}')`\n )\n .join()})\n `\n break\n }\n })\n )\n\n batchBundle = JSON.stringify(\n filters\n .find(filter => filter.name === 'batch_bundle')\n ?.value.map(itm => {\n return {\n product_id: itm.productId,\n release_qty: itm?.releaseQty || 0,\n release_uom_value: itm?.releaseUomValue || 0\n }\n }) || []\n )\n }\n\n return {\n bizplaceIds,\n productWhereClause,\n apiWhereClause,\n bundleWhereClause,\n whereClause,\n batchBundle,\n productDetailWhereClause\n }\n}\n\nasync function createInventory(\n inventory: Partial<Inventory> | Partial<Inventory>[],\n trxMgr: EntityManager\n): Promise<Inventory | Inventory[]> {\n return await trxMgr.getRepository(Inventory).save(inventory as Inventory)\n}\n\n/**\n * @summary Update inventory record\n * @description It will update inventory after set a stamp (domain, updater)\n * The special point of this function is that this changes won't generate inventory history\n * If you want to generate inventory history automatically you would better to use transactionInventory function\n */\nasync function updateInventory(\n inventory: Partial<Inventory> | Partial<Inventory>[],\n trxMgr: EntityManager\n): Promise<Partial<Inventory> | Partial<Inventory>[]> {\n if (!(inventory as any).id) throw new Error(`Target doesn't have ID`)\n return await trxMgr.getRepository(Inventory).save(inventory as Inventory)\n}\n\nasync function generateInventoryHistory(\n inventory: Inventory,\n refOrder: any,\n transactionType: string,\n qty: number,\n uomValue: number,\n user: User,\n trxMgr?: EntityManager\n): Promise<InventoryHistory> {\n const invHistoryRepo: Repository<InventoryHistory> =\n trxMgr?.getRepository(InventoryHistory) || getRepository(InventoryHistory)\n const invRepo: Repository<Inventory> = trxMgr?.getRepository(Inventory) || getRepository(Inventory)\n\n if (!inventory?.id) throw new Error(`Can't find out ID of inventory.`)\n if (!refOrder?.id || !refOrder.name) throw new Error(`Can't find out ID or Name of Reference Order`)\n if (\n !inventory?.domain ||\n !inventory?.bizplace ||\n !inventory?.product?.id ||\n !inventory?.warehouse?.id ||\n !inventory?.location?.id\n ) {\n inventory = await invRepo.findOne({\n where: { id: inventory.id },\n relations: ['domain', 'bizplace', 'product', 'warehouse', 'location']\n })\n }\n\n const domain: Domain = inventory.domain\n const location: Location = inventory.location\n\n const seq: number = await invHistoryRepo.countBy({\n domain: { id: inventory.domain.id },\n palletId: inventory.palletId\n })\n let openingQty: number = 0\n let openingUomValue: number = 0\n\n if (seq) {\n const lastInvHistory: InventoryHistory = await invHistoryRepo.findOneBy({\n domain: { id: inventory.domain.id },\n palletId: inventory.palletId,\n seq: seq - 1\n })\n openingQty = lastInvHistory.openingQty + lastInvHistory.qty\n openingUomValue = lastInvHistory.openingUomValue + lastInvHistory.uomValue\n }\n\n let inventoryHistory: InventoryHistory = new InventoryHistory()\n inventoryHistory.name = InventoryNoGenerator.inventoryHistoryName()\n inventoryHistory.description = inventory.description\n inventoryHistory.seq = seq\n inventoryHistory.palletId = inventory.palletId\n inventoryHistory.cartonId = inventory.cartonId\n inventoryHistory.batchId = inventory.batchId\n inventoryHistory.batchIdRef = inventory.batchIdRef\n inventoryHistory.status = inventory.status\n inventoryHistory.transactionType = transactionType\n inventoryHistory.refOrderId = refOrder?.id || null\n inventoryHistory.orderNo = refOrder?.name || null\n inventoryHistory.orderRefNo = refOrder?.refNo || null\n inventoryHistory.inventory = inventory\n inventoryHistory.product = inventory.product\n inventoryHistory.reusablePallet = inventory.reusablePallet\n inventoryHistory.zone = inventory.zone\n inventoryHistory.warehouse = inventory.warehouse\n inventoryHistory.location = inventory.location\n inventoryHistory.expirationDate = inventory.expirationDate\n inventoryHistory.packingType = inventory.packingType\n inventoryHistory.packingSize = inventory.packingSize\n inventoryHistory.uom = inventory.uom\n inventoryHistory.qty = qty\n inventoryHistory.openingQty = openingQty\n inventoryHistory.uomValue = uomValue\n inventoryHistory.openingUomValue = openingUomValue\n inventoryHistory.unitCost = inventory.unitCost\n inventoryHistory.domain = inventory.domain\n inventoryHistory.bizplace = inventory.bizplace\n inventoryHistory.creator = user\n inventoryHistory.updater = user\n\n inventoryHistory = await invHistoryRepo.save(inventoryHistory)\n\n if (inventory.lastSeq !== seq) {\n await invRepo.save({\n ...inventory,\n lastSeq: inventoryHistory.seq,\n updater: user\n })\n }\n\n await switchLocationStatus(domain, location, user, trxMgr)\n return inventoryHistory\n}\n\n/**\n * @description: Check location emptiness and update status of location\n * @param domain\n * @param location\n * @param updater\n * @param trxMgr\n */\nexport async function switchLocationStatus(\n domain: Domain,\n location: Location,\n updater: User,\n trxMgr?: EntityManager\n): Promise<Location> {\n const invRepo: Repository<Inventory> = trxMgr?.getRepository(Inventory) || getRepository(Inventory)\n const locationRepo: Repository<Location> = trxMgr?.getRepository(Location) || getRepository(Location)\n const allocatedItemsCnt: number = await invRepo.countBy({\n domain: { id: domain.id },\n status: INVENTORY_STATUS.STORED,\n location: { id: location.id }\n })\n\n if (!allocatedItemsCnt && location.status !== LOCATION_STATUS.EMPTY) {\n location = await locationRepo.save({\n ...location,\n status: LOCATION_STATUS.EMPTY,\n updater\n })\n } else if (allocatedItemsCnt && location.status === LOCATION_STATUS.EMPTY) {\n location = await locationRepo.save({\n ...location,\n status: LOCATION_STATUS.OCCUPIED,\n updater\n })\n }\n\n return location\n}\n\nexport function _composeTargetInventories(product: Product, record: any, inventories: Inventory[]): OrderInventory[] {\n let leftReleaseQty: number = record.releaseQty\n let leftReleaseUomValue: number = record.releaseUomValue\n let compReleaseQty: number = 0\n let compReleaseUomValue: number = 0\n let totalInventoryQty: number = inventories.reduce((total, inventory) => total + inventory.remainQty, 0)\n\n if (totalInventoryQty < record.releaseQty) {\n throw new Error(`invalid release qty for ${product?.sku}`)\n }\n\n let orderInventories: Partial<OrderInventory[]> = []\n let idx = 0\n while (compReleaseQty < record.releaseQty) {\n const inventory = inventories[idx]\n const {\n packingType,\n packingSize,\n batchId,\n batchIdRef,\n uom\n }: { packingType: string; packingSize: number; batchId: string; batchIdRef: string; uom: string } = inventory\n\n let orderInventory: OrderInventory = new OrderInventory()\n\n if (inventory.remainQty > leftReleaseQty) {\n const uomValuePerQty: number = Math.round((inventory.remainUomValue / inventory.remainQty) * 100) / 100\n\n compReleaseQty += leftReleaseQty\n compReleaseUomValue += leftReleaseUomValue\n\n orderInventory = {\n ...orderInventory,\n releaseQty: leftReleaseQty,\n releaseUomValue: Math.round(leftReleaseQty * uomValuePerQty * 100) / 100\n }\n } else {\n compReleaseQty += inventory.remainQty\n compReleaseUomValue += inventory.remainUomValue\n leftReleaseQty -= inventory.remainQty\n leftReleaseUomValue -= inventory.remainUomValue\n\n orderInventory = {\n ...orderInventory,\n releaseQty: inventory.remainQty,\n releaseUomValue: inventory.remainUomValue\n }\n }\n\n orderInventories.push({\n ...orderInventory,\n inventory,\n packingType,\n packingSize,\n batchId,\n batchIdRef,\n uom,\n product,\n type: ORDER_TYPES.RELEASE_OF_GOODS\n })\n\n idx++\n }\n\n return orderInventories\n}\n"]}
|
|
1
|
+
{"version":3,"file":"inventory-util.js","sourceRoot":"","sources":["../../server/utils/inventory-util.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, Equal, In, Not, Raw, Repository, SelectQueryBuilder } from 'typeorm'\n\nimport { User } from '@things-factory/auth-base'\nimport { Bizplace } from '@things-factory/biz-base'\nimport { Product, ProductBundle } from '@things-factory/product-base'\nimport { Domain, Filter, getRepository, ListParam } from '@things-factory/shell'\nimport {\n Inventory,\n INVENTORY_STATUS,\n InventoryHistory,\n InventoryNoGenerator,\n Location,\n LOCATION_STATUS,\n LOCATION_TYPE,\n Pallet\n} from '@things-factory/warehouse-base'\n\nimport { ORDER_TYPES } from '../constants'\nimport { ValidationError } from '../errors'\nimport {\n ArrivalNotice,\n DeliveryOrder,\n InventoryCheck,\n OrderInventory,\n ReleaseGood,\n ReturnOrder,\n ReverseKittingOrder,\n VasOrder\n} from '../service'\n\nexport type ReferenceOrderType =\n | ArrivalNotice\n | ReleaseGood\n | VasOrder\n | InventoryCheck\n | DeliveryOrder\n | ReturnOrder\n | ReverseKittingOrder\n\nexport const InventoryUtil = {\n /**\n * Get all available product belonging to list of bizplaces\n * @param {[Object]} bizplaces\n * @param {Object} params\n * @param {Object} context\n * @param {Object} trxMgr\n * @returns { object } {items, total}\n */\n async bizplaceProductInventory(\n bizplaces: Bizplace[],\n params: ListParam,\n context: ResolverContext,\n trxMgr: EntityManager\n ) {\n try {\n let filters = params.filters\n\n const { domain } = context.state\n\n const { bizplaceIds, productWhereClause, bundleWhereClause, whereClause, batchBundle, productDetailWhereClause } =\n await getConditions(bizplaces, filters, trxMgr, false)\n\n let productFilter = filters.find(itm => itm.name == 'productName')\n let inventoryBizplaceFilter = filters.find(itm => itm.name == 'bizplaceId')\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group ON COMMIT DROP AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n SUM(oi.release_qty) AS release_qty,\n SUM(oi.release_uom_value) AS release_uom_value,\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.batch_id NOTNULL\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n pd.packing_type AS \"packingType\",\n pd.packing_size AS \"packingSize\",\n pd.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n COALESCE(SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) - MAX(COALESCE(bp.bundle_product_release_qty, 0)),0) AS \"remainQty\",\n COALESCE(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)),0) AS \"remainUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)), ' ', pd.uom) AS \"remainUomValueWithUom\",\n 'SINGLE' AS \"groupType\"\n FROM products p\n INNER join product_details pd on pd.product_id = p.id\n LEFT JOIN (\n SELECT i.* FROM inventories i \n INNER JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n WHERE l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n AND i.domain_id = $1 AND i.status = 'STORED'\n ${inventoryBizplaceFilter ? `AND i.bizplace_id = '${inventoryBizplaceFilter.value}'` : ``}\n ) i ON i.product_id = pd.product_id\n AND i.packing_type = pd.packing_type \n and i.packing_size = pd.packing_size \n and i.uom = pd.uom \n LEFT JOIN oi ON i.batch_id = oi.batch_id AND p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN (\n SELECT pbs.product_id, SUM(pbs.bundle_qty * src.release_qty) AS bundle_product_release_qty, SUM(pbs.bundle_qty * src.release_uom_value) AS bundle_product_release_uom_value \n FROM product_bundle_settings pbs\n INNER JOIN json_populate_recordset(NULL::order_inventories, '${batchBundle}') src ON src.product_id = pbs.product_bundle_id\n GROUP BY pbs.product_id\n ) bp on i.product_id = bp.product_id\n WHERE p.bizplace_id IN (${bizplaceIds})\n ${productDetailWhereClause}\n ${\n productFilter\n ? `AND (\n lower(p.sku) ilike '${productFilter.value}'\n OR lower(p.name) ilike '${productFilter.value}'\n OR lower(p.description) ilike '${productFilter.value}'\n )\n `\n : ``\n }\n GROUP BY\n p.id,\n pd.packing_type,\n pd.packing_size,\n pd.uom\n UNION \n SELECT packing_type, packing_size,'UNIT' AS \"uom\", name AS \"productName\", sku AS \"productSKU\", '-' AS \"productBrand\", id AS \"productId\",\n COALESCE(MIN(FLOOR(pbs.\"availableQty\")),0) AS \"remainQty\", \n COALESCE(MIN(FLOOR(pbs.\"availableUomValue\")),0) AS \"remainUomValue\", \n CONCAT(COALESCE(MIN(FLOOR(pbs.\"availableUomValue\")),0),' UNIT') AS \"remainUomValueWithUom\", \n 'BUNDLE' AS \"groupType\"\n FROM product_bundles pb\n LEFT JOIN (\n SELECT pbs.product_id, pbs.product_bundle_id, min(pbs.bundle_qty),\n (SUM(COALESCE(i2.qty, 0)) - SUM(COALESCE(i2.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0))) / min(pbs.bundle_qty) AS \"availableQty\",\n (SUM(COALESCE(i2.uom_value, 0)) - SUM(COALESCE(i2.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0))) / min(pbs.bundle_qty) AS \"availableUomValue\"\n FROM product_bundle_settings pbs \n LEFT JOIN inventories i2 ON i2.product_id = pbs.product_id AND i2.domain_id = $1 AND i2.status = 'STORED'\n INNER JOIN locations l2 ON i2.location_id = l2.id \n LEFT JOIN oi ON oi.product_id = i2.product_id\n WHERE l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${inventoryBizplaceFilter ? `AND i2.bizplace_id = '${inventoryBizplaceFilter.value}'` : ``}\n GROUP BY \n pbs.product_id, \n pbs.product_bundle_id\n ) pbs ON pbs.product_bundle_id = pb.id\n ${bundleWhereClause}\n AND pb.bizplace_id IN (${bizplaceIds}) \n ${\n productFilter\n ? `AND (\n lower(pb.sku) ilike '${productFilter.value}'\n OR lower(pb.name) ilike '${productFilter.value}'\n OR lower(pb.description) ilike '${productFilter.value}'\n )\n `\n : ``\n }\n GROUP BY \n pb.packing_type, \n pb.packing_size, \n pb.name, \n pb.sku, \n pb.id\n )\n AS inv_prod_grp \n ${whereClause}\n order by \"productSKU\", \"productName\"\n )\n `\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(`select count(*) as total from temp_inventory_product_group`)\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(`select * from temp_inventory_product_group OFFSET $1 LIMIT $2`, [\n (params.pagination.page - 1) * params.pagination.limit,\n params.pagination.limit\n ])\n } else {\n items = await trxMgr.query(`select * from temp_inventory_product_group`)\n }\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n /**\n * Get all available product belonging to list of bizplaces\n * @param {[Object]} bizplaces\n * @param {Object} params\n * @param {Object} context\n * @param {Object} trxMgr\n * @returns { object } {items, total}\n */\n async bizplaceInventoryProductGroup(\n bizplaces: Bizplace[],\n params: ListParam,\n context: ResolverContext,\n trxMgr: EntityManager\n ) {\n try {\n let filters = params.filters\n const { domain } = context.state\n\n const { bizplaceIds, productWhereClause, bundleWhereClause, whereClause, batchBundle } = await getConditions(\n bizplaces,\n filters,\n trxMgr\n )\n\n const _groupType = filters.find(res => res.name == 'groupType')\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n round(cast(SUM(oi.release_qty) as numeric), 3) AS release_qty,\n round(cast(SUM(oi.release_uom_value) as numeric), 3) AS release_uom_value,\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.batch_id NOTNULL\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n i.batch_id AS \"batchId\",\n i.batch_id_ref AS \"batchIdRef\",\n i.packing_type AS \"packingType\",\n i.packing_size AS \"packingSize\",\n i.pallet_id as \"palletId\",\n i.created_at as \"createdAt\",\n i.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n ROUND(cast(SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) - MAX(COALESCE(bp.bundle_product_release_qty, 0)) as numeric), 3) AS \"remainQty\",\n ROUND(cast(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)) as numeric), 3) AS \"remainUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)), ' ', i.uom) AS \"remainUomValueWithUom\",\n 'SINGLE' AS \"groupType\",\n i.expiration_date as \"expirationDate\"\n FROM\n inventories i\n LEFT JOIN products p ON i.product_id = p.id\n LEFT JOIN oi ON i.batch_id = oi.batch_id AND p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n LEFT JOIN (\n SELECT pbs.product_id, SUM(pbs.bundle_qty * src.release_qty) AS bundle_product_release_qty, SUM(pbs.bundle_qty * src.release_uom_value) AS bundle_product_release_uom_value \n FROM product_bundle_settings pbs\n INNER JOIN json_populate_recordset(NULL::order_inventories,'${batchBundle}') src ON src.product_id = pbs.product_bundle_id\n GROUP BY pbs.product_id\n ) bp on i.product_id = bp.product_id\n WHERE i.domain_id = $1\n AND l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${productWhereClause}\n GROUP BY\n i.batch_id,\n i.batch_id_ref,\n p.id,\n i.packing_type,\n i.packing_size,\n i.expiration_date,\n i.pallet_id,\n i.created_at,\n i.uom\n UNION \n SELECT 'BUNDLE' AS \"batchId\", null as \"batchIdRef\", packing_type, packing_size, null AS \"palletId\", null AS \"createdAt\", 'UNIT' AS \"uom\", name AS \"productName\", sku AS \"productSKU\", 'brand' AS \"productBrand\", id AS \"productId\",\n MIN(FLOOR(pbs.\"availableQty\")) AS \"remainQty\", \n MIN(FLOOR(pbs.\"availableUomValue\")) AS \"remainUomValue\", \n CONCAT(MIN(FLOOR(pbs.\"availableUomValue\")),' UNIT') AS \"remainUomValueWithUom\",\n 'BUNDLE' AS \"groupType\",\n pbs.\"expirationDate\" as \"expirationDate\"\n FROM product_bundles pb\n INNER JOIN (\n SELECT pbs.product_id, pbs.product_bundle_id, min(pbs.bundle_qty),\n (SUM(COALESCE(i2.qty, 0)) - SUM(COALESCE(i2.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0))) / min(pbs.bundle_qty) AS \"availableQty\",\n (SUM(COALESCE(i2.uom_value, 0)) - SUM(COALESCE(i2.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0))) / min(pbs.bundle_qty) AS \"availableUomValue\", i2.expiration_date as \"expirationDate\"\n FROM product_bundle_settings pbs \n LEFT JOIN inventories i2 ON i2.product_id = pbs.product_id AND i2.domain_id = $1\n AND i2.bizplace_id IN (${bizplaceIds})\n AND i2.status = 'STORED'\n LEFT JOIN oi ON oi.product_id = i2.product_id\n GROUP BY pbs.product_id, pbs.product_bundle_id, i2.expiration_date\n ) pbs ON pbs.product_bundle_id = pb.id\n ${bundleWhereClause}\n GROUP BY pb.packing_type, pb.packing_size, pb.name, pb.sku, pb.id, pbs.\"expirationDate\"\n )\n AS inv_prod_grp\n ${whereClause}\n )\n `\n\n let filterGroupTypeQuery\n\n if (_groupType) {\n if (_groupType.value === 'SINGLE') {\n filterGroupTypeQuery = `where \"groupType\"= 'SINGLE' `\n } else {\n filterGroupTypeQuery = `where \"groupType\"= 'BUNDLE' `\n }\n }\n\n let sortingArr = params.sortings || []\n\n let sortedBy = []\n\n if (sortingArr.length > 0) {\n sortingArr.forEach(element => {\n if (element.desc) {\n sortedBy.push(`\"${element.name}\" DESC `)\n } else {\n sortedBy.push(`\"${element.name}\" `)\n }\n })\n }\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(\n `select count(*) as total from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''}`\n )\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(\n `select * from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''} ${\n sortingArr.length > 0 ? ' Order by ' + sortedBy.toString() : ''\n } OFFSET $1 LIMIT $2`,\n [(params.pagination.page - 1) * params.pagination.limit, params.pagination.limit]\n )\n } else {\n items = await trxMgr.query(\n `select * from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''} ${\n sortingArr.length > 0 ? ' Order by ' + sortedBy.toString() : ''\n }`\n )\n }\n\n await trxMgr.query(`drop table temp_inventory_product_group`)\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n async inventoryProductGroupOpenAPI(\n bizplaces: Bizplace[],\n params: ListParam,\n context: ResolverContext,\n trxMgr: EntityManager\n ) {\n try {\n let filters = params.filters\n const { domain } = context.state\n\n const { apiWhereClause } = await getConditions(bizplaces, filters, trxMgr)\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group_open_api AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n SUM(oi.release_qty) AS release_qty,\n SUM(oi.release_uom_value) AS release_uom_value,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n i.packing_type AS \"packingType\",\n i.packing_size AS \"packingSize\",\n i.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) AS \"remainQty\",\n SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) AS \"remainUomValue\",\n SUM(COALESCE(i.qty, 0)) AS \"totalQty\",\n SUM(COALESCE(i.uom_value, 0)) AS \"totalUomValue\",\n SUM(COALESCE(i.locked_qty, 0)) + MAX(COALESCE(oi.release_qty, 0)) AS \"totalLockedQty\",\n SUM(COALESCE(i.locked_uom_value, 0)) + MAX(COALESCE(oi.release_uom_value, 0)) AS \"totalLockedUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)), ' ', i.uom) AS \"remainUomValueWithUom\"\n FROM inventories i\n LEFT JOIN products p ON i.product_id = p.id\n LEFT JOIN oi ON p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n WHERE i.domain_id = $1\n AND l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${apiWhereClause}\n GROUP BY\n p.id,\n i.packing_type,\n i.packing_size,\n i.uom\n )\n AS inv_prod_grp\n )\n `\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(`select count(*) as total from temp_inventory_product_group_open_api`)\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(`select * from temp_inventory_product_group_open_api OFFSET $1 LIMIT $2`, [\n (params.pagination.page - 1) * params.pagination.limit,\n params.pagination.limit\n ])\n } else {\n items = await trxMgr.query(`select * from temp_inventory_product_group_open_api`)\n }\n\n await trxMgr.query(`drop table temp_inventory_product_group_open_api`)\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n /**\n * Validate warehouse partners product quantity\n * @param {Object} warehouseDomain -\n * @param {Object} partnerBizplace - {id}\n * @param {Object} orderInventories - [{id, qty}]\n * @param {Object} context\n * @param {Object} trxMgr\n */\n async validateWarehousePartnersProductsQuantity(\n warehouseDomain: Domain,\n partnerBizplace: Bizplace,\n orderInventories: OrderInventory[],\n context: any,\n trxMgr?: EntityManager\n ): Promise<void> {\n let json_oi = JSON.stringify(\n orderInventories\n .map(x => {\n if (x.id) return null\n\n return {\n product_id: x.product.id,\n batch_id: x.batchId,\n packing_type: x.packingType,\n release_qty: x.releaseQty,\n uom: x.uom\n }\n })\n .filter(i => i)\n )\n\n let resultQb = await trxMgr.query(\n `\n select joi.product_id as \"productId\", joi.batch_id as \"batchId\", joi.packing_type as \"packingType\", joi.uom as \"uom\", joi.release_qty as \"releaseQty\",\n ROUND(cast(sum(i.qty - coalesce(i.locked_qty,0)) - coalesce(\n (\n select sum(oi.release_qty) from order_inventories oi \n where (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n and oi.inventory_id IS null\n and oi.product_id = joi.product_id\n and oi.batch_id = joi.batch_id\n and oi.packing_type = joi.packing_type\n and oi.uom = joi.uom\n and oi.domain_id = $1\n and oi.bizplace_id = $2\n ),0) as numeric), 3) as \"availableQty\",\n ROUND(cast(sum(i.uom_value - coalesce(i.locked_uom_value ,0)) - coalesce(\n (\n select sum(oi.release_uom_value) from order_inventories oi \n where (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n and oi.inventory_id IS null\n and oi.product_id = joi.product_id\n and oi.batch_id = joi.batch_id\n and oi.packing_type = joi.packing_type\n and oi.uom = joi.uom\n and oi.domain_id = $1\n and oi.bizplace_id = $2\n ),0) as numeric), 3) as \"availableUomValue\"\n from json_populate_recordset(NULL::order_inventories,'${json_oi}') joi\n left join inventories i on joi.product_id = i.product_id \n and joi.batch_id = i.batch_id\n and joi.packing_type = i.packing_type and i.status IN ('STORED', 'DEFECTED')\n and joi.uom = i.uom\n and i.domain_id = $1\n and i.bizplace_id = $2\n group by joi.product_id, joi.batch_id, joi.packing_type, joi.release_qty, joi.uom\n `,\n [warehouseDomain.id, partnerBizplace.id]\n )\n\n resultQb.forEach(itm => {\n if (itm.releaseQty > itm.availableQty) {\n throw new ValidationError({\n ...ValidationError.ERROR_CODES.RELEASE_QTY_OVER_LIMIT,\n detail: { data: JSON.stringify(resultQb) }\n })\n }\n })\n },\n\n async checkPalletDuplication(palletId: string, warehouseDomain: Domain, trxMgr: EntityManager): Promise<void> {\n const duplicatedPalletCnt: number = await trxMgr.getRepository(Inventory).countBy({\n domain: { id: warehouseDomain.id },\n palletId,\n status: Not(Equal(INVENTORY_STATUS.TERMINATED))\n })\n\n if (duplicatedPalletCnt) throw new Error(palletId + ` exists`)\n\n const duplicatedReusablePalletCnt: number = await trxMgr.getRepository(Pallet).count({\n where: {\n domain: { id: warehouseDomain.id },\n name: palletId\n }\n })\n\n if (duplicatedReusablePalletCnt) throw new Error(palletId + ` exists`)\n },\n\n /**\n * To pre-assign inventories automatically for orderInventories in Release Goods\n * @param product\n * @param orderInventory\n * @param packingType\n * @param locationSortingRules\n * @param customerBizplace\n * @param domain\n * @param trxMgr\n * @returns orderInventories\n */\n async autoAssignInventoryForRelease(\n product: Product,\n orderInventory: OrderInventory,\n packingType: string,\n locationSortingRules: any = [],\n customerBizplace: Bizplace,\n domain: Domain,\n trxMgr: EntityManager,\n batchId?: string\n ): Promise<OrderInventory[]> {\n let qb: SelectQueryBuilder<Inventory> = trxMgr.getRepository(Inventory).createQueryBuilder('iv')\n qb.leftJoinAndSelect('iv.location', 'loc')\n .andWhere('\"iv\".\"domain_id\" = :domainId')\n .andWhere('\"iv\".\"bizplace_id\" = :bizplaceId')\n .andWhere('\"iv\".\"packing_type\" = :packingType')\n .andWhere('\"iv\".\"product_id\" = :productId')\n .andWhere('\"iv\".\"status\" = :status')\n .andWhere('\"iv\".\"qty\" - COALESCE(\"iv\".\"locked_qty\", 0) > 0')\n .andWhere('\"loc\".\"type\" NOT IN (:...locationTypes)')\n .setParameters({\n domainId: domain.id,\n bizplaceId: customerBizplace.id,\n packingType: packingType,\n productId: product.id,\n status: INVENTORY_STATUS.STORED,\n locationTypes: [LOCATION_TYPE.QUARANTINE, LOCATION_TYPE.RESERVE]\n })\n\n if (batchId) {\n qb.andWhere('\"iv\".\"batch_id\" = :batchId', { batchId: batchId })\n }\n\n let locationSorting = function (qb: SelectQueryBuilder<Inventory>, locationSortingRules) {\n if (locationSortingRules?.length) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n idx === 0\n ? qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n : qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n } else {\n qb.addOrderBy('\"loc\".\"name\"', 'ASC')\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n }\n return qb\n }\n\n switch (product?.pickingStrategy) {\n case 'FIFO':\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n qb = locationSorting(qb, locationSortingRules)\n break\n case 'LIFO':\n qb.addOrderBy('\"iv\".\"created_at\"', 'DESC')\n qb = locationSorting(qb, locationSortingRules)\n break\n case 'FEFO':\n qb.addOrderBy('\"iv\".\"expiration_date\"', 'ASC')\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n qb = locationSorting(qb, locationSortingRules)\n break\n case 'FMFO':\n qb.addOrderBy('\"iv\".\"manufacture_date\"', 'ASC')\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n qb = locationSorting(qb, locationSortingRules)\n break\n case 'LOCATION':\n qb = locationSorting(qb, locationSortingRules)\n break\n default:\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n qb = locationSorting(qb, locationSortingRules)\n break\n }\n\n let inventories: Inventory[] = await qb.getMany()\n if (!inventories?.length) throw new Error(`no inventories found for ${product.sku}`)\n\n inventories = inventories.map(inventory => {\n return {\n ...inventory,\n remainQty: inventory.qty - (inventory?.lockedQty || 0),\n remainUomValue: inventory.uomValue - (inventory?.lockedUomValue || 0)\n }\n })\n\n return _composeTargetInventories(product, orderInventory, inventories)\n },\n\n /**\n * @summary Do transaction on inventory record\n * @description It will update inventory after set a temp (domain, updater)\n * and then generate inventory history based on current changes\n */\n async transactionInventory(\n inventory: Inventory,\n referenceOrder: ReferenceOrderType,\n changedQty: number,\n changedWeight: number,\n transactionType: string,\n user: User,\n trxMgr: EntityManager\n ): Promise<Inventory> {\n if (inventory.id) {\n inventory = (await updateInventory(inventory, trxMgr)) as any\n } else {\n inventory = (await createInventory(inventory, trxMgr)) as any\n }\n\n await generateInventoryHistory(inventory, referenceOrder, transactionType, changedQty, changedWeight, user, trxMgr)\n\n return inventory\n }\n}\n\ninterface Conditions {\n bizplaceIds: string\n productWhereClause: string\n bundleWhereClause: string\n whereClause: string\n batchBundle: string\n apiWhereClause: string\n productDetailWhereClause: string\n}\n\nasync function getConditions(\n bizplaces: Bizplace[],\n filters: Filter[],\n trxMgr: EntityManager,\n hasRemainingQty: Boolean = true\n): Promise<Conditions> {\n let bizplaceIds = bizplaces.map((bizplace: Bizplace) => `'${bizplace.id}'`).join()\n\n let productWhereClause = `\n AND i.status = 'STORED'\n AND i.bizplace_id IN (${bizplaceIds})\n `\n let apiWhereClause = `\n AND i.bizplace_id IN (${bizplaceIds})\n `\n let bundleWhereClause = `\n WHERE pb.status = 'ACTIVATED'\n `\n\n let whereClause = hasRemainingQty ? ` WHERE \"remainQty\" > 0` : ` WHERE 1 = 1`\n\n let productDetailWhereClause = ``\n\n let batchBundle: string\n if (filters?.length) {\n await Promise.all(\n filters.map(async (filter: { name: string; operator: string; value: any }) => {\n const name = filter.name\n const operator = filter.operator.toLowerCase()\n let value = filter.value\n\n switch (name) {\n case 'productId':\n if (operator == 'in')\n whereClause += `AND \"productId\" ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(itm => {\n return `'${itm}'`\n })\n .join(',')})`\n break\n\n case 'productBundleId':\n if (operator == 'in')\n whereClause += `AND \"productId\" ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(itm => {\n return `'${itm}'`\n })\n .join(',')})`\n break\n\n case 'batchId':\n whereClause += `AND LOWER(\"batchId\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'batchIdRef':\n whereClause += `AND LOWER(\"batchIdRef\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'productBrand':\n whereClause += `AND LOWER(\"productBrand\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'productSKU':\n whereClause += `AND LOWER(\"productSKU\") LIKE '${value.toLowerCase()}'`\n\n case 'productName':\n const products: Product[] = await trxMgr.getRepository(Product).find({\n select: ['id'],\n where: [\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n name: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n sku: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n description: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n }\n ]\n })\n\n const productIds: string = products\n .map((product: Product) => product.id)\n .map((id: string) => `'${id}'`)\n .join()\n\n if (productIds.length) {\n productWhereClause += `AND i.product_id IN (${productIds})`\n } else {\n productWhereClause += `AND i.product_id ISNULL`\n }\n\n // filter product bundle as product info\n const productBundles: ProductBundle[] = await trxMgr.getRepository(ProductBundle).find({\n select: ['id'],\n where: [\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n name: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n sku: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n description: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n }\n ]\n })\n\n const productBundleIds: string = productBundles\n .map((bundle: ProductBundle) => bundle.id)\n .map((id: string) => `'${id}'`)\n .join()\n\n if (productBundleIds.length) {\n bundleWhereClause += `AND pb.id IN (${productBundleIds})`\n } else {\n bundleWhereClause += `AND pb.id ISNULL`\n }\n break\n\n case 'packingType':\n whereClause += `AND LOWER(\"packingType\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'showBundle':\n whereClause += `AND LOWER(\"groupType\") LIKE 'bundle'`\n break\n\n case 'hideBundle':\n whereClause += `AND LOWER(\"groupType\") LIKE 'single'`\n break\n\n case 'batch_product':\n productWhereClause += `\n AND (i.batch_id, p.id, i.packing_type, i.packing_size) ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(\n (v: { batchId: string; productId: string; packingType: string; packingSize: string }) =>\n `('${v.batchId}', '${v.productId}', '${v.packingType}', '${v.packingSize}')`\n )\n .join()})\n `\n break\n\n case 'batch_bundle':\n bundleWhereClause += `\n ${bundleWhereClause == '' ? 'WHERE' : 'AND'} pb.id ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map((v: { productId: string }) => `('${v.productId}')`)\n .join()})\n `\n break\n\n case 'product':\n productDetailWhereClause += `\n AND (pd.product_id, pd.packing_type, pd.packing_size, pd.uom) ${\n operator === 'in' ? 'IN' : 'NOT IN'\n } (${value\n .map(\n (v: { productId: string; packingType: string; packingSize: string; uom: string }) =>\n `('${v.productId}', '${v.packingType}', '${v.packingSize}', '${v.uom}')`\n )\n .join()})\n `\n break\n }\n })\n )\n\n batchBundle = JSON.stringify(\n filters\n .find(filter => filter.name === 'batch_bundle')\n ?.value.map(itm => {\n return {\n product_id: itm.productId,\n release_qty: itm?.releaseQty || 0,\n release_uom_value: itm?.releaseUomValue || 0\n }\n }) || []\n )\n }\n\n return {\n bizplaceIds,\n productWhereClause,\n apiWhereClause,\n bundleWhereClause,\n whereClause,\n batchBundle,\n productDetailWhereClause\n }\n}\n\nasync function createInventory(\n inventory: Partial<Inventory> | Partial<Inventory>[],\n trxMgr: EntityManager\n): Promise<Inventory | Inventory[]> {\n return await trxMgr.getRepository(Inventory).save(inventory as Inventory)\n}\n\n/**\n * @summary Update inventory record\n * @description It will update inventory after set a stamp (domain, updater)\n * The special point of this function is that this changes won't generate inventory history\n * If you want to generate inventory history automatically you would better to use transactionInventory function\n */\nasync function updateInventory(\n inventory: Partial<Inventory> | Partial<Inventory>[],\n trxMgr: EntityManager\n): Promise<Partial<Inventory> | Partial<Inventory>[]> {\n if (!(inventory as any).id) throw new Error(`Target doesn't have ID`)\n return await trxMgr.getRepository(Inventory).save(inventory as Inventory)\n}\n\nasync function generateInventoryHistory(\n inventory: Inventory,\n refOrder: any,\n transactionType: string,\n qty: number,\n uomValue: number,\n user: User,\n trxMgr?: EntityManager\n): Promise<InventoryHistory> {\n const invHistoryRepo: Repository<InventoryHistory> =\n trxMgr?.getRepository(InventoryHistory) || getRepository(InventoryHistory)\n const invRepo: Repository<Inventory> = trxMgr?.getRepository(Inventory) || getRepository(Inventory)\n\n if (!inventory?.id) throw new Error(`Can't find out ID of inventory.`)\n if (!refOrder?.id || !refOrder.name) throw new Error(`Can't find out ID or Name of Reference Order`)\n if (\n !inventory?.domain ||\n !inventory?.bizplace ||\n !inventory?.product?.id ||\n !inventory?.warehouse?.id ||\n !inventory?.location?.id\n ) {\n inventory = await invRepo.findOne({\n where: { id: inventory.id },\n relations: ['domain', 'bizplace', 'product', 'warehouse', 'location']\n })\n }\n\n const domain: Domain = inventory.domain\n const location: Location = inventory.location\n\n const seq: number = await invHistoryRepo.countBy({\n domain: { id: inventory.domain.id },\n palletId: inventory.palletId\n })\n let openingQty: number = 0\n let openingUomValue: number = 0\n\n if (seq) {\n const lastInvHistory: InventoryHistory = await invHistoryRepo.findOneBy({\n domain: { id: inventory.domain.id },\n palletId: inventory.palletId,\n seq: seq - 1\n })\n openingQty = lastInvHistory.openingQty + lastInvHistory.qty\n openingUomValue = lastInvHistory.openingUomValue + lastInvHistory.uomValue\n }\n\n let inventoryHistory: InventoryHistory = new InventoryHistory()\n inventoryHistory.name = InventoryNoGenerator.inventoryHistoryName()\n inventoryHistory.description = inventory.description\n inventoryHistory.seq = seq\n inventoryHistory.palletId = inventory.palletId\n inventoryHistory.cartonId = inventory.cartonId\n inventoryHistory.batchId = inventory.batchId\n inventoryHistory.batchIdRef = inventory.batchIdRef\n inventoryHistory.status = inventory.status\n inventoryHistory.transactionType = transactionType\n inventoryHistory.refOrderId = refOrder?.id || null\n inventoryHistory.orderNo = refOrder?.name || null\n inventoryHistory.orderRefNo = refOrder?.refNo || null\n inventoryHistory.inventory = inventory\n inventoryHistory.product = inventory.product\n inventoryHistory.reusablePallet = inventory.reusablePallet\n inventoryHistory.zone = inventory.zone\n inventoryHistory.warehouse = inventory.warehouse\n inventoryHistory.location = inventory.location\n inventoryHistory.expirationDate = inventory.expirationDate\n inventoryHistory.packingType = inventory.packingType\n inventoryHistory.packingSize = inventory.packingSize\n inventoryHistory.uom = inventory.uom\n inventoryHistory.qty = qty\n inventoryHistory.openingQty = openingQty\n inventoryHistory.uomValue = uomValue\n inventoryHistory.openingUomValue = openingUomValue\n inventoryHistory.unitCost = inventory.unitCost\n inventoryHistory.domain = inventory.domain\n inventoryHistory.bizplace = inventory.bizplace\n inventoryHistory.creator = user\n inventoryHistory.updater = user\n\n inventoryHistory = await invHistoryRepo.save(inventoryHistory)\n\n if (inventory.lastSeq !== seq) {\n await invRepo.save({\n ...inventory,\n lastSeq: inventoryHistory.seq,\n updater: user\n })\n }\n\n await switchLocationStatus(domain, location, user, trxMgr)\n return inventoryHistory\n}\n\n/**\n * @description: Check location emptiness and update status of location\n * @param domain\n * @param location\n * @param updater\n * @param trxMgr\n */\nexport async function switchLocationStatus(\n domain: Domain,\n location: Location,\n updater: User,\n trxMgr?: EntityManager\n): Promise<Location> {\n const invRepo: Repository<Inventory> = trxMgr?.getRepository(Inventory) || getRepository(Inventory)\n const locationRepo: Repository<Location> = trxMgr?.getRepository(Location) || getRepository(Location)\n const allocatedItemsCnt: number = await invRepo.countBy({\n domain: { id: domain.id },\n status: INVENTORY_STATUS.STORED,\n location: { id: location.id }\n })\n\n if (!allocatedItemsCnt && location.status !== LOCATION_STATUS.EMPTY) {\n location = await locationRepo.save({\n ...location,\n status: LOCATION_STATUS.EMPTY,\n updater\n })\n } else if (allocatedItemsCnt && location.status === LOCATION_STATUS.EMPTY) {\n location = await locationRepo.save({\n ...location,\n status: LOCATION_STATUS.OCCUPIED,\n updater\n })\n }\n\n return location\n}\n\nexport function _composeTargetInventories(product: Product, record: any, inventories: Inventory[]): OrderInventory[] {\n let leftReleaseQty: number = record.releaseQty\n let leftReleaseUomValue: number = record.releaseUomValue\n let compReleaseQty: number = 0\n let compReleaseUomValue: number = 0\n let totalInventoryQty: number = inventories.reduce((total, inventory) => total + inventory.remainQty, 0)\n\n if (totalInventoryQty < record.releaseQty) {\n throw new Error(`invalid release qty for ${product?.sku}`)\n }\n\n let orderInventories: Partial<OrderInventory[]> = []\n let idx = 0\n while (compReleaseQty < record.releaseQty) {\n const inventory = inventories[idx]\n const {\n packingType,\n packingSize,\n batchId,\n batchIdRef,\n uom\n }: { packingType: string; packingSize: number; batchId: string; batchIdRef: string; uom: string } = inventory\n\n let orderInventory: OrderInventory = new OrderInventory()\n\n if (inventory.remainQty > leftReleaseQty) {\n const uomValuePerQty: number = Math.round((inventory.remainUomValue / inventory.remainQty) * 100) / 100\n\n compReleaseQty += leftReleaseQty\n compReleaseUomValue += leftReleaseUomValue\n\n orderInventory = {\n ...orderInventory,\n releaseQty: leftReleaseQty,\n releaseUomValue: Math.round(leftReleaseQty * uomValuePerQty * 100) / 100\n }\n } else {\n compReleaseQty += inventory.remainQty\n compReleaseUomValue += inventory.remainUomValue\n leftReleaseQty -= inventory.remainQty\n leftReleaseUomValue -= inventory.remainUomValue\n\n orderInventory = {\n ...orderInventory,\n releaseQty: inventory.remainQty,\n releaseUomValue: inventory.remainUomValue\n }\n }\n\n orderInventories.push({\n ...orderInventory,\n inventory,\n packingType,\n packingSize,\n batchId,\n batchIdRef,\n uom,\n product,\n type: ORDER_TYPES.RELEASE_OF_GOODS\n })\n\n idx++\n }\n\n return orderInventories\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/sales-base",
|
|
3
|
-
"version": "8.0.
|
|
3
|
+
"version": "8.0.51",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -36,5 +36,5 @@
|
|
|
36
36
|
"@things-factory/transport-base": "^8.0.41",
|
|
37
37
|
"@things-factory/warehouse-base": "^8.0.47"
|
|
38
38
|
},
|
|
39
|
-
"gitHead": "
|
|
39
|
+
"gitHead": "3aecc36b712051528dd09c00e566b24fa91ee959"
|
|
40
40
|
}
|