Commit Graph

1998 Commits

Author SHA1 Message Date
7231428fa7 auto-claude: subtask-4-2 - Add form sections 4-6 (Endpoints, Security, Backup & DR)
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
2026-01-09 08:49:48 +01:00
b9a7f4640c auto-claude: subtask-4-1 - Create it_audit_form.html template with base structure
- Created IT audit form template with 9 sections (1-3 fully implemented)
- Section 1: IT Contact (IT manager, outsourcing, provider, contact info)
- Section 2: Cloud & Identity (Azure AD, M365, Google Workspace, local AD)
- Section 3: Server Infrastructure (server count, types, virtualization, OS)
- Sections 4-9: Placeholder structure ready for implementation
- Added progress bar with section navigation dots
- Implemented toggle switches, chip selects for multi-value fields
- Added conditional field visibility logic
- Included loading overlay and info modal patterns
- Responsive design following existing audit templates (gbp_audit.html, seo_audit.html)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 08:46:23 +01:00
5cdd33857f auto-claude: subtask-2-2 - Implement security scoring algorithm (50% weight)
Security scoring implementation with 7 security elements:
- EDR: +15 pts (highest security value)
- MFA: +10 pts (identity security)
- Firewall: +10 pts (network protection)
- Backup: +10 pts (data protection)
- DR Plan: +10 pts (disaster recovery readiness)
- VPN: +5 pts (secure remote access)
- Monitoring: +5 pts (security visibility)

Max raw score: 65 points. Returns raw score directly.
Normalization to 0-100 happens in overall score calculation.

Verification: has_edr + has_mfa returns 25 (15 + 10).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 08:30:37 +01:00
e929a9e825 auto-claude: subtask-2-1 - Create it_audit_service.py with ITAuditResult dataclass
Added IT audit service module with:
- ITAuditResult dataclass with all required fields (overall_score, security_score,
  collaboration_score, completeness_score, maturity_level, fields, recommendations)
- FieldStatus dataclass for individual field status tracking
- CollaborationMatch dataclass for collaboration matching results
- ITAuditService class with complete structure:
  - Scoring methods: _calculate_security_score, _calculate_collaboration_score,
    _calculate_completeness_score, calculate_scores
  - CRUD methods: save_audit, get_latest_audit, get_audit_history
  - Matching methods: find_collaboration_matches, save_collaboration_match,
    get_matches_for_company
- Helper functions: get_maturity_level, get_maturity_level_label
- Scoring configuration constants following spec:
  - Security (50% weight): EDR, MFA, firewall, backup, DR plan, VPN, monitoring
  - Collaboration (30% weight): 6 flags + Azure AD, M365, PBS, Zabbix bonuses
  - Completeness (20% weight): weighted field completion percentage
- Maturity levels: basic (0-39), developing (40-59), established (60-79), advanced (80-100)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 08:27:10 +01:00
23b6425861 auto-claude: subtask-1-4 - Run migration for IT audit tables in DEV database
- Executed it_audit_migration.sql against DEV PostgreSQL (localhost:5433)
- Created it_audits and it_collaboration_matches tables
- Created 12 indexes for performance optimization
- Created 4 views: v_company_it_overview, v_it_audit_history,
  v_it_collaboration_overview, v_it_technology_stats
