Merged
Conversation
- Add get_install_id() and base_first_seen tracking in InstallationConfig - Introduce app/telemetry package with TelemetryService abstraction - Define minimal base telemetry schema (BASE_SCHEMA_KEYS) - Implement send_base_telemetry, send_base_first_seen, send_base_heartbeat - Implement send_analytics_event and identify_user gated by opt-in - Unify install identity: get_installation_id() now returns get_install_id()
…_seen at startup - Delegate track_event, identify_user, track_page_view to telemetry service - Only send detailed analytics when user has opted in (is_detailed_analytics_enabled) - Call send_base_first_seen() once at app startup (idempotent per install) - posthog_funnels: require telemetry_enabled for funnel tracking - posthog_monitoring: require telemetry_enabled for error/performance events
…enable - Register send_base_telemetry_heartbeat_with_app cron at 03:00 UTC - setup: call check_and_send_telemetry when user opts in during setup - admin: call check_and_send_telemetry when toggling detailed analytics on
…shboard - settings: distinguish minimal install telemetry (always on) vs optional detailed analytics - telemetry: update toggle label and data-collection copy for base vs opt-in layers - List what is collected in each layer and what is never collected
…rd guide - Add telemetry-architecture.md: base vs detailed layers, schema, consent, retention - ARCHITECTURE: link to telemetry doc and two-layer overview - analytics.md: two-layer telemetry section and link to architecture - privacy.md: update base/detailed analytics and retention wording - all_tracked_events.md: document base_telemetry.first_seen/heartbeat, opt-in events
- test_installation_config: assert install_id UUID format and config persistence - test_telemetry_consent_and_base: analytics not sent when opt-out, sent when opt-in - test_telemetry_consent_and_base: base first_seen idempotent, heartbeat payload schema - test_telemetry_consent_and_base: install_id stable across calls
Remove from index (keep on disk): .cursor/plans, logs/.gitkeep, logs/app.jsonl, mobile lib files, tests/__pycache__/*.pyc. These are already in .gitignore; stopping tracking so future changes are ignored.
…portal dashboard preferences - Migration 139: add users.keyboard_shortcuts_overrides (JSON) for per-user shortcut customization - Migration 140: add client_portal_dashboard_preferences table for widget layout and order
…it/link models - Add ClientPortalDashboardPreference for per-client/widget dashboard layout and order - Export new model in models __init__; minor updates to audit_log, link_template, user as needed
… and preferences - Add ClientActivityFeedService and ClientReportService; update approval and notification services - Add inventory report service updates - Client portal routes: dashboard preferences (widget order/visibility), activity feed, reports - Templates: dashboard, activity_feed, reports, base; add widgets (invoices, pending_actions, projects, stats, time_entries)
- Add keyboard_shortcuts_defaults utility for default bindings and overrides - Update Settings keyboard shortcuts template for customization UI - Add KEYBOARD_SHORTCUTS_DEVELOPER.md for implementation and extension
- Update app bootstrap and route modules (admin, api, api_v1, audit_logs, clients, expenses, projects, settings, team_chat, timer) - Add error_handling utility; update backup, client_lock, context_processors, data_import
- enhanced-ui, error-handling, keyboard-shortcuts, pwa, smart-notifications, toast-notifications - base.html layout and script includes
- Remove stale 'coming soon' claims; mark incomplete implementations as historical where relevant - Update GETTING_STARTED, REST_API, KEYBOARD_SHORTCUTS_SUMMARY, BULK_TASK_OPERATIONS - Update client portal, inventory, and activity feed docs; API token scopes
…ory API - Client portal, enhanced UI, keyboard shortcuts and shortcuts API - Jira integration; API v1 inventory reports and transfers - Silent exception handling fixes
- Remove 'Bulk due date/priority update feature coming soon!' from 10 locale .po files - Align messages with current implementation
- Document docs/i18n audit: removed stale claims, updated implementation status - Mileage/Per diem export, break time, architecture refactor, fixes (Xero, time filter, mobile, dashboard cache, etc.)
- When webhook_secret is set in Jira integration, verify incoming webhooks via X-Hub-Signature-256, X-Atlassian-Webhook-Signature, or X-Hub-Signature - Reject requests with missing or invalid signature; no secret = accept all (unchanged) - Add webhook_secret password field to Connection Settings in Jira config - Add tests for verification success, missing sig, and invalid sig
…PI input - /api/activity: return 400 with clear message when start_date/end_date are not valid ISO 8601; avoid silent pass on parse errors - Web route /activity: catch ValueError, log and skip filter instead of 500 - Add tests for invalid date formats on API and web routes
…y-only access - New scopes read:inventory and write:inventory; existing read/write:projects still grant same inventory access for backward compatibility - require_api_token() accepts tuple of scopes (any one required); inventory endpoints accept (read:inventory | read:projects) and (write:inventory | write:projects) - ApiTokenService: add new scopes to allowed list; document in API_TOKEN_SCOPES.md - Add tests for inventory report endpoints with scope checks
- Reports accept ?days=1-365 (default 30) for configurable date range - ?format=csv returns CSV download (summary, hours by project, time by date) with same access control as reports page - Subtitle shows 'Last N days' when date range is applied - Add tests for days param and CSV export
- Catch AttributeError/KeyError/TypeError and generic Exception in PEPPOL block; log with exc_info and show generic warning to user so view still renders - Avoid silent pass that hid configuration or data errors - Add test for exception path (mock get_custom_field to raise)
…ettings - /settings and /settings/preferences lacked templates (would 500); redirect to canonical user.settings with info flash for preferences
…OST/PUT replay - queueForOffline now saves url, method, headers, body (replay-safe for localStorage); legacy items with options only still replayed via fallback - processOfflineQueue builds fetch options from stored method/body so replayed requests send the same payload when back online - Make queueForOffline async and await it in handleFetchResponse/handleFetchException - Add tests asserting queue stores method/body and replay uses them
- CHANGELOG: document offline queue replay, inventory scopes, client portal reports (date range + CSV), Jira webhook verification; activity feed date validation, PEPPOL exception handling, settings redirect, doc sync - CLIENT_FEATURES_IMPLEMENTATION_STATUS: report date range and CSV export marked as implemented - INCOMPLETE_IMPLEMENTATIONS_ANALYSIS: add Verified 2026-03-16 for webhooks, issues permissions, search API, offline queue, error handling - Add CODEBASE_AUDIT.md with gap analysis and fixed/remaining items
Database Migration Validation✅ Migration validation passed! Completed checks:
The database migrations are safe to apply. 🚀 📝 Note: Schema drift warnings indicate existing model/migration mismatches that existed before this PR. These should be addressed in a separate schema alignment PR. This comment was automatically generated by the Migration Validation workflow. |
❌ CI Test ResultsOverall Status: 2 test suite(s) failed Test Results: 0/7 passed Test Suites:
Commit: fdf4f6b |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Brief description of the change and why it's needed.
Type of change
Checklist
pytest).Related issues
Fixes # (issue number, if applicable)
See CONTRIBUTING.md and CHANGELOG.md for guidelines.