Add Flask route for IT audit form display:
- GET /it-audit/form with optional company_id query parameter
- Access control: admin can access any company, users only their own
- Defaults to current user's company if no company_id provided
- Pre-fills form with existing audit data if available
- Renders it_audit_form.html template
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Added collaboration matrix section to IT audit dashboard with:
- CSS styles for match type cards following combo-grid pattern
- Six match type categories: M365 licensing, backup replication,
Teams federation, shared monitoring, collective purchasing,
and knowledge sharing
- Company pairs display with status badges (suggested, contacted,
active, declined)
- Empty state with friendly message when no matches exist
- Responsive grid layout matching social_media.html patterns
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Create IT Audit admin dashboard template with:
- Header with title, description, and action buttons
- Stats grid showing: total audits, avg overall score, avg security
score, avg collaboration score, companies without audit
- Maturity level distribution (basic, developing, established, advanced)
- Technology stats grid (Azure AD, M365, Proxmox PBS, Zabbix, EDR, DR Plan)
- Collaboration flags section (6 cooperation types)
- Empty states for all sections when no data
- Responsive design following patterns from admin_seo_dashboard.html
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Enhanced updateProgress() function to track section-by-section completion
- Added calculateSectionCompletion() helper for per-section field analysis
- Added updateSectionProgress() for section-level progress indicators
- Implemented real-time progress tracking with input event listeners
- Added debounced input handlers for text/email/textarea fields
- Added keyboard navigation support for progress dots (accessibility)
- Progress bar color changes based on completion percentage:
- Primary (blue) for <50%
- Warning (yellow) for 50-79%
- Success (green) for >=80%
- Section dots and numbers turn green when section is 70%+ complete
- Properly handles conditional fields visibility in completion calculation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Added three new form sections to IT audit form:
- Section 4: Endpoints (Workstations) - device types, OS, MDM, encryption
- Section 5: Security - antivirus/EDR, VPN, MFA, password policy, training
- Section 6: Backup & DR - backup solutions, targets, frequency, retention, DR plan
Features:
- Dropdowns for single-select options (MDM solution, VPN, antivirus, etc.)
- Chip-select for multi-select options (endpoint types, OS, MFA methods, etc.)
- Toggle switches for yes/no questions with conditional fields
- Full JavaScript support for new chip selections and conditional mappings
- Initialization support for editing existing audits
- Verified production health endpoint is running
- Confirmed code implementation is correct:
- gbp_audit_service.py uses google_opening_hours for hours field
- gbp_audit_service.py uses google_photos_count for photos field
- gbp_audit_service.py uses google_rating/google_reviews_count for reviews
- Manual browser verification required (page requires authentication)
- Instructions documented in build-progress.txt
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Migration code complete:
- database/migrations/add_gbp_hours_photos_columns.sql
- run_migration.py helper script
SSH access to production (10.22.68.249) is blocked from sandbox.
User must run the documented command to complete migration.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Changed _check_hours() in GBP Audit Service to read opening hours from
google_opening_hours field instead of google_business_status. The method
now properly returns the actual hours value when available.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add google_photos_count to result dictionary initialization
- Extract photos count from API response using len(place['photos'])
- Update logging to include photos count in output
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Added 'photos' field to the fields list in get_place_details() method
to enable fetching business photos from Google Places API.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
BLOCKED: Cannot verify - dependencies not met:
- Local SQLite database empty (no tables initialized)
- Google Places API not enabled for current API key
- Previous subtask (4-2) was blocked, no audit ran
Documented blockers and options to unblock in build-progress.txt.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Added test for search_google_reviews method to handle API errors gracefully.
The test mocks GooglePlacesSearcher to simulate a RequestException during
get_place_details and verifies that the method returns None values instead
of crashing.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Added test_search_google_reviews test in TestBraveSearcherGoogleReviews class
that verifies successful Google reviews retrieval via Google Places API:
- Mocks complete place lookup with realistic place_id
- Mocks full place details response including rating, reviews count,
opening hours, and business status
- Verifies all expected fields are correctly returned
- Validates correct API calls are made with expected parameters
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>