export type Paginated = { count: number; next: string | null; previous: string | null; results: T[]; }; export type UserStatus = | 'inactive' | 'gm' | 'gm_admin' | 'buh' | 'bu_admin' | 'director' | 'director_admin' | 'account_admin' | 'superuser'; export type User = { id: number; user_name: string; display_name: string; status: UserStatus; is_superuser?: boolean; managed_by?: number | null; managed_by_name?: string | null; managed_by_pending?: number | null; managed_by_pending_name?: string | null; managed_by_requested_at?: string | null; created_at: string; updated_at: string; }; export type UserWrite = { user_name: string; display_name: string; status: UserStatus; password?: string; managed_by?: number | null; }; export type ActiveSite = { id: number; code: string; name: string; source_site_id: string; api_base_url: string; has_api_key: boolean; managed_by?: number | null; managed_by_name?: string | null; is_active: boolean; last_synced_at: string | null; last_sync_status: string; last_sync_message: string; created_at: string; updated_at: string; }; export type ActiveSiteWrite = { code: string; name?: string; api_base_url?: string; api_key?: string; is_active?: boolean; }; export type ActiveSiteSyncSummary = { active_site_id: number; status: string; message: string; kandangs: number; cycles: number; flocks: number; selected_cycles: number; series_rows: Record; iot_panels: number; }; export type ActiveSiteSyncResponse = { detail: string; summary?: ActiveSiteSyncSummary; summaries?: ActiveSiteSyncSummary[]; active_site?: ActiveSite; active_site_count?: number; }; export type Site = { id: string; site_name: string; user: number; owner_name?: string; active_site?: number | null; created_at: string; updated_at: string; }; export type Kandang = { id: number; kandang_name: string; site: string; created_at: string; updated_at: string; }; export type Flock = { id: number; flock_name: string; kandang: number; created_at: string; updated_at: string; }; export type CycleStatus = 'active' | 'pending_close' | 'closed'; export type Cycle = { id: number; kandang: number; kandang_name: string; total_days: number; current_day: number; visible_through_date: string; soft_end_date?: string; start_date: string; end_date: string | null; chick_in_weight: number; doc_in_count: number; feed_initial_balance: number; feed_initial_balance_date?: string | null; feed_initial_balance_iot?: number | null; feed_initial_balance_accuracy?: number | null; feed_initial_balance_sync_error?: string | null; status: CycleStatus; active_site?: number | null; source_cycle_id?: number | null; proposed_end_date?: string | null; close_requested_at?: string | null; close_requested_by?: number | null; close_approved_by?: number | null; close_approved_at?: string | null; created_at: string; updated_at: string; }; export type KPI = { id: number; cycle: number; kandang: number; flock_id: number; date: string; age: number; mortality: number; mortality_total: number; feed: number; feed_total: number; harvest: number; harvest_total: number; harvest_weight: number; harvest_weight_total: number; chicken_life: number; chicken_life_percentage: number; iot_weight: number; average_harvest_day: number; average_harvest_weight: number; fcr: number; eef: number; cc: number; cw: number; fs: number; manual: number; created_at: string; updated_at: string; }; export type ManualInput = { id: number; cycle: number; kandang: number; flock_id: number; date: string; age_manual: number; mortality_manual: number; mortality_manual_total: number; feed_in_manual: number; feed_use_manual: number; feed_in_manual_total: number; feed_use_manual_total: number; feed_out_manual: number; feed_out_manual_total: number; harvest_manual: number; harvest_manual_total: number; harvest_weight_manual: number; harvest_weight_manual_total: number; manual_weight: number; average_harvest_day_manual: number; average_harvest_weight_manual: number; fcr_manual: number; eef_manual: number; created_at: string; updated_at: string; }; export type ChickenCounting = { id: number; cycle: number; kandang: number; flock_id: number; date: string; total_count: number; mortality_count: number; created_at: string; updated_at: string; }; export type ChickenWeight = { id: number; cycle: number; kandang: number; flock_id: number; date: string; age: number; doc_weight: number; average_weight: number; chicken_count: number; uniformity: number; average_daily_gain: number; created_at: string; updated_at: string; }; export type LatestAvg = { average_weight: number; date: string; age: number; uniformity: number; average_daily_gain: number; cycle: number; kandang: number; }; export type Karung = { id: number; cycle: number; kandang: number; flock_id: number; date: string; in_today: number; out_today: number; in_total: number; out_total: number; feed_use_today: number; feed_use_total: number; created_at: string; updated_at: string; }; export type PanelIoT = { id: number; flock: number; flock_id: number; kandang: number | null; date: string; timestamp: string | null; wind_speed: number; humidity: number; water_total: number; average_temperature: number; experience_temperature: number; created_at: string; updated_at: string; }; export type AIInsight = { id: number; cycle: number; kandang: number | null; flock_id?: number; date: string; insight_text: string; /** Condition from graded facts: healthy | warning | critical | unknown */ alert: string; topic: string; report_type: string; report_period: string; summary?: string; citations?: InsightCitation[]; section?: string; session?: string; created_at: string; updated_at: string; }; export type InsightReportType = 'page' | 'daily' | 'weekly' | 'end_cycle'; export type InsightTopic = | 'hitung_ayam' | 'berat_ayam' | 'fcr' | 'eef' | 'iot_panel' | 'hitung_karung' | 'dashboard'; export type InsightCitation = { id?: string; title?: string; chapter?: string; excerpt?: string; source?: string; }; /** * Curated page context sent to the insight service. * `kandangId` is required — never generate for "all kandang". */ export type InsightContext = { kandangId: number; kandangName?: string; cycleId?: number; hari_ke?: number | null; totalDays?: number | null; periode?: string | null; [key: string]: unknown; }; export type InsightGenerateParams = { cycle_id: number; kandang_id: number; topic: InsightTopic | string; report_type?: InsightReportType; report_period?: string | null; context: InsightContext; force_refresh?: boolean; }; export type InsightCachedParams = { cycle_id: number; kandang_id: number; topic: InsightTopic | string; report_type?: InsightReportType; report_period?: string | null; }; export type InsightJobStage = | 'queued' | 'starting' | 'grading' | 'retrieving' | 'synthesizing' | 'saving' | 'done' | 'error'; export type InsightGenerateJob = { job_id: string; status: 'queued' | 'running' | 'done' | 'error'; }; export type InsightJobStatus = InsightGenerateJob & { stage: InsightJobStage; result: InsightApiResponse | null; error: string | null; }; export type InsightStatusLabel = 'ok' | 'warning' | 'critical' | 'unknown'; export type InsightStructuredSection = { status: InsightStatusLabel; bullets: string[]; evidence: string[]; actions: string[]; }; export type InsightStructuredReport = { summary: { headline: string; bullets: string[]; risks: string[]; actions: string[]; }; detailed?: Partial< Record< 'hitung_ayam' | 'berat_ayam' | 'fcr' | 'eef' | 'panel_iot' | 'data_quality', InsightStructuredSection > >; }; /** Structured end-cycle insight (Masalah / Akar penyebab / Perbaikan). */ export type EndCycleRootCause = { id?: string; hipotesis: string; bukti: string[]; confidence?: 'high' | 'med' | 'low' | string; fase?: string; }; export type EndCycleAction = { id?: string; fase: string; aksi: string; metrik_pantau?: string; }; export type EndCycleStructuredInsight = { kesimpulan: string; masalah: string[]; akar_penyebab: EndCycleRootCause[]; perbaikan_siklus_berikutnya: EndCycleAction[]; insight?: string; }; /** Response from generate / cached insight endpoints. */ export type InsightApiResponse = { success?: boolean; insight_text: string; summary?: string; insight?: string; structured?: InsightStructuredReport | null; structured_end_cycle?: EndCycleStructuredInsight | null; citations?: InsightCitation[]; message?: string; }; export type KarungRequestResult = { karung: Karung; upstream: Record; }; export type CycleFilter = { cycle_id?: number; kandang_id?: number; site_id?: string; flock_id?: number; date?: string; status?: CycleStatus; }; export type SiteWrite = { site_name: string; user: number }; export type KandangWrite = { kandang_name: string; site: string; }; export type FlockWrite = { flock_name: string; kandang: number; }; export type CycleWrite = { kandang: number; total_days?: number; current_day?: number; start_date: string; end_date?: string | null; chick_in_weight: number; doc_in_count: number; feed_initial_balance?: number; feed_initial_balance_date?: string | null; status?: CycleStatus; }; export type CountingWrite = { cycle: number; date: string; total_count?: number; mortality_count?: number; }; export type ManualInputWrite = { cycle: number; date?: string; age_manual?: number; mortality_manual?: number; feed_in_manual?: number; feed_use_manual?: number; feed_out_manual?: number; harvest_manual?: number; harvest_weight_manual?: number; manual_weight?: number; };