- Added missing document_management column to match SQLAlchemy model
- Applied grants for nordabiz_app user

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 08:23:40 +01:00
721e313549 auto-claude: subtask-1-3 - Add ITCollaborationMatch SQLAlchemy model to datab
Added ITCollaborationMatch model to database.py for storing company match pairs:
- company_a_id, company_b_id: Foreign keys to companies table
- match_type: Type of collaboration (shared_licensing, backup_replication, etc.)
- match_reason: Human-readable explanation of the match
- match_score: 0-100 strength score
- status: suggested, contacted, in_progress, completed, declined
- shared_attributes: JSONB for flexible attribute storage
- Helper properties for Polish labels (match_type_label, status_label)
- UniqueConstraint on (company_a_id, company_b_id, match_type)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 08:20:08 +01:00
2df1ed324f auto-claude: subtask-1-2 - Add ITAudit SQLAlchemy model to database.py
Add comprehensive ITAudit model with all columns for 9-section IT audit form:
- Scores (overall, completeness, security, collaboration)
- IT Contact fields
- Cloud & Identity (Azure AD, M365, Google Workspace)
- Server Infrastructure (virtualization, OS)
- Endpoints (employee/computer counts, MDM)
- Security (antivirus, EDR, VPN, MFA)
- Backup & Disaster Recovery (Proxmox PBS support)
- Monitoring (Zabbix integration placeholder)
- Business Apps (ticketing, ERP, CRM)
- Active Directory configuration
- Collaboration flags for cross-company matching

Includes helper properties for maturity labels and score categories.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 08:17:48 +01:00
8edcda52e3 auto-claude: subtask-1-1 - Create SQL migration for IT audit tables
Add migration script for it_audits and it_collaboration_matches tables:

- it_audits: 9-section form storage (IT Contact, Cloud & Identity,
  Server Infrastructure, Endpoints, Security, Backup & DR, Monitoring,
  Business Apps, Collaboration flags)
- it_collaboration_matches: Cross-company matching with 6 types
  (shared licensing, backup replication, Teams federation,
  shared monitoring, collective purchasing, knowledge sharing)
- Indexes for company_id, audit_date, scores, maturity level
- Update triggers for updated_at timestamps
- Views: company overview, audit history, collaboration overview,
  technology statistics
