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:
@@ -57,7 +57,13 @@ public class JobProfile : Profile
|
||||
.ForMember(dest => dest.OriginalJobNumber,
|
||||
opt => opt.MapFrom(src => src.OriginalJob != null ? src.OriginalJob.JobNumber : null))
|
||||
.ForMember(dest => dest.IntakeCheckedByName,
|
||||
opt => opt.MapFrom(src => src.IntakeCheckedBy != null ? src.IntakeCheckedBy.FullName : null));
|
||||
opt => opt.MapFrom(src => src.IntakeCheckedBy != null ? src.IntakeCheckedBy.FullName : null))
|
||||
.ForMember(dest => dest.CustomerNotifyBySms,
|
||||
opt => opt.MapFrom(src => src.Customer != null && src.Customer.NotifyBySms))
|
||||
.ForMember(dest => dest.CustomerMobilePhone,
|
||||
opt => opt.MapFrom(src => src.Customer != null
|
||||
? (src.Customer.MobilePhone ?? src.Customer.Phone)
|
||||
: null));
|
||||
|
||||
// JobTimeEntry → JobTimeEntryDto
|
||||
CreateMap<JobTimeEntry, JobTimeEntryDto>()
|
||||
|
||||
Reference in New Issue
Block a user