Files
TimeTracker/docs/reports
Dries Peeters f0b7e7a6df feat(reports): unpaid-by-salesman scheduled reports and report builder fixes
Scheduled reports (per-salesman, unpaid-only)
- Schedule form: add email distribution (single / SalesmanEmailMapping /
  template) and recipient template when "Split by custom field" is on.
- Support {value} and {value_lower} in recipient_email_template
  (e.g. {value_lower}@test.de).
- Add use_last_month_dates on ReportEmailSchedule: optional "Use previous
  calendar month" for monthly runs; migration 111.
- Override report date range in ScheduledReportService when
  cadence=monthly and use_last_month_dates=true.
- Wire use_last_month_dates through schedule form, API, and
  create_schedule.

Report Builder
- Add "Unpaid time entries" quick-start (Time Entries + unpaid only +
  last 30 days) and applyUnpaidPreset().
- Clarify "Unpaid only" help: "Unpaid = billable, not yet on any invoice."
- Define canvas at top of script so edit-mode IIFE and addDataSourceToCanvas
  can use it; fix applyUnpaidPreset/onclick when script failed to parse.
- Click-to-add for Data Sources and Components (in addition to drag-and-drop).
- Set dataTransfer.effectAllowed = 'copy' in dragstart for drop compatibility.
- Fix save-form handler: remove orphan try { with no catch that caused
  SyntaxError and prevented applyUnpaidPreset (and rest of script) from loading.

Documentation
- Add docs/reports/UNPAID_BY_SALESMAN_AND_SCHEDULED_REPORTS.md (unpaid
  definition, unpaid-by-salesman setup, SalesmanEmailMapping, template use).
2026-01-21 15:11:12 +01:00
..

Reports & Analysis

Reports, summaries, and analysis documents for TimeTracker.

📊 Available Reports

📝 Report Types

This directory contains:

  • Bugfix summaries - Historical bugfix documentation
  • Audit reports - System audits and analysis
  • Analysis reports - Feature and system analysis