Cc { get; set; } = new();
public string Subject { get; set; } = "{ClientName} — {ReportName}";
/// HTML body. Placeholders are substituted before sending.
public string Body { get; set; } =
"Hello,
Please find attached the {ReportType} report \"{ReportName}\" for {ClientName}, generated on {DateUtc} UTC.
";
}
///
/// A user-defined schedule that generates a report for a single client (profile)
/// on a recurrence. Persisted to schedules.json.
///
public class ScheduledReport
{
public string Id { get; set; } = Guid.NewGuid().ToString();
/// this schedule belongs to.
public string ProfileId { get; set; } = string.Empty;
/// Human label shown in the UI.
public string Name { get; set; } = string.Empty;
public ReportType Type { get; set; }
public ScheduledReportOptions Options { get; set; } = new();
/// When true, run against every site in the tenant (site discovery); otherwise use .
public bool AllSites { get; set; } = true;
public List SiteUrls { get; set; } = new();
public ReportMergeMode MergeMode { get; set; } = ReportMergeMode.SingleMerged;
public ReportFormat Format { get; set; } = ReportFormat.Html;
public RecurrenceRule Recurrence { get; set; } = new();
/// Optional Graph email delivery of the generated report.
public ReportEmailSettings Email { get; set; } = new();
public bool Enabled { get; set; } = true;
public string CreatedBy { get; set; } = string.Empty;
public DateTime CreatedUtc { get; set; } = DateTime.UtcNow;
public DateTime? LastRunUtc { get; set; }
public DateTime? NextRunUtc { get; set; }
}