1cb7a8ca4a
Phase 3 — eliminated ApplicationDbContext from all non-exempt controllers, routing all data access through IUnitOfWork. Added IPlainRepository<T> for the four platform entities (Announcement, BannedIp, DashboardTip, ReleaseNote) that intentionally don't extend BaseEntity and therefore can't use the constrained IRepository<T>. Added permanent-exception comments to the 18 controllers that legitimately retain direct DbContext access (Identity infra, cross-tenant platform ops, bulk streaming exports). Phase 4 — added EnforceDataAccessArchitecture() to Program.cs, a startup gate that reflects over every Controller subclass and throws at boot if any non-exempt controller injects ApplicationDbContext. The app cannot start with a violation. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
49 lines
2.3 KiB
C#
49 lines
2.3 KiB
C#
using PowderCoating.Core.Entities;
|
|
|
|
namespace PowderCoating.Application.Interfaces;
|
|
|
|
/// <summary>
|
|
/// Placeholder return types for operational reports. These will be replaced with proper
|
|
/// Application DTOs as each report is migrated from ReportsController in Phase 2/3.
|
|
/// </summary>
|
|
public record JobCycleTimeReport(List<JobCycleTimeRow> Rows, int Months);
|
|
public record JobCycleTimeRow(string StatusName, double AvgDaysInStatus, int JobCount);
|
|
|
|
public record PowderUsageReport(List<PowderUsageRow> Rows, int Months);
|
|
public record PowderUsageRow(string ColorName, string VendorName, decimal TotalLbs, decimal TotalCost);
|
|
|
|
/// <summary>
|
|
/// Read-only service for operational aggregate reports. All methods query the database
|
|
/// with AsNoTracking and return pre-shaped objects — no tracked entities are returned.
|
|
/// Implemented in Infrastructure; uses ApplicationDbContext directly.
|
|
/// </summary>
|
|
public interface IOperationalReportService
|
|
{
|
|
/// <summary>Returns average time jobs spend in each status over the given lookback period.</summary>
|
|
Task<JobCycleTimeReport> GetJobCycleTimeAsync(int companyId, int months);
|
|
|
|
/// <summary>Returns powder usage (lbs and cost) broken down by color and vendor.</summary>
|
|
Task<PowderUsageReport> GetPowderUsageAsync(int companyId, int months);
|
|
|
|
/// <summary>
|
|
/// Returns all active (non-deleted, non-voided) bills with their Vendor and non-deleted
|
|
/// Payments navigations loaded. Used by Analytics, ExpensesAp, and AI accounting actions
|
|
/// so those controllers do not need a direct ApplicationDbContext reference.
|
|
/// </summary>
|
|
Task<List<Bill>> GetActiveBillsAsync();
|
|
|
|
/// <summary>
|
|
/// Returns all non-deleted direct expenses with their ExpenseAccount navigation loaded.
|
|
/// Used by Analytics, ExpensesAp, and AI accounting actions so those controllers do not
|
|
/// need a direct ApplicationDbContext reference.
|
|
/// </summary>
|
|
Task<List<Expense>> GetAllExpensesAsync();
|
|
|
|
/// <summary>
|
|
/// Returns the full job status history log with FromStatus and ToStatus navigations
|
|
/// loaded. Used by Analytics and JobCycleTime so those actions do not need a direct
|
|
/// ApplicationDbContext reference.
|
|
/// </summary>
|
|
Task<List<JobStatusHistory>> GetAllJobStatusHistoryAsync();
|
|
}
|