Software Requirements Specification

DEXPO Exports
ERP System

Comprehensive Functional Requirements — Phase 1 & Phase 2

Document Version2.0
PlatformOutSystems Low-Code
OrganisationDexo Exports Limited, Indore (MP)
ClassificationInternal — Project Team Only
Prepared ByAnkit Gangrade
Date

Table of Contents

1.Project Overview & Objectives§1 2.User Roles & Access Control§2 3.Application Architecture§3
Phase 1 — Core ERP
4.User Management§4 5.Master Data — Categories, Items, Vendors, Customers§5 6.Import Orders (Purchase Orders)§6 7.Export Orders (Sales Orders)§7 8.Admin Dashboard§8
Phase 2 — Logistic Integration
9.Logistic Status Master§9 10.Logistic Provider Management§10 11.Export Movement & Tracking§11 12.Logistic Dashboard§12 13.Third-Party API Integration§13

§1 Project Overview & Objectives

Dexo Exports Limited is an electronics export company based in Indore, Madhya Pradesh. The company handles the procurement of electronics goods from vendors (Import) and their sale to customers overseas (Export). Currently, these operations are managed through manual processes and disconnected spreadsheets, leading to inventory inaccuracies, delays, and a lack of visibility into order status.


This document specifies the functional requirements for a web-based ERP system to be built on the OutSystems low-code platform. The system will digitalise and centralise all core operations across two delivery phases.

Business Objectives

#ObjectiveDescription
OBJ-01Centralised InventoryMaintain a single, accurate record of all stock items, quantities, and valuations. Eliminate the use of offline spreadsheets for stock tracking.
OBJ-02Digitalised TransactionsReplace manual order creation with a structured digital process for both Import (Purchase Orders) and Export (Sales Orders).
OBJ-03Role-Based Access ControlEnsure each user sees and can do only what their role permits. No user should be able to access data or functionality outside their assigned scope.
OBJ-04Management DashboardProvide Admin and Manager users with a real-time summary of business performance: order volumes, financials, and inventory health.
OBJ-05Logistic Integration (Phase 2)Connect with third-party logistic providers via API to automatically track shipment status, eliminating the need for manual follow-up calls.

Delivery Phases

Phase 1 — Core ERP (Sections 4–8): User management, master data (categories, items, vendors, customers), purchase orders, sales orders, and the admin dashboard. This phase delivers a fully functional ERP for day-to-day operations.
Phase 2 — Logistic Integration (Sections 9–13): Extends Phase 1 with a complete shipment tracking module — logistic provider management, export movement tracking, a dedicated logistic user dashboard, and real-time API integration with logistics providers.

§2 User Roles & Access Control

The system implements four distinct user roles. Each role is defined by a specific set of permissions. No user can operate outside the scope of their assigned role. Role assignment is done by an Admin during user creation.

Role Definitions

RoleDescriptionTypical User
AdminFull system access. Manages users, all master data, all transactions, configuration, and sees all reports.Business owner / IT manager
ManagerOperational access. Can view and manage master data and transactions. Cannot manage users or system configuration.Operations manager
UserSales-focused access. Can create and manage Export Orders (SO). Has read-only access to master data.Sales executive
Logistic UserRestricted to the Logistic Dashboard only. Can update shipment status and fetch live tracking. Cannot access any other screen.Warehouse / dispatch staff

Permissions Matrix

Functionality Admin Manager User Logistic User
User Management✔ Full
Master Data (Categories, Items)✔ Full✔ FullRead Only
Vendors✔ Full✔ Full
Customers✔ Full✔ Full✔ Full
Purchase Orders (Import)✔ Full✔ Full
Sales Orders (Export)✔ Full✔ Full✔ Full
Admin Dashboard✔ Full✔ Full
Logistic Provider Management✔ Full
Logistic DashboardView OnlyView Only✔ Full
Login redirect rule: After login, Admin and Manager are redirected to the Admin Dashboard. A Logistic User is redirected directly to the Logistic Dashboard. Any attempt to access an unauthorised screen redirects back to the permitted screen.

§3 Application Architecture

The system follows the OutSystems three-layer architecture: Foundation at the bottom, Core in the middle, and UI at the top. Dependencies are strictly one-directional — upper layers may reference lower layers, but never the reverse.

