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:
2026-05-08 20:47:04 -04:00
parent fb979bc88d
commit f40d58ac2e
10 changed files with 9776 additions and 3 deletions
@@ -90,9 +90,30 @@
<div class="row justify-content-end">
<div class="col-sm-6 col-md-5">
<div class="d-flex justify-content-between mb-1">
<span class="text-muted">Subtotal</span>
<span>@Model.SubTotal.ToString("C")</span>
<span class="text-muted">Items Subtotal</span>
<span>@Model.ItemsSubtotal.ToString("C")</span>
</div>
@if (Model.OvenBatchCost > 0)
{
<div class="d-flex justify-content-between mb-1">
<span class="text-muted">Oven Processing</span>
<span>@Model.OvenBatchCost.ToString("C")</span>
</div>
}
@if (Model.ShopSuppliesAmount > 0)
{
<div class="d-flex justify-content-between mb-1">
<span class="text-muted">Shop Supplies (@(Model.ShopSuppliesPercent.ToString("0.##"))%)</span>
<span>@Model.ShopSuppliesAmount.ToString("C")</span>
</div>
}
@if (Model.OvenBatchCost > 0 || Model.ShopSuppliesAmount > 0)
{
<div class="d-flex justify-content-between mb-1 fw-semibold">
<span>Subtotal</span>
<span>@Model.SubTotal.ToString("C")</span>
</div>
}
@if (Model.DiscountAmount > 0 && !Model.HideDiscountFromCustomer)
{
<div class="d-flex justify-content-between mb-1 text-success">