"use server"; import { ID } from "node-appwrite"; import { Query } from "node-appwrite"; import { createAdminClient } from "./server"; import { requireTenant } from "./tenant-guard"; import { DATABASE_ID, TABLES, ACTIVITY_TYPE_LABELS, type Activity } from "./schema"; import type { AuthState } from "./auth-types"; export type SendTarget = "me" | "team"; export type SendSummaryState = AuthState & { sent?: number }; export async function sendDailySummaryAction( _prev: SendSummaryState, formData: FormData, ): Promise { let ctx; try { ctx = await requireTenant(); } catch { return { ok: false, error: "Oturum geçersiz." }; } const target = (formData.get("target") ?? "me") as SendTarget; if (target === "team" && !["owner", "admin"].includes(ctx.role)) { return { ok: false, error: "Bu işlem için yetkiniz yok." }; } const { tablesDB, teams, users, messaging } = createAdminClient(); const todayStr = new Date().toISOString().split("T")[0]; // "YYYY-MM-DD" const activitiesResult = await tablesDB.listRows({ databaseId: DATABASE_ID, tableId: TABLES.activities, queries: [ Query.equal("tenantId", ctx.tenantId), Query.limit(500), ], }); const allActivities = JSON.parse(JSON.stringify(activitiesResult.rows)) as Activity[]; const todayActivities = allActivities.filter( (a) => a.dueDate?.startsWith(todayStr), ); const dateLabel = new Date().toLocaleDateString("tr-TR", { day: "numeric", month: "long", }); if (target === "me") { const mine = todayActivities.filter( (a) => (a.assigneeId ?? a.createdBy) === ctx.user.id, ); if (mine.length === 0) { return { ok: false, error: "Bugün için planlanmış aktiviteniz bulunmuyor." }; } await messaging.createEmail( ID.unique(), `Bugünün Aktiviteleri — ${dateLabel}`, buildEmailHtml(mine, ctx.user.name), [], [ctx.user.id], [], ); return { ok: true, sent: 1 }; } // send_to_team: her üyeye kendi aktiviteleri const membershipsResult = await teams.listMemberships(ctx.tenantId); let sentCount = 0; for (const m of membershipsResult.memberships) { if (!m.userId || !m.confirm) continue; const memberActivities = todayActivities.filter( (a) => (a.assigneeId ?? a.createdBy) === m.userId, ); if (memberActivities.length === 0) continue; const member = await users.get(m.userId).catch(() => null); if (!member) continue; await messaging.createEmail( ID.unique(), `Bugünün Aktiviteleri — ${dateLabel}`, buildEmailHtml(memberActivities, member.name), [], [m.userId], [], ); sentCount++; } if (sentCount === 0) { return { ok: false, error: "Ekip üyelerinin bugün planlanmış aktivitesi bulunmuyor.", }; } return { ok: true, sent: sentCount }; } function buildEmailHtml(activities: Activity[], name: string): string { const today = new Date().toLocaleDateString("tr-TR", { weekday: "long", year: "numeric", month: "long", day: "numeric", }); const rows = activities .map((a) => { const done = a.completedAt ? `✓ Tamamlandı` : `○ Bekliyor`; const type = ACTIVITY_TYPE_LABELS[a.type] ?? a.type; const desc = a.description ? `
${a.description}
` : ""; return `
${a.title}
${desc} ${type} ${done} `; }) .join(""); return `

Emlak CRM · Günlük Özet

Merhaba, ${name}

${today}

Bugün için ${activities.length} aktivite planlanmış:

${rows}
Aktivite Tür Durum

Bu e-posta Emlak CRM tarafından otomatik olarak gönderilmiştir.

`; }