Skip to main content

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)

DeletedNotes
application/domain/ApplicationStatus.java (old)Had internal/external string fields — gone
application/domain/ApplicationStatusEnum.javaDRAFT, SUBMITTED enum — gone
application/domain/ApplicationStatusTransition.java (old history log)Replaced by ApplicationStatusHistory
application/domain/ApplicationStatusTransitionRepository.javaSame
application/web/dto/ApplicationStatusDto.java (old)internal/external DTO — gone
application/web/dto/ApplicationStatusInput.java (old)Same — gone
document/domain/TemplateStatus.javaRenamed to ApplicationStatus
document/domain/TemplateStatusRepository.javaRenamed to ApplicationStatusRepository
document/domain/TemplateStatusTransition.javaRenamed to ApplicationStatusTransition
document/domain/TemplateStatusTransitionRepository.javaRenamed to ApplicationStatusTransitionRepository
document/domain/TemplateTransitionType.javaRenamed to StatusTransitionType
document/TemplateStatusService.javaRenamed to ApplicationStatusService
document/web/TemplateStatusController.javaRenamed to ApplicationStatusController
document/web/TemplateStatusMapper.javaRenamed 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 on Application.

Hook renames (use-template-statuses.ts)

All hooks were renamed. Backward-compat aliases are exported so existing call sites still compile:

Old exportNew export
useTemplateStatusesuseApplicationStatuses
useCreateTemplateStatususeCreateApplicationStatus
useUpdateTemplateStatususeUpdateApplicationStatus
useDeleteTemplateStatususeDeleteApplicationStatus
useTemplateStatusTransitionsuseApplicationStatusTransitions
useCreateTemplateStatusTransitionuseCreateApplicationStatusTransition
useUpdateTemplateStatusTransitionuseUpdateApplicationStatusTransition
useDeleteTemplateStatusTransitionuseDeleteApplicationStatusTransition
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

  1. application-input.graphqls must NOT define its own ApplicationStatusInput — that type lives in documents-input.graphqls. Adding it again causes a "duplicate type" schema conflict.

  2. ApplicationInput has no status field — do not add currentApplicationStatus or status to ApplicationInput. Status is set by the workflow engine only.

  3. ApplicationMapper ignores currentApplicationStatus — the mapper has @Mapping(target = "currentApplicationStatus", ignore = true) and @Mapping(target = "currentApplicationStatusId", ignore = true). This is intentional.

  4. ./mvnw clean compile, not ./mvnw compile — Maven's incremental compile may hide errors from deleted classes. Always use clean compile when investigating compile errors after a rename refactor.

  5. WorkflowService / WorkflowController inject ApplicationStatusRepository, not TemplateStatusRepository.