- 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>