+ placeholder="Examples:
• We specialise in automotive restoration — wheels, frames, suspension brackets, and roll cages are our bread and butter.
• Our customers expect premium pricing. We rarely work on items over 20 sqft.
• Most items come to us already stripped; sandblasting adds roughly 15 min per item on average.
• We use a 2-stage cure cycle — pre-heat 10 min, coat, cure 20 min at 400°F.">@(Model.OperatingCosts?.AiContextProfile)
- Plain language — write it as if briefing a new estimator on your shop.
+ Plain language — write it as if briefing a new estimator on your shop.
@(Model.OperatingCosts?.AiContextProfile?.Length ?? 0)/2000
@@ -832,7 +832,7 @@
Save AI Profile
@@ -843,9 +843,9 @@
How AI Learning Works
-
Layer 1 — Pricing config: Your operating costs (labor, equipment, markup) are always injected automatically.
-
Layer 2 — Your shop profile: The description you write here is added to every AI analysis, guiding estimates toward your typical work.
-
Layer 3 — Automatic learning: Each time your team accepts an AI estimate without changing it, that item is silently added as a calibration example. The AI improves on its own the more you use it.
+
Layer 1 — Pricing config: Your operating costs (labor, equipment, markup) are always injected automatically.
+
Layer 2 — Your shop profile: The description you write here is added to every AI analysis, guiding estimates toward your typical work.
+
Layer 3 — Automatic learning: Each time your team accepts an AI estimate without changing it, that item is silently added as a calibration example. The AI improves on its own the more you use it.
@@ -874,10 +874,10 @@
Used by the AI when estimating job complexity and throughput.
Printed in italic at the bottom of every blank work order. Supports plain text — use * or ** for visual emphasis.
+
Printed in italic at the bottom of every blank work order. Supports plain text — use * or ** for visual emphasis.
@@ -2168,7 +2168,7 @@
- SMS Notifications — Terms of Service
+ SMS Notifications — Terms of Service
@@ -2178,9 +2178,9 @@
1. Prior Express Written Consent Required
-
You must obtain clear, documented consent from each customer before sending them any SMS message. This means each customer must have explicitly agreed — in writing or through a recorded digital interaction — that they wish to receive text messages from your business. Enabling this feature is not consent on their behalf. You must collect and record their authorization individually, before enabling SMS for their account in this system.
+
You must obtain clear, documented consent from each customer before sending them any SMS message. This means each customer must have explicitly agreed — in writing or through a recorded digital interaction — that they wish to receive text messages from your business. Enabling this feature is not consent on their behalf. You must collect and record their authorization individually, before enabling SMS for their account in this system.
-
2. Federal Law Governs SMS — Fines Are Real
+
2. Federal Law Governs SMS — Fines Are Real
The Telephone Consumer Protection Act (TCPA), enforced by the Federal Communications Commission (FCC), imposes fines of $500 to $1,500 per individual message sent without proper authorization. These fines apply per text, not per customer. A single campaign to 100 unconsented recipients could result in exposure of $50,000 to $150,000. The FCC and private plaintiffs both actively pursue TCPA violations.
3. Opt-Out Requests Must Be Honored Immediately
@@ -2189,7 +2189,7 @@
4. Message Rates & Content Restrictions
Every message sent must include your business name and an opt-out reminder (e.g., "Reply STOP to opt out"). Messages must be directly relevant to the service the customer consented to receive and must not contain solicitations, promotions, or third-party offers unless the customer has separately consented to those.
-
5. Your Responsibility — Not Ours
+
5. Your Responsibility — Not Ours
Powder Coating Logix provides this feature as a communication tool only. We are not responsible for how you use it. You agree that your company is solely responsible for obtaining proper consent, maintaining records of that consent, honoring opt-outs, and ensuring all outbound messages comply with the TCPA, FCC regulations, and any applicable state laws. You agree to indemnify and hold Powder Coating Logix harmless from any claims, fines, or damages arising from your company's use of SMS.
@@ -2201,7 +2201,7 @@
— navigate relative to the button
+ // Bootstrap teleports modals to — navigate relative to the button
const modalEl = btn ? btn.closest('.modal') : document.getElementById('gcModal');
const q = sel => modalEl ? modalEl.querySelector(sel) : document.querySelector(sel);
diff --git a/src/PowderCoating.Web/Views/Invoices/Details.cshtml b/src/PowderCoating.Web/Views/Invoices/Details.cshtml
index 30bd6e2..1b13309 100644
--- a/src/PowderCoating.Web/Views/Invoices/Details.cshtml
+++ b/src/PowderCoating.Web/Views/Invoices/Details.cshtml
@@ -17,8 +17,8 @@
var emailOptedOut = hasEmail && !Model.CustomerNotifyByEmail;
var smsPhone = !string.IsNullOrWhiteSpace(Model.CustomerMobilePhone) ? Model.CustomerMobilePhone : Model.CustomerPhone;
var hasSms = !string.IsNullOrWhiteSpace(smsPhone) && Model.CustomerNotifyBySms;
- var showSendModal = hasEmail && !emailOptedOut && hasSms; // both channels — show choice modal
- var directSendSms = !hasEmail && hasSms; // SMS only — skip modal
+ var showSendModal = hasEmail && !emailOptedOut && hasSms; // both channels — show choice modal
+ var directSendSms = !hasEmail && hasSms; // SMS only — skip modal
var hasAvailableCredits = ViewBag.AvailableCreditMemos != null && ((IEnumerable)ViewBag.AvailableCreditMemos).Any();
var canIssueRefund = !isDraft && !isVoided && Model.AmountPaid > 0;
var canApplyCredit = !isVoided && Model.BalanceDue > 0 && hasAvailableCredits;
@@ -80,7 +80,7 @@