- Once a quote is saved as a Draft and you are happy with the pricing and details, you can mark it - as sent to the customer. + Once a quote is saved as a Draft and you are happy with the pricing and details, you can send it + to the customer via email or SMS, or both.
++ Click Send Quote via SMS on the Details page to text the customer a short message + containing their quote total and a link to the self-service approval portal. The customer can open the + link on their phone and approve or decline without logging in. +
+You can also manually mark a quote as Approved or Rejected when - you hear back from the customer verbally or by phone, without going through a formal email send. + you hear back from the customer verbally or by phone, without going through a formal email or SMS send. Use the status buttons on the quote Details page to do this.
diff --git a/src/PowderCoating.Web/Views/Shared/_Layout.cshtml b/src/PowderCoating.Web/Views/Shared/_Layout.cshtml index c79f351..b4df46a 100644 --- a/src/PowderCoating.Web/Views/Shared/_Layout.cshtml +++ b/src/PowderCoating.Web/Views/Shared/_Layout.cshtml @@ -1199,6 +1199,10 @@ Stripe Events + + + SMS Agreements +
diff --git a/src/PowderCoating.Web/Views/SmsAgreements/Index.cshtml b/src/PowderCoating.Web/Views/SmsAgreements/Index.cshtml new file mode 100644 index 0000000..b0fd7fe --- /dev/null +++ b/src/PowderCoating.Web/Views/SmsAgreements/Index.cshtml @@ -0,0 +1,301 @@ +@model ListPer-company SMS terms acceptance log — current terms version: v@currentVersion
+| Company | +SMS Status | +Terms Accepted | +Accepted By | +Accepted At | +IP Address | +History | +
|---|---|---|---|---|---|---|
|
+
+ @row.CompanyName
+ @if (row.IsDeleted)
+ {
+ Deleted
+ }
+
+ |
+ + @if (row.SmsDisabledByAdmin) + { + Admin-Disabled + } + else if (row.SmsEnabled) + { + Enabled + } + else + { + Off + } + | ++ @if (row.CurrentAgreement != null) + { + v@row.CurrentAgreement.TermsVersion + } + else if (row.LatestAgreement != null) + { + + Stale (v@row.LatestAgreement.TermsVersion) + + } + else + { + Never + } + | ++ @if (row.CurrentAgreement != null) + { + @row.CurrentAgreement.AgreedByUserName + } + else if (row.LatestAgreement != null) + { + @row.LatestAgreement.AgreedByUserName + } + else + { + — + } + | ++ @{ + var displayAgreement = row.CurrentAgreement ?? row.LatestAgreement; + } + @if (displayAgreement != null) + { + + @displayAgreement.AgreedAt.ToString("MMM d, yyyy 'at' h:mm tt") UTC + + } + else + { + — + } + | +
+ @if (displayAgreement?.IpAddress != null)
+ {
+ @displayAgreement.IpAddress
+ }
+ else
+ {
+ —
+ }
+ |
+ + @if (row.AllAgreements.Count > 0) + { + + } + else + { + — + } + | +