Application Status — Domain Model & Rename Reference
What Was Renamed (and Why)
A large refactor replaced the old dual-status system with a single, template-scoped status model. Any AI agent working on status-related code must be aware of these renames to avoid reintroducing deleted types.
Deleted entirely (do NOT recreate)
| Deleted | Notes |
|---|---|
application/domain/ApplicationStatus.java (old) | Had internal/external string fields — gone |
application/domain/ApplicationStatusEnum.java | DRAFT, SUBMITTED enum — gone |
application/domain/ApplicationStatusTransition.java (old history log) | Replaced by ApplicationStatusHistory |
application/domain/ApplicationStatusTransitionRepository.java | Same |
application/web/dto/ApplicationStatusDto.java (old) | internal/external DTO — gone |
application/web/dto/ApplicationStatusInput.java (old) | Same — gone |
document/domain/TemplateStatus.java | Renamed to ApplicationStatus |
document/domain/TemplateStatusRepository.java | Renamed to ApplicationStatusRepository |
document/domain/TemplateStatusTransition.java | Renamed to ApplicationStatusTransition |
document/domain/TemplateStatusTransitionRepository.java | Renamed to ApplicationStatusTransitionRepository |
document/domain/TemplateTransitionType.java | Renamed to StatusTransitionType |
document/TemplateStatusService.java | Renamed to ApplicationStatusService |
document/web/TemplateStatusController.java | Renamed to ApplicationStatusController |
document/web/TemplateStatusMapper.java | Renamed to ApplicationStatusMapper |
document/web/dto/TemplateStatusDto.java etc. | Renamed to ApplicationStatusDto etc. |
Current Domain Model
ApplicationStatus (in document/domain/)
Template-scoped custom status. Not the old application-level enum.
// package: com.axvero.ams.core.document.domain
@Entity @Table(name = "application_status")
class ApplicationStatus {
UUID id;
UUID applicationTemplateId; // scoped to a template
String statusId; // human slug, e.g. "submitted", "credit-check-done"
String internalName; // staff-facing label
String externalName; // client-facing label
String color; // hex or Tailwind token
boolean isInitial;
boolean isFinal;
boolean manuallySettable;
}
Repository: ApplicationStatusRepository
findByApplicationTemplateId(UUID templateId)findByApplicationTemplateIdAndStatusId(UUID templateId, String statusId)
Application.currentApplicationStatus (in application/domain/)
// FK stored as currentApplicationStatusId (UUID column)
@Column(name = "current_application_status_id")
private UUID currentApplicationStatusId;
// Read-only join — never set via input
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "current_application_status_id", insertable = false, updatable = false)
private ApplicationStatus currentApplicationStatus;
Rule: currentApplicationStatus is read-only in the JPA sense. Set currentApplicationStatusId to change status; use currentApplicationStatus only to read.
ApplicationInput does NOT contain a status field. The application-input.graphqls intentionally omits currentApplicationStatus — it is managed by the workflow engine, not by direct mutation.
ApplicationStatusHistory (in application/domain/)
Renamed from the old ApplicationStatusTransition. This is the audit log — one row per status change on an application.
ApplicationStatusTransition (in document/domain/)
Renamed from TemplateStatusTransition. This is the transition definition on a template (from-status → to-status with a type). Not the history log.
StatusTransitionType (in document/domain/)
Renamed from TemplateTransitionType. Enum values: USER, SYSTEM, BOTH.
GraphQL Schema Names
Queries (in documents.graphqls)
applicationStatuses(templateId: ID!): [ApplicationStatus!]!
applicationStatusTransitions(templateId: ID!): [ApplicationStatusTransition!]!
Mutations (in documents.graphqls)
createApplicationStatus(templateId: ID!, input: ApplicationStatusInput!): ApplicationStatus!
updateApplicationStatus(id: ID!, input: ApplicationStatusInput!): ApplicationStatus!
deleteApplicationStatus(id: ID!): Boolean!
createApplicationStatusTransition(...): ApplicationStatusTransition!
updateApplicationStatusTransition(...): ApplicationStatusTransition!
deleteApplicationStatusTransition(id: ID!): Boolean!
Application type (in application.graphqls)
type Application {
...
currentApplicationStatus: ApplicationStatus # replaces old "status: ApplicationStatus"
...
}
ApplicationStatusHistory (in application.graphqls, query in queries.graphqls)
applicationStatusHistory(applicationId: ID!): [ApplicationStatusHistory!]!
WorkflowStep (in workflow.graphqls)
type WorkflowStep {
...
applicationStatus: ApplicationStatus # replaces old "templateStatus: TemplateStatus"
...
}
Frontend
Query field names
- Use
currentApplicationStatus { id statusId internalName externalName color isInitial isFinal }everywhere. - Never use
status { internal external }— that field no longer exists onApplication.
Hook renames (use-template-statuses.ts)
All hooks were renamed. Backward-compat aliases are exported so existing call sites still compile:
| Old export | New export |
|---|---|
useTemplateStatuses | useApplicationStatuses |
useCreateTemplateStatus | useCreateApplicationStatus |
useUpdateTemplateStatus | useUpdateApplicationStatus |
useDeleteTemplateStatus | useDeleteApplicationStatus |
useTemplateStatusTransitions | useApplicationStatusTransitions |
useCreateTemplateStatusTransition | useCreateApplicationStatusTransition |
useUpdateTemplateStatusTransition | useUpdateApplicationStatusTransition |
useDeleteTemplateStatusTransition | useDeleteApplicationStatusTransition |
TemplateStatus (type) | ApplicationStatus |
TemplateStatusTransition (type) | ApplicationStatusTransition |
Prefer the new names for all new code.
WorkflowStep field
// use-workflow.ts and use-application-workflow.ts
step.applicationStatus // replaces step.templateStatus
Input field:
{ applicationStatusId: string } // replaces templateStatusId
isDraft detection
The old ApplicationStatusEnum.Draft check is gone. Draft now means no status has been assigned yet:
const isDraft = !application.status.value // status.value comes from currentApplicationStatus?.internalName
query-keys.ts
queryKeys.applicationStatuses(templateId) // was templateStatuses
queryKeys.applicationStatusTransitions(templateId) // was templateStatusTransitions
Common Pitfalls
-
application-input.graphqlsmust NOT define its ownApplicationStatusInput— that type lives indocuments-input.graphqls. Adding it again causes a "duplicate type" schema conflict. -
ApplicationInputhas no status field — do not addcurrentApplicationStatusorstatustoApplicationInput. Status is set by the workflow engine only. -
ApplicationMapperignores currentApplicationStatus — the mapper has@Mapping(target = "currentApplicationStatus", ignore = true)and@Mapping(target = "currentApplicationStatusId", ignore = true). This is intentional. -
./mvnw clean compile, not./mvnw compile— Maven's incremental compile may hide errors from deleted classes. Always useclean compilewhen investigating compile errors after a rename refactor. -
WorkflowService / WorkflowController inject
ApplicationStatusRepository, notTemplateStatusRepository.