mirror of
https://github.com/temetro/temetro.git
synced 2026-07-26 20:08:14 +00:00
3aa699aefe
real Live card, persistent chat history Analytics & earnings: - Analytics now carries real money computed from invoices (billed/paid/ outstanding + by-month); new Earnings section on the Analysis page drawn with the project's Bklit chart components (shared EarningsChart). AI agent reaches the whole clinic: - new read tools getClinicInfo / getAnalytics / listInventory render clinic, analytics (with a Bklit earnings chart) and inventory cards in chat - proposeInvoice turns an uploaded purchase/medication list into an invoice (new "invoice" action-preview kind → createInvoice); invoices/appointments auto-create/link a patient (ensurePatient) so they hit the Patients page Live card: - plots real data — patients checked in today — via GET /api/analytics/live (polled); value pill clamped and margins widened so nothing spills the card Persistent AI chat history (Claude-style): - ai_chat_threads + ai_chat_messages (migration 0016); per-user, org-scoped thread CRUD under /api/chat/threads - chat panel owns a thread id, loads /?thread=<id>, and auto-saves after each exchange; sidebar lists past chats (open/delete), "New chat" starts fresh Verified with backend typecheck + frontend tsc + next build. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
49 lines
1.2 KiB
TypeScript
49 lines
1.2 KiB
TypeScript
import { apiFetch } from "@/lib/api-client";
|
|
|
|
// Server-computed clinic analytics. Mirrors the backend `src/types/analytics.ts`.
|
|
// All figures are aggregates over the active clinic's real data.
|
|
export type TrendPoint = { label: string; count: number };
|
|
export type EarningsPoint = { label: string; billed: number; paid: number };
|
|
|
|
export type Analytics = {
|
|
patients: {
|
|
total: number;
|
|
newThisMonth: number;
|
|
active: number;
|
|
};
|
|
appointments: {
|
|
thisWeek: number;
|
|
completed: number;
|
|
cancelled: number;
|
|
upcoming: number;
|
|
};
|
|
prescriptions: {
|
|
total: number;
|
|
active: number;
|
|
};
|
|
tasks: {
|
|
open: number;
|
|
done: number;
|
|
};
|
|
earnings: {
|
|
totalBilled: number;
|
|
totalPaid: number;
|
|
totalOutstanding: number;
|
|
byMonth: EarningsPoint[];
|
|
};
|
|
trends: {
|
|
patientsByMonth: TrendPoint[];
|
|
appointmentsByWeekday: TrendPoint[];
|
|
};
|
|
};
|
|
|
|
export function getAnalytics(): Promise<Analytics> {
|
|
return apiFetch<Analytics>("/api/analytics");
|
|
}
|
|
|
|
// Current "in the building now" count — checked-in appointments today. Polled by
|
|
// the Analysis Live card.
|
|
export function getLiveMetric(): Promise<{ value: number }> {
|
|
return apiFetch<{ value: number }>("/api/analytics/live");
|
|
}
|