Add TCPA-compliant SMS consent tracking for prospect quotes
- Quote entity: ProspectSmsConsent (bool) + ProspectSmsConsentedAt (DateTime?) fields - QuoteDtos: consent fields on Create/Update/Convert DTOs with TCPA guidance text - Quote Create/Edit views: SMS consent checkbox shown when mobile number is entered - Quote ConvertToCustomer view: staff must re-confirm consent carries over to customer record - QuoteApproval: consent state exposed in ViewModel and ApprovalPage for transparency - Consent timestamp cleared when prospect quote is linked to an existing customer - Migration: AddProspectSmsConsent Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -52,10 +52,23 @@
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label asp-for="ProspectPhone" class="form-label">Phone <span class="text-danger">*</span></label>
|
||||
<input asp-for="ProspectPhone" class="form-control" type="tel" />
|
||||
<input asp-for="ProspectPhone" class="form-control" type="tel" id="editProspectPhone" />
|
||||
<span asp-validation-for="ProspectPhone" class="text-danger"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-2" id="editProspectSmsConsentRow">
|
||||
<div class="col-12">
|
||||
<div class="form-check">
|
||||
<input asp-for="ProspectSmsConsent" class="form-check-input" id="ProspectSmsConsent" />
|
||||
<label class="form-check-label fw-semibold" for="ProspectSmsConsent">
|
||||
Customer verbally agreed to receive SMS notifications
|
||||
</label>
|
||||
</div>
|
||||
<small class="text-muted">
|
||||
<i class="bi bi-shield-check me-1"></i>Only check if the customer explicitly consented to receive text messages (TCPA compliance).
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-2">
|
||||
<div class="col-md-6">
|
||||
<label asp-for="ProspectAddress" class="form-label"></label>
|
||||
@@ -683,8 +696,20 @@
|
||||
if (custEl) new TomSelect(custEl, { placeholder: '-- Select Customer --', openOnFocus: true, maxOptions: false,
|
||||
onChange: function(value) { onQuoteCustomerChanged({ value: value }); }
|
||||
});
|
||||
// Show/hide SMS consent row based on phone field value
|
||||
const phoneEl = document.getElementById('editProspectPhone');
|
||||
if (phoneEl) {
|
||||
phoneEl.addEventListener('input', updateEditProspectSmsConsent);
|
||||
updateEditProspectSmsConsent();
|
||||
}
|
||||
});
|
||||
|
||||
function updateEditProspectSmsConsent() {
|
||||
const phoneEl = document.getElementById('editProspectPhone');
|
||||
const row = document.getElementById('editProspectSmsConsentRow');
|
||||
if (phoneEl && row) row.style.display = phoneEl.value.trim() ? '' : 'none';
|
||||
}
|
||||
|
||||
function onQuoteCustomerChanged(select) {
|
||||
const meta = JSON.parse(document.getElementById('quoteMetaData').textContent);
|
||||
const optOutIds = new Set(meta.emailOptOutCustomerIds || []);
|
||||
|
||||
Reference in New Issue
Block a user