LayerApplication / ModuleResponsibility
UI LayerDEXPOAll screens and screen-level logic. No database access. Calls Core server actions only.
Core LayerDEXPO_CSCore entities (Customer, Vendor, Item, SO, PO), business rules, and server actions for Phase 1.
Core Layer Phase 2DEXPO_Logistic_CSLogistic entities (Provider, Status Mapping, ExportMovement, ExportMovementLog), static entity (DeliveryStatus), wrapper actions to call the Integration Service.
Foundation LayerDEXO (Theme)Application theme, UI layouts, login flow, and shared UI templates.
Foundation LayerDexpo_LibRole definitions, role-based access logic, user management server actions.
Foundation Layer Phase 2Dexpo_Logistic_ISIntegration Service — sole module responsible for HTTP calls to third-party logistic provider APIs. Contains input/response structures and all error handling.
Phase 1 — Core ERP
Sections 4 through 8. Foundation of the system — user management, master data, purchase orders, sales orders, and the admin dashboard.

§4 User Management (Admin only)

The Admin manages all user accounts for the DEXPO system. This includes creating new users, assigning roles, editing details, and resetting passwords. The system sends automated email notifications on account creation and password changes.

Functional Requirements

IDRequirementDetailPriority
UM-01Navigation entryA dropdown menu item "Manage Users" is added to the navigation bar, visible only to Admin users. Clicking it opens the Manage Users page.MUST
UM-02User list pageThe page shows a table of all users with columns: Name (clickable), Email, Roles, Status (Active / Inactive). Default view shows Active users. Filters: Status (All / Active / Inactive), Role (dropdown).MUST
UM-03Add new userClicking "Add User" opens a popup with fields: Full Name (mandatory), Email (mandatory, used as login), Password (mandatory on create), Retype Password (mandatory on create), Roles (multi-select — at least one required), Is Active (default: checked). On save, user is created and a welcome email is sent.MUST
UM-04Edit userClicking a user name opens the same popup pre-filled. In edit mode, password fields are optional — leaving them blank retains the existing password. If a new password is provided, it must pass the same validations.MUST
UM-05Change passwordA "Change Password" link in each user row opens a focused popup. Admin types and confirms a new password. On success, a password reset notification email is sent to the user.MUST
UM-06Welcome emailOn successful user creation, the system sends an automated email to the user's email address containing their name, login email, and assigned password.MUST
UM-07Password reset emailAfter every successful Admin-initiated password change, the system sends an email to the user with the new password.MUST

Validation Rules

FieldRule
Full NameMinimum 2 characters. Cannot be blank.
EmailMust be a valid email format. Must be unique across all users (case-insensitive).
Password (create)Mandatory. Minimum 6 characters.
Retype PasswordMust exactly match the Password field.
RolesAt least one role must be selected. Multi-select is allowed (e.g. Admin + Manager).

§5 Master Data

Master data refers to the core reference records the system depends on — Categories, Items, Vendors, and Customers. These records are created once and reused across transactions. Incorrect or missing master data will prevent transactions from being created.

5.1 — Categories

Categories group items for reporting and inventory filtering (e.g. "Air Coolers", "Fans", "Water Purifiers").

IDRequirementPriority
CAT-01Admin and Manager can create, edit, and deactivate categories. Category Name is mandatory and must be unique.MUST
CAT-02The category list shows Name, Description, and Status (Active / Inactive) with filters for Status.MUST
CAT-03A category cannot be deleted if items are associated with it. Deactivation is used instead.MUST

5.2 — Items (Products)

Items represent the physical products that DEXPO buys (via PO) and sells (via SO). The system automatically adjusts stock quantity when orders are processed.

IDRequirementPriority
ITEM-01Admin and Manager can create, edit, and deactivate items. Each item belongs to a Category.MUST
ITEM-02Item fields: Name (mandatory), Category (mandatory), SKU (unique), Unit Rate (decimal), Remaining Quantity (integer, auto-managed), Is Active.MUST
ITEM-03When a PO is confirmed, the items in the PO increase the Remaining Quantity for those items. When an SO is confirmed, the items decrease it.MUST
ITEM-04The item list supports filtering by Category and Status. The list shows current Remaining Quantity and a stock status badge (Healthy / Low Stock / Critical) based on configurable thresholds.MUST

5.3 — Vendors

Vendors are the suppliers from whom DEXPO purchases goods (Import / Purchase Orders).

IDRequirementPriority
VND-01Admin and Manager can create, edit, and deactivate vendors. Vendor Name is mandatory.MUST
VND-02Vendor fields: Name, Contact Person, Email, Phone, Address, Is Active.MUST

5.4 — Customers

Customers are the buyers to whom DEXPO sells goods (Export / Sales Orders).

IDRequirementPriority
CUST-01Admin, Manager, and User can create, edit, and deactivate customers. Customer Name is mandatory.MUST
CUST-02Customer fields: Name, Contact Person, Email, Phone, Billing Address, Is Active.MUST
CUST-03A special "Cash Customer" record exists in the system by default for walk-in or one-time buyers where no customer account is needed.MUST

§6 Import Orders — Purchase Orders (PO)

A Purchase Order (PO) represents a transaction where DEXPO buys goods from a vendor. It is referred to as an "Import Order" in the business context. POs affect the inventory by increasing stock quantities upon confirmation.

Creation Flow

1
Header: Select PO Date and Vendor (mandatory). The PO number is auto-generated by the system.
2
Line Items: Add one or more items. For each line: select Item, enter Quantity (min: 1) and Rate. The Amount (Qty × Rate) is calculated automatically. At least one line item is required.
3
Summary: The system displays Subtotal, Discount (manual entry), and Final Payable. Final Payable = Subtotal − Discount.
4
Save: On save, the PO is recorded with status "Draft". Admin or Manager can confirm it, which increases inventory quantities and locks the PO from further editing.

Functional Requirements

IDRequirementPriority
PO-01Admin and Manager can create, view, and manage Purchase Orders. The User role has no access to PO screens.MUST
PO-02A PO must have at least one line item to be saved.MUST
PO-03Line items can be added, edited, and removed before the PO is confirmed. Once confirmed, no edits are permitted.MUST
PO-04The PO Report page displays all POs with filters: Date Range, Vendor, and Status. Each row shows PO ID, Date, Vendor, Item Count, and Total Amount.MUST
PO-05An invoice view is available for each PO showing the full breakdown of line items and totals.SHOULD

§7 Export Orders — Sales Orders (SO)

A Sales Order (SO) represents a transaction where DEXPO sells goods to a customer. It is referred to as an "Export Order" in the business context. SOs reduce inventory quantities upon confirmation and form the basis of the Logistic tracking workflow in Phase 2.

Creation Flow

1
Header: Select SO Date and Customer (mandatory). Can select "Cash Customer" for walk-in buyers. SO number is auto-generated.
2
Line Items: Add items to the order. For each line: select Item, enter Quantity and Rate. Amount is auto-calculated. System must warn if the ordered quantity exceeds available stock.
3
Summary: System shows Subtotal, Discount (manual), and Final Payable = Subtotal − Discount.
4
Save & Confirm: On confirmation, inventory is reduced and the SO is locked. In Phase 2, confirmation also triggers the logistic assignment workflow.

Functional Requirements

IDRequirementPriority
SO-01Admin, Manager, and User can create Sales Orders. All three roles can view the SO report.MUST
SO-02A Sales Order must have at least one line item to be saved.MUST
SO-03The system warns (but does not block by default) if the quantity for a line item exceeds the item's Remaining Quantity.MUST
SO-04Once an SO is confirmed, it cannot be edited or deleted. Status changes are managed through the Logistic module in Phase 2.MUST
SO-05The SO Report page shows all Sales Orders with filters: Date Range, Customer, and Status. Each row shows SO ID, Date, Customer, Item Count, Total Amount, and current Logistic Status.MUST
SO-06An invoice popup is accessible from both the SO Report and the Logistic Dashboard, showing full order breakdown.MUST

§8 Admin Dashboard

The Admin Dashboard is the home screen for Admin and Manager users after login. It gives a single-screen view of business health across orders, financials, and inventory. All values refresh on every page load.

Dashboard Components

IDComponentDescriptionPriority
DASH-01Export Order Status CardsSix KPI cards showing counts of export orders by stage: Total Created, In-Process, Sent to Facility, In-Transit, Delayed (EDD passed but not delivered), Delivered. Status values are derived from the LogisticStatusMaster static entity (Phase 2). In Phase 1, simplified statuses are used.MUST
DASH-02Financial KPI CardsFour cards: Export Revenue Today (SUM of SO totals for today), Export Revenue – 3 Months, Import Spend – 30 Days, Total Discounts Today. Cards show the value only — no percentage delta or comparison lines.MUST
DASH-03Export Orders by Status ChartA doughnut chart showing the distribution of export orders across all current statuses. Segment colours match the LogisticStatusMaster color codes. Statuses with zero orders are still visible in the legend.MUST
DASH-04Inventory by Category ChartA doughnut chart showing stock value (Rate × RemainingQTY) grouped by the top 5 categories. Accompanied by horizontal progress bars showing each category's share of total stock value.MUST
DASH-05Inventory Item Summary TableA table of items sorted by Stock Value (descending). Columns: Item Name, Category, Rate, Remaining Qty, Stock Value, Status badge. Status rules: Critical (Qty < 5), Low Stock (Qty < 15), Healthy. Thresholds are configurable via System Settings — not hardcoded.MUST
Phase 2 — Logistic Integration
Sections 9 through 13. Extends Phase 1 with a complete shipment tracking system, logistic provider API integration, and a dedicated operational dashboard for Logistic Users.
Prerequisite: Phase 2 is built on top of the fully delivered Phase 1 system. The DEXPO_Logistic_CS Core module and Dexpo_Logistic_IS Foundation module are new OutSystems modules added in this phase. Phase 1 modules are not modified — they are only referenced.

§9 Logistic Status Master Phase 2

The Logistic Status Master is a Static Entity in OutSystems — meaning it is defined at design time, not managed by users at runtime. It contains the official vocabulary of delivery statuses that DEXPO uses across the system. These statuses represent the states set by the Logistic Provider's API after a shipment is handed over.

A Static Entity in OutSystems is like a lookup table that is baked into the application at compile time. Records cannot be added or deleted by users. They are referenced by identifier (e.g. Entities.DeliveryStatus.InTransit) in business logic, making the code readable and safe from runtime data corruption.

Static Entity: DeliveryStatus — 7 Records

#IdentifierLabelColourMeaning
1ReceivedAtFacilityReceived at FacilityCyanProvider has received the shipment at their facility
2PackedPackedVioletPacked and labelled, ready for dispatch
3ShippedShippedBlueDispatched from the facility
4InTransitIn-TransitDark GreenEn route to the destination
5HoldHoldOrangeHeld — customs, documentation, or provider hold
6DeliveredDeliveredGreenSuccessfully delivered to the customer
7FailedToDeliverFailed To DeliverRedAll delivery attempts have failed

§10 Logistic Provider Management Phase 2

DEXPO ships its export orders using third-party logistics companies (e.g. DHL, Blue Dart, FedEx). Each provider communicates shipment status through their own proprietary API and uses their own status code vocabulary. This module lets the Admin register providers in the system and define how each provider's status codes translate to DEXPO's internal DeliveryStatus vocabulary.

Before a provider can be added to DEXPO, the company must be registered on the DEXPO Partner Portal to obtain API credentials (Partner ID, API Key, API Secret).
Partner Portal: https://labs.lowcademy.com/logistic/providers.php

Data Model: Logistic_Provider Entity

Data Model: Logistic_Status_Mapping Entity

Each provider uses its own status codes (e.g. "OFD", "DELIVERED_OK"). This table maps each provider code to a DEXPO DeliveryStatus so the system always displays a consistent status.

Functional Requirements

IDRequirementPriority
LP-01Admin can navigate to "Manage Logistic Provider" from the Admin dropdown menu. Other roles cannot see this link.MUST
LP-02The Provider List page shows all registered providers in a table: Name, Nick Name, Contact Person, Email, Phone, Status. Clicking a provider name opens the Edit screen.MUST
LP-03Clicking "Add Provider" navigates to a dedicated Add/Edit Provider screen (not a popup). On save, the user is redirected back to the Provider List. Cancel also redirects without saving.MUST
LP-04The Add/Edit screen has two sections: Provider Details and API Credentials. A third section, Logistic Status Mapping, contains a dynamic table for mapping the provider's status codes to DEXPO's DeliveryStatus. Rows can be added and removed. Saved as part of the same save action as the provider.MUST
LP-05NickName is editable only during initial creation. Once saved, it becomes read-only in all future edits.MUST
LP-06The entire save (provider + all mapping rows) must execute in a single database transaction. If any part fails, nothing is saved.MUST

§11 Export Movement & Tracking Phase 2

After a Sales Order is confirmed, the physical goods need to be shipped to the customer. The Export Movement module tracks this process from internal preparation through to final delivery. Each SO has exactly one ExportMovement record. Every status change in the lifecycle is logged to ExportMovementLog.

Internal Status Stages (Manual — set by Logistic User)

StatusMeaning
NewOrder just assigned to a Logistic User. No action taken yet.
In-ProcessLogistic User has started packing the order.
Sent to Logistic FacilityGoods handed over to the Logistic Provider. This status triggers the API call to register the shipment. Once set, internal statuses cannot be changed.

Provider Status Stages (Automatic — set by API)

After the goods are handed over and the Logistic API is called, all subsequent statuses come from the provider and are mapped to the DeliveryStatus static entity.

Received at Facility → Packed → Shipped → In-Transit → Hold / Delivered / Failed To Deliver

Data Model: ExportMovement Entity

Data Model: ExportMovementLog Entity

An append-only log. One row is added each time the ExportMovement status changes. This table provides a complete history of the shipment journey.

§12 Logistic Dashboard Phase 2

The Logistic Dashboard is the sole screen visible to users with the Logistic User role. It shows all export orders assigned to that user, allows them to update internal statuses, view invoices, and fetch live tracking from the provider API.

Functional Requirements

IDRequirementPriority
LD-01On login, a Logistic User is automatically redirected to the Logistic Dashboard. All other screens are hidden from the nav and blocked from direct URL access.MUST
LD-02The page shows a welcome banner with the user's name, last auto-poll time, and a live countdown to the next scheduled poll (15 minutes).MUST
LD-03Four KPI cards: Total Assigned, In Progress, Sent to Facility, Delivered. Counts update after every status change.MUST
LD-04A table shows all assigned orders with columns: Order ID (clickable → Invoice popup), Tracking ID, Date, Status (clickable badge for internal statuses), Logistic Company, Expected Delivery, Last Updated, Fetch button.MUST
LD-05New status orders always appear at the top of the table, regardless of date. All other orders are sorted by date descending.MUST
LD-06Table filters: Order ID (text, partial match), Tracking ID (text, partial match), Date (exact), Status (dropdown). All four filters apply simultaneously using AND logic.MUST
LD-07Clicking an Order ID opens an invoice popup showing full order details (customer, line items, totals) without navigating away from the dashboard.MUST
LD-08Clicking a status badge (for internal statuses: New, In-Process, Sent to Logistic Facility) opens a Status Update popup. The popup shows the three manual options plus — under a divider — the current API-set status read-only, if applicable. Once the status reaches "Sent to Logistic Facility" or beyond, the manual options are locked.MUST
LD-09The Fetch button is shown only for rows where: a Tracking ID exists AND the current status is not Delivered or Failed To Deliver. Clicking it calls the API for that single order and updates the status in real time.MUST
LD-10A "Fetch All Statuses Now" button polls the API for all eligible orders simultaneously. Shows a spinner during processing. On completion, displays a toast with the count of orders polled and updated.MUST

§13 Third-Party API Integration Phase 2

DEXPO integrates with registered Logistic Providers via a REST API. All API communication is handled exclusively by the Dexpo_Logistic_IS Foundation module. No other module makes direct HTTP calls. API documentation is available at: https://labs.lowcademy.com/logistic/api-docs.php

API Trigger 1 — Register Shipment (on "Sent to Logistic Facility")

IDRequirementPriority
API-01When the Logistic User sets a status to "Sent to Logistic Facility", the system immediately calls the selected Provider's API endpoint using the provider's Partner ID, API Key, and API Secret to register the shipment.MUST
API-02The API response must return a Tracking Number and Expected Delivery Date. Both are saved to the ExportMovement record and displayed in the Logistic Dashboard table.MUST
API-03If the API call fails, the status is rolled back to its previous value. The user sees an inline error: "Failed to register shipment. Please retry." The system retries once automatically before showing the error.MUST
API-04While the API call is in progress, the Confirm button is disabled and shows a loading spinner to prevent double-submission.MUST

API Trigger 2 — Fetch Status (Manual, per order)

IDRequirementPriority
API-05Clicking the Fetch button on a row calls the Provider API with the order's Tracking Number. The returned status is mapped through the provider's Logistic_Status_Mapping records and the matching DeliveryStatus is applied to the ExportMovement record.MUST
API-06The updated status, EDD, and LastUpdatedDate are reflected in the Logistic Dashboard table immediately after the API call completes. A log entry is appended to ExportMovementLog.MUST

API Trigger 3 — Auto-Poll Timer (System, every 15 minutes)

IDRequirementPriority
API-07An OutSystems Timer named PollLogisticStatuses is configured to run every 15 minutes. It queries all ExportMovement records where: TrackingID is not null AND CurrentDeliveryStatus is not Delivered or FailedToDeliver.MUST
API-08For each eligible record, the timer calls the provider's API, applies the status mapping, and updates the ExportMovement record. A log entry is appended to ExportMovementLog with UpdatedBy = "System".MUST
API-09Each timer run logs a record to SO_Logistic_PollLog with: RunAt, OrdersPolled, UpdatedCount, ErrorCount. This allows audit and debugging of polling activity.MUST
API-10The timer is exception-safe per record. If one API call fails, the remaining records continue processing. The failure increments ErrorCount in the PollLog but does not abort the timer run.MUST
Summary of all API interactions: There are exactly three moments in the system where an API call is made to a Logistic Provider: (1) when an order is registered at "Sent to Logistic Facility", (2) when the user clicks Fetch on a single order, and (3) when the 15-minute system timer fires. All three routes go through Dexpo_Logistic_IS.
Ankit Gangrade
Business Analyst & Requirements Author
Dexo Exports Limited, Indore