Add SMS gating, TCPA terms agreement, and compose-before-send modal
- Three-tier SMS gate: platform kill-switch → admin force-disable → plan AllowSms → company opt-in - CompanySmsAgreement entity records admin acceptance of TCPA terms with IP, user agent, and terms version - SMS terms of service modal on Company Settings with versioned re-agreement (AppConstants.SmsTermsVersion) - Dev redirect: non-production SMS routed to Twilio:DevRedirectPhone to protect real customer numbers - Removed redundant Ready for Pickup SMS (Job Completed covers it) - Role-based compose modal on job completion: Admin/Manager reviews and edits before send; ShopFloor auto-sends - Send SMS button on job details for ad-hoc messages (Admin/Manager only) - SendJobSmsAsync auto-appends STOP opt-out language if missing - Migrations: AddSmsGating, AddCompanySmsAgreement Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -36,6 +36,7 @@ public class UnitOfWork : IUnitOfWork
|
||||
private IRepository<Company>? _companies;
|
||||
private IRepository<CompanyOperatingCosts>? _companyOperatingCosts;
|
||||
private IRepository<CompanyPreferences>? _companyPreferences;
|
||||
private IRepository<CompanySmsAgreement>? _companySmsAgreements;
|
||||
|
||||
// AI Predictions
|
||||
private IRepository<AiItemPrediction>? _aiItemPredictions;
|
||||
@@ -170,6 +171,10 @@ public class UnitOfWork : IUnitOfWork
|
||||
public IRepository<CompanyPreferences> CompanyPreferences =>
|
||||
_companyPreferences ??= new Repository<CompanyPreferences>(_context);
|
||||
|
||||
/// <summary>Repository for <see cref="CompanySmsAgreement"/> audit records. Tenant-filtered; never soft-deleted — legal audit trail.</summary>
|
||||
public IRepository<CompanySmsAgreement> CompanySmsAgreements =>
|
||||
_companySmsAgreements ??= new Repository<CompanySmsAgreement>(_context);
|
||||
|
||||
// AI Predictions
|
||||
/// <summary>Repository for <see cref="AiItemPrediction"/> records; tenant-filtered. Shared between QuoteItem and JobItem via a single nullable FK — no duplication on quote→job conversion.</summary>
|
||||
public IRepository<AiItemPrediction> AiItemPredictions =>
|
||||
|
||||
Reference in New Issue
Block a user