- Changed <style> to <style is:global> so CSS applies to dynamically
created step chips (Astro scoped styles don't match JS-created elements)
- After async pre-fill from order data completes, re-renders the active
step so EntityStep reads the populated state
- Removes payment step when token/order param is present
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Immediate scroll before the FCC lookup starts, so the user sees
the loading spinner even when the search results list is long.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Batch orders: checkout API already sends combined intake email, so worker
handlers no longer send their own (was causing 2-3 duplicate emails)
- When accessed via ?token= or ?order= (post-payment), the "payment" step
is removed from the intake wizard since payment is already complete
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The handler was returning the acceptance letter as an artifact, which
triggered the instant-delivery email to the client before the admin
placed the wholesale order with Northwest. Now uploads to MinIO but
returns empty artifacts. Admin todo includes the MinIO path to send
the letter after confirming the NW order.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Previously required both has_account && returning (logged in before).
Now shows portal link whenever has_account is true.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Batch invoice creation now calculates actual total from line items
- Fixed JS syntax error: `className = "..." style="..."` was invalid JS
(style= outside string literal caused Unexpected identifier 'style')
- Portal menu: set hide_standard_menu=1 to remove duplicate sidebar items
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The replace_all for orange button styling put `style="..."` after the
className assignment as bare JS, causing `Unexpected identifier 'style'`
which killed the entire enhancement script (no toggles, no CTA).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The always-rebuild approach caused the CTA to disappear when the observer
fired a second time. Reverted to only rebuild on FRN change.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Always rebuild CTA when observer fires (removes stale CTA first)
- Check both label and full card text for service detection
- Add dedup guards on service list
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. XSS: error messages use textContent by default, innerHTML only
for controlled HTML (CORES link) via allowHtml flag
2. XSS: name search errors built with DOM API, not innerHTML
3. Race condition: concurrent FRN lookups cancel prior request
via AbortController tracking
4. Null safety: DOM element guards with error logging
5. Null safety: check.detail uses || "" fallback, \n → <br>
6. Quote form: auto-resets after 3 seconds on successful submit
7. Pricing: discount uses Math.round(total*15)/100 for cent precision
8. Future-proofing: parseFloat for prices instead of parseInt
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
FCC Compliance Check:
- FRN validation: shows "must be 10 digits" with digit count
- Auto-strips non-digits and pads to 10
- 30-second timeout with friendly message
- "Not found in any FCC database" with link to CORES
- Network error guidance
- FRN display uses overflow-wrap for mobile
- Error box uses innerHTML for clickable links
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
CORES scraper sometimes returns empty address depending on server IP.
Now falls back to Headquarters Address from the FCC 499 filer detail
page, which is more reliable.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Compliance orders portal page moved to ERPNext/Frappe at:
portal.performancewest.net/compliance-orders
Includes USAC delegation confirmation via Frappe API.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- GET /api/v1/compliance-orders/my-orders?email= returns all orders
grouped by batch, with USAC delegation status
- /account/orders page shows order history with:
- Entity name, FRN, batch ID, date, payment status
- Itemized services with pricing
- USAC delegation callout with confirmation button
- Auth-gated (requires login)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Intake email now has "I've completed the delegation →" button
instead of "reply to this email"
- Button links to order success page with action=usac_delegation
- New API: POST /api/v1/compliance-orders/:id/usac-delegation
Records confirmation timestamp in intake_data and logs it
- Removed "reply to this email" from intake email
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Step 1: "Did ENTITY provide and bill for telecom services?"
- Yes → red, filing required for each missed year
- No → Step 2 follow-up
Step 2: "Does ENTITY plan to provide telecom services going forward?"
- Yes, keep active → yellow, zero-revenue 499-A filings needed
- No, cancel → yellow, catch-up filings + USAC cancellation
Fixes: white-on-red button visibility, removes confusing 3-way
choice, uses inline styles for button colors.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
RMD: "Does WYOMING FIBER PHONE INC provide any voice services?"
499-A: "Did WYOMING FIBER PHONE INC bill customers for voice or data..."
BDC: "Does WYOMING FIBER PHONE INC provide broadband internet access?"
Also applies entity name to response messages.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When 499-A shows as past due, asks:
- "Yes — I need to file" → keeps red, notes each year priced separately
- "No — I had no telecom revenue" → yellow, explains zero-revenue
filings still required for each year with active filer ID
- "I want to cancel my 499 registration" → yellow, explains catch-up
filings must be completed first, offers to handle cancellation
All options have "Change answer" undo buttons.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- RMD "not found" now asks "Do you provide any voice services?" with
Yes/No buttons. Clicking No turns it green (data-only, not applicable).
Includes "Change answer" undo button.
- DC Agent checkbox hides and unchecks when Form 499-A is unchecked,
reappears when 499-A is re-checked.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds financial_connections with balances permission and prefetch
to Stripe Checkout sessions when payment_method is ACH. This uses
Plaid to verify the customer's bank account balance before accepting
payment, reducing ACH return risk.
- permissions: ["payment_method", "balances"]
- prefetch: ["balances"]
- verification_method: "instant"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. BDC Yes/No buttons now have "Change answer" undo — clicking
Yes or No is reversible without re-running the check
2. intake_data JSON.parse wrapped in try/catch with error logging
instead of silently returning empty object
3. All CTA price displays use .toFixed(2) for consistent formatting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. CRITICAL: Add compliance_batch to stripe session tableMap —
session IDs weren't being stored for batch orders
2. CRITICAL: Fix batch orders using order_number instead of batch_id
when storing stripe_session_id
3. MAJOR: Tax deductibility note only shows for compliance orders,
not CRTC/formation/bundles
4. MAJOR: Identity verification fallback changed from localhost:4321
to performancewest.net with warning log
5. MEDIUM: Fix discount rounding — last service absorbs remainder
to prevent cent loss across batch orders
6. LOW: Validate at least one paid service in batch orders
7. Standardize support email to info@performancewest.net everywhere
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sends next-steps email with services list, USAC delegation
instructions for 499-A, and multi-year catch-up note.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Explains that each missed year is filed and priced separately
- Tells user we'll contact them for USAC E-File delegation after order
- "Not sure what you need?" leads to the free assessment form
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Results now show as proper clickable cards with:
- Entity name (bold), DBA (if different from legal name)
- FRN (monospace) and Filer ID on the right
- Clear "click to check compliance" hint
- Bordered list with dividers and hover state
- Hides results after selection
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The quote form code had TypeScript casts (as HTMLInputElement, as
HTMLButtonElement) in a plain <script> tag. Browsers can't parse
TypeScript — this killed the entire page script silently.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Docker layer caching was serving old site content after git pull
because file timestamps didn't change enough to bust the cache.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
"Contact us" now opens an inline form that submits a ticket
to ERPNext via POST /api/v1/tickets with category "quote".
Pre-fills entity name, FRN, and overdue items from the check.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Spreading a string gives individual characters ("C,a,r,i,e,r...").
Filter as string values instead.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tailwind purges bg-orange-500 since it's not in the safelist.
Use inline style to guarantee the orange button renders.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace rsync deploy with git pull workflow
- Add CLAUDE.md with deployment rules to prevent file clobbering
- Add .gitignore for node_modules, dist, .env, etc.
- Deploy script now supports: ./deploy.sh prod | ./deploy.sh dev
- Enforces committed changes before deploy
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>