Extended both customer and jobs export/import to preserve Autotask
company mappings during data migration and system reset workflows.
Changes:
- Customer export (CSV): Added autotask_company_id and autotask_company_name columns
- Customer import (CSV): Reads and applies Autotask mapping fields, resets sync status
- Jobs export (JSON): Includes Autotask fields in customers array
- Jobs import (JSON): Processes customers array with Autotask mappings before jobs
- Backwards compatible: Old exports without Autotask fields continue to work
- Import feedback: Shows both created and updated customer counts
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Split Autotask settings into two separate forms with dedicated save
buttons and field validation:
1. Autotask Settings form:
- Save button inside card for better UX
- Required fields: Environment, Username, Password (if not set),
Tracking Identifier, Base URL
- Red asterisks indicate required fields
2. Ticket Defaults form:
- Separate save button inside card
- Required fields: Queue, Ticket Source, Status, Priority Warning,
Priority Error
- Prevents saving incomplete configurations
Benefits:
- Clear visual separation of concerns
- Prevents accidental saving of empty values
- HTML5 validation ensures all required fields are filled
- Better user experience with focused save actions
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Enhanced save logic to protect against losing the default ticket
status value when saving settings with an empty dropdown:
- Only update to new value if a status is actually selected
- Only allow clearing if reference data is loaded (dropdown has options)
- Preserve existing value if dropdown is empty (no reference data)
This fixes the issue where saving settings before reference data
loaded would overwrite the previously configured default status
with NULL, causing "Create Autotask ticket" to fail with error
about missing default status.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixed issue where Default Ticket Status dropdown was empty when
opening the settings page. Now automatically loads reference data
(queues, sources, statuses, priorities) when:
- Autotask integration is enabled
- API credentials are configured
- Reference data cache is empty
This eliminates the need to manually click "Refresh reference data"
before being able to select a default ticket status.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added customer active status filtering to prevent jobs from deleted
(inactive) customers from appearing in the UI alongside existing
archived job filtering.
Changes:
- Daily Jobs: Filter jobs where customer is NULL or active=True
- Run Checks: Filter jobs where customer is NULL or active=True
- Jobs list: Filter jobs where customer is NULL or active=True
This prevents showing jobs with "-" status from archived jobs or
deleted customers on Daily Jobs and Run Checks pages.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit consolidates all development work from the following branch series:
- v20260203-* (13 branches): Initial Autotask integration, graph config UI improvements
- v20260204-* (3 branches): Dashboard redirect setting, additional refinements
- v20260205-* (13 branches): Autotask resolution improvements, changelog restructuring
Key features merged:
- Autotask PSA integration with ticket creation, resolution, and search
- Graph/mail configuration UI improvements with credential testing
- Daily dashboard redirect setting (optional navigation control)
- Changelog restructuring with improved Python structure
- Various bug fixes and UI enhancements
All functionality has been consolidated from the final state of branch
v20260205-13-changelog-python-structure to preserve working features.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added "Open in Autotask" button next to ticket number in Run Checks modal
for quick navigation to the ticket in Autotask PSA.
Changes:
- Enhanced renderAutotaskInfo() function in run_checks.html
- Button appears only when autotask_ticket_id exists
- Opens in new tab with proper Autotask URL format
- Styled as small outline button for compact layout
- URL format: https://ww19.autotask.net/Mvc/ServiceDesk/TicketDetail.mvc?workspace=False&ids[0]={id}&ticketId={id}
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit adds a new setting that displays a visual "SANDBOX" banner
when the environment is marked as development or sandbox.
Changes:
- Add is_sandbox_environment boolean column to SystemSettings model
- Add database migration for automatic schema update
- Add Environment section in Settings > General with toggle switch
- Create sandbox.css with diagonal banner styling (non-interactive)
- Inject system_settings into all template contexts
- Add sandbox banner to base.html layout
- Update changelog with feature description
The banner appears as a red diagonal ribbon in the top-left corner and
uses pointer-events: none to remain non-interactive while keeping
underlying elements clickable.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added ellipsis-field class to both "Overall remark" and "Remark" fields in
the Run Checks modal. This prevents long text from pushing action buttons
(like Autotask ticket creation) out of view. Users can click the field to
expand/collapse the full text.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
The button in the "Link existing Autotask ticket" modal performed a search
operation but was labeled "Refresh", which was confusing. Renamed to "Search"
to accurately reflect its functionality.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Created app/changelog.py with structured changelog data (first 3 versions as example)
- Removed Gitea dependency for changelog rendering
- Added new changelog.html template with:
- Sidebar navigation for version jumping
- Bootstrap cards for each version
- Color-coded type badges (feature/improvement/fixed/documentation)
- Responsive design with sticky navigation
- Added changelog.css with modern styling and dark mode support
- Updated routes_changelog.py to use Python data structure
- No external dependencies, faster loading, always available
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
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>
Added automatic search for similar company names when opening unmapped
customers in the edit modal. This speeds up the mapping process by
eliminating manual searches.
Changes:
- Clear search box when opening customer edit modal
- Auto-populate search with customer name for unmapped customers
- Automatically display matching Autotask companies as suggestions
- Refactor search logic into reusable performAutotaskSearch() function
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixed issue where the search input retained previous search text when
reopening the Link existing modal. The search box now always starts
empty for a better user experience.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
The "Link existing ticket" dialog now searches across all companies when
a ticket number is entered, enabling linking of overarching issues.
Changes:
- Added query_tickets_by_number() to Autotask client
- Route searches both customer's company and cross-company when ticket number detected
- Results are combined and deduplicated (customer tickets shown first)
- Enables linking multi-company infrastructure issues to any job
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
The resolve confirmation dialog and ticket notes now correctly indicate
whether the ticket will be closed or remain open based on time entry check.
Changes:
- Frontend: Updated confirmation message to explain conditional closure
- Backend: Check time entries before creating note
- Dynamic message in ticket note:
* "ticket will be closed in Autotask" (no time entries)
* "ticket remains open in Autotask due to existing time entries" (has time entries)
- Updated route docstring to reflect conditional status behaviour
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implements API contract section 9: ticket resolution workflow with
conditional status updates based on time entry existence.
- Added query_time_entries_by_ticket_id() for POST /TimeEntries/query
- update_ticket_resolution_safe() now checks time entries:
* No time entries: sets status to 5 (Complete)
* Has time entries: keeps current status (ticket remains open)
This ensures tickets are only auto-closed when appropriate per the
validated Autotask API workflow.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
The issueType, subIssueType, and source fields must be sent in the PUT
payload with their exact values from GET response, including null. This
fixes HTTP 500 error where Autotask rejected picklist value 0.
Changed _pick function to return (found, value) tuple to distinguish
between "field missing" and "field is null".
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Restored from branch v20260203-13-autotask-resolution-item-wrapper with
the following functionality:
- Autotask REST API client with support for tickets, notes, companies,
and reference data (queues, sources, priorities, statuses)
- Safe ticket updates preserving stabilizing fields per API contract
- Database models for Autotask settings, customer mapping, and ticket linkage
- Settings UI for Autotask configuration with connection test
- Run Checks integration for ticket creation
- Customers page with Autotask company mapping
- Ticket linking during mail import
Also preserved the require_daily_dashboard_visit setting from the
current branch.
Added docs/autotask_rest_api.md with validated API contract from Postman tests.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Added a new setting in Settings > General > Navigation that allows
administrators to control whether users are redirected to the dashboard
on their first page view each day.
Changes:
- Added require_daily_dashboard_visit column to SystemSettings model
- Added migration for the new column (default: FALSE)
- Modified before_request hook to check the setting before redirecting
- Added Navigation card with toggle in Settings General page
- Restored changelog-claude.md with performance and feature updates
Default is OFF - users can navigate directly to any page without
being forced to visit the dashboard first.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The indexes defined in models.py __table_args__ are not automatically
created by the custom migration system. Added migrate_performance_indexes()
to explicitly create the indexes at startup.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add database indexes on frequently queried FK columns (JobRun, MailMessage,
MailObject, TicketScope, RemarkScope)
- Fix N+1 query in override recomputation by batch loading jobs
- Optimize Daily Jobs page with batch queries:
- Batch load all today's runs in single query
- Batch infer weekly/monthly schedules for all jobs
- Batch load ticket/remark indicators
These changes reduce query count by 80-90% on pages like Daily Jobs and Run Checks,
significantly improving performance on systems with slower storage.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>