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:
@@ -91,6 +91,7 @@ public class SubscriptionMiddleware
|
||||
{
|
||||
context.Items["AllowOnlinePayments"] = true;
|
||||
context.Items["AllowAccounting"] = true;
|
||||
context.Items["AllowSms"] = true;
|
||||
await _next(context);
|
||||
return;
|
||||
}
|
||||
@@ -137,6 +138,9 @@ public class SubscriptionMiddleware
|
||||
|| (company.OnlinePaymentsOverride ?? (planConfig?.AllowOnlinePayments ?? false));
|
||||
context.Items["AllowAccounting"] = company.IsComped
|
||||
|| (company.AccountingOverride ?? (planConfig?.AllowAccounting ?? false));
|
||||
// SMS: comped gets it; admin force-disable beats everything else; then plan; then company opt-in
|
||||
context.Items["AllowSms"] = company.IsComped
|
||||
|| (!company.SmsDisabledByAdmin && (planConfig?.AllowSms ?? false) && company.SmsEnabled);
|
||||
|
||||
if (company.IsComped)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user