Proje: Okul.com.tr CRM · Hub: Okul.com.tr CRM — Domain

CRM Duyuru ve Etkinlik Modeli

Paylaşılan Tip

Announcement TypeScript tipi hem duyurular hem etkinlikler için kullanılır. Ayrı bir Event tipi yoktur. type alanı ikisini ayırt eder:

  • Duyurular: type = 'announcement' (veya boş/varsayılan)
  • Etkinlikler: type = 'event'

Announcement Alanları

interface Announcement {
    id: number;
    title: string;
    text: string;
    type: string;            // 'announcement' veya 'event'
    created_by: number;
    sort: number;
    starts_on: string | null;  // Duyurularda opsiyonel, etkinliklerde ZORUNLU
    ends_on: string;           // Duyurularda var, etkinliklerde YOK
    is_active: boolean;
    user?: User;
    creator?: User;
    schools?: School[];
    content_schools?: SchoolAnnouncement[];
    published_home_page_school?: SchoolAnnouncement | null;
    announcementMedia?: Media;
    eventMedias?: Media[];    // Etkinliklerde birden fazla media
    media?: Media;
}

FormValues Farkları

AnnouncementFormValues:

  • starts_on?: string | null — opsiyonel
  • ends_on: string — zorunlu
  • temp_media_urls?: string[] | null

EventFormValues:

  • starts_on: stringzorunlu (announcement’tan farklı)
  • ends_on alanı yok
  • temp_media_urls?: string[] | null

Endpoint Farkı

  • Duyurular: /admin/school-content/announcements
  • Etkinlikler: /admin/school-content/events

Media Farkı

DuyurularEtkinlikler
MediaTypeANNOUNCEMENTSANNOUNCEMENT_EVENTS
MediaRoleIdANNOUNCEMENT_CONTENT (11)EVENTS_ANNOUNCEMENT (18)
Media alanıannouncementMedia (tekil)eventMedias (çoğul, array)

Etkinlikler galeri destekler (@dnd-kit ile drag-drop sıralama).

SchoolAnnouncement (Pivot)

interface SchoolAnnouncement {
    id: number;
    school_id: number;
    announcement_id: number;
    show_home_page: boolean | number;  // okul bazlı anasayfa gösterimi
    announcement_type: string;
}

AnnouncementService.updateShowHomePage(id, schoolId, showHomePage) → bu pivot kaydını günceller.

getById Include’ları

  • Duyurular: includes[]=creator&includes[]=schools&includes[]=contentSchools
  • Etkinlikler: includes[]=creator&includes[]=schools&includes[]=contentSchools&includes[]=eventMedias

Permission’lar (Paylaşılan)

Her ikisi de aynı permission’ları kullanır:

  • add-announcement
  • edit-announcement
  • delete-announcement