using PowderCoating.Core.Entities; using PowderCoating.Core.Interfaces.Repositories; namespace PowderCoating.Core.Interfaces; public interface IUnitOfWork : IDisposable { // Multi-tenancy IRepository Companies { get; } IRepository CompanyOperatingCosts { get; } IRepository CompanyPreferences { get; } IRepository CompanySmsAgreements { get; } // AI Predictions IRepository AiItemPredictions { get; } // Powder Insights IPowderUsageLogRepository PowderUsageLogs { get; } // Core entities — typed repositories for complex domains ICustomerRepository Customers { get; } IJobRepository Jobs { get; } IRepository JobDailyPriorities { get; } IRepository JobItems { get; } IJobItemCoatRepository JobItemCoats { get; } IRepository JobItemPrepServices { get; } IRepository JobChangeHistories { get; } IRepository JobPrepServices { get; } IQuoteRepository Quotes { get; } IRepository QuotePhotos { get; } IRepository QuoteItems { get; } IRepository QuoteItemCoats { get; } IRepository QuoteItemPrepServices { get; } IRepository QuoteChangeHistories { get; } IRepository InventoryItems { get; } IPlainRepository PowderCatalog { get; } IInventoryTransactionRepository InventoryTransactions { get; } IRepository Equipment { get; } IRepository OvenCosts { get; } IRepository BlastSetups { get; } IRepository MaintenanceRecords { get; } IRepository Vendors { get; } IJobPhotoRepository JobPhotos { get; } IRepository JobNotes { get; } IRepository CustomerNotes { get; } IRepository JobStatusHistory { get; } IRepository PricingTiers { get; } // Lookup tables (replacing enums) IRepository JobStatusLookups { get; } IRepository JobPriorityLookups { get; } IRepository QuoteStatusLookups { get; } IRepository InventoryCategoryLookups { get; } IRepository AppointmentStatusLookups { get; } IRepository AppointmentTypeLookups { get; } IRepository PrepServices { get; } IRepository ShopWorkers { get; } IRepository ShopWorkerRoleCosts { get; } IRepository ReworkRecords { get; } IRepository Refunds { get; } IRepository CreditMemos { get; } IRepository CreditMemoApplications { get; } IRepository JobTimeEntries { get; } // Appointments IRepository Appointments { get; } // Product Catalog IRepository CatalogCategories { get; } IRepository CatalogItems { get; } IRepository CatalogPriceCheckReports { get; } // Oven Scheduling IRepository OvenBatches { get; } IRepository OvenBatchItems { get; } // Invoices, Payments & Deposits — typed repository for complex include chains IInvoiceRepository Invoices { get; } IRepository InvoiceItems { get; } IRepository Payments { get; } IRepository Deposits { get; } // Purchase Orders — typed repository for paged/filtered list and detail load IPurchaseOrderRepository PurchaseOrders { get; } IRepository PurchaseOrderItems { get; } // Expense Tracking / Accounts Payable — typed repository for Bills IRepository Accounts { get; } IBillRepository Bills { get; } IRepository BillLineItems { get; } IRepository BillPayments { get; } IRepository Expenses { get; } // Manual Journal Entries IRepository JournalEntries { get; } IRepository JournalEntryLines { get; } // Vendor Credits IRepository VendorCredits { get; } IRepository VendorCreditLineItems { get; } IRepository VendorCreditApplications { get; } // Bank Reconciliation IRepository BankReconciliations { get; } // Tax Rates IRepository TaxRates { get; } // Recurring Transactions IRepository RecurringTemplates { get; } // Fixed Assets IRepository FixedAssets { get; } IRepository FixedAssetDepreciationEntries { get; } // Budgeting IRepository Budgets { get; } IRepository BudgetLines { get; } // Year-End Close IRepository YearEndCloses { get; } // Notifications — typed repository for IgnoreQueryFilters-based history lookups INotificationLogRepository NotificationLogs { get; } IRepository NotificationTemplates { get; } // Subscription IRepository SubscriptionPlanConfigs { get; } // Job Templates IJobTemplateRepository JobTemplates { get; } IRepository JobTemplateItems { get; } IRepository JobTemplateItemCoats { get; } IRepository JobTemplateItemPrepServices { get; } // Platform content (SuperAdmin-managed, no tenant filter, no soft delete) IPlainRepository Announcements { get; } IPlainRepository BannedIps { get; } IPlainRepository DashboardTips { get; } IRepository InAppNotifications { get; } IPlainRepository ReleaseNotes { get; } // Bug Reports IRepository BugReports { get; } IRepository BugReportAttachments { get; } // Contact Us IRepository ContactSubmissions { get; } // AI lookup: per-manufacturer URL patterns IRepository ManufacturerLookupPatterns { get; } // Gift Certificates IRepository GiftCertificates { get; } IRepository GiftCertificateRedemptions { get; } // Customer Intake Kiosk IRepository KioskSessions { get; } Task SaveChangesAsync(); Task CompleteAsync(); // Alias for SaveChangesAsync /// /// Executes inside a database transaction using EF Core's /// execution strategy, enabling compatibility with SqlServerRetryingExecutionStrategy. /// Commits on success and rolls back on any exception (which is re-thrown). /// Task ExecuteInTransactionAsync(Func operation); /// /// Same as but returns a value. /// Task ExecuteInTransactionAsync(Func> operation); /// /// Detaches all tracked entities from the change tracker. /// Use after a failed save to prevent contaminating subsequent operations. /// void ClearChangeTracker(); // Kept for backwards-compatibility — prefer ExecuteInTransactionAsync for new code. Task BeginTransactionAsync(); Task CommitTransactionAsync(); Task RollbackTransactionAsync(); }