backupchecks/docs/changelog-claude.md
Ivo Oskamp 1d9f3662a1 Fix automatic mail import unable to be disabled once enabled
Fixed bug where unchecked automatic mail import checkbox was not
processed by the backend, preventing users from disabling the
automatic import after enabling it.

Root cause: HTML forms do not send unchecked checkbox values. The
existing check `if "auto_import_enabled" in request.form` would skip
updating the setting when the checkbox was unchecked.

Solution: Added import_form_touched flag to detect when the import
settings form is submitted, then update the checkbox value based on
presence (checked) or absence (unchecked) in form data.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 22:15:38 +01:00

91 lines
5.3 KiB
Markdown

# Changelog - Claude Code
This file documents all changes made to this project via Claude Code.
## [2026-02-05]
### Added
- Autotask customer mapping now auto-searches for similar company names when opening unmapped customers:
- Automatically populates search box with customer name
- Displays matching Autotask companies as suggestions
- Speeds up mapping process by eliminating manual search for most customers
- Autotask "Link existing ticket" now supports cross-company ticket search:
- Added `query_tickets_by_number()` to search tickets by number across all companies
- When searching with a ticket number (e.g., "T20260205.0001"), results include:
- Tickets from the customer's company (primary results)
- Matching tickets from other companies (for overarching issues)
- Enables linking tickets for multi-company infrastructure issues
### Changed
- Autotask resolve confirmation and note messages now correctly indicate ticket closure status:
- Frontend confirmation dialog explains conditional closure based on time entries
- Backend route checks time entries before creating note and generates dynamic message:
- "ticket will be closed in Autotask" when no time entries exist
- "ticket remains open in Autotask due to existing time entries" when time entries exist
- Route docstring updated to reflect conditional status update behaviour
### Added
- Autotask conditional ticket status update based on time entries (API contract section 9):
- `query_time_entries_by_ticket_id()` - Query time entries for a ticket via POST /TimeEntries/query
- `update_ticket_resolution_safe()` now checks for time entries and conditionally sets status:
- If NO time entries exist: sets status to 5 (Complete) with completedDate and resolvedDateTime
- If time entries exist: keeps current status unchanged (ticket remains open)
### Fixed
- Automatic mail import can now be disabled in Settings after being enabled (fixed unchecked checkbox not being processed)
- Autotask "Link existing" search box now clears when opening the modal instead of retaining previous search text
- Autotask customer mapping search box now clears when opening the edit modal instead of retaining previous search text
- Autotask ticket resolution update now correctly preserves exact field values from GET response in PUT payload.
The `issueType`, `subIssueType`, and `source` fields are copied with their exact values (including null)
from the GET response, as required by Autotask API. Previously these fields were being skipped or modified.
### Added
- Restored Autotask PSA integration from branch `v20260203-13-autotask-resolution-item-wrapper`:
- `integrations/autotask/client.py` - Autotask REST API client with full support for:
- Zone information discovery
- Ticket CRUD operations (create, get, update)
- Ticket notes via `/Tickets/{id}/Notes` endpoint
- Safe resolution updates preserving stabilizing fields
- Query support for companies, tickets, time entries, deleted ticket logs
- Reference data retrieval (queues, ticket sources, priorities, statuses)
- `ticketing_utils.py` - Utilities for internal ticket management and Autotask linkage
- Database migrations for Autotask fields:
- `SystemSettings`: Autotask connection settings, defaults, and cached reference data
- `Customer`: Autotask company mapping fields
- `JobRun`: Autotask ticket linkage and deletion tracking fields
- `Ticket`: Resolution origin tracking
- Settings UI for Autotask configuration (connection test, reference data sync)
- Run Checks integration for Autotask ticket creation
- Customers page with Autotask company mapping
- Documentation files for Autotask integration design and implementation
- Added `docs/autotask_rest_api.md` - Validated Autotask REST API contract based on Postman testing
## [2026-02-04]
### Added
- `docs/changelog-claude.md` - Changelog file for tracking changes made via Claude Code
- Setting to enable/disable daily dashboard redirect requirement (Settings > General > Navigation)
- New `require_daily_dashboard_visit` column in `SystemSettings` model
- Migration in `migrations.py` to add the column
- Toggle in Settings General page under new "Navigation" card
- Default value is OFF (disabled) - users can navigate directly to any page
### Changed
- Converted changelog to English (all project documentation must be in English)
- Documented branch naming convention and build workflow in Claude memory
- Filled README.md with comprehensive project documentation based on source code analysis
### Performance
- Added database indexes migration (`migrations.py`) for frequently queried foreign key columns:
- `JobRun`: indexes on `job_id`, `job_id+run_at`, `job_id+reviewed_at`, `mail_message_id`
- `MailMessage`: indexes on `job_id`, `location`, `job_id+location`
- `MailObject`: index on `mail_message_id`
- `TicketScope`: indexes on `ticket_id`, `job_id`
- `RemarkScope`: indexes on `remark_id`, `job_id`
- Fixed N+1 query in `_recompute_override_flags_for_runs()` - batch loads all jobs instead of per-run queries
- Optimized Daily Jobs page with batch queries:
- Batch load all today's runs for all jobs in single query
- Batch infer weekly schedules for all jobs (was per-job query)
- Batch infer monthly schedules for jobs without weekly schedule
- Batch load ticket/remark indicators for all jobs