DGDP manages defense procurement for the Bangladesh Armed Forces. Tenders, bidders, contracts, amendments, deliveries, and audits — all of which had lived on paper, email, and a patchwork of legacy tools. The mandate: bring the whole pipeline online with the discipline the domain deserves.
┌──────────────────────┐ ┌──────────────────────┐
│ Officer Portal │ │ Vendor Portal │
│ React · role-scoped │ │ React · KYC gated │
└──────────┬───────────┘ └──────────┬───────────┘
│ │
└─────────────┬──────────────┘
│
┌────────────▼────────────┐
│ API Gateway │
│ auth · routing · logs │
└────────────┬────────────┘
│
┌────────────────┬───────────┼───────────┬────────────────┐
│ │ │ │ │
┌────▼────┐ ┌──────▼──────┐ ┌──▼───┐ ┌────▼─────┐ ┌──────▼──────┐
│ Tender │ │ Bidder / │ │ Doc │ │ Contract │ │ Audit & │
│ Service │ │ KYC │ │ Vault│ │ Service │ │ Notification│
└────┬────┘ └──────┬──────┘ └──┬───┘ └────┬─────┘ └──────┬──────┘
│ │ │ │ │
└────────────────┴────┬──────┴───────────┴────────────────┘
│
┌───────▼────────┐ ┌───────────┐
│ Oracle DB │◄──────┤ Redis │
│ · partitioned │ │ · sessions│
│ · audit-logged │ │ · queues │
└────────────────┘ └───────────┘ We split services by procurement lifecycle — tender, bidder, contract, audit, documents — so each piece could evolve at its own cadence as regulations changed. Team boundaries moved; service boundaries didn't have to.
The audit service was first-class, not bolted on. Every state transition across every service emitted a signed event consumed by a dedicated audit store. When the comptroller asked a question, we had an answer in one query — not a forensic expedition across logs.
Instead of a tangle of boolean permissions, we modeled roles as composable scopes. An auditor saw a different UI from an officer from the same endpoint, because the endpoint shaped its response to the caller. Fewer bugs, fewer leaks.
We leaned into Oracle's strengths — partitioned tables for tender archives, proper materialized views for dashboards, PL/SQL where it actually earned its keep — instead of writing the platform as if the DB were interchangeable.