mirror of
https://github.com/temetro/temetro.git
synced 2026-09-01 05:18:57 +00:00
feat: clinic-wide AI (analytics/earnings/inventory + invoice-from-file),
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>
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
"use client";
|
||||
|
||||
import { Bar } from "@/components/charts/bar";
|
||||
import { BarChart } from "@/components/charts/bar-chart";
|
||||
import { BarXAxis } from "@/components/charts/bar-x-axis";
|
||||
import { Grid } from "@/components/charts/grid";
|
||||
import { ChartTooltip } from "@/components/charts/tooltip";
|
||||
import type { EarningsPoint } from "@/lib/analytics";
|
||||
|
||||
// Earnings by month — billed vs paid — drawn with the project's Bklit chart
|
||||
// components (the vendored visx chart family under components/charts). Shared by
|
||||
// the Analysis page and the chat analytics card.
|
||||
export function EarningsChart({
|
||||
data,
|
||||
aspectRatio = "2 / 1",
|
||||
}: {
|
||||
data: EarningsPoint[];
|
||||
aspectRatio?: string;
|
||||
}) {
|
||||
const chartData = data.map((d) => ({
|
||||
name: d.label,
|
||||
billed: d.billed,
|
||||
paid: d.paid,
|
||||
}));
|
||||
return (
|
||||
<BarChart aspectRatio={aspectRatio} data={chartData}>
|
||||
<Grid horizontal />
|
||||
<Bar dataKey="billed" fill="var(--chart-line-primary)" />
|
||||
<Bar dataKey="paid" fill="var(--chart-2)" />
|
||||
<BarXAxis />
|
||||
<ChartTooltip showDatePill={false} />
|
||||
</BarChart>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user