Skip to main content

PRODUCT UNIT OF MEASUREMENT

📏 Technical Specification: Product Unit of Measurement (PUM)


📋 Feature Overview

Attribute Detail
Module 📂 Directory (PRODUCT_UNIT_OF_MEASUREMENT)
Feature Name Product Unit of Measurement (PUM)
Description Defines specific units of measurement (e.g., Bags, MT) for products and their conversion rates. Links products to external codes for integration.
Page & Detail
1. Listing Page: /product-unit-of-measurement
Displays grid of product UOMs, filters, and delete actions.
2. Add/Edit Page: /add-product-unit-of-measurement
Form for defining UOMs and conversion rates for products.
User Guide 📄 [Ekajaya Admin User Guide - Directory Module, Section 8]

🛠️ Technical Implementation

A. Permissions & Access Control

Note: Access is controlled via PermissionGuard and code-level checks.
Scope Permission Code Description & Page Usage
Menu Visibility PRODUCT_UNIT_OF_MEASUREMENT.MENU

Sidebar menu visibility.

\product-unit-of-measurement

\add-product-unit-of-measurement

Page AccessRouting PRODUCT_UNIT_OF_MEASUREMENT.LISTING Access to listing route.
\product-unit-of-measurement
Page RoutingPRODUCT_UNIT_OF_MEASUREMENT.VIEW

Access to add route.

\add-product-unit-of-measurement

View Access PRODUCT_UNIT_OF_MEASUREMENT.VIEW Controls visibility of action buttons (Edit).
\product-unit-of-measurement
Create Action PRODUCT_UNIT_OF_MEASUREMENT.UPDATE Visibility of the + Add button.
\product-unit-of-measurement
Delete Action PRODUCT_UNIT_OF_MEASUREMENT.DELETE Visibility of the Delete 🗑️ icon.
\product-unit-of-measurement
Edit/Save Action PRODUCT_UNIT_OF_MEASUREMENT.UPDATE Ability to save changes (Create/Update).
\add-product-unit-of-measurement

B. API Interaction

Base URL: ${environment.baseApiUrl}
1. Retrieve PUM List \product-unit-of-measurement
Endpoint
/productUnitOfMeasurements/getQuery
Method
POST
Key Params
join: product
filter: Dynamic filters for unitOfMeasurement and productId.
2. DeleteListing PUM \product-unit-of-measurement
Endpoint
/products/getQuery
POST
Purpose: Populate productDataSource for filtering
/settings/getQuery
POST
Filter: type='Unit Of Measurement'
/productUnitOfMeasurements/getQuery
POST
Filter: unitOfMeasurement, productId
/productUnitOfMeasurements/delete
MethodPOST
POSTPurpose: Hard Delete PUM Record
{ "id": Number }
2.
3. Get SingleAdd PUM (Edit Mode)Manage \add-product-unit-of-measurement
Endpoint
/products/getQuery
POST
Filter: isDeleted=0
/settings/getQuery
POST
Filter: type='Unit Of Measurement'
/settings/getQuery
POST
Filter: type='CIMA Product Code'
/settings/getQuery
POST
Filter: type='Asia Cement Product Code'
/productUnitOfMeasurements/getQuery
Method
POST
Query Params
filter:Filter: id||$eq||{id}id
limit: 1
(Fetch
specific record)
4.
/productUnitOfMeasurements/create
POST
Purpose: Create PUMnew \add-product-unit-of-measurementrecord
Endpoint/productUnitOfMeasurements/update
POST
/productUnitOfMeasurements/create
Purpose:
Method
Update
POSTexisting record
{
  "productId": Number,
  "unitOfMeasurement": "String",
  "conversionRate": Number,
  "cimaProductCode": "String"
}
5. Update PUM \add-product-unit-of-measurement
Endpoint
/productUnitOfMeasurements/update
Method
POST
Payload is same as Create, but includes "id": Number.
6. Helper APIs (Dropdowns) \add-product-unit-of-measurement
Products
/products/getQuery (isDeleted=0)
POST
UOM Options
/settings/getQuery (type="Unit Of Measurement")
POST
CIMA Codes
/settings/getQuery (type="CIMA Product Code")
POST
Asia Cement Codes
/settings/getQuery (type="Asia Cement Product Code")
POST

C. Validation & Business Logic

1. Mandatory Fields Validation \add-product-unit-of-measurement

  • Trigger: On Save.
  • Logic: Checks if productId, unitOfMeasurement, or conversionRate are empty.
  • Error: Displays specific error messages (e.g., "Please select the product", "Please enter the conversion rate").

2. Conversion Logic & Constraints

Context: The conversion rate is critical for calculating tonnage vs. quantity in orders.

Note: There is no explicit backend validation check for unique Product+UOM combinations in the provided code. The system relies on the user ensuring duplicates are not created.