Skip to content

ECSTP

Procurement coordination platform: generated CRUD with a rules seam over it.

The ESMD CRA SSC Tracking Portal: how the Canada Revenue Agency coordinates IT procurement with Shared Services Canada.

Coordinators drive procurement requests through the stages of the CRA–SSC process; client branches see what stage a request has reached and what they owe next. It replaced a Microsoft Access database. An official-languages obligation shaped the schema rather than a translation layer added later: every reference value and user-facing label is a two-language pair on the row: titleEn/titleFr, roleNameEn/roleNameFr, paired properties files.

Scale

84
JPA entities
241
Angular components
21
Event subtypes
11
BRD statuses

Decisions

FoundationDomainIntegrationDelivery
Foundation
Replaced a Microsoft Access database carrying its own logic with a Spring Boot 2.7 WAR on WildFly, PostgreSQL behind it, Angular in front.

Access kept the data and the rules in one file, so two coordinators could not work at once and nothing was reconstructable after the fact. The rebuild put the rules in Java and the history in PostgreSQL. The Angular build is copied into the WAR at package time, which gives one artefact and no CORS to configure, and means a front-end fix cannot ship without a backend release.

ESMD coordinators
Drive requests through the CRA–SSC process
CRA client branches
See the stage a request reached and what they owe next
HTTPS
One WAR, one deployment
Angular 17.2 SPA
Served from the WAR at base href /ecstp/
Angular MaterialCKEditor 5ngx-translate (EN/FR)shared internal component library
REST /api (session + CSRF cookie)
Spring Boot 2.7 on WildFly
Java 8, Hibernate, Spring Data REST at /api
Hand-written controllersSpring Data REST repositoriesEventInstance engine*RulesService listenersThymeleaf email generators
Security · SPNEGO filter → database-backed authorities → server-side session
JPA / HikariCP
PostgreSQL
Domain tables with Envers revision mirrors beside them
Per-developer schemas so migrations can be written in parallel
Read at request time
GCdocsREST
Document storage
E502REST
SSC work-order search
CSIHTTP
Employee lookup
AD / LDAPLDAP
Identity attributes
Site directoryREST
CRA site lookup
SMTPSMTP
Thymeleaf notifications
The Angular build is copied into the WAR at package time, so there is one artefact and no CORS to configure. The trade is release granularity: a change to a single screen ships as a full application deployment.
1 / 11
The interesting part is the seam. Spring Data REST generates the CRUD surface; repository event handlers reload the persisted row on every save and fire rules against the diff, so writes that look like plain updates carry workflow meaning.