diff --git a/backend/repository/campaign.go b/backend/repository/campaign.go index 3a89f9d..531ddae 100644 --- a/backend/repository/campaign.go +++ b/backend/repository/campaign.go @@ -1783,7 +1783,7 @@ func (r *Campaign) GetCampaignStats(ctx context.Context, campaignID *uuid.UUID) func (r *Campaign) GetAllCampaignStats(ctx context.Context, companyID *uuid.UUID) ([]database.CampaignStats, error) { var stats []database.CampaignStats - db := r.DB.WithContext(ctx).Order("created_at DESC") + db := r.DB.WithContext(ctx).Order("campaign_start_date DESC NULLS LAST, created_at DESC") if companyID != nil { db = db.Where("company_id = ?", companyID) @@ -1817,7 +1817,7 @@ func (r *Campaign) DeleteCampaignStats(ctx context.Context, campaignID *uuid.UUI func (r *Campaign) GetManualCampaignStats(ctx context.Context, companyID *uuid.UUID) ([]database.CampaignStats, error) { var stats []database.CampaignStats - db := r.DB.WithContext(ctx).Where("campaign_id IS NULL").Order("created_at DESC") + db := r.DB.WithContext(ctx).Where("campaign_id IS NULL").Order("campaign_start_date DESC NULLS LAST, created_at DESC") if companyID != nil { db = db.Where("company_id = ?", companyID) diff --git a/backend/service/campaign.go b/backend/service/campaign.go index 12eabfd..387eae6 100644 --- a/backend/service/campaign.go +++ b/backend/service/campaign.go @@ -4307,18 +4307,10 @@ func (c *Campaign) CreateManualCampaignStats(ctx context.Context, session *model id := uuid.New() now := time.Now() - // Use provided date for created_at and updated_at, or current time if not provided - var statsDate time.Time - if req.CampaignStartDate != nil { - statsDate = *req.CampaignStartDate - } else { - statsDate = now - } - // Set required fields req.ID = &id - req.CreatedAt = &statsDate - req.UpdatedAt = &statsDate + req.CreatedAt = &now + req.UpdatedAt = &now req.CampaignID = nil // No campaign reference for manual stats // Calculate total events diff --git a/frontend/src/lib/components/CampaignTrendChart.svelte b/frontend/src/lib/components/CampaignTrendChart.svelte index 761e7d9..f74ef6b 100644 --- a/frontend/src/lib/components/CampaignTrendChart.svelte +++ b/frontend/src/lib/components/CampaignTrendChart.svelte @@ -287,20 +287,19 @@ // ignore errors } - // Filtered campaigns based on selected time range (using sendStartAt or createdAt) + // Filtered campaigns based on selected time range (using sendStartAt) $: filteredCampaignStats = (() => { if (!campaignStats || campaignStats.length === 0) return []; const range = Number(selectedTimeRange); const now = new Date(); const cutoff = new Date(now.getFullYear(), now.getMonth() - range + 1, 1); return campaignStats.filter((c) => { - const startDate = c.sendStartAt - ? new Date(c.sendStartAt) - : c.createdAt - ? new Date(c.createdAt) - : c.date instanceof Date - ? c.date - : new Date(c.date); + // filter out stats with no dates (data integrity issue) + if (!c.campaignStartDate && !c.createdAt) { + console.warn('Filtering out campaign stat with missing dates:', c); + return false; + } + const startDate = c.campaignStartDate ? new Date(c.campaignStartDate) : new Date(c.createdAt); return startDate >= cutoff; }); })(); @@ -335,17 +334,18 @@ }; })(); - // Update chartData to use filteredCampaignStats, using sendStartAt or createdAt as date, and sort by date ascending + // Update chartData to use filteredCampaignStats, using sendStartAt as date, and sort by date ascending $: chartData = filteredCampaignStats + .filter((c) => { + if (!c.campaignStartDate && !c.createdAt) { + console.warn('Skipping campaign stat with missing dates in chart data:', c); + return false; + } + return true; + }) .map((c) => ({ ...c, - date: c.sendStartAt - ? new Date(c.sendStartAt) - : c.createdAt - ? new Date(c.createdAt) - : c.date instanceof Date - ? c.date - : new Date(c.date), + date: c.campaignStartDate ? new Date(c.campaignStartDate) : new Date(c.createdAt), name: c.campaignName || c.name || c.title || '' })) .sort((a, b) => a.date.getTime() - b.date.getTime()); diff --git a/frontend/src/routes/company/[id]/stats/+page.svelte b/frontend/src/routes/company/[id]/stats/+page.svelte index 7d4b0a8..0e7eb20 100644 --- a/frontend/src/routes/company/[id]/stats/+page.svelte +++ b/frontend/src/routes/company/[id]/stats/+page.svelte @@ -417,7 +417,7 @@ alignText="center" value={`${pct.reported.count} (${pct.reported.absolute}%, rel: ${pct.reported.relative}%)`} /> - +