@{ ViewData["Title"] = "Update Job Status"; Layout = null; var job = ViewBag.Job as PowderCoating.Core.Entities.Job; var allStatuses = ViewBag.AllStatuses as List; var jobId = (int)ViewBag.JobId; // Determine next/previous status options var currentOrder = job!.JobStatus.DisplayOrder; var nextStatus = allStatuses! .Where(s => s.DisplayOrder > currentOrder && s.StatusCode != "ONHOLD" && s.StatusCode != "CANCELLED") .OrderBy(s => s.DisplayOrder) .FirstOrDefault(); var onHoldStatus = allStatuses!.FirstOrDefault(s => s.StatusCode == "ONHOLD"); var isOnHold = job.JobStatus.StatusCode == "ONHOLD"; var isTerminal = job.JobStatus.IsTerminalStatus; } @ViewData["Title"]
@job.JobNumber
@if (!string.IsNullOrWhiteSpace(job.Customer?.CompanyName)) { @job.Customer.CompanyName } else { @($"{job.Customer?.ContactFirstName} {job.Customer?.ContactLastName}".Trim()) }
@if (TempData["StatusUpdated"] != null) {
✓ Status updated successfully!
}
Current Status
@job.JobStatus.DisplayName @if (job.DueDate.HasValue) {
Due: @job.DueDate.Value.ToString("MMM d, yyyy") @if (job.DueDate < DateTime.Today && !isTerminal) { — OVERDUE }
}
@if (isTerminal) {
This job is @job.JobStatus.DisplayName and requires no further updates.
} else if (isOnHold) { @* On hold — offer resume (next logical status after resume by advancing) *@ @if (nextStatus != null) {
@Html.AntiForgeryToken()
} } else { @* Advance to next step *@ @if (nextStatus != null) {
@Html.AntiForgeryToken()
} else {
No further stages available.
} @* On Hold option *@ @if (onHoldStatus != null) {
@Html.AntiForgeryToken()
} }
Job created @job.CreatedAt.ToString("MMM d, yyyy") @job.JobPriority?.DisplayName Priority