@model PowderCoating.Application.DTOs.Company.CompanyDto @using PowderCoating.Web.ViewModels.Platform @using PowderCoating.Web.Controllers @{ ViewData["Title"] = Model.CompanyName; ViewData["PageIcon"] = "bi-building"; var planConfigs = ((IEnumerable)ViewBag.PlanConfigs) .OrderBy(c => c.SortOrder).ToList(); var planBadgeColors = planConfigs.Select((c, i) => (c.Plan, i)) .ToDictionary(x => x.Plan, x => x.i switch { 0 => "bg-secondary", 1 => "bg-primary", 2 => "bg-info", _ => "bg-success" }); var planNames = planConfigs.ToDictionary(c => c.Plan, c => c.DisplayName); string PlanBadge(int plan) => planBadgeColors.TryGetValue(plan, out var c) ? c : "bg-secondary"; string PlanName(int plan) => planNames.TryGetValue(plan, out var n) ? n : plan.ToString(); var healthScore = (int)(ViewBag.HealthScore ?? 0); var healthRisk = (string)(ViewBag.HealthRisk ?? "Healthy"); var healthSignals = (List)(ViewBag.HealthSignals ?? new List()); var jobs30 = (int)(ViewBag.Jobs30 ?? 0); var jobs90 = (int)(ViewBag.Jobs90 ?? 0); var lastLogin = (DateTime?)(ViewBag.LastLoginDate); var onboarding = (OnboardingProgressRowViewModel?)(ViewBag.Onboarding); string ScoreColor(int s) => s >= 75 ? "text-success" : s >= 45 ? "text-warning" : "text-danger"; string RiskBadgeClass(string r) => r switch { "Healthy" => "bg-success", "AtRisk" => "bg-warning text-dark", "Critical" => "bg-danger", "NeverActivated" => "bg-secondary", _ => "bg-secondary" }; string RiskLabel(string r) => r switch { "Healthy" => "Healthy", "AtRisk" => "At Risk", "Critical" => "Critical", "NeverActivated" => "Never Activated", _ => r }; }
Companies @if (!string.IsNullOrEmpty(Model.CompanyCode)) { @Model.CompanyCode } @(Model.IsActive ? "Active" : "Inactive") @RiskLabel(healthRisk)
@if (TempData["Warning"] != null) { }
@Model.UserCount
Users
@Model.CustomerCount
Customers
@Model.JobCount
Jobs
@healthScore
Health Score
Company Information
@if (!string.IsNullOrEmpty(Model.CreatedBy)) { } @if (Model.UpdatedAt.HasValue) { }
Company Name@Model.CompanyName
Code@(Model.CompanyCode ?? "—")
Status@(Model.IsActive ? "Active" : "Inactive")
Time Zone@(Model.TimeZone ?? "America/New_York")
Created@Model.CreatedAt.ToString("MMM d, yyyy h:mm tt")
Created By@Model.CreatedBy
Last Updated@Model.UpdatedAt.Value.ToString("MMM d, yyyy")
Primary Contact
Contact Name@Model.PrimaryContactName
Email@Model.PrimaryContactEmail
Phone@(Model.Phone ?? "—")
Address
@if (!string.IsNullOrEmpty(Model.Address)) {
@Model.Address
@if (!string.IsNullOrEmpty(Model.City) || !string.IsNullOrEmpty(Model.State)) { @Model.City, @Model.State @Model.ZipCode }
} else { No address on file. }
@if (!string.IsNullOrEmpty(Model.StripeCustomerId) || !string.IsNullOrEmpty(Model.StripeSubscriptionId)) {
Stripe IDs
@if (!string.IsNullOrEmpty(Model.StripeCustomerId)) { } @if (!string.IsNullOrEmpty(Model.StripeSubscriptionId)) { }
Customer@Model.StripeCustomerId
Subscription@Model.StripeSubscriptionId
}
Users (@Model.Users.Count)
Add Admin User
@if (Model.Users.Any()) {
@foreach (var user in Model.Users.OrderBy(u => u.LastName)) { }
Name Email Role Department Status Last Login Actions
@user.FullName @if (user.CompanyRole == null) { SuperAdmin } @user.Email @if (!string.IsNullOrEmpty(user.CompanyRole)) { "bg-primary", "Manager" => "bg-info", "Worker" => "bg-secondary", _ => "bg-light text-dark" })">@user.CompanyRole.Replace("Company", "") } else { N/A } @(user.Department ?? "—") @(user.IsActive ? "Active" : "Inactive") @(user.LastLoginDate.HasValue ? user.LastLoginDate.Value.ToString("MMM d, yyyy") : "Never") @if (user.CompanyRole != null) {
@Html.AntiForgeryToken()
@Html.AntiForgeryToken()
} else { Platform User }
} else {

No users found for this company.

Create First Admin User
}
Subscription
Plan @PlanName(Model.SubscriptionPlan)
Status @{ var (ssBadge, ssLabel) = Model.SubscriptionStatus switch { PowderCoating.Core.Enums.SubscriptionStatus.Active => ("bg-success", "Active"), PowderCoating.Core.Enums.SubscriptionStatus.GracePeriod => ("bg-warning text-dark", "Grace Period"), PowderCoating.Core.Enums.SubscriptionStatus.Expired => ("bg-danger", "Expired"), PowderCoating.Core.Enums.SubscriptionStatus.Canceled => ("bg-secondary", "Canceled"), PowderCoating.Core.Enums.SubscriptionStatus.Inactive => ("bg-secondary", "Inactive"), _ => ("bg-secondary", Model.SubscriptionStatus.ToString()) }; } @ssLabel
Start Date @Model.SubscriptionStartDate.ToString("MMMM d, yyyy")
End Date @if (Model.SubscriptionEndDate.HasValue) { var daysLeft = (int)(Model.SubscriptionEndDate.Value.Date - DateTime.UtcNow.Date).TotalDays; @Model.SubscriptionEndDate.Value.ToString("MMMM d, yyyy") @if (daysLeft >= 0 && daysLeft <= 30) { (in @daysLeft days) } @if (daysLeft < 0) { (expired @(-daysLeft)d ago) } } else { Ongoing }
Manage Subscription & Features
Activity Snapshot
Last Login @if (lastLogin.HasValue) { var days = (int)(DateTime.UtcNow - lastLogin.Value).TotalDays; = 30 ? "text-warning" : "text-success")"> @lastLogin.Value.ToString("MMM d, yyyy") (@days days ago) } else { Never }
Jobs (last 30d)@jobs30
Jobs (last 90d)@jobs90
Jobs total@Model.JobCount
Customers@Model.CustomerCount
@if (onboarding != null) {
Setup Progress
@{ var (obBadge, obLabel) = onboarding.Status switch { OnboardingStatus.Complete => ("bg-success", "Complete"), OnboardingStatus.InProgress => ("bg-primary", "In Progress"), OnboardingStatus.Dismissed => ("bg-secondary", "Dismissed"), _ => ("bg-light text-dark border", "Not Started") }; } Status: @obLabel @if (!string.IsNullOrEmpty(onboarding.OnboardingPath)) { Path: @onboarding.OnboardingPath }
Setup Wizard @if (onboarding.WizardCompleted) { Complete } else { Pending }
Milestones @onboarding.StepsCompleted / @onboarding.TotalSteps
@{ var pct = onboarding.TotalSteps > 0 ? (int)(onboarding.StepsCompleted * 100.0 / onboarding.TotalSteps) : 0; var barClass = pct == 100 ? "bg-success" : pct > 0 ? "bg-primary" : "bg-secondary"; }
Milestone Dates
First Job / Quote @{ var firstActivity = onboarding.FirstJobCreatedAt ?? onboarding.FirstQuoteCreatedAt; } @(firstActivity.HasValue ? firstActivity.Value.ToString("MMM d, yyyy") : "—")
First Invoice @(onboarding.FirstInvoiceCreatedAt.HasValue ? onboarding.FirstInvoiceCreatedAt.Value.ToString("MMM d, yyyy") : "—")
Workflow Completed @(onboarding.FirstWorkflowCompletedAt.HasValue ? onboarding.FirstWorkflowCompletedAt.Value.ToString("MMM d, yyyy") : "—")
Widget Dismissed @(onboarding.GuidedActivationDismissedAt.HasValue ? onboarding.GuidedActivationDismissedAt.Value.ToString("MMM d, yyyy") : "—")
} else {

Onboarding data not available.

}
Health Score
@healthScore
@RiskLabel(healthRisk)
= 45 ? "bg-warning" : "bg-danger")" style="width:@healthScore%">
Risk Signals
@if (healthSignals.Any()) {
    @foreach (var signal in healthSignals) {
  • @signal
  • }
} else {

No risk signals detected.

}
Danger Zone
Reset All Company Data

Permanently deletes all business data — customers, jobs, quotes, invoices, inventory, and more. The company record, users, and settings are preserved. Use this to wipe a migration and start fresh.

Delete Company

Permanently deletes the company and everything in it. There is no going back. @if (Model.UserCount > 0) {
This company has @Model.UserCount user(s) — remove them first. }

@section Scripts { }