- Grants for nordabiz_app user

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 08:14:51 +01:00
86db0a98d4 fix: Track CHANGELOG.md in git (was incorrectly ignored)
- Removed CHANGELOG.md from .gitignore
- Added CHANGELOG.md to version control

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 06:44:14 +01:00
9fd6f994a0 chore: Remove Auto0Claude status and old config files
Removed:
- .auto-claude-status (Auto0Claude artifact)
- debug-headers.conf (old nginx config)
- nginx-custom-maintenance.conf (old nginx config)
- advanced-config-update.sql (one-time SQL)
- SQLite backup files (not tracked by git)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 06:43:34 +01:00
6970dc5a6b chore: Project cleanup - remove Auto0Claude and obsolete docs
Removed:
- .auto-claude/ directory (79 files, 2.9MB)
- 5 git worktrees and auto-claude/* branches
- Obsolete deployment docs (DEPLOYMENT*.md)
- Iteration summaries (ITERATION_*.md)
- Old analysis files (VERIFICATION_*, DETAILED_FINDINGS, etc.)
- One-time scripts (fix_*.py, import_*.py, migrate_*.py)

Updated:
- CLAUDE.md: Added Social Media Audit as implemented
- CLAUDE.md: Marked fetch_company_news.py as TODO

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 06:41:03 +01:00
39cd257f4e Fix YouTube detection overwriting valid matches
- Add 'channel', 'c', 'user', '@' etc. to YouTube exclusion list
- Add 'bold_themes', 'boldthemes' to Twitter/Facebook exclusions (theme creators)
- Fix pattern matching loop to stop after first valid match per platform
- Prevents fallback pattern from overwriting correct channel ID with 'channel'

Fixes issue where youtube.com/channel/ID was being overwritten with
youtube.com/channel/channel by the second fallback pattern.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 05:36:06 +01:00
c319777d58 Social Media audit: progress bar improvements
- Add detailed logging to SocialMediaAuditor (website scan, Brave search, results)
- Slow down progress bar animation (400ms instead of 200ms) for better readability
- Bold "ZNALEZIONO" text for found platforms
- Display Google rating and review count in progress
- Increase wait time before modal close (4 seconds)
- Add console.log for debugging audit response

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 05:29:17 +01:00
8fed190303 fix(social-audit): Convert opening_hours dict to JSON for JSONB column
Fixes: psycopg2.ProgrammingError: can't adapt type 'dict'

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 05:14:01 +01:00
deed279521 fix(social-audit): Use SocialMediaAuditor for comprehensive audit
- Import and use SocialMediaAuditor from scripts/social_media_audit.py
- Audit now scans website HTML for social media links
- Discovers profiles via Brave Search API (if configured)
- Fetches Google Business Profile data via Google Places API
- Saves discovered profiles to database

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 05:12:25 +01:00
cadf91b481 feat(social-audit): Add ability to run Social Media audit
- Add "Uruchom audyt" button to social_audit.html
- Create POST /api/social/audit endpoint to verify profile URLs
- Add loading overlay and modal for audit progress/results
- Audit verifies each social media URL and updates check_status

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 05:07:58 +01:00
505800381e feat(social-audit): Add Social Media audit dashboard
- Create /audit/social/<slug> route with platform presence analysis
- Create social_audit.html template with 6 platforms (FB, IG, LinkedIn, YT, X, TikTok)
- Add purple "Audyt Social" button on company profile next to GBP and SEO audits
- Show score based on platforms count, profile details and recommendations

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 05:03:57 +01:00
c7b57100ad fix(seo-audit): Use correct attribute website_url instead of url
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 04:54:51 +01:00
3da1501872 feat(seo-audit): Add dedicated SEO audit page for individual companies
- Create /audit/seo/<slug> route with access control (admin or company owner)
- Create seo_audit.html template with score visualization
- Add green "Audyt SEO" button next to GBP audit button on company profile
- Match styling and UX patterns from GBP audit feature

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 04:53:21 +01:00
b3885a06e8 feat(gbp-audit): Add data source tags to progress overlay
- Show "Google" badge next to each field in progress steps
- Blue badge indicates data comes from Google Places API
- Helps users understand where audit data originates

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 04:46:14 +01:00
3b2dcc279b feat(gbp-audit): Use Google data for all audit fields
- Add new columns to CompanyWebsiteAnalysis: google_name, google_address,
  google_phone, google_website, google_types, google_maps_url
- Update _check_name(), _check_address(), _check_phone(), _check_website(),
  _check_categories() to use Google data instead of NordaBiz database
- All audit fields now show real data from Google Business Profile
- Fallback to NordaBiz data only when Google data unavailable

Migration: database/migrations/add_google_gbp_fields.sql

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 04:43:03 +01:00
7aacdd5951 Fix: include details field in fields_status serialization
The details field (with reviews breakdown) was not being passed to template.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 04:32:40 +01:00
0c1d03418b GBP Audit: show reviews scoring breakdown
Add details field to FieldStatus for passing breakdown info.
Display scoring breakdown like: "3 pkt (1. opinia) + 1 pkt (ocena) = 4/9"

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 04:30:04 +01:00
a25767e49c GBP Audit: simple user-friendly reviews message
Replace technical scoring breakdown with simple messages:
- 0 reviews: "Poproś klientów o opinię"
- Partial: "Dobry początek! Zbierz więcej opinii"
- Full score: "Doskonale! Masz maksymalną punktację"

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 04:28:13 +01:00
d44df3b104 GBP Audit: user-friendly reviews scoring explanation
Clearer breakdown showing:
- What points user already earned (✓)
- What's still pending (○)
- Actionable tip for zero reviews
- Goal reminder for partial scores

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 04:25:39 +01:00
82b57427f7 GBP Audit: add scoring explanation for reviews field
Shows how review points are calculated:
- Full score (9/9): 5+ reviews AND rating >= 4.0
- Partial: 3 pts (first review) + 1 pt/review + 1 pt bonus (rating >= 4.0)
- Missing: 0 pts

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 04:23:24 +01:00
6758e208d4 GBP Audit: fetch Google data + detailed progress overlay
- Add fetch_google_business_data() to fetch fresh data from Google Places API
- Progress overlay shows all 10 data fields with actual values:
  * Place search, Rating, Reviews, Photos, Hours, Phone, Website, Status
- 5-second delay after completion for user to read results
- Fix opening hours display (show formatted weekday_text)
- Fix reviews scoring (integer-based: 3 base + 1/review + 1 bonus)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 04:19:44 +01:00
69bb6b839a docs: Fix incorrect SQLite references - DEV uses PostgreSQL via Docker
The documentation incorrectly stated that DEV environment uses SQLite
when it actually uses PostgreSQL via Docker on localhost:5433.

Updated files:
- CLAUDE.md - main project instructions
- PROJECT_INFO.md - environment documentation
- deployment_checklist.md - deployment procedures
- SCRIPTS_INDEX.md - script usage commands
- .claude/commands/*.md - all slash command definitions
- tests/test_admin_seo_dashboard.py - test database URL

DEV environment:
- PostgreSQL via Docker: localhost:5433
- Container: nordabiz-postgres
- Database: nordabiz
- User: nordabiz_app

PROD environment:
- PostgreSQL: 10.22.68.249:5432

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 03:40:50 +01:00
def60a4b22 docs: fix database config - DEV uses PostgreSQL via Docker, not SQLite 2026-01-09 03:30:51 +01:00
3cea691fd4 fix(gbp): fix opening hours and photos data fetching
Add database migration to support opening hours and photos fields.
Update GBP audit service to properly fetch and validate these fields
from Google Business Profile API. Add comprehensive test coverage.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 03:27:38 +01:00
20359aa9de chore: ignore Auto-Claude metadata files 2026-01-09 03:12:15 +01:00
603c95c608 auto-claude: subtask-7-1 - Production verification for GBP audit
- 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>
2026-01-08 23:25:41 +01:00
de4cf264fa auto-claude: subtask-6-1 - Mark database migration ready for user action
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>
2026-01-08 23:23:19 +01:00
0dde9bde77 auto-claude: subtask-6-1 - Add run_migration.py for production deployment
Added a Python migration script that can be run on the production server
to add the google_opening_hours and google_photos_count columns.

Script connects to localhost (127.0.0.1) as required by PostgreSQL config.

Usage on production server:
  cd /var/www/nordabiznes && python3 run_migration.py

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 23:21:19 +01:00
8945b79fcc auto-claude: subtask-5-2 - Test GBP audit service locally to verify field checks
- Created tests/test_gbp_audit_field_checks.py with comprehensive tests
- Tests verify _check_hours() correctly uses google_opening_hours field
- Tests verify _check_photos() correctly uses google_photos_count field
- Tests cover edge cases: null values, missing analysis, partial data
- All field check logic validated: complete/partial/missing status
- Field weights verified: hours=8, photos=15, total=100

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 23:10:16 +01:00
5ed97ac1dd auto-claude: subtask-5-1 - Fix opening_hours and photos data passing in audit_company
Fixed a bug where google_opening_hours and google_photos_count were being
fetched from the Google Places API but not passed through to the result
dictionary correctly:

- Changed 'opening_hours' key to 'google_opening_hours' to match what
  save_audit_result() expects
- Added 'google_photos_count' to the result dictionary

Verified with dry-run: INPI company now shows opening hours schedule
and 10 photos count from Google Business Profile.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 23:08:19 +01:00
5f18a228b1 auto-claude: subtask-4-1 - Create SQL migration script for new columns
Add database migration script to add google_opening_hours (JSONB) and
google_photos_count (INTEGER) columns to company_website_analysis table.

These columns are needed for storing GBP data from Google Places API:
- google_opening_hours: stores weekday_text, open_now, and periods data
- google_photos_count: stores count of photos from Google Business profile

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 23:04:25 +01:00
fd5a04c02c auto-claude: subtask-3-2 - Update _check_photos() to use google_photos_count
Changed _check_photos method to read from analysis.google_photos_count
instead of total_images. This provides actual GBP photo count rather
than estimated website images.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 23:02:49 +01:00
d84588c46b auto-claude: subtask-3-1 - Update _check_hours() method to read from google_opening_hours
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>
2026-01-08 23:01:28 +01:00
aacf2cf54b auto-claude: subtask-2-3 - Update save_audit_result() to store google_opening_hours and google_photos_count
- Added google_opening_hours and google_photos_count to INSERT column list
- Added corresponding placeholders to VALUES list
- Added to ON CONFLICT UPDATE SET clause
- Added to parameter dictionary reading from google_reviews result

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 23:00:22 +01:00
5f2cfa06fd auto-claude: subtask-2-2 - Update get_place_details() to return photos count
- 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>
2026-01-08 22:59:04 +01:00
5fa80f9efa auto-claude: subtask-2-1 - Add 'photos' to fields list in GooglePlacesSearcher
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>
2026-01-08 22:58:04 +01:00
41997a15e9 auto-claude: subtask-1-1 - Add google_opening_hours (JSONB) and google_photos_count (INTEGER) columns to CompanyWebsiteAnalysis model
- Added google_opening_hours Column(JSONB) for storing GBP opening hours
- Added google_photos_count Column(Integer) for storing GBP photos count
- Both columns added to GOOGLE BUSINESS section alongside existing google_* columns
2026-01-08 22:57:21 +01:00
115c1c1193 auto-claude: subtask-4-3 - Verify database has Google data for INPI company
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>
2026-01-08 20:52:14 +01:00
06c22539d7 auto-claude: subtask-4-2 - Add --company-slug support and dotenv loading
- Add --company-slug argument to social_media_audit.py for easier testing
- Add get_company_id_by_slug() method to SocialMediaAuditor class
- Add python-dotenv support to load .env file from project root
- Create verify_google_places.py script for direct API testing

Note: Full verification blocked - current API key (PageSpeed) doesn't have
Places API enabled. Requires enabling Places API in Google Cloud Console
for project NORDABIZNES (gen-lang-client-0540794446).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 20:49:59 +01:00
3d69d53550 auto-claude: subtask-3-4 - Run all tests and verify they pass
Fixed bug in social media exclusion logic that was too aggressive.
The substring check `any(ex in match.lower() for ex in excludes)`
was incorrectly excluding valid usernames containing exclusion
strings (e.g., 'testcompany' was excluded because it contained 'p').

Changed to exact match only to properly handle Instagram post URLs
(`instagram.com/p/...`) without false positives on valid usernames.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 20:41:54 +01:00
9cd5066afe auto-claude: subtask-3-3 - Add test_search_google_reviews_error for API error
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>
2026-01-08 20:39:11 +01:00
ee6bc656ef auto-claude: subtask-3-2 - Add test_search_google_reviews for successful API response
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>
2026-01-08 20:37:27 +01:00
c057794c64 auto-claude: subtask-3-1 - Create test file for social_media_audit with Google Places tests
Add comprehensive unit tests for social_media_audit.py:
- WebsiteAuditor tests: SSL checks, hosting detection, HTML parsing, social media extraction
- GooglePlacesSearcher tests: find_place, get_place_details, API error handling
- BraveSearcher tests: Google reviews search, fallback mechanisms
- SocialMediaAuditor tests: company auditing, result saving, integration tests
- Pattern tests: hosting providers, social media URL patterns, exclusion rules

Tests follow the same structure and patterns as test_seo_audit.py.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 20:35:27 +01:00
3bdbde1621 auto-claude: subtask-2-3 - Update SocialMediaAuditor to use GooglePlacesSearcher
- Add google_places_searcher attribute to SocialMediaAuditor
- Initialize GooglePlacesSearcher if GOOGLE_PLACES_API_KEY env var is set
- Update audit_company() to use Places API directly when available
- Fallback to Brave Search when API key not configured
- Log which data source is being used for reviews

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 20:31:22 +01:00