Langkau ke kandungan

Case study · Dewan Bandaraya Kuala Lumpur

Stock and inventory control across Kuala Lumpur City Hall stores.

Stock and inventory control

— RM 710,000, 2021 to 2023

01 · Client and system

Client
Dewan Bandaraya Kuala Lumpur
System
SIMS — stock and inventory
Period
2021 – 2023
Current status
Delivered and handed over to the agency’s team.

02 · The problem

Stock moved between stores faster than the record of it did.

Kuala Lumpur City Hall holds stock across multiple stores, and items move between them constantly. When the movement is recorded after the fact, the stock position is always slightly wrong — and an approval carried on paper or in a message cannot be audited afterwards. The system had to make the approval itself the record, so a movement and its authorisation could never exist separately.

03 · What we built

Five things we are accountable for.

  1. 01 Stock master and store-level inventory control across the agency’s stores.
  2. 02 Movement request and approval workflow, where the approval is the record of authorisation.
  3. 03 Mobile approval for authorised officers, so a movement is not held up by an officer being away from a desk.
  4. 04 Stock position reporting for the officers who have to answer for it.
  5. 05 Handover to the agency’s own team, with Bahasa Malaysia documentation.

04 · Scale

The numbers this engagement is measured on.

RM 710k
Contract value

Approximate, rounded

2 years
Delivery period

2021 to 2023

1
External interface

Firebase Cloud Messaging

Handed over
Current status

Agency’s team operates it

Stores on the system — to supply
Coverage
Stock items under control — to supply
Volume

Two figures are held back until the agency confirms what may be published. An evaluator reads a blank field as honest; a made-up one costs the whole submission.

Architecture explorer

Six layers, in the order a stock movement passes through them.

Scroll to move through the stack. Every layer and its detail is on the page whether the highlight runs or not.

Stack

  1. 01 Client
  2. 02 Gateway
  3. 03 Application
  4. 04 Approval queue
  5. 05 Database
  6. 06 Notification
  1. 01

    Client

    The storekeeper raising a movement request, or the officer approving it.

    Both actions are bound to a named user, so the movement and its authorisation carry the same audit trail.

    • Web client
    • Mobile client
  2. 02

    Gateway

    Authentication and store-level authorisation before the request is accepted.

    An officer can only raise or approve movement for the stores they hold, and that is enforced here rather than in the interface.

    • Authentication
    • Store-level scope
  3. 03

    Application

    Stock master, movement rules, and the approval workflow itself.

    A movement is never applied to the stock position until its approval is recorded — the two are a single transaction, not two steps.

    • Laravel
    • Movement workflow
  4. 04

    Approval queue

    Movements waiting on a named approver.

    Pending items stay in the approver’s list until cleared. Nothing expires quietly, and nothing is auto-approved by timeout.

    • Pending queue
    • Named approver
  5. 05

    Database

    The stock position, every movement, and every authorisation against it.

    The position is derived from approved movements rather than maintained separately, so the ledger and the balance cannot disagree.

    • Relational store
    • MySQL
  6. 06

    Notification

    Push notification to the approver that a movement is waiting.

    Approvals are actioned in the system, not in the notification. A missed push delays nothing beyond the next time the approver opens their list.

    • Firebase Cloud Messaging
    • FCM HTTP v1

Interfaces

One interface, and it cannot change state.

Firebase Cloud Messaging FCM HTTP v1 Outbound

Payload — Stock movement approval request.

On failure — Approvals are actioned in the system, not in the notification. Pending items stay in the approver’s list until cleared.

05 · Result

Three measured outcomes.

Outcome 1 — to supply

Time from movement request to recorded approval, before and after the system.

Outcome 2 — to supply

Stock count variance at audit, across the stores on the system.

Outcome 3 — to supply

Proportion of movements approved on mobile rather than at a desk.

This block is deliberately empty. It is the block an evaluation committee reads hardest, and it must carry numbers you can stand behind in a clarification meeting.

06 · Stack and standards

  • Laravel
  • Flutter
  • MySQL
  • RESTful API
  • Firebase Cloud Messaging
  • Mobile approval

Standards and compliance schedules applicable to this engagement are to be listed here — confirm which may be named publicly before this page is published.