Compare commits

...
10 Commits
Author SHA1 Message Date
GiteadandClaude Sonnet 4.6 00fd213291 feat: add Dental Office Name to Lab RX form, pre-filled from office contact settings
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-03 21:21:59 -04:00
GiteadandClaude Sonnet 4.6 191ed129d8 feat: replace DOB with Age in Lab RX form, auto-calculated from patient DOB
Age is pre-filled when opening the RX popup by calculating from patient.dateOfBirth.
The field is editable in case of override. Both preview card and print output
now show Age instead of DOB.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-03 21:06:44 -04:00
GiteadandClaude Sonnet 4.6 305a07874d fix: add selenium-settings-card.jsx and wire it into settings-page.jsx
selenium-settings-card.jsx didn't exist and settings-page.jsx was missing
the import and case "selenium" handler, so the Selenium settings section
was invisible on other PCs running the .jsx files.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-03 00:13:49 -04:00
GiteadandClaude Sonnet 4.6 6e779fc630 fix: update lab-management-tab.jsx and add lab-rx-modal.jsx
JSX files were missing the Lab RX feature — lab-management-tab.jsx still had
the old lab order table UI, and lab-rx-modal.jsx didn't exist. The app on
other PCs runs .jsx files, so git pull wasn't showing the new Lab RX feature.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-03 00:12:10 -04:00
GiteadandClaude Sonnet 4.6 ce2e03e505 feat: pre-fill doctor name with default NPI provider in Lab RX popup
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 23:55:23 -04:00
GiteadandClaude Sonnet 4.6 75ecd7cc20 feat: add Selenium Settings page to configure paymentGroupId per office
Adds a new Settings → Advanced → Selenium Settings page where the office
name (paymentGroupId) used in United/DentalHub portal dropdowns can be
configured without touching code. Previously hardcoded as "Summit Dental
Care"; now injected from DB into the three United workers at job dispatch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 23:53:43 -04:00
GiteadandClaude Sonnet 4.6 abb2a0ac96 feat: add Lab RX feature with template management and auto-seed defaults
- New lab_rx_template table with sortOrder and Prisma migrations
- Backend CRUD + reorder routes at /api/lab-rx/templates
- Auto-seeds 3 Highland Dental Studio defaults on first use per user
- LabRxModal: template picker, inline rename, up/down reorder, full
  template form with sections (Template Name / Lab Info / Case Details)
- RX popup: Tooth Number, Shade, Due Date, Doctor (from NPI providers),
  Instructions pre-filled with "Please make / Thank you!", print output
- lab-rx-templates.ts config file for future git-managed additions

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 23:20:44 -04:00
GiteadandClaude Sonnet 4.6 ac4d8c4c74 feat: add lab management layout, barcode generation, and dental education page
- Redesign lab management tab with patient search table and action buttons
- Add react-barcode integration: generates CODE128 barcode from patient name with print and download support
- Add Dental Education page and sidebar entry between Cloud Storage and AI Input Agent

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 13:03:58 -04:00
GiteadandClaude Sonnet 4.6 998ef0ac95 feat: add POE and period exam aliases → D0120 in CDT lookup
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 23:58:56 -04:00
GiteadandClaude Sonnet 4.6 15a1091f35 fix: stop premature chatbot claim queue advance + skip preview popup mid-batch
handleClaimSubmit advanced the chatbot batch claim queue right after creating
the DB claim record, before the Selenium job even ran. This caused only the
last patient in a multi-patient claim batch to get its PDF saved to
Documents — earlier patients' job tracking got overwritten by the next
patient's submission before their PDF download could complete.

Also make advanceChatbotClaimQueue() report whether it navigated to another
queued patient, and skip the auto PDF preview popup in that case so it only
opens for the last/standalone claim.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 23:44:21 -04:00
321 changed files with 10052 additions and 901 deletions
+4
View File
@@ -44,6 +44,8 @@ const ALIAS_MAP: Record<string, string> = {
// Exams
"perio exam": "periodic oral evaluation",
"periodic exam": "periodic oral evaluation",
"period exam": "periodic oral evaluation",
"poe": "periodic oral evaluation",
"recall exam": "periodic oral evaluation",
"comp exam": "comprehensive oral evaluation",
"comprehensive exam": "comprehensive oral evaluation",
@@ -150,6 +152,8 @@ const ALIAS_MAP: Record<string, string> = {
// or short abbreviations that need precise mapping (checked before keyword search)
const DIRECT_CODE_MAP: Record<string, string> = {
// Exams
"poe": "D0120",
"period exam": "D0120",
"limited exam": "D0140",
"emergency exam": "D0140",
// X-rays
+4
View File
@@ -43,6 +43,8 @@ import shoppingVendorsRoutes from "./shopping-vendors";
import feeScheduleRoutes from "./feeSchedule";
import licenseRoutes from "./license";
import insuranceStatusBcbsMaRoutes from "./insuranceStatusBcbsMa";
import labRxRoutes from "./lab-rx";
import seleniumSettingsRoutes from "./selenium-settings";
const router = Router();
@@ -90,5 +92,7 @@ router.use("/commissions", commissionsRoutes);
router.use("/shopping-vendors", shoppingVendorsRoutes);
router.use("/fee-schedule", feeScheduleRoutes);
router.use("/license", licenseRoutes);
router.use("/lab-rx", labRxRoutes);
router.use("/selenium-settings", seleniumSettingsRoutes);
export default router;
@@ -3,6 +3,7 @@ import { storage } from "../storage";
import { enqueueSeleniumJob } from "../queue/jobRunner";
import { forwardOtpToSeleniumUnitedDHClaimAgent } from "../services/seleniumUnitedDHClaimClient";
import { io } from "../socket";
import { prisma as db } from "@repo/db/client";
const router = Router();
@@ -40,11 +41,14 @@ router.post("/uniteddh-claim", async (req: Request, res: Response): Promise<any>
});
}
const seleniumSettings = await db.seleniumSettings.findUnique({ where: { userId: req.user.id } });
const enrichedPayload = {
claim: {
...claimData,
uniteddhUsername: credentials.username,
uniteddhPassword: credentials.password,
paymentGroupId: seleniumSettings?.paymentGroupId ?? "",
},
};
@@ -3,6 +3,7 @@ import { storage } from "../storage";
import { enqueueSeleniumJob } from "../queue/jobRunner";
import { forwardOtpToSeleniumUnitedDHPreAuthAgent } from "../services/seleniumUnitedDHPreAuthClient";
import { io } from "../socket";
import { prisma as db } from "@repo/db/client";
const router = Router();
@@ -40,11 +41,14 @@ router.post("/uniteddh-preauth", async (req: Request, res: Response): Promise<an
});
}
const seleniumSettings = await db.seleniumSettings.findUnique({ where: { userId: req.user.id } });
const enrichedPayload = {
claim: {
...claimData,
uniteddhUsername: credentials.username,
uniteddhPassword: credentials.password,
paymentGroupId: seleniumSettings?.paymentGroupId ?? "",
},
};
@@ -3,6 +3,7 @@ import { storage } from "../storage";
import { forwardOtpToSeleniumUnitedSCOAgent } from "../services/seleniumUnitedSCOEligibilityClient";
import { io } from "../socket";
import { enqueueSeleniumJob } from "../queue/jobRunner";
import { prisma as db } from "@repo/db/client";
const router = Router();
@@ -62,10 +63,13 @@ router.post(
});
}
const seleniumSettings = await db.seleniumSettings.findUnique({ where: { userId: req.user.id } });
const enrichedData = {
...rawData,
unitedscoUsername: credentials.username,
unitedscoPassword: credentials.password,
paymentGroupId: seleniumSettings?.paymentGroupId ?? "",
};
const socketId: string | undefined = req.body.socketId;
+92
View File
@@ -0,0 +1,92 @@
import express, { Request, Response } from "express";
import { storage } from "../storage";
const router = express.Router();
router.get("/templates", async (req: Request, res: Response): Promise<any> => {
try {
const userId = req.user?.id;
if (!userId) return res.status(401).json({ message: "Unauthorized" });
const templates = await storage.getLabRxTemplates(userId);
return res.json(templates);
} catch (err) {
return res.status(500).json({ error: "Failed to fetch lab RX templates", details: String(err) });
}
});
router.post("/templates", async (req: Request, res: Response): Promise<any> => {
try {
const userId = req.user?.id;
if (!userId) return res.status(401).json({ message: "Unauthorized" });
const { name, labName, labPhone, labFax, labAddress, labAccount, caseType, material, instructions } = req.body;
if (!name?.trim()) return res.status(400).json({ message: "Template name is required" });
const template = await storage.createLabRxTemplate(userId, {
name: name.trim(),
labName: labName?.trim() || undefined,
labPhone: labPhone?.trim() || undefined,
labFax: labFax?.trim() || undefined,
labAddress: labAddress?.trim() || undefined,
labAccount: labAccount?.trim() || undefined,
caseType: caseType?.trim() || undefined,
material: material?.trim() || undefined,
instructions: instructions?.trim() || undefined,
});
return res.status(201).json(template);
} catch (err) {
return res.status(500).json({ error: "Failed to create lab RX template", details: String(err) });
}
});
router.put("/templates/:id", async (req: Request, res: Response): Promise<any> => {
try {
const userId = req.user?.id;
if (!userId) return res.status(401).json({ message: "Unauthorized" });
const id = Number(req.params.id);
if (isNaN(id)) return res.status(400).json({ message: "Invalid ID" });
const { name, labName, labPhone, labFax, labAddress, labAccount, caseType, material, instructions } = req.body;
if (name !== undefined && !name?.trim()) return res.status(400).json({ message: "Name cannot be empty" });
const template = await storage.updateLabRxTemplate(userId, id, {
name: name?.trim(),
labName: labName?.trim() || undefined,
labPhone: labPhone?.trim() || undefined,
labFax: labFax?.trim() || undefined,
labAddress: labAddress?.trim() || undefined,
labAccount: labAccount?.trim() || undefined,
caseType: caseType?.trim() || undefined,
material: material?.trim() || undefined,
instructions: instructions?.trim() || undefined,
});
return res.json(template);
} catch (err) {
return res.status(500).json({ error: "Failed to update lab RX template", details: String(err) });
}
});
router.post("/templates/reorder", async (req: Request, res: Response): Promise<any> => {
try {
const userId = req.user?.id;
if (!userId) return res.status(401).json({ message: "Unauthorized" });
const { orderedIds } = req.body;
if (!Array.isArray(orderedIds)) return res.status(400).json({ message: "orderedIds must be an array" });
await storage.reorderLabRxTemplates(userId, orderedIds);
return res.status(204).send();
} catch (err) {
return res.status(500).json({ error: "Failed to reorder templates", details: String(err) });
}
});
router.delete("/templates/:id", async (req: Request, res: Response): Promise<any> => {
try {
const userId = req.user?.id;
if (!userId) return res.status(401).json({ message: "Unauthorized" });
const id = Number(req.params.id);
if (isNaN(id)) return res.status(400).json({ message: "Invalid ID" });
const ok = await storage.deleteLabRxTemplate(userId, id);
if (!ok) return res.status(404).json({ message: "Template not found" });
return res.status(204).send();
} catch (err) {
return res.status(500).json({ error: "Failed to delete lab RX template", details: String(err) });
}
});
export default router;
@@ -0,0 +1,42 @@
import { Router, Request, Response } from "express";
import { prisma as db } from "@repo/db/client";
const router = Router();
// GET /api/selenium-settings
router.get("/", async (req: Request, res: Response): Promise<any> => {
try {
const userId = req.user?.id;
if (!userId) return res.status(401).json({ message: "Unauthorized" });
const settings = await db.seleniumSettings.findUnique({ where: { userId } });
return res.status(200).json({ paymentGroupId: settings?.paymentGroupId ?? "" });
} catch (err) {
return res.status(500).json({ error: "Failed to fetch Selenium settings", details: String(err) });
}
});
// PUT /api/selenium-settings
router.put("/", async (req: Request, res: Response): Promise<any> => {
try {
const userId = req.user?.id;
if (!userId) return res.status(401).json({ message: "Unauthorized" });
const { paymentGroupId } = req.body;
if (typeof paymentGroupId !== "string") {
return res.status(400).json({ message: "paymentGroupId must be a string" });
}
const settings = await db.seleniumSettings.upsert({
where: { userId },
update: { paymentGroupId: paymentGroupId.trim() },
create: { userId, paymentGroupId: paymentGroupId.trim() },
});
return res.status(200).json({ paymentGroupId: settings.paymentGroupId });
} catch (err) {
return res.status(500).json({ error: "Failed to save Selenium settings", details: String(err) });
}
});
export default router;
+2
View File
@@ -25,6 +25,7 @@ import { procedureTimeslotStorage } from "./procedure-timeslot-storage";
import { insuranceContactStorage } from "./insurance-contact-storage";
import { commissionsStorage } from "./commissions-storage";
import { shoppingVendorStorage } from "./shopping-vendor-storage";
import { labRxStorage } from "./lab-rx-storage";
export const storage = {
@@ -53,6 +54,7 @@ export const storage = {
...insuranceContactStorage,
...commissionsStorage,
...shoppingVendorStorage,
...labRxStorage,
};
@@ -0,0 +1,90 @@
import { prisma as db } from "@repo/db/client";
export type LabRxTemplateInput = {
name: string;
labName?: string;
labPhone?: string;
labFax?: string;
labAddress?: string;
labAccount?: string;
caseType?: string;
material?: string;
instructions?: string;
};
const DEFAULT_TEMPLATES: LabRxTemplateInput[] = [
{
name: "Highland Dental Crown",
labName: "Highland Dental Studio",
labPhone: "781-552-5198",
labAddress: "87 Cambridge Street, Burlington, MA 01803",
caseType: "Crown",
material: "Zirconia",
},
{
name: "Highland Dental Full Denture",
labName: "Highland Dental Studio",
labPhone: "781-552-5198",
labAddress: "87 Cambridge Street, Burlington, MA 01803",
caseType: "Full Denture",
},
{
name: "Highland Dental Partial Denture",
labName: "Highland Dental Studio",
labPhone: "781-552-5198",
labAddress: "87 Cambridge Street, Burlington, MA 01803",
caseType: "Partial Denture",
},
];
export const labRxStorage = {
async getLabRxTemplates(userId: number) {
const existing = await db.labRxTemplate.findMany({
where: { userId },
orderBy: { sortOrder: "asc" },
});
if (existing.length === 0) {
await db.labRxTemplate.createMany({
data: DEFAULT_TEMPLATES.map((t, index) => ({ userId, sortOrder: index, ...t })),
});
return db.labRxTemplate.findMany({
where: { userId },
orderBy: { sortOrder: "asc" },
});
}
return existing;
},
async reorderLabRxTemplates(userId: number, orderedIds: number[]) {
await db.$transaction(
orderedIds.map((id, index) =>
db.labRxTemplate.updateMany({
where: { id, userId },
data: { sortOrder: index },
})
)
);
},
async createLabRxTemplate(userId: number, data: LabRxTemplateInput) {
return db.labRxTemplate.create({
data: { userId, ...data },
});
},
async updateLabRxTemplate(userId: number, id: number, data: Partial<LabRxTemplateInput>) {
return db.labRxTemplate.update({
where: { id, userId },
data,
});
},
async deleteLabRxTemplate(userId: number, id: number) {
const existing = await db.labRxTemplate.findFirst({ where: { id, userId } });
if (!existing) return false;
await db.labRxTemplate.delete({ where: { id } });
return true;
},
};
+1
View File
@@ -68,6 +68,7 @@
"pdfjs-dist": "^3.11.174",
"postcss": "^8.4.47",
"react": "^19.1.0",
"react-barcode": "^1.6.1",
"react-contexify": "^6.0.0",
"react-day-picker": "9.7.0",
"react-dnd": "^16.0.1",
+2
View File
@@ -29,6 +29,7 @@ const ReportsPage = lazy(() => import("./pages/reports-page"));
const CloudStoragePage = lazy(() => import("./pages/cloud-storage-page"));
const JobMonitorPage = lazy(() => import("./pages/job-monitor-page"));
const ChartPage = lazy(() => import("./pages/chart-page"));
const DentalEducationPage = lazy(() => import("./pages/dental-education-page"));
const AiInputAgentPage = lazy(() => import("./pages/ai-input-agent-page"));
const DentalShoppingSearchTagPage = lazy(() => import("./pages/dental-shopping-search-tag-page"));
const DentalShoppingLoginInfoPage = lazy(() => import("./pages/dental-shopping-login-info-page"));
@@ -65,6 +66,7 @@ function Router() {
/>
<ProtectedRoute path="/reports" component={() => <ReportsPage />} />
<ProtectedRoute path="/cloud-storage" component={() => <CloudStoragePage />} />
<ProtectedRoute path="/dental-education" component={() => <DentalEducationPage />} />
<ProtectedRoute path="/ai-input-agent" component={() => <AiInputAgentPage />} />
<ProtectedRoute path="/dental-shopping/search-tag" component={() => <DentalShoppingSearchTagPage />} />
<ProtectedRoute path="/dental-shopping/login-info" component={() => <DentalShoppingLoginInfoPage />} />
@@ -0,0 +1,116 @@
import { useRef } from "react";
import Barcode from "react-barcode";
import {
Dialog,
DialogContent,
DialogHeader,
DialogTitle,
DialogFooter,
} from "@/components/ui/dialog";
import { Button } from "@/components/ui/button";
import { Download, Printer } from "lucide-react";
import { Patient } from "@repo/db/types";
interface BarcodeModalProps {
open: boolean;
onClose: () => void;
patient: Patient;
}
export function BarcodeModal({ open, onClose, patient }: BarcodeModalProps) {
const barcodeRef = useRef<HTMLDivElement>(null);
const patientLabel = `${patient.firstName ?? ""} ${patient.lastName ?? ""}`.trim();
const barcodeValue = patientLabel || "PATIENT";
const handlePrint = () => {
const svg = barcodeRef.current?.querySelector("svg");
if (!svg) return;
const svgData = new XMLSerializer().serializeToString(svg);
const printWindow = window.open("", "_blank", "width=400,height=300");
if (!printWindow) return;
printWindow.document.write(`
<!DOCTYPE html>
<html>
<head>
<title>Barcode — ${patientLabel}</title>
<style>
body { margin: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100vh; font-family: sans-serif; }
p { margin: 4px 0 0; font-size: 13px; color: #333; }
</style>
</head>
<body>
${svgData}
<p>${patientLabel}</p>
<script>window.onload = () => { window.print(); window.close(); }<\/script>
</body>
</html>
`);
printWindow.document.close();
};
const handleDownload = () => {
const svg = barcodeRef.current?.querySelector("svg");
if (!svg) return;
const canvas = document.createElement("canvas");
const svgData = new XMLSerializer().serializeToString(svg);
const img = new Image();
const svgBlob = new Blob([svgData], { type: "image/svg+xml;charset=utf-8" });
const url = URL.createObjectURL(svgBlob);
img.onload = () => {
canvas.width = img.width;
canvas.height = img.height;
const ctx = canvas.getContext("2d")!;
ctx.fillStyle = "#ffffff";
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(img, 0, 0);
URL.revokeObjectURL(url);
const link = document.createElement("a");
link.download = `barcode-${patientLabel.replace(/\s+/g, "-")}.png`;
link.href = canvas.toDataURL("image/png");
link.click();
};
img.src = url;
};
return (
<Dialog open={open} onOpenChange={onClose}>
<DialogContent className="max-w-sm">
<DialogHeader>
<DialogTitle>Patient Barcode</DialogTitle>
</DialogHeader>
<div className="flex flex-col items-center gap-3 py-4">
<div ref={barcodeRef}>
<Barcode
value={barcodeValue}
format="CODE128"
width={2}
height={80}
displayValue={true}
fontSize={13}
margin={10}
/>
</div>
</div>
<DialogFooter className="gap-2">
<Button variant="outline" onClick={handlePrint} className="gap-2">
<Printer className="h-4 w-4" />
Print
</Button>
<Button onClick={handleDownload} className="gap-2">
<Download className="h-4 w-4" />
Download PNG
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
);
}
@@ -1,258 +1,81 @@
import { useState } from "react";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Textarea } from "@/components/ui/textarea";
import { Badge } from "@/components/ui/badge";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select";
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table";
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog";
import { Plus, Pencil, Trash2, Package } from "lucide-react";
const STATUS_COLORS = {
pending: "bg-yellow-100 text-yellow-700 border-yellow-200",
"in-lab": "bg-blue-100 text-blue-700 border-blue-200",
received: "bg-green-100 text-green-700 border-green-200",
delivered: "bg-gray-100 text-gray-600 border-gray-200",
cancelled: "bg-red-100 text-red-600 border-red-200",
};
const STATUS_LABELS = {
pending: "Pending",
"in-lab": "In Lab",
received: "Received",
delivered: "Delivered",
cancelled: "Cancelled",
};
const CASE_TYPES = [
"Crown – PFM",
"Crown – All Ceramic",
"Crown – Zirconia",
"Crown – Gold",
"Bridge – PFM",
"Bridge – Zirconia",
"Implant Crown",
"Implant Abutment",
"Veneer",
"Inlay / Onlay",
"Full Denture (Upper)",
"Full Denture (Lower)",
"Partial Denture",
"Night Guard",
"Bleaching Tray",
"Retainer",
"Diagnostic Model",
"Other",
];
const COMMON_LABS = [
"Dental Arts Lab",
"National Dentex",
"Glidewell Dental",
"Henry Schein Lab",
"Affordable Dentures Lab",
"Local Lab",
];
const SHADES = [
"A1", "A2", "A3", "A3.5", "A4",
"B1", "B2", "B3", "B4",
"C1", "C2", "C3", "C4",
"D2", "D3", "D4",
"BL1", "BL2", "BL3", "BL4",
"Custom",
];
let nextId = 1;
const newOrder = () => ({
id: nextId++,
orderDate: new Date().toISOString().substring(0, 10),
dueDate: "",
tooth: "",
caseType: "",
lab: "",
shade: "",
status: "pending",
rush: false,
notes: "",
trackingNumber: "",
});
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { PatientTable } from "@/components/patients/patient-table";
import { BarcodeModal } from "@/components/chart/barcode-modal";
import { LabRxModal } from "@/components/chart/lab-rx-modal";
import { Barcode, FileText } from "lucide-react";
export function LabManagementTab() {
const [orders, setOrders] = useState([]);
const [dialogOpen, setDialogOpen] = useState(false);
const [editing, setEditing] = useState(newOrder());
const openAdd = () => {
setEditing(newOrder());
setDialogOpen(true);
};
const openEdit = (order) => {
setEditing({ ...order });
setDialogOpen(true);
};
const handleSave = () => {
setOrders((prev) => {
const idx = prev.findIndex((o) => o.id === editing.id);
if (idx >= 0) {
const next = [...prev];
next[idx] = editing;
return next;
}
return [...prev, editing];
});
setDialogOpen(false);
};
const handleDelete = (id) => {
setOrders((prev) => prev.filter((o) => o.id !== id));
};
const pending = orders.filter((o) => o.status === "pending" || o.status === "in-lab").length;
const rush = orders.filter((o) => o.rush && o.status !== "delivered" && o.status !== "cancelled").length;
return (<div className="space-y-4">
<div className="flex items-center justify-between">
<div className="flex gap-4 text-sm text-gray-600">
{pending > 0 && <span>Open orders: <strong>{pending}</strong></span>}
{rush > 0 && <span className="text-red-600">Rush: <strong>{rush}</strong></span>}
{orders.length === 0 && <span>No lab orders yet</span>}
</div>
<Button size="sm" onClick={openAdd} className="gap-1.5">
<Plus className="h-4 w-4"/>
New Lab Order
</Button>
</div>
const [selectedPatient, setSelectedPatient] = useState(null);
const [barcodeOpen, setBarcodeOpen] = useState(false);
const [labRxOpen, setLabRxOpen] = useState(false);
<div className="border rounded-lg overflow-hidden">
<Table>
<TableHeader>
<TableRow className="bg-gray-50">
<TableHead className="w-24">Order Date</TableHead>
<TableHead className="w-16">Tooth</TableHead>
<TableHead>Case Type</TableHead>
<TableHead>Lab</TableHead>
<TableHead className="w-16 text-center">Shade</TableHead>
<TableHead className="w-24">Due</TableHead>
<TableHead className="w-28">Status</TableHead>
<TableHead className="w-20 text-right">Actions</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{orders.length === 0 ? (<TableRow>
<TableCell colSpan={8} className="text-center text-gray-400 py-10">
<div className="flex flex-col items-center gap-2">
<Package className="h-8 w-8 text-gray-300"/>
<span>No lab orders yet. Click "New Lab Order" to add one.</span>
</div>
</TableCell>
</TableRow>) : (orders.map((order) => (<TableRow key={order.id} className={order.rush ? "bg-red-50/40" : ""}>
<TableCell className="text-sm">{order.orderDate}</TableCell>
<TableCell className="font-mono text-sm">{order.tooth || "—"}</TableCell>
<TableCell>
<div className="flex items-center gap-1.5">
<span className="text-sm font-medium">{order.caseType}</span>
{order.rush && (<Badge className="text-[10px] bg-red-100 text-red-600 border-red-200 px-1 py-0" variant="outline">
RUSH
</Badge>)}
</div>
{order.notes && (<p className="text-xs text-gray-400 truncate max-w-xs mt-0.5">{order.notes}</p>)}
</TableCell>
<TableCell className="text-sm text-gray-600">{order.lab || "—"}</TableCell>
<TableCell className="text-center text-sm">{order.shade || "—"}</TableCell>
<TableCell className="text-sm text-gray-600">{order.dueDate || "—"}</TableCell>
<TableCell>
<Badge className={`text-xs border ${STATUS_COLORS[order.status]}`} variant="outline">
{STATUS_LABELS[order.status]}
</Badge>
</TableCell>
<TableCell>
<div className="flex justify-end gap-1">
<Button variant="ghost" size="icon" className="h-7 w-7" onClick={() => openEdit(order)}>
<Pencil className="h-3.5 w-3.5"/>
</Button>
<Button variant="ghost" size="icon" className="h-7 w-7 text-red-500 hover:text-red-600 hover:bg-red-50" onClick={() => handleDelete(order.id)}>
<Trash2 className="h-3.5 w-3.5"/>
</Button>
</div>
</TableCell>
</TableRow>)))}
</TableBody>
</Table>
</div>
<Dialog open={dialogOpen} onOpenChange={setDialogOpen}>
<DialogContent className="max-w-lg">
<DialogHeader>
<DialogTitle>Lab Order</DialogTitle>
</DialogHeader>
<div className="grid grid-cols-2 gap-3 py-2">
<div className="space-y-1">
<Label className="text-xs">Order Date</Label>
<Input type="date" value={editing.orderDate} onChange={(e) => setEditing((d) => ({ ...d, orderDate: e.target.value }))} className="h-9 text-sm"/>
</div>
<div className="space-y-1">
<Label className="text-xs">Due Date</Label>
<Input type="date" value={editing.dueDate} onChange={(e) => setEditing((d) => ({ ...d, dueDate: e.target.value }))} className="h-9 text-sm"/>
</div>
<div className="space-y-1">
<Label className="text-xs">Tooth #</Label>
<Input placeholder="e.g. 14" value={editing.tooth} onChange={(e) => setEditing((d) => ({ ...d, tooth: e.target.value }))} className="h-9 text-sm"/>
</div>
<div className="space-y-1">
<Label className="text-xs">Shade</Label>
<Select value={editing.shade} onValueChange={(v) => setEditing((d) => ({ ...d, shade: v }))}>
<SelectTrigger className="h-9 text-sm">
<SelectValue placeholder="Select..."/>
</SelectTrigger>
<SelectContent>
{SHADES.map((s) => <SelectItem key={s} value={s}>{s}</SelectItem>)}
</SelectContent>
</Select>
</div>
<div className="col-span-2 space-y-1">
<Label className="text-xs">Case Type</Label>
<Select value={editing.caseType} onValueChange={(v) => setEditing((d) => ({ ...d, caseType: v }))}>
<SelectTrigger className="h-9 text-sm">
<SelectValue placeholder="Select case type..."/>
</SelectTrigger>
<SelectContent>
{CASE_TYPES.map((c) => <SelectItem key={c} value={c}>{c}</SelectItem>)}
</SelectContent>
</Select>
</div>
<div className="col-span-2 space-y-1">
<Label className="text-xs">Lab</Label>
<Select value={editing.lab} onValueChange={(v) => setEditing((d) => ({ ...d, lab: v }))}>
<SelectTrigger className="h-9 text-sm">
<SelectValue placeholder="Select lab..."/>
</SelectTrigger>
<SelectContent>
{COMMON_LABS.map((l) => <SelectItem key={l} value={l}>{l}</SelectItem>)}
</SelectContent>
</Select>
</div>
<div className="space-y-1">
<Label className="text-xs">Status</Label>
<Select value={editing.status} onValueChange={(v) => setEditing((d) => ({ ...d, status: v }))}>
<SelectTrigger className="h-9 text-sm">
<SelectValue />
</SelectTrigger>
<SelectContent>
{Object.keys(STATUS_LABELS).map((s) => (<SelectItem key={s} value={s}>{STATUS_LABELS[s]}</SelectItem>))}
</SelectContent>
</Select>
</div>
<div className="space-y-1">
<Label className="text-xs">Tracking #</Label>
<Input placeholder="Optional" value={editing.trackingNumber} onChange={(e) => setEditing((d) => ({ ...d, trackingNumber: e.target.value }))} className="h-9 text-sm"/>
</div>
<div className="col-span-2 flex items-center gap-2">
<input type="checkbox" id="rush" checked={editing.rush} onChange={(e) => setEditing((d) => ({ ...d, rush: e.target.checked }))} className="h-4 w-4 rounded border-gray-300"/>
<Label htmlFor="rush" className="text-sm cursor-pointer text-red-600 font-medium">
Rush Order
</Label>
</div>
<div className="col-span-2 space-y-1">
<Label className="text-xs">Notes</Label>
<Textarea placeholder="Special instructions, shade details..." value={editing.notes} onChange={(e) => setEditing((d) => ({ ...d, notes: e.target.value }))} className="text-sm resize-none" rows={2}/>
</div>
return (
<div className="space-y-6">
<Card>
<CardHeader>
<CardTitle>Lab Actions</CardTitle>
<CardDescription>
{selectedPatient
? `Selected patient: ${selectedPatient.firstName} ${selectedPatient.lastName}`
: "Select a patient below to get started."}
</CardDescription>
</CardHeader>
<CardContent>
<div className="flex gap-4">
<Button
variant="outline"
className="gap-2"
disabled={!selectedPatient}
onClick={() => setBarcodeOpen(true)}
>
<Barcode className="h-4 w-4" />
Create a Barcode
</Button>
<Button
variant="outline"
className="gap-2"
disabled={!selectedPatient}
onClick={() => setLabRxOpen(true)}
>
<FileText className="h-4 w-4" />
Lab RX
</Button>
</div>
<DialogFooter>
<Button variant="outline" onClick={() => setDialogOpen(false)}>Cancel</Button>
<Button onClick={handleSave} disabled={!editing.caseType}>Save</Button>
</DialogFooter>
</DialogContent>
</Dialog>
</div>);
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Patient Records</CardTitle>
<CardDescription>Select a patient by clicking the checkbox.</CardDescription>
</CardHeader>
<CardContent>
<PatientTable
allowView={true}
allowDelete={false}
allowCheckbox={true}
allowEdit={false}
onSelectPatient={setSelectedPatient}
/>
</CardContent>
</Card>
{selectedPatient && (
<>
<BarcodeModal
open={barcodeOpen}
onClose={() => setBarcodeOpen(false)}
patient={selectedPatient}
/>
<LabRxModal
open={labRxOpen}
onClose={() => setLabRxOpen(false)}
patient={selectedPatient}
/>
</>
)}
</div>
);
}
@@ -1,364 +1,84 @@
import { useState } from "react";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Textarea } from "@/components/ui/textarea";
import { Badge } from "@/components/ui/badge";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
import {
Dialog,
DialogContent,
DialogHeader,
DialogTitle,
DialogFooter,
} from "@/components/ui/dialog";
import { Plus, Pencil, Trash2, Package } from "lucide-react";
type LabStatus = "pending" | "in-lab" | "received" | "delivered" | "cancelled";
interface LabOrder {
id: number;
orderDate: string;
dueDate: string;
tooth: string;
caseType: string;
lab: string;
shade: string;
status: LabStatus;
rush: boolean;
notes: string;
trackingNumber: string;
}
const STATUS_COLORS: Record<LabStatus, string> = {
pending: "bg-yellow-100 text-yellow-700 border-yellow-200",
"in-lab": "bg-blue-100 text-blue-700 border-blue-200",
received: "bg-green-100 text-green-700 border-green-200",
delivered: "bg-gray-100 text-gray-600 border-gray-200",
cancelled: "bg-red-100 text-red-600 border-red-200",
};
const STATUS_LABELS: Record<LabStatus, string> = {
pending: "Pending",
"in-lab": "In Lab",
received: "Received",
delivered: "Delivered",
cancelled: "Cancelled",
};
const CASE_TYPES = [
"Crown – PFM",
"Crown – All Ceramic",
"Crown – Zirconia",
"Crown – Gold",
"Bridge – PFM",
"Bridge – Zirconia",
"Implant Crown",
"Implant Abutment",
"Veneer",
"Inlay / Onlay",
"Full Denture (Upper)",
"Full Denture (Lower)",
"Partial Denture",
"Night Guard",
"Bleaching Tray",
"Retainer",
"Diagnostic Model",
"Other",
];
const COMMON_LABS = [
"Dental Arts Lab",
"National Dentex",
"Glidewell Dental",
"Henry Schein Lab",
"Affordable Dentures Lab",
"Local Lab",
];
const SHADES = [
"A1", "A2", "A3", "A3.5", "A4",
"B1", "B2", "B3", "B4",
"C1", "C2", "C3", "C4",
"D2", "D3", "D4",
"BL1", "BL2", "BL3", "BL4",
"Custom",
];
let nextId = 1;
const newOrder = (): LabOrder => ({
id: nextId++,
orderDate: new Date().toISOString().substring(0, 10),
dueDate: "",
tooth: "",
caseType: "",
lab: "",
shade: "",
status: "pending",
rush: false,
notes: "",
trackingNumber: "",
});
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { PatientTable } from "@/components/patients/patient-table";
import { BarcodeModal } from "@/components/chart/barcode-modal";
import { LabRxModal } from "@/components/chart/lab-rx-modal";
import { Barcode, FileText } from "lucide-react";
import { Patient } from "@repo/db/types";
export function LabManagementTab() {
const [orders, setOrders] = useState<LabOrder[]>([]);
const [dialogOpen, setDialogOpen] = useState(false);
const [editing, setEditing] = useState<LabOrder>(newOrder());
const openAdd = () => {
setEditing(newOrder());
setDialogOpen(true);
};
const openEdit = (order: LabOrder) => {
setEditing({ ...order });
setDialogOpen(true);
};
const handleSave = () => {
setOrders((prev) => {
const idx = prev.findIndex((o) => o.id === editing.id);
if (idx >= 0) {
const next = [...prev];
next[idx] = editing;
return next;
}
return [...prev, editing];
});
setDialogOpen(false);
};
const handleDelete = (id: number) => {
setOrders((prev) => prev.filter((o) => o.id !== id));
};
const pending = orders.filter((o) => o.status === "pending" || o.status === "in-lab").length;
const rush = orders.filter((o) => o.rush && o.status !== "delivered" && o.status !== "cancelled").length;
const [selectedPatient, setSelectedPatient] = useState<Patient | null>(null);
const [barcodeOpen, setBarcodeOpen] = useState(false);
const [labRxOpen, setLabRxOpen] = useState(false);
return (
<div className="space-y-4">
<div className="flex items-center justify-between">
<div className="flex gap-4 text-sm text-gray-600">
{pending > 0 && <span>Open orders: <strong>{pending}</strong></span>}
{rush > 0 && <span className="text-red-600">Rush: <strong>{rush}</strong></span>}
{orders.length === 0 && <span>No lab orders yet</span>}
</div>
<Button size="sm" onClick={openAdd} className="gap-1.5">
<Plus className="h-4 w-4" />
New Lab Order
</Button>
</div>
<div className="border rounded-lg overflow-hidden">
<Table>
<TableHeader>
<TableRow className="bg-gray-50">
<TableHead className="w-24">Order Date</TableHead>
<TableHead className="w-16">Tooth</TableHead>
<TableHead>Case Type</TableHead>
<TableHead>Lab</TableHead>
<TableHead className="w-16 text-center">Shade</TableHead>
<TableHead className="w-24">Due</TableHead>
<TableHead className="w-28">Status</TableHead>
<TableHead className="w-20 text-right">Actions</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{orders.length === 0 ? (
<TableRow>
<TableCell colSpan={8} className="text-center text-gray-400 py-10">
<div className="flex flex-col items-center gap-2">
<Package className="h-8 w-8 text-gray-300" />
<span>No lab orders yet. Click "New Lab Order" to add one.</span>
</div>
</TableCell>
</TableRow>
) : (
orders.map((order) => (
<TableRow key={order.id} className={order.rush ? "bg-red-50/40" : ""}>
<TableCell className="text-sm">{order.orderDate}</TableCell>
<TableCell className="font-mono text-sm">{order.tooth || "—"}</TableCell>
<TableCell>
<div className="flex items-center gap-1.5">
<span className="text-sm font-medium">{order.caseType}</span>
{order.rush && (
<Badge className="text-[10px] bg-red-100 text-red-600 border-red-200 px-1 py-0" variant="outline">
RUSH
</Badge>
)}
</div>
{order.notes && (
<p className="text-xs text-gray-400 truncate max-w-xs mt-0.5">{order.notes}</p>
)}
</TableCell>
<TableCell className="text-sm text-gray-600">{order.lab || "—"}</TableCell>
<TableCell className="text-center text-sm">{order.shade || "—"}</TableCell>
<TableCell className="text-sm text-gray-600">{order.dueDate || "—"}</TableCell>
<TableCell>
<Badge className={`text-xs border ${STATUS_COLORS[order.status]}`} variant="outline">
{STATUS_LABELS[order.status]}
</Badge>
</TableCell>
<TableCell>
<div className="flex justify-end gap-1">
<Button variant="ghost" size="icon" className="h-7 w-7" onClick={() => openEdit(order)}>
<Pencil className="h-3.5 w-3.5" />
</Button>
<Button variant="ghost" size="icon" className="h-7 w-7 text-red-500 hover:text-red-600 hover:bg-red-50" onClick={() => handleDelete(order.id)}>
<Trash2 className="h-3.5 w-3.5" />
</Button>
</div>
</TableCell>
</TableRow>
))
)}
</TableBody>
</Table>
</div>
<Dialog open={dialogOpen} onOpenChange={setDialogOpen}>
<DialogContent className="max-w-lg">
<DialogHeader>
<DialogTitle>Lab Order</DialogTitle>
</DialogHeader>
<div className="grid grid-cols-2 gap-3 py-2">
<div className="space-y-1">
<Label className="text-xs">Order Date</Label>
<Input
type="date"
value={editing.orderDate}
onChange={(e) => setEditing((d) => ({ ...d, orderDate: e.target.value }))}
className="h-9 text-sm"
/>
</div>
<div className="space-y-1">
<Label className="text-xs">Due Date</Label>
<Input
type="date"
value={editing.dueDate}
onChange={(e) => setEditing((d) => ({ ...d, dueDate: e.target.value }))}
className="h-9 text-sm"
/>
</div>
<div className="space-y-1">
<Label className="text-xs">Tooth #</Label>
<Input
placeholder="e.g. 14"
value={editing.tooth}
onChange={(e) => setEditing((d) => ({ ...d, tooth: e.target.value }))}
className="h-9 text-sm"
/>
</div>
<div className="space-y-1">
<Label className="text-xs">Shade</Label>
<Select
value={editing.shade}
onValueChange={(v) => setEditing((d) => ({ ...d, shade: v }))}
>
<SelectTrigger className="h-9 text-sm">
<SelectValue placeholder="Select..." />
</SelectTrigger>
<SelectContent>
{SHADES.map((s) => <SelectItem key={s} value={s}>{s}</SelectItem>)}
</SelectContent>
</Select>
</div>
<div className="col-span-2 space-y-1">
<Label className="text-xs">Case Type</Label>
<Select
value={editing.caseType}
onValueChange={(v) => setEditing((d) => ({ ...d, caseType: v }))}
>
<SelectTrigger className="h-9 text-sm">
<SelectValue placeholder="Select case type..." />
</SelectTrigger>
<SelectContent>
{CASE_TYPES.map((c) => <SelectItem key={c} value={c}>{c}</SelectItem>)}
</SelectContent>
</Select>
</div>
<div className="col-span-2 space-y-1">
<Label className="text-xs">Lab</Label>
<Select
value={editing.lab}
onValueChange={(v) => setEditing((d) => ({ ...d, lab: v }))}
>
<SelectTrigger className="h-9 text-sm">
<SelectValue placeholder="Select lab..." />
</SelectTrigger>
<SelectContent>
{COMMON_LABS.map((l) => <SelectItem key={l} value={l}>{l}</SelectItem>)}
</SelectContent>
</Select>
</div>
<div className="space-y-1">
<Label className="text-xs">Status</Label>
<Select
value={editing.status}
onValueChange={(v) => setEditing((d) => ({ ...d, status: v as LabStatus }))}
>
<SelectTrigger className="h-9 text-sm">
<SelectValue />
</SelectTrigger>
<SelectContent>
{(Object.keys(STATUS_LABELS) as LabStatus[]).map((s) => (
<SelectItem key={s} value={s}>{STATUS_LABELS[s]}</SelectItem>
))}
</SelectContent>
</Select>
</div>
<div className="space-y-1">
<Label className="text-xs">Tracking #</Label>
<Input
placeholder="Optional"
value={editing.trackingNumber}
onChange={(e) => setEditing((d) => ({ ...d, trackingNumber: e.target.value }))}
className="h-9 text-sm"
/>
</div>
<div className="col-span-2 flex items-center gap-2">
<input
type="checkbox"
id="rush"
checked={editing.rush}
onChange={(e) => setEditing((d) => ({ ...d, rush: e.target.checked }))}
className="h-4 w-4 rounded border-gray-300"
/>
<Label htmlFor="rush" className="text-sm cursor-pointer text-red-600 font-medium">
Rush Order
</Label>
</div>
<div className="col-span-2 space-y-1">
<Label className="text-xs">Notes</Label>
<Textarea
placeholder="Special instructions, shade details..."
value={editing.notes}
onChange={(e) => setEditing((d) => ({ ...d, notes: e.target.value }))}
className="text-sm resize-none"
rows={2}
/>
</div>
<div className="space-y-6">
{/* Action buttons */}
<Card>
<CardHeader>
<CardTitle>Lab Actions</CardTitle>
<CardDescription>
{selectedPatient
? `Selected patient: ${selectedPatient.firstName} ${selectedPatient.lastName}`
: "Select a patient below to get started."}
</CardDescription>
</CardHeader>
<CardContent>
<div className="flex gap-4">
<Button
variant="outline"
className="gap-2"
disabled={!selectedPatient}
onClick={() => setBarcodeOpen(true)}
>
<Barcode className="h-4 w-4" />
Create a Barcode
</Button>
<Button
variant="outline"
className="gap-2"
disabled={!selectedPatient}
onClick={() => setLabRxOpen(true)}
>
<FileText className="h-4 w-4" />
Lab RX
</Button>
</div>
<DialogFooter>
<Button variant="outline" onClick={() => setDialogOpen(false)}>Cancel</Button>
<Button onClick={handleSave} disabled={!editing.caseType}>Save</Button>
</DialogFooter>
</DialogContent>
</Dialog>
</CardContent>
</Card>
{/* Patient search / selection */}
<Card>
<CardHeader>
<CardTitle>Patient Records</CardTitle>
<CardDescription>Select a patient by clicking the checkbox.</CardDescription>
</CardHeader>
<CardContent>
<PatientTable
allowView={true}
allowDelete={false}
allowCheckbox={true}
allowEdit={false}
onSelectPatient={setSelectedPatient}
/>
</CardContent>
</Card>
{selectedPatient && (
<>
<BarcodeModal
open={barcodeOpen}
onClose={() => setBarcodeOpen(false)}
patient={selectedPatient}
/>
<LabRxModal
open={labRxOpen}
onClose={() => setLabRxOpen(false)}
patient={selectedPatient}
/>
</>
)}
</div>
);
}
@@ -0,0 +1,626 @@
import { useState, useRef } from "react";
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import { apiRequest } from "@/lib/queryClient";
import { useToast } from "@/hooks/use-toast";
import {
Dialog,
DialogContent,
DialogHeader,
DialogTitle,
DialogFooter,
} from "@/components/ui/dialog";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Textarea } from "@/components/ui/textarea";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { Plus, Pencil, Trash2, Printer, X, Check, FlaskConical, ChevronUp, ChevronDown } from "lucide-react";
const EMPTY_TEMPLATE = {
name: "", labName: "", labPhone: "", labFax: "",
labAddress: "", labAccount: "", caseType: "", material: "", instructions: "Please make\nThank you!",
};
const EMPTY_RX = { toothNumbers: "", shade: "", dueDate: "", doctorName: "", age: "", officeName: "", additionalNotes: "Please make\nThank you!" };
const calcAge = (dob) => {
if (!dob) return "";
const birth = new Date(dob);
const today = new Date();
let age = today.getFullYear() - birth.getFullYear();
const m = today.getMonth() - birth.getMonth();
if (m < 0 || (m === 0 && today.getDate() < birth.getDate())) age--;
return String(age);
};
const CASE_TYPES = ["Crown", "Bridge", "Veneer", "Inlay/Onlay", "Full Denture", "Partial Denture", "Night Guard", "Retainer", "Implant Crown", "Other"];
const MATERIALS = ["Zirconia", "PFM (Porcelain-Fused-to-Metal)", "E-Max", "Acrylic", "Cast Metal", "Composite", "PMMA", "Other"];
export function LabRxModal({ open, onClose, patient }) {
const { toast } = useToast();
const queryClient = useQueryClient();
const printRef = useRef(null);
const [rxTemplate, setRxTemplate] = useState(null);
const [rx, setRx] = useState(EMPTY_RX);
const [renamingId, setRenamingId] = useState(null);
const [renameValue, setRenameValue] = useState("");
const [showTemplateForm, setShowTemplateForm] = useState(false);
const [editingTemplateId, setEditingTemplateId] = useState(null);
const [templateForm, setTemplateForm] = useState(EMPTY_TEMPLATE);
const { data: providers = [] } = useQuery({
queryKey: ["/api/npiProviders"],
queryFn: async () => {
const res = await apiRequest("GET", "/api/npiProviders");
if (!res.ok) throw new Error("Failed to fetch providers");
return res.json();
},
enabled: open,
});
const { data: officeContact } = useQuery({
queryKey: ["/api/office-contact"],
queryFn: async () => {
const res = await apiRequest("GET", "/api/office-contact");
if (!res.ok) return null;
return res.json();
},
enabled: open,
});
const { data: templates = [], isLoading } = useQuery({
queryKey: ["/api/lab-rx/templates"],
queryFn: async () => {
const res = await apiRequest("GET", "/api/lab-rx/templates");
if (!res.ok) throw new Error("Failed to fetch");
return res.json();
},
enabled: open,
});
const invalidate = () => queryClient.invalidateQueries({ queryKey: ["/api/lab-rx/templates"] });
const createMutation = useMutation({
mutationFn: async (data) => {
const res = await apiRequest("POST", "/api/lab-rx/templates", data);
if (!res.ok) { const e = await res.json().catch(() => null); throw new Error(e?.message || "Failed to save"); }
return res.json();
},
onSuccess: () => { invalidate(); setShowTemplateForm(false); setTemplateForm(EMPTY_TEMPLATE); toast({ title: "Template saved" }); },
onError: (e) => toast({ title: "Error", description: e.message, variant: "destructive" }),
});
const updateMutation = useMutation({
mutationFn: async ({ id, data }) => {
const res = await apiRequest("PUT", `/api/lab-rx/templates/${id}`, data);
if (!res.ok) { const e = await res.json().catch(() => null); throw new Error(e?.message || "Failed to update"); }
return res.json();
},
onSuccess: () => { invalidate(); setEditingTemplateId(null); setTemplateForm(EMPTY_TEMPLATE); setShowTemplateForm(false); toast({ title: "Template updated" }); },
onError: (e) => toast({ title: "Error", description: e.message, variant: "destructive" }),
});
const renameMutation = useMutation({
mutationFn: async ({ id, name }) => {
const res = await apiRequest("PUT", `/api/lab-rx/templates/${id}`, { name });
if (!res.ok) { const e = await res.json().catch(() => null); throw new Error(e?.message || "Failed to rename"); }
return res.json();
},
onSuccess: () => { invalidate(); setRenamingId(null); },
onError: (e) => toast({ title: "Error", description: e.message, variant: "destructive" }),
});
const deleteMutation = useMutation({
mutationFn: async (id) => {
const res = await apiRequest("DELETE", `/api/lab-rx/templates/${id}`);
if (!res.ok) throw new Error("Failed to delete");
},
onSuccess: () => { invalidate(); toast({ title: "Template deleted" }); },
onError: (e) => toast({ title: "Error", description: e.message, variant: "destructive" }),
});
const reorderMutation = useMutation({
mutationFn: async (orderedIds) => {
const res = await apiRequest("POST", "/api/lab-rx/templates/reorder", { orderedIds });
if (!res.ok) throw new Error("Failed to reorder");
},
onSuccess: () => invalidate(),
onError: (e) => toast({ title: "Error", description: e.message, variant: "destructive" }),
});
const moveTemplate = (index, direction) => {
const swapIndex = direction === "up" ? index - 1 : index + 1;
const reordered = [...templates];
const a = reordered[index];
const b = reordered[swapIndex];
reordered[index] = b;
reordered[swapIndex] = a;
queryClient.setQueryData(["/api/lab-rx/templates"], reordered);
reorderMutation.mutate(reordered.map((t) => t.id));
};
const openRx = (t) => {
if (renamingId !== null) return;
setRxTemplate(t);
setRx({ ...EMPTY_RX, doctorName: providers[0]?.providerName ?? "", age: calcAge(patient.dateOfBirth), officeName: officeContact?.officeName ?? "" });
};
const startRename = (e, t) => {
e.stopPropagation();
setRenamingId(t.id);
setRenameValue(t.name);
};
const commitRename = () => {
if (!renameValue.trim()) { toast({ title: "Name cannot be empty", variant: "destructive" }); return; }
if (renamingId !== null) renameMutation.mutate({ id: renamingId, name: renameValue.trim() });
};
const cancelRename = () => setRenamingId(null);
const openAddTemplate = () => { setEditingTemplateId(null); setTemplateForm(EMPTY_TEMPLATE); setShowTemplateForm(true); };
const openEditTemplate = (t) => {
setEditingTemplateId(t.id);
setTemplateForm({ name: t.name, labName: t.labName ?? "", labPhone: t.labPhone ?? "", labFax: t.labFax ?? "", labAddress: t.labAddress ?? "", labAccount: t.labAccount ?? "", caseType: t.caseType ?? "", material: t.material ?? "", instructions: t.instructions ?? "" });
setShowTemplateForm(true);
};
const handleSaveTemplate = () => {
if (!templateForm.name.trim()) { toast({ title: "Template name is required", variant: "destructive" }); return; }
if (editingTemplateId !== null) updateMutation.mutate({ id: editingTemplateId, data: templateForm });
else createMutation.mutate(templateForm);
};
const isSaving = createMutation.isPending || updateMutation.isPending;
const handlePrint = () => {
const content = printRef.current;
if (!content || !rxTemplate) return;
const win = window.open("", "_blank", "width=800,height=900");
if (!win) return;
win.document.write(`<!DOCTYPE html><html><head><title>Lab RX</title>
<style>
body{font-family:Arial,sans-serif;margin:0;padding:24px;font-size:13px;color:#111}
h1{font-size:22px;margin:0 0 4px;text-align:center}
.subtitle{text-align:center;color:#555;font-size:12px;margin-bottom:12px}
hr{border:none;border-top:2px solid #000;margin:10px 0}
.section{margin-bottom:14px}
.section-title{font-weight:bold;font-size:11px;text-transform:uppercase;letter-spacing:.06em;border-bottom:1px solid #bbb;margin-bottom:8px;padding-bottom:3px;color:#333}
.row{display:flex;gap:24px;margin-bottom:6px}
.field{flex:1}
.field label{display:block;font-size:10px;color:#777;margin-bottom:1px}
.field span{display:block;border-bottom:1px solid #aaa;padding-bottom:2px;min-height:18px;font-size:13px}
.instructions-box{border:1px solid #bbb;padding:8px;min-height:64px;white-space:pre-wrap;font-size:12px}
.sig-area{display:flex;gap:48px;margin-top:32px}
.sig-line{border-top:1px solid #000;padding-top:3px;font-size:10px;color:#777;min-width:180px}
@media print{body{margin:0}}
</style>
</head><body>${content.innerHTML}</body></html>`);
win.document.close();
win.focus();
setTimeout(() => { win.print(); win.close(); }, 300);
};
const patientName = `${patient.firstName} ${patient.lastName}`;
const today = new Date().toLocaleDateString("en-US");
return (
<>
{/* Main modal */}
<Dialog open={open} onOpenChange={(v) => !v && onClose()}>
<DialogContent className="max-w-3xl max-h-[90vh] overflow-y-auto">
<DialogHeader>
<DialogTitle className="flex items-center gap-2">
<FlaskConical className="h-5 w-5" />
Lab RX — {patientName}
</DialogTitle>
</DialogHeader>
<Tabs defaultValue="rx">
<TabsList className="mb-4">
<TabsTrigger value="rx">Create Lab RX</TabsTrigger>
<TabsTrigger value="templates">Manage Templates</TabsTrigger>
</TabsList>
{/* Tab 1: pick template */}
<TabsContent value="rx" className="space-y-4">
<p className="text-xs font-medium text-gray-500 uppercase tracking-wide">
Click a template to create a Lab RX
</p>
{isLoading ? (
<p className="text-sm text-gray-400">Loading templates…</p>
) : templates.length === 0 ? (
<p className="text-sm text-gray-400">No templates yet. Go to "Manage Templates" to add one.</p>
) : (
<div className="grid grid-cols-1 sm:grid-cols-2 gap-3">
{templates.map((t) => (
<div
key={t.id}
onClick={() => openRx(t)}
className="group relative border rounded-lg p-3 bg-white cursor-pointer hover:border-blue-400 hover:shadow-sm transition-all"
>
{renamingId === t.id ? (
<div className="flex items-center gap-1" onClick={(e) => e.stopPropagation()}>
<Input
autoFocus
value={renameValue}
onChange={(e) => setRenameValue(e.target.value)}
onKeyDown={(e) => { if (e.key === "Enter") commitRename(); if (e.key === "Escape") cancelRename(); }}
className="h-7 text-sm font-medium"
/>
<Button variant="ghost" size="icon" className="h-6 w-6 shrink-0 text-green-600" onClick={commitRename} disabled={renameMutation.isPending}>
<Check className="h-3.5 w-3.5" />
</Button>
<Button variant="ghost" size="icon" className="h-6 w-6 shrink-0" onClick={cancelRename}>
<X className="h-3.5 w-3.5" />
</Button>
</div>
) : (
<div className="flex items-start justify-between gap-2">
<div className="min-w-0">
<p className="font-semibold text-sm text-gray-900 truncate">{t.name}</p>
{t.labName && <p className="text-xs text-gray-500 mt-0.5">{t.labName}</p>}
<div className="flex flex-wrap gap-x-3 gap-y-0.5 mt-1 text-xs text-gray-400">
{t.caseType && <span>{t.caseType}</span>}
{t.material && <span>{t.material}</span>}
</div>
</div>
<button
title="Rename template"
onClick={(e) => startRename(e, t)}
className="shrink-0 p-1 rounded opacity-0 group-hover:opacity-100 hover:bg-gray-100 transition-opacity"
>
<Pencil className="h-3.5 w-3.5 text-gray-400" />
</button>
</div>
)}
</div>
))}
</div>
)}
</TabsContent>
{/* Tab 2: manage templates */}
<TabsContent value="templates" className="space-y-4">
<div className="flex items-center justify-between">
<p className="text-sm text-gray-500">{templates.length} template{templates.length !== 1 ? "s" : ""}</p>
<Button size="sm" onClick={openAddTemplate} className="gap-1.5">
<Plus className="h-4 w-4" /> Add Template
</Button>
</div>
{showTemplateForm && (
<div className="border rounded-lg overflow-hidden">
<div className="bg-gray-100 border-b px-4 py-2.5">
<p className="text-sm font-semibold text-gray-800">
{editingTemplateId !== null ? "Edit Template" : "New Template"}
</p>
</div>
<div className="p-4 space-y-5 bg-white">
{/* Template Name section */}
<div className="space-y-2">
<div className="flex items-center gap-2">
<p className="text-xs font-bold uppercase tracking-widest text-blue-600">Template Name</p>
<div className="flex-1 h-px bg-blue-100" />
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Name <span className="text-red-500">*</span></Label>
<Input
placeholder="e.g. Glidewell Crown, Argen Bridge…"
value={templateForm.name}
onChange={(e) => setTemplateForm((f) => ({ ...f, name: e.target.value }))}
className="h-9 text-sm"
/>
<p className="text-xs text-gray-400">This name appears on the template picker button.</p>
</div>
</div>
{/* Lab Information section */}
<div className="space-y-2">
<div className="flex items-center gap-2">
<p className="text-xs font-bold uppercase tracking-widest text-gray-500">Lab Information</p>
<div className="flex-1 h-px bg-gray-200" />
</div>
<div className="grid grid-cols-2 gap-3">
<div className="space-y-1">
<Label className="text-xs text-gray-600">Lab Name</Label>
<Input placeholder="e.g. Glidewell Dental" value={templateForm.labName} onChange={(e) => setTemplateForm((f) => ({ ...f, labName: e.target.value }))} className="h-9 text-sm" />
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Account #</Label>
<Input placeholder="e.g. 123456" value={templateForm.labAccount} onChange={(e) => setTemplateForm((f) => ({ ...f, labAccount: e.target.value }))} className="h-9 text-sm" />
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Phone</Label>
<Input placeholder="(800) 000-0000" value={templateForm.labPhone} onChange={(e) => setTemplateForm((f) => ({ ...f, labPhone: e.target.value }))} className="h-9 text-sm" />
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Fax</Label>
<Input placeholder="(800) 000-0001" value={templateForm.labFax} onChange={(e) => setTemplateForm((f) => ({ ...f, labFax: e.target.value }))} className="h-9 text-sm" />
</div>
<div className="col-span-2 space-y-1">
<Label className="text-xs text-gray-600">Address</Label>
<Input placeholder="123 Lab St, City, State 00000" value={templateForm.labAddress} onChange={(e) => setTemplateForm((f) => ({ ...f, labAddress: e.target.value }))} className="h-9 text-sm" />
</div>
</div>
</div>
{/* Default Case Details section */}
<div className="space-y-2">
<div className="flex items-center gap-2">
<p className="text-xs font-bold uppercase tracking-widest text-gray-500">Default Case Details</p>
<div className="flex-1 h-px bg-gray-200" />
</div>
<div className="grid grid-cols-2 gap-3">
<div className="space-y-1">
<Label className="text-xs text-gray-600">Case Type</Label>
<Select value={templateForm.caseType} onValueChange={(v) => setTemplateForm((f) => ({ ...f, caseType: v }))}>
<SelectTrigger className="h-9 text-sm"><SelectValue placeholder="Select…" /></SelectTrigger>
<SelectContent>{CASE_TYPES.map((c) => <SelectItem key={c} value={c}>{c}</SelectItem>)}</SelectContent>
</Select>
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Material</Label>
<Select value={templateForm.material} onValueChange={(v) => setTemplateForm((f) => ({ ...f, material: v }))}>
<SelectTrigger className="h-9 text-sm"><SelectValue placeholder="Select…" /></SelectTrigger>
<SelectContent>{MATERIALS.map((m) => <SelectItem key={m} value={m}>{m}</SelectItem>)}</SelectContent>
</Select>
</div>
<div className="col-span-2 space-y-1">
<Label className="text-xs text-gray-600">Instructions</Label>
<Textarea placeholder="Standard instructions for this lab…" value={templateForm.instructions} onChange={(e) => setTemplateForm((f) => ({ ...f, instructions: e.target.value }))} className="text-sm resize-none" rows={3} />
</div>
</div>
</div>
</div>
<div className="bg-gray-50 border-t px-4 py-3 flex gap-2">
<Button size="sm" onClick={handleSaveTemplate} disabled={isSaving}>
<Check className="h-3.5 w-3.5 mr-1" />{isSaving ? "Saving…" : "Save Template"}
</Button>
<Button size="sm" variant="outline" onClick={() => { setShowTemplateForm(false); setEditingTemplateId(null); setTemplateForm(EMPTY_TEMPLATE); }} disabled={isSaving}>
<X className="h-3.5 w-3.5 mr-1" /> Cancel
</Button>
</div>
</div>
)}
{isLoading ? (
<p className="text-sm text-gray-400 py-4 text-center">Loading…</p>
) : templates.length === 0 ? (
<p className="text-sm text-gray-400 py-8 text-center">No templates yet. Click "Add Template" to create one.</p>
) : (
<div className="space-y-2">
{templates.map((t, index) => (
<div key={t.id} className="border rounded-lg p-3 bg-white flex items-center gap-2">
<div className="flex flex-col shrink-0">
<Button
variant="ghost" size="icon" className="h-6 w-6 text-gray-400 hover:text-gray-700 disabled:opacity-20"
disabled={index === 0 || reorderMutation.isPending}
onClick={() => moveTemplate(index, "up")}
>
<ChevronUp className="h-4 w-4" />
</Button>
<Button
variant="ghost" size="icon" className="h-6 w-6 text-gray-400 hover:text-gray-700 disabled:opacity-20"
disabled={index === templates.length - 1 || reorderMutation.isPending}
onClick={() => moveTemplate(index, "down")}
>
<ChevronDown className="h-4 w-4" />
</Button>
</div>
<div className="flex-1 min-w-0">
<p className="font-medium text-sm text-gray-900">{t.name}</p>
{t.labName && <p className="text-xs text-gray-500">{t.labName}</p>}
<div className="flex flex-wrap gap-x-4 gap-y-0.5 text-xs text-gray-400 mt-0.5">
{t.caseType && <span>Case: {t.caseType}</span>}
{t.material && <span>Material: {t.material}</span>}
{t.labPhone && <span>Ph: {t.labPhone}</span>}
</div>
</div>
<div className="flex items-center gap-1 shrink-0">
<Button variant="ghost" size="icon" className="h-7 w-7" onClick={() => openEditTemplate(t)}>
<Pencil className="h-3.5 w-3.5 text-gray-500" />
</Button>
<Button variant="ghost" size="icon" className="h-7 w-7" onClick={() => deleteMutation.mutate(t.id)} disabled={deleteMutation.isPending}>
<Trash2 className="h-3.5 w-3.5 text-red-500" />
</Button>
</div>
</div>
))}
</div>
)}
</TabsContent>
</Tabs>
</DialogContent>
</Dialog>
{/* RX popup */}
<Dialog open={!!rxTemplate} onOpenChange={(v) => { if (!v) setRxTemplate(null); }}>
<DialogContent className="max-w-2xl max-h-[90vh] overflow-y-auto">
<DialogHeader>
<DialogTitle className="flex items-center gap-2">
<Printer className="h-5 w-5" />
Lab RX — {rxTemplate?.name}
</DialogTitle>
</DialogHeader>
{rxTemplate && (
<>
<div className="space-y-5 py-2">
{/* Tooth Number section */}
<div className="space-y-2">
<div className="flex items-center gap-2">
<p className="text-xs font-bold uppercase tracking-widest text-blue-600">Tooth Number</p>
<div className="flex-1 h-px bg-blue-100" />
</div>
<div className="grid grid-cols-2 gap-3">
<div className="space-y-1">
<Label className="text-xs text-gray-600">Tooth Number(s)</Label>
<Input placeholder="e.g. 3, 14, 19" value={rx.toothNumbers} onChange={(e) => setRx((r) => ({ ...r, toothNumbers: e.target.value }))} className="h-9 text-sm" />
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Shade</Label>
<Input placeholder="e.g. A2, B1" value={rx.shade} onChange={(e) => setRx((r) => ({ ...r, shade: e.target.value }))} className="h-9 text-sm" />
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Age</Label>
<Input placeholder="e.g. 72" value={rx.age} onChange={(e) => setRx((r) => ({ ...r, age: e.target.value }))} className="h-9 text-sm" />
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Due Date</Label>
<Input type="date" value={rx.dueDate} onChange={(e) => setRx((r) => ({ ...r, dueDate: e.target.value }))} className="h-9 text-sm" />
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Doctor's Name</Label>
<Select value={rx.doctorName} onValueChange={(v) => setRx((r) => ({ ...r, doctorName: v }))}>
<SelectTrigger className="h-9 text-sm">
<SelectValue placeholder="Select provider…" />
</SelectTrigger>
<SelectContent>
{providers.map((p) => (
<SelectItem key={p.id} value={p.providerName}>{p.providerName}</SelectItem>
))}
</SelectContent>
</Select>
</div>
<div className="col-span-2 space-y-1">
<Label className="text-xs text-gray-600">Dental Office Name</Label>
<Input placeholder="e.g. Summit Dental Care" value={rx.officeName} onChange={(e) => setRx((r) => ({ ...r, officeName: e.target.value }))} className="h-9 text-sm" />
</div>
</div>
</div>
{/* Instructions section */}
<div className="space-y-2">
<div className="flex items-center gap-2">
<p className="text-xs font-bold uppercase tracking-widest text-gray-500">Instructions</p>
<div className="flex-1 h-px bg-gray-200" />
</div>
{rxTemplate.instructions && (
<div className="rounded-md bg-gray-50 border px-3 py-2 text-xs text-gray-600 whitespace-pre-wrap">
<span className="font-medium text-gray-400 block mb-1">From template</span>
{rxTemplate.instructions}
</div>
)}
<div className="space-y-1">
<Label className="text-xs text-gray-600">Additional Notes</Label>
<Textarea placeholder="Any extra instructions for this case…" value={rx.additionalNotes} onChange={(e) => setRx((r) => ({ ...r, additionalNotes: e.target.value }))} className="text-sm resize-none" rows={3} />
</div>
</div>
{/* RX preview */}
<div className="border rounded-lg p-4 bg-gray-50 text-sm space-y-3">
<div className="text-center border-b pb-3">
<p className="font-bold text-base">Dental Lab Prescription</p>
<p className="text-xs text-gray-500">
Date: {today}{rx.dueDate ? ` · Due: ${new Date(rx.dueDate + "T00:00").toLocaleDateString("en-US")}` : ""}
</p>
</div>
<div className="grid grid-cols-2 gap-x-6 gap-y-1">
<div><span className="text-gray-400 text-xs">Patient</span><p className="font-medium">{patientName}</p></div>
<div><span className="text-gray-400 text-xs">Age</span><p>{rx.age || "—"}</p></div>
{rx.officeName && <div className="col-span-2"><span className="text-gray-400 text-xs">Dental Office</span><p className="font-medium">{rx.officeName}</p></div>}
<div className="col-span-2 mt-1 border-t pt-2"><span className="text-gray-400 text-xs">Lab</span><p className="font-medium">{rxTemplate.labName || "—"}</p></div>
<div><span className="text-gray-400 text-xs">Phone</span><p>{rxTemplate.labPhone || "—"}</p></div>
{rxTemplate.labFax && <div><span className="text-gray-400 text-xs">Fax</span><p>{rxTemplate.labFax}</p></div>}
{rxTemplate.labAddress && <div className="col-span-2"><span className="text-gray-400 text-xs">Address</span><p>{rxTemplate.labAddress}</p></div>}
{rxTemplate.labAccount && <div><span className="text-gray-400 text-xs">Account #</span><p>{rxTemplate.labAccount}</p></div>}
<div className="col-span-2 mt-1 border-t pt-2 grid grid-cols-2 gap-x-6">
<div><span className="text-gray-400 text-xs">Case Type</span><p>{rxTemplate.caseType || "—"}</p></div>
<div><span className="text-gray-400 text-xs">Material</span><p>{rxTemplate.material || "—"}</p></div>
<div><span className="text-gray-400 text-xs">Tooth #</span><p>{rx.toothNumbers || "—"}</p></div>
<div><span className="text-gray-400 text-xs">Shade</span><p>{rx.shade || "—"}</p></div>
{rx.doctorName && <div><span className="text-gray-400 text-xs">Doctor</span><p>{rx.doctorName}</p></div>}
</div>
{(rxTemplate.instructions || rx.additionalNotes) && (
<div className="col-span-2 mt-1 border-t pt-2">
<span className="text-gray-400 text-xs">Instructions</span>
<p className="whitespace-pre-wrap text-xs mt-1 text-gray-700">
{[rxTemplate.instructions, rx.additionalNotes].filter(Boolean).join("\n\n")}
</p>
</div>
)}
</div>
</div>
</div>
{/* Hidden print DOM */}
<div className="hidden">
<div ref={printRef}>
<h1>Dental Lab Prescription</h1>
<div className="subtitle">
Date: {today}{rx.dueDate ? ` · Due: ${new Date(rx.dueDate + "T00:00").toLocaleDateString("en-US")}` : ""}
</div>
<hr />
<div className="section">
<div className="section-title">Patient Information</div>
<div className="row">
<div className="field"><label>Patient Name</label><span>{patientName}</span></div>
<div className="field"><label>Age</label><span>{rx.age}</span></div>
<div className="field"><label>Dental Office</label><span>{rx.officeName}</span></div>
</div>
</div>
<div className="section">
<div className="section-title">Dental Lab</div>
<div className="row">
<div className="field"><label>Lab Name</label><span>{rxTemplate.labName ?? ""}</span></div>
<div className="field"><label>Account #</label><span>{rxTemplate.labAccount ?? ""}</span></div>
</div>
<div className="row">
<div className="field"><label>Phone</label><span>{rxTemplate.labPhone ?? ""}</span></div>
<div className="field"><label>Fax</label><span>{rxTemplate.labFax ?? ""}</span></div>
</div>
<div className="row">
<div className="field"><label>Address</label><span>{rxTemplate.labAddress ?? ""}</span></div>
</div>
</div>
<div className="section">
<div className="section-title">Prescription Details</div>
<div className="row">
<div className="field"><label>Case Type</label><span>{rxTemplate.caseType ?? ""}</span></div>
<div className="field"><label>Material</label><span>{rxTemplate.material ?? ""}</span></div>
</div>
<div className="row">
<div className="field"><label>Tooth Number(s)</label><span>{rx.toothNumbers}</span></div>
<div className="field"><label>Shade</label><span>{rx.shade}</span></div>
</div>
<div className="row">
<div className="field"><label>Doctor's Name</label><span>{rx.doctorName}</span></div>
</div>
</div>
<div className="section">
<div className="section-title">Instructions</div>
<div className="instructions-box">
{[rxTemplate.instructions, rx.additionalNotes].filter(Boolean).join("\n\n")}
</div>
</div>
<div className="sig-area">
<div className="sig-line">Doctor Signature</div>
<div className="sig-line">Date</div>
</div>
</div>
</div>
</>
)}
<DialogFooter>
<Button variant="outline" onClick={() => setRxTemplate(null)}>Close</Button>
<Button onClick={handlePrint} className="gap-2">
<Printer className="h-4 w-4" /> Print Lab RX
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
</>
);
}
@@ -0,0 +1,672 @@
import { useState, useRef } from "react";
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import { apiRequest } from "@/lib/queryClient";
import { useToast } from "@/hooks/use-toast";
import { Patient } from "@repo/db/types";
import {
Dialog,
DialogContent,
DialogHeader,
DialogTitle,
DialogFooter,
} from "@/components/ui/dialog";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Textarea } from "@/components/ui/textarea";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { Plus, Pencil, Trash2, Printer, X, Check, FlaskConical, ChevronUp, ChevronDown } from "lucide-react";
type LabRxTemplate = {
id: number;
name: string;
labName?: string | null;
labPhone?: string | null;
labFax?: string | null;
labAddress?: string | null;
labAccount?: string | null;
caseType?: string | null;
material?: string | null;
instructions?: string | null;
sortOrder: number;
};
type TemplateFormState = {
name: string;
labName: string;
labPhone: string;
labFax: string;
labAddress: string;
labAccount: string;
caseType: string;
material: string;
instructions: string;
};
type RxFields = {
toothNumbers: string;
shade: string;
dueDate: string;
doctorName: string;
age: string;
officeName: string;
additionalNotes: string;
};
const EMPTY_TEMPLATE: TemplateFormState = {
name: "", labName: "", labPhone: "", labFax: "",
labAddress: "", labAccount: "", caseType: "", material: "", instructions: "Please make\nThank you!",
};
const EMPTY_RX: RxFields = { toothNumbers: "", shade: "", dueDate: "", doctorName: "", age: "", officeName: "", additionalNotes: "Please make\nThank you!" };
const calcAge = (dob: string | Date | null | undefined): string => {
if (!dob) return "";
const birth = new Date(dob);
const today = new Date();
let age = today.getFullYear() - birth.getFullYear();
const m = today.getMonth() - birth.getMonth();
if (m < 0 || (m === 0 && today.getDate() < birth.getDate())) age--;
return String(age);
};
const CASE_TYPES = ["Crown", "Bridge", "Veneer", "Inlay/Onlay", "Full Denture", "Partial Denture", "Night Guard", "Retainer", "Implant Crown", "Other"];
const MATERIALS = ["Zirconia", "PFM (Porcelain-Fused-to-Metal)", "E-Max", "Acrylic", "Cast Metal", "Composite", "PMMA", "Other"];
interface Props {
open: boolean;
onClose: () => void;
patient: Patient;
}
export function LabRxModal({ open, onClose, patient }: Props) {
const { toast } = useToast();
const queryClient = useQueryClient();
const printRef = useRef<HTMLDivElement>(null);
// RX popup
const [rxTemplate, setRxTemplate] = useState<LabRxTemplate | null>(null);
const [rx, setRx] = useState<RxFields>(EMPTY_RX);
// Inline rename (Tab 1 cards)
const [renamingId, setRenamingId] = useState<number | null>(null);
const [renameValue, setRenameValue] = useState("");
// Manage Templates form
const [showTemplateForm, setShowTemplateForm] = useState(false);
const [editingTemplateId, setEditingTemplateId] = useState<number | null>(null);
const [templateForm, setTemplateForm] = useState<TemplateFormState>(EMPTY_TEMPLATE);
const { data: providers = [] } = useQuery<{ id: number; providerName: string }[]>({
queryKey: ["/api/npiProviders"],
queryFn: async () => {
const res = await apiRequest("GET", "/api/npiProviders");
if (!res.ok) throw new Error("Failed to fetch providers");
return res.json();
},
enabled: open,
});
const { data: officeContact } = useQuery<{ officeName?: string } | null>({
queryKey: ["/api/office-contact"],
queryFn: async () => {
const res = await apiRequest("GET", "/api/office-contact");
if (!res.ok) return null;
return res.json();
},
enabled: open,
});
const { data: templates = [], isLoading } = useQuery<LabRxTemplate[]>({
queryKey: ["/api/lab-rx/templates"],
queryFn: async () => {
const res = await apiRequest("GET", "/api/lab-rx/templates");
if (!res.ok) throw new Error("Failed to fetch");
return res.json();
},
enabled: open,
});
const invalidate = () => queryClient.invalidateQueries({ queryKey: ["/api/lab-rx/templates"] });
const createMutation = useMutation({
mutationFn: async (data: TemplateFormState) => {
const res = await apiRequest("POST", "/api/lab-rx/templates", data);
if (!res.ok) { const e = await res.json().catch(() => null); throw new Error(e?.message || "Failed to save"); }
return res.json();
},
onSuccess: () => { invalidate(); setShowTemplateForm(false); setTemplateForm(EMPTY_TEMPLATE); toast({ title: "Template saved" }); },
onError: (e: any) => toast({ title: "Error", description: e.message, variant: "destructive" }),
});
const updateMutation = useMutation({
mutationFn: async ({ id, data }: { id: number; data: Partial<TemplateFormState> }) => {
const res = await apiRequest("PUT", `/api/lab-rx/templates/${id}`, data);
if (!res.ok) { const e = await res.json().catch(() => null); throw new Error(e?.message || "Failed to update"); }
return res.json();
},
onSuccess: () => { invalidate(); setEditingTemplateId(null); setTemplateForm(EMPTY_TEMPLATE); setShowTemplateForm(false); toast({ title: "Template updated" }); },
onError: (e: any) => toast({ title: "Error", description: e.message, variant: "destructive" }),
});
const renameMutation = useMutation({
mutationFn: async ({ id, name }: { id: number; name: string }) => {
const res = await apiRequest("PUT", `/api/lab-rx/templates/${id}`, { name });
if (!res.ok) { const e = await res.json().catch(() => null); throw new Error(e?.message || "Failed to rename"); }
return res.json();
},
onSuccess: () => { invalidate(); setRenamingId(null); },
onError: (e: any) => toast({ title: "Error", description: e.message, variant: "destructive" }),
});
const deleteMutation = useMutation({
mutationFn: async (id: number) => {
const res = await apiRequest("DELETE", `/api/lab-rx/templates/${id}`);
if (!res.ok) throw new Error("Failed to delete");
},
onSuccess: () => { invalidate(); toast({ title: "Template deleted" }); },
onError: (e: any) => toast({ title: "Error", description: e.message, variant: "destructive" }),
});
const reorderMutation = useMutation({
mutationFn: async (orderedIds: number[]) => {
const res = await apiRequest("POST", "/api/lab-rx/templates/reorder", { orderedIds });
if (!res.ok) throw new Error("Failed to reorder");
},
onSuccess: () => invalidate(),
onError: (e: any) => toast({ title: "Error", description: e.message, variant: "destructive" }),
});
const moveTemplate = (index: number, direction: "up" | "down") => {
const swapIndex = direction === "up" ? index - 1 : index + 1;
const reordered = [...templates];
const a = reordered[index]!;
const b = reordered[swapIndex]!;
reordered[index] = b;
reordered[swapIndex] = a;
queryClient.setQueryData<LabRxTemplate[]>(["/api/lab-rx/templates"], reordered);
reorderMutation.mutate(reordered.map((t) => t.id));
};
const openRx = (t: LabRxTemplate) => {
if (renamingId !== null) return;
setRxTemplate(t);
setRx({ ...EMPTY_RX, doctorName: providers[0]?.providerName ?? "", age: calcAge(patient.dateOfBirth), officeName: officeContact?.officeName ?? "" });
};
const startRename = (e: React.MouseEvent, t: LabRxTemplate) => {
e.stopPropagation();
setRenamingId(t.id);
setRenameValue(t.name);
};
const commitRename = () => {
if (!renameValue.trim()) { toast({ title: "Name cannot be empty", variant: "destructive" }); return; }
if (renamingId !== null) renameMutation.mutate({ id: renamingId, name: renameValue.trim() });
};
const cancelRename = () => setRenamingId(null);
const openAddTemplate = () => { setEditingTemplateId(null); setTemplateForm(EMPTY_TEMPLATE); setShowTemplateForm(true); };
const openEditTemplate = (t: LabRxTemplate) => {
setEditingTemplateId(t.id);
setTemplateForm({ name: t.name, labName: t.labName ?? "", labPhone: t.labPhone ?? "", labFax: t.labFax ?? "", labAddress: t.labAddress ?? "", labAccount: t.labAccount ?? "", caseType: t.caseType ?? "", material: t.material ?? "", instructions: t.instructions ?? "" });
setShowTemplateForm(true);
};
const handleSaveTemplate = () => {
if (!templateForm.name.trim()) { toast({ title: "Template name is required", variant: "destructive" }); return; }
if (editingTemplateId !== null) updateMutation.mutate({ id: editingTemplateId, data: templateForm });
else createMutation.mutate(templateForm);
};
const isSaving = createMutation.isPending || updateMutation.isPending;
const handlePrint = () => {
const content = printRef.current;
if (!content || !rxTemplate) return;
const win = window.open("", "_blank", "width=800,height=900");
if (!win) return;
win.document.write(`<!DOCTYPE html><html><head><title>Lab RX</title>
<style>
body{font-family:Arial,sans-serif;margin:0;padding:24px;font-size:13px;color:#111}
h1{font-size:22px;margin:0 0 4px;text-align:center}
.subtitle{text-align:center;color:#555;font-size:12px;margin-bottom:12px}
hr{border:none;border-top:2px solid #000;margin:10px 0}
.section{margin-bottom:14px}
.section-title{font-weight:bold;font-size:11px;text-transform:uppercase;letter-spacing:.06em;border-bottom:1px solid #bbb;margin-bottom:8px;padding-bottom:3px;color:#333}
.row{display:flex;gap:24px;margin-bottom:6px}
.field{flex:1}
.field label{display:block;font-size:10px;color:#777;margin-bottom:1px}
.field span{display:block;border-bottom:1px solid #aaa;padding-bottom:2px;min-height:18px;font-size:13px}
.instructions-box{border:1px solid #bbb;padding:8px;min-height:64px;white-space:pre-wrap;font-size:12px}
.sig-area{display:flex;gap:48px;margin-top:32px}
.sig-line{border-top:1px solid #000;padding-top:3px;font-size:10px;color:#777;min-width:180px}
@media print{body{margin:0}}
</style>
</head><body>${content.innerHTML}</body></html>`);
win.document.close();
win.focus();
setTimeout(() => { win.print(); win.close(); }, 300);
};
const patientName = `${patient.firstName} ${patient.lastName}`;
const today = new Date().toLocaleDateString("en-US");
return (
<>
{/* ── Main modal ── */}
<Dialog open={open} onOpenChange={(v) => !v && onClose()}>
<DialogContent className="max-w-3xl max-h-[90vh] overflow-y-auto">
<DialogHeader>
<DialogTitle className="flex items-center gap-2">
<FlaskConical className="h-5 w-5" />
Lab RX — {patientName}
</DialogTitle>
</DialogHeader>
<Tabs defaultValue="rx">
<TabsList className="mb-4">
<TabsTrigger value="rx">Create Lab RX</TabsTrigger>
<TabsTrigger value="templates">Manage Templates</TabsTrigger>
</TabsList>
{/* ── Tab 1: pick template ── */}
<TabsContent value="rx" className="space-y-4">
<p className="text-xs font-medium text-gray-500 uppercase tracking-wide">
Click a template to create a Lab RX
</p>
{isLoading ? (
<p className="text-sm text-gray-400">Loading templates…</p>
) : templates.length === 0 ? (
<p className="text-sm text-gray-400">No templates yet. Go to "Manage Templates" to add one.</p>
) : (
<div className="grid grid-cols-1 sm:grid-cols-2 gap-3">
{templates.map((t) => (
<div
key={t.id}
onClick={() => openRx(t)}
className="group relative border rounded-lg p-3 bg-white cursor-pointer hover:border-blue-400 hover:shadow-sm transition-all"
>
{renamingId === t.id ? (
<div className="flex items-center gap-1" onClick={(e) => e.stopPropagation()}>
<Input
autoFocus
value={renameValue}
onChange={(e) => setRenameValue(e.target.value)}
onKeyDown={(e) => { if (e.key === "Enter") commitRename(); if (e.key === "Escape") cancelRename(); }}
className="h-7 text-sm font-medium"
/>
<Button variant="ghost" size="icon" className="h-6 w-6 shrink-0 text-green-600" onClick={commitRename} disabled={renameMutation.isPending}>
<Check className="h-3.5 w-3.5" />
</Button>
<Button variant="ghost" size="icon" className="h-6 w-6 shrink-0" onClick={cancelRename}>
<X className="h-3.5 w-3.5" />
</Button>
</div>
) : (
<div className="flex items-start justify-between gap-2">
<div className="min-w-0">
<p className="font-semibold text-sm text-gray-900 truncate">{t.name}</p>
{t.labName && <p className="text-xs text-gray-500 mt-0.5">{t.labName}</p>}
<div className="flex flex-wrap gap-x-3 gap-y-0.5 mt-1 text-xs text-gray-400">
{t.caseType && <span>{t.caseType}</span>}
{t.material && <span>{t.material}</span>}
</div>
</div>
<button
title="Rename template"
onClick={(e) => startRename(e, t)}
className="shrink-0 p-1 rounded opacity-0 group-hover:opacity-100 hover:bg-gray-100 transition-opacity"
>
<Pencil className="h-3.5 w-3.5 text-gray-400" />
</button>
</div>
)}
</div>
))}
</div>
)}
</TabsContent>
{/* ── Tab 2: manage templates ── */}
<TabsContent value="templates" className="space-y-4">
<div className="flex items-center justify-between">
<p className="text-sm text-gray-500">{templates.length} template{templates.length !== 1 ? "s" : ""}</p>
<Button size="sm" onClick={openAddTemplate} className="gap-1.5">
<Plus className="h-4 w-4" /> Add Template
</Button>
</div>
{showTemplateForm && (
<div className="border rounded-lg overflow-hidden">
<div className="bg-gray-100 border-b px-4 py-2.5">
<p className="text-sm font-semibold text-gray-800">
{editingTemplateId !== null ? "Edit Template" : "New Template"}
</p>
</div>
<div className="p-4 space-y-5 bg-white">
{/* Template Name section */}
<div className="space-y-2">
<div className="flex items-center gap-2">
<p className="text-xs font-bold uppercase tracking-widest text-blue-600">Template Name</p>
<div className="flex-1 h-px bg-blue-100" />
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Name <span className="text-red-500">*</span></Label>
<Input
placeholder="e.g. Glidewell Crown, Argen Bridge…"
value={templateForm.name}
onChange={(e) => setTemplateForm((f) => ({ ...f, name: e.target.value }))}
className="h-9 text-sm"
/>
<p className="text-xs text-gray-400">This name appears on the template picker button.</p>
</div>
</div>
{/* Lab Information section */}
<div className="space-y-2">
<div className="flex items-center gap-2">
<p className="text-xs font-bold uppercase tracking-widest text-gray-500">Lab Information</p>
<div className="flex-1 h-px bg-gray-200" />
</div>
<div className="grid grid-cols-2 gap-3">
<div className="space-y-1">
<Label className="text-xs text-gray-600">Lab Name</Label>
<Input placeholder="e.g. Glidewell Dental" value={templateForm.labName} onChange={(e) => setTemplateForm((f) => ({ ...f, labName: e.target.value }))} className="h-9 text-sm" />
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Account #</Label>
<Input placeholder="e.g. 123456" value={templateForm.labAccount} onChange={(e) => setTemplateForm((f) => ({ ...f, labAccount: e.target.value }))} className="h-9 text-sm" />
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Phone</Label>
<Input placeholder="(800) 000-0000" value={templateForm.labPhone} onChange={(e) => setTemplateForm((f) => ({ ...f, labPhone: e.target.value }))} className="h-9 text-sm" />
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Fax</Label>
<Input placeholder="(800) 000-0001" value={templateForm.labFax} onChange={(e) => setTemplateForm((f) => ({ ...f, labFax: e.target.value }))} className="h-9 text-sm" />
</div>
<div className="col-span-2 space-y-1">
<Label className="text-xs text-gray-600">Address</Label>
<Input placeholder="123 Lab St, City, State 00000" value={templateForm.labAddress} onChange={(e) => setTemplateForm((f) => ({ ...f, labAddress: e.target.value }))} className="h-9 text-sm" />
</div>
</div>
</div>
{/* Default Case Details section */}
<div className="space-y-2">
<div className="flex items-center gap-2">
<p className="text-xs font-bold uppercase tracking-widest text-gray-500">Default Case Details</p>
<div className="flex-1 h-px bg-gray-200" />
</div>
<div className="grid grid-cols-2 gap-3">
<div className="space-y-1">
<Label className="text-xs text-gray-600">Case Type</Label>
<Select value={templateForm.caseType} onValueChange={(v) => setTemplateForm((f) => ({ ...f, caseType: v }))}>
<SelectTrigger className="h-9 text-sm"><SelectValue placeholder="Select…" /></SelectTrigger>
<SelectContent>{CASE_TYPES.map((c) => <SelectItem key={c} value={c}>{c}</SelectItem>)}</SelectContent>
</Select>
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Material</Label>
<Select value={templateForm.material} onValueChange={(v) => setTemplateForm((f) => ({ ...f, material: v }))}>
<SelectTrigger className="h-9 text-sm"><SelectValue placeholder="Select…" /></SelectTrigger>
<SelectContent>{MATERIALS.map((m) => <SelectItem key={m} value={m}>{m}</SelectItem>)}</SelectContent>
</Select>
</div>
<div className="col-span-2 space-y-1">
<Label className="text-xs text-gray-600">Instructions</Label>
<Textarea placeholder="Standard instructions for this lab…" value={templateForm.instructions} onChange={(e) => setTemplateForm((f) => ({ ...f, instructions: e.target.value }))} className="text-sm resize-none" rows={3} />
</div>
</div>
</div>
</div>
<div className="bg-gray-50 border-t px-4 py-3 flex gap-2">
<Button size="sm" onClick={handleSaveTemplate} disabled={isSaving}>
<Check className="h-3.5 w-3.5 mr-1" />{isSaving ? "Saving…" : "Save Template"}
</Button>
<Button size="sm" variant="outline" onClick={() => { setShowTemplateForm(false); setEditingTemplateId(null); setTemplateForm(EMPTY_TEMPLATE); }} disabled={isSaving}>
<X className="h-3.5 w-3.5 mr-1" /> Cancel
</Button>
</div>
</div>
)}
{isLoading ? (
<p className="text-sm text-gray-400 py-4 text-center">Loading…</p>
) : templates.length === 0 ? (
<p className="text-sm text-gray-400 py-8 text-center">No templates yet. Click "Add Template" to create one.</p>
) : (
<div className="space-y-2">
{templates.map((t, index) => (
<div key={t.id} className="border rounded-lg p-3 bg-white flex items-center gap-2">
<div className="flex flex-col shrink-0">
<Button
variant="ghost" size="icon" className="h-6 w-6 text-gray-400 hover:text-gray-700 disabled:opacity-20"
disabled={index === 0 || reorderMutation.isPending}
onClick={() => moveTemplate(index, "up")}
>
<ChevronUp className="h-4 w-4" />
</Button>
<Button
variant="ghost" size="icon" className="h-6 w-6 text-gray-400 hover:text-gray-700 disabled:opacity-20"
disabled={index === templates.length - 1 || reorderMutation.isPending}
onClick={() => moveTemplate(index, "down")}
>
<ChevronDown className="h-4 w-4" />
</Button>
</div>
<div className="flex-1 min-w-0">
<p className="font-medium text-sm text-gray-900">{t.name}</p>
{t.labName && <p className="text-xs text-gray-500">{t.labName}</p>}
<div className="flex flex-wrap gap-x-4 gap-y-0.5 text-xs text-gray-400 mt-0.5">
{t.caseType && <span>Case: {t.caseType}</span>}
{t.material && <span>Material: {t.material}</span>}
{t.labPhone && <span>Ph: {t.labPhone}</span>}
</div>
</div>
<div className="flex items-center gap-1 shrink-0">
<Button variant="ghost" size="icon" className="h-7 w-7" onClick={() => openEditTemplate(t)}>
<Pencil className="h-3.5 w-3.5 text-gray-500" />
</Button>
<Button variant="ghost" size="icon" className="h-7 w-7" onClick={() => deleteMutation.mutate(t.id)} disabled={deleteMutation.isPending}>
<Trash2 className="h-3.5 w-3.5 text-red-500" />
</Button>
</div>
</div>
))}
</div>
)}
</TabsContent>
</Tabs>
</DialogContent>
</Dialog>
{/* ── RX popup ── */}
<Dialog open={!!rxTemplate} onOpenChange={(v) => { if (!v) setRxTemplate(null); }}>
<DialogContent className="max-w-2xl max-h-[90vh] overflow-y-auto">
<DialogHeader>
<DialogTitle className="flex items-center gap-2">
<Printer className="h-5 w-5" />
Lab RX — {rxTemplate?.name}
</DialogTitle>
</DialogHeader>
{rxTemplate && (
<>
<div className="space-y-5 py-2">
{/* Tooth Number section */}
<div className="space-y-2">
<div className="flex items-center gap-2">
<p className="text-xs font-bold uppercase tracking-widest text-blue-600">Tooth Number</p>
<div className="flex-1 h-px bg-blue-100" />
</div>
<div className="grid grid-cols-2 gap-3">
<div className="space-y-1">
<Label className="text-xs text-gray-600">Tooth Number(s)</Label>
<Input placeholder="e.g. 3, 14, 19" value={rx.toothNumbers} onChange={(e) => setRx((r) => ({ ...r, toothNumbers: e.target.value }))} className="h-9 text-sm" />
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Shade</Label>
<Input placeholder="e.g. A2, B1" value={rx.shade} onChange={(e) => setRx((r) => ({ ...r, shade: e.target.value }))} className="h-9 text-sm" />
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Age</Label>
<Input placeholder="e.g. 72" value={rx.age} onChange={(e) => setRx((r) => ({ ...r, age: e.target.value }))} className="h-9 text-sm" />
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Due Date</Label>
<Input type="date" value={rx.dueDate} onChange={(e) => setRx((r) => ({ ...r, dueDate: e.target.value }))} className="h-9 text-sm" />
</div>
<div className="space-y-1">
<Label className="text-xs text-gray-600">Doctor's Name</Label>
<Select value={rx.doctorName} onValueChange={(v) => setRx((r) => ({ ...r, doctorName: v }))}>
<SelectTrigger className="h-9 text-sm">
<SelectValue placeholder="Select provider…" />
</SelectTrigger>
<SelectContent>
{providers.map((p) => (
<SelectItem key={p.id} value={p.providerName}>{p.providerName}</SelectItem>
))}
</SelectContent>
</Select>
</div>
<div className="col-span-2 space-y-1">
<Label className="text-xs text-gray-600">Dental Office Name</Label>
<Input placeholder="e.g. Summit Dental Care" value={rx.officeName} onChange={(e) => setRx((r) => ({ ...r, officeName: e.target.value }))} className="h-9 text-sm" />
</div>
</div>
</div>
{/* Instructions section */}
<div className="space-y-2">
<div className="flex items-center gap-2">
<p className="text-xs font-bold uppercase tracking-widest text-gray-500">Instructions</p>
<div className="flex-1 h-px bg-gray-200" />
</div>
{rxTemplate.instructions && (
<div className="rounded-md bg-gray-50 border px-3 py-2 text-xs text-gray-600 whitespace-pre-wrap">
<span className="font-medium text-gray-400 block mb-1">From template</span>
{rxTemplate.instructions}
</div>
)}
<div className="space-y-1">
<Label className="text-xs text-gray-600">Additional Notes</Label>
<Textarea placeholder="Any extra instructions for this case…" value={rx.additionalNotes} onChange={(e) => setRx((r) => ({ ...r, additionalNotes: e.target.value }))} className="text-sm resize-none" rows={3} />
</div>
</div>
{/* RX preview */}
<div className="border rounded-lg p-4 bg-gray-50 text-sm space-y-3">
<div className="text-center border-b pb-3">
<p className="font-bold text-base">Dental Lab Prescription</p>
<p className="text-xs text-gray-500">
Date: {today}{rx.dueDate ? ` · Due: ${new Date(rx.dueDate + "T00:00").toLocaleDateString("en-US")}` : ""}
</p>
</div>
<div className="grid grid-cols-2 gap-x-6 gap-y-1">
<div><span className="text-gray-400 text-xs">Patient</span><p className="font-medium">{patientName}</p></div>
<div><span className="text-gray-400 text-xs">Age</span><p>{rx.age || "—"}</p></div>
{rx.officeName && <div className="col-span-2"><span className="text-gray-400 text-xs">Dental Office</span><p className="font-medium">{rx.officeName}</p></div>}
<div className="col-span-2 mt-1 border-t pt-2"><span className="text-gray-400 text-xs">Lab</span><p className="font-medium">{rxTemplate.labName || "—"}</p></div>
<div><span className="text-gray-400 text-xs">Phone</span><p>{rxTemplate.labPhone || "—"}</p></div>
{rxTemplate.labFax && <div><span className="text-gray-400 text-xs">Fax</span><p>{rxTemplate.labFax}</p></div>}
{rxTemplate.labAddress && <div className="col-span-2"><span className="text-gray-400 text-xs">Address</span><p>{rxTemplate.labAddress}</p></div>}
{rxTemplate.labAccount && <div><span className="text-gray-400 text-xs">Account #</span><p>{rxTemplate.labAccount}</p></div>}
<div className="col-span-2 mt-1 border-t pt-2 grid grid-cols-2 gap-x-6">
<div><span className="text-gray-400 text-xs">Case Type</span><p>{rxTemplate.caseType || "—"}</p></div>
<div><span className="text-gray-400 text-xs">Material</span><p>{rxTemplate.material || "—"}</p></div>
<div><span className="text-gray-400 text-xs">Tooth #</span><p>{rx.toothNumbers || "—"}</p></div>
<div><span className="text-gray-400 text-xs">Shade</span><p>{rx.shade || "—"}</p></div>
{rx.doctorName && <div><span className="text-gray-400 text-xs">Doctor</span><p>{rx.doctorName}</p></div>}
</div>
{(rxTemplate.instructions || rx.additionalNotes) && (
<div className="col-span-2 mt-1 border-t pt-2">
<span className="text-gray-400 text-xs">Instructions</span>
<p className="whitespace-pre-wrap text-xs mt-1 text-gray-700">
{[rxTemplate.instructions, rx.additionalNotes].filter(Boolean).join("\n\n")}
</p>
</div>
)}
</div>
</div>
</div>
{/* Hidden print DOM */}
<div className="hidden">
<div ref={printRef}>
<h1>Dental Lab Prescription</h1>
<div className="subtitle">
Date: {today}{rx.dueDate ? ` · Due: ${new Date(rx.dueDate + "T00:00").toLocaleDateString("en-US")}` : ""}
</div>
<hr />
<div className="section">
<div className="section-title">Patient Information</div>
<div className="row">
<div className="field"><label>Patient Name</label><span>{patientName}</span></div>
<div className="field"><label>Age</label><span>{rx.age}</span></div>
<div className="field"><label>Dental Office</label><span>{rx.officeName}</span></div>
</div>
</div>
<div className="section">
<div className="section-title">Dental Lab</div>
<div className="row">
<div className="field"><label>Lab Name</label><span>{rxTemplate.labName ?? ""}</span></div>
<div className="field"><label>Account #</label><span>{rxTemplate.labAccount ?? ""}</span></div>
</div>
<div className="row">
<div className="field"><label>Phone</label><span>{rxTemplate.labPhone ?? ""}</span></div>
<div className="field"><label>Fax</label><span>{rxTemplate.labFax ?? ""}</span></div>
</div>
<div className="row">
<div className="field"><label>Address</label><span>{rxTemplate.labAddress ?? ""}</span></div>
</div>
</div>
<div className="section">
<div className="section-title">Prescription Details</div>
<div className="row">
<div className="field"><label>Case Type</label><span>{rxTemplate.caseType ?? ""}</span></div>
<div className="field"><label>Material</label><span>{rxTemplate.material ?? ""}</span></div>
</div>
<div className="row">
<div className="field"><label>Tooth Number(s)</label><span>{rx.toothNumbers}</span></div>
<div className="field"><label>Shade</label><span>{rx.shade}</span></div>
</div>
<div className="row">
<div className="field"><label>Doctor's Name</label><span>{rx.doctorName}</span></div>
</div>
</div>
<div className="section">
<div className="section-title">Instructions</div>
<div className="instructions-box">
{[rxTemplate.instructions, rx.additionalNotes].filter(Boolean).join("\n\n")}
</div>
</div>
<div className="sig-area">
<div className="sig-line">Doctor Signature</div>
<div className="sig-line">Date</div>
</div>
</div>
</div>
</>
)}
<DialogFooter>
<Button variant="outline" onClick={() => setRxTemplate(null)}>Close</Button>
<Button onClick={handlePrint} className="gap-2">
<Printer className="h-4 w-4" /> Print Lab RX
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
</>
);
}
@@ -30,6 +30,8 @@ import {
Building2,
Timer,
BookOpen,
MonitorCog,
GraduationCap,
ShoppingCart,
Search,
KeyRound,
@@ -169,6 +171,11 @@ export function Sidebar() {
path: "/cloud-storage",
icon: <Cloud className="h-5 w-5 text-sky-500" />,
},
{
name: "Dental Education",
path: "/dental-education",
icon: <GraduationCap className="h-5 w-5 text-lime-600" />,
},
{
name: "AI Input Agent",
path: "/ai-input-agent",
@@ -285,6 +292,11 @@ export function Sidebar() {
path: "/settings/aichat",
icon: <Bot className="h-4 w-4 text-gray-400" />,
},
{
name: "Selenium Settings",
path: "/settings/selenium",
icon: <MonitorCog className="h-4 w-4 text-gray-400" />,
},
],
},
],
@@ -0,0 +1,106 @@
import { useState, useEffect } from "react";
import { useQuery, useMutation } from "@tanstack/react-query";
import { Card, CardContent } from "@/components/ui/card";
import { CheckCircle } from "lucide-react";
import { useToast } from "@/hooks/use-toast";
import { apiRequest, queryClient } from "@/lib/queryClient";
export function SeleniumSettingsCard() {
const { toast } = useToast();
const [paymentGroupId, setPaymentGroupId] = useState("");
const { data: settings, isLoading } = useQuery({
queryKey: ["/api/selenium-settings"],
queryFn: async () => {
const res = await apiRequest("GET", "/api/selenium-settings");
if (!res.ok) return null;
return res.json();
},
});
useEffect(() => {
if (settings) {
setPaymentGroupId(settings.paymentGroupId ?? "");
}
}, [settings]);
const saveMutation = useMutation({
mutationFn: async (data) => {
const res = await apiRequest("PUT", "/api/selenium-settings", data);
if (!res.ok) {
const err = await res.json().catch(() => null);
throw new Error(err?.message || "Failed to save Selenium settings");
}
return res.json();
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["/api/selenium-settings"] });
toast({ title: "Selenium Settings Saved" });
},
onError: (err) => {
toast({ title: "Error", description: err?.message || "Failed to save settings", variant: "destructive" });
},
});
if (isLoading) {
return (
<Card>
<CardContent className="py-6">
<p className="text-sm text-gray-500">Loading...</p>
</CardContent>
</Card>
);
}
return (
<Card>
<CardContent className="space-y-6 py-6">
<div>
<div className="flex items-center gap-2">
<h3 className="text-lg font-semibold">Selenium Settings</h3>
{settings?.paymentGroupId && (
<span className="flex items-center gap-1 text-xs text-green-600 font-medium">
<CheckCircle className="h-3.5 w-3.5" /> Configured
</span>
)}
</div>
<p className="text-sm text-gray-500 mt-1">
Configure values used by Selenium automation workers (United eligibility, claim, and pre-auth).
</p>
</div>
<form
className="space-y-4"
onSubmit={(e) => {
e.preventDefault();
saveMutation.mutate({ paymentGroupId });
}}
>
<div>
<label className="block text-sm font-medium text-gray-700">
Payment Group ID
</label>
<p className="text-xs text-gray-400 mb-1">
The office name as it appears in the United/DentalHub portal dropdown (e.g. "Summit Dental Care" or "Broadway Dental").
</p>
<input
type="text"
value={paymentGroupId}
onChange={(e) => setPaymentGroupId(e.target.value)}
className="mt-1 p-2 border rounded w-full"
placeholder="e.g. Summit Dental Care"
/>
</div>
<button
type="submit"
className="bg-teal-600 text-white px-4 py-2 rounded hover:bg-teal-700 disabled:opacity-50"
disabled={saveMutation.isPending}
>
{saveMutation.isPending ? "Saving..." : "Save Settings"}
</button>
</form>
</CardContent>
</Card>
);
}
@@ -0,0 +1,110 @@
import { useState, useEffect } from "react";
import { useQuery, useMutation } from "@tanstack/react-query";
import { Card, CardContent } from "@/components/ui/card";
import { CheckCircle } from "lucide-react";
import { useToast } from "@/hooks/use-toast";
import { apiRequest, queryClient } from "@/lib/queryClient";
type SeleniumSettings = {
paymentGroupId: string;
};
export function SeleniumSettingsCard() {
const { toast } = useToast();
const [paymentGroupId, setPaymentGroupId] = useState("");
const { data: settings, isLoading } = useQuery<SeleniumSettings | null>({
queryKey: ["/api/selenium-settings"],
queryFn: async () => {
const res = await apiRequest("GET", "/api/selenium-settings");
if (!res.ok) return null;
return res.json();
},
});
useEffect(() => {
if (settings) {
setPaymentGroupId(settings.paymentGroupId ?? "");
}
}, [settings]);
const saveMutation = useMutation({
mutationFn: async (data: SeleniumSettings) => {
const res = await apiRequest("PUT", "/api/selenium-settings", data);
if (!res.ok) {
const err = await res.json().catch(() => null);
throw new Error(err?.message || "Failed to save Selenium settings");
}
return res.json();
},
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["/api/selenium-settings"] });
toast({ title: "Selenium Settings Saved" });
},
onError: (err: any) => {
toast({ title: "Error", description: err?.message || "Failed to save settings", variant: "destructive" });
},
});
if (isLoading) {
return (
<Card>
<CardContent className="py-6">
<p className="text-sm text-gray-500">Loading...</p>
</CardContent>
</Card>
);
}
return (
<Card>
<CardContent className="space-y-6 py-6">
<div>
<div className="flex items-center gap-2">
<h3 className="text-lg font-semibold">Selenium Settings</h3>
{settings?.paymentGroupId && (
<span className="flex items-center gap-1 text-xs text-green-600 font-medium">
<CheckCircle className="h-3.5 w-3.5" /> Configured
</span>
)}
</div>
<p className="text-sm text-gray-500 mt-1">
Configure values used by Selenium automation workers (United eligibility, claim, and pre-auth).
</p>
</div>
<form
className="space-y-4"
onSubmit={(e) => {
e.preventDefault();
saveMutation.mutate({ paymentGroupId });
}}
>
<div>
<label className="block text-sm font-medium text-gray-700">
Payment Group ID
</label>
<p className="text-xs text-gray-400 mb-1">
The office name as it appears in the United/DentalHub portal dropdown (e.g. "Summit Dental Care" or "Broadway Dental").
</p>
<input
type="text"
value={paymentGroupId}
onChange={(e) => setPaymentGroupId(e.target.value)}
className="mt-1 p-2 border rounded w-full"
placeholder="e.g. Summit Dental Care"
/>
</div>
<button
type="submit"
className="bg-teal-600 text-white px-4 py-2 rounded hover:bg-teal-700 disabled:opacity-50"
disabled={saveMutation.isPending}
>
{saveMutation.isPending ? "Saving..." : "Save Settings"}
</button>
</form>
</CardContent>
</Card>
);
}
@@ -0,0 +1,40 @@
export type LabRxTemplateConfig = {
id: string;
name: string;
labName?: string;
labPhone?: string;
labFax?: string;
labAddress?: string;
labAccount?: string;
caseType?: string;
material?: string;
instructions?: string;
};
export const LAB_RX_TEMPLATES: LabRxTemplateConfig[] = [
{
id: "highland-crown",
name: "Highland Dental Crown",
labName: "Highland Dental Studio",
labPhone: "781-552-5198",
labAddress: "87 Cambridge Street, Burlington, MA 01803",
caseType: "Crown",
material: "Zirconia",
},
{
id: "highland-full-denture",
name: "Highland Dental Full Denture",
labName: "Highland Dental Studio",
labPhone: "781-552-5198",
labAddress: "87 Cambridge Street, Burlington, MA 01803",
caseType: "Full Denture",
},
{
id: "highland-partial-denture",
name: "Highland Dental Partial Denture",
labName: "Highland Dental Studio",
labPhone: "781-552-5198",
labAddress: "87 Cambridge Street, Burlington, MA 01803",
caseType: "Partial Denture",
},
];
+24 -13
View File
@@ -143,10 +143,12 @@ export default function ClaimsPage() {
// CCA result: pdfFileId is already saved by the processor — open preview directly
if (jobResult.pdfFileId) {
advanceAiClaimQueue();
advanceChatbotClaimQueue();
setPreviewPdfId(jobResult.pdfFileId);
setPreviewFallbackFilename(jobResult.pdfFilename ?? `cca_claim_${jobResult.claimNumber ?? "unknown"}.pdf`);
setPreviewOpen(true);
const advancedToNext = advanceChatbotClaimQueue();
if (!advancedToNext) {
setPreviewPdfId(jobResult.pdfFileId);
setPreviewFallbackFilename(jobResult.pdfFilename ?? `cca_claim_${jobResult.claimNumber ?? "unknown"}.pdf`);
setPreviewOpen(true);
}
dispatch(setTaskStatus({
key: "claimSubmit",
status: "success",
@@ -336,7 +338,9 @@ export default function ClaimsPage() {
// Advance the chatbot_claim_queue / chatbot_check_claim_queue after selenium PDF is saved.
// NOT called from closeClaim — called only after the selenium job completes and PDF is downloaded.
const advanceChatbotClaimQueue = () => {
// Returns true if it navigated on to another queued patient (caller should skip the PDF
// preview popup in that case — the form is about to be replaced by the next patient's claim).
const advanceChatbotClaimQueue = (): boolean => {
try {
const raw = sessionStorage.getItem("chatbot_check_claim_queue");
if (raw) {
@@ -369,7 +373,7 @@ export default function ClaimsPage() {
window.dispatchEvent(new CustomEvent("chatbot:eligibility-prefill"));
setWouterLocation("/insurance-status");
}, 500);
return;
return true;
}
sessionStorage.removeItem("chatbot_check_claim_queue");
}
@@ -403,11 +407,13 @@ export default function ClaimsPage() {
setTimeout(() => {
setWouterLocation(`/claims?newPatient=${next.patient.id}`);
}, 500);
return;
return true;
}
sessionStorage.removeItem("chatbot_claim_queue");
}
} catch {}
return false;
};
// Advance the ai_claim_queue by removing the first item (current patient).
@@ -447,10 +453,13 @@ export default function ClaimsPage() {
const data = await res.json();
if (!res.ok) throw new Error(data?.message || "Failed to save claim");
queryClient.invalidateQueries({ queryKey: QK_CLAIMS_BASE });
if (!isDraft) {
advanceAiClaimQueue();
advanceChatbotClaimQueue();
}
// NOTE: advanceChatbotClaimQueue() is NOT called here. This function only creates
// the claim DB record; for selenium-based insurances (MH/CCA/DDMA/Tufts/United) the
// actual submission + PDF happens afterward. Advancing the queue here would move to
// the next patient before the current patient's selenium job (and PDF) finishes.
// The queue is advanced later, once the selenium job completes (see
// handleMHSeleniumPdfDownload and the CCA branch in the job-status useEffect).
if (!isDraft) advanceAiClaimQueue();
return data;
};
@@ -964,13 +973,15 @@ export default function ClaimsPage() {
duration: isPreAuth ? 10000 : 5000,
});
let advancedToNext = false;
if (!isPreAuth) {
advanceAiClaimQueue();
advanceChatbotClaimQueue();
advancedToNext = advanceChatbotClaimQueue();
}
// Pop up the final PDF so the user doesn't need to navigate to Documents
if (result.pdfFileId) {
// (skip if we're about to navigate to the next queued patient's claim)
if (result.pdfFileId && !advancedToNext) {
setPreviewPdfId(result.pdfFileId);
setPreviewFallbackFilename(result.fileName ?? null);
setPreviewOpen(true);
@@ -0,0 +1,27 @@
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { GraduationCap } from "lucide-react";
export default function DentalEducationPage() {
return (
<div className="container mx-auto space-y-6">
<div>
<h1 className="text-3xl font-bold tracking-tight">Dental Education</h1>
<p className="text-muted-foreground">Educational resources for dental staff and patients.</p>
</div>
<Card>
<CardHeader>
<CardTitle className="flex items-center gap-2">
<GraduationCap className="h-5 w-5 text-lime-600" />
Coming Soon
</CardTitle>
</CardHeader>
<CardContent>
<p className="text-muted-foreground text-sm">
Dental education content will be available here.
</p>
</CardContent>
</Card>
</div>
);
}
@@ -19,6 +19,7 @@ import { OfficeContactCard } from "@/components/settings/office-contact-card";
import { ProcedureTimeslotCard } from "@/components/settings/procedure-timeslot-card";
import { InsuranceContactCard } from "@/components/settings/insurance-contact-card";
import { AiChatSettingsCard } from "@/components/settings/ai-chat-settings-card";
import { SeleniumSettingsCard } from "@/components/settings/selenium-settings-card";
export default function SettingsPage() {
const { toast } = useToast();
const { user: currentUser } = useAuth();
@@ -232,6 +233,8 @@ export default function SettingsPage() {
return <ProcedureTimeslotCard />;
case "insurancecontact":
return <InsuranceContactCard />;
case "selenium":
return <SeleniumSettingsCard />;
default:
return null;
}
+6 -1
View File
@@ -20,6 +20,7 @@ import { OfficeContactCard } from "@/components/settings/office-contact-card";
import { ProcedureTimeslotCard } from "@/components/settings/procedure-timeslot-card";
import { InsuranceContactCard } from "@/components/settings/insurance-contact-card";
import { AiChatSettingsCard } from "@/components/settings/ai-chat-settings-card";
import { SeleniumSettingsCard } from "@/components/settings/selenium-settings-card";
type SectionId =
| "staff"
@@ -34,7 +35,8 @@ type SectionId =
| "officehours"
| "officecontact"
| "proceduretimeslot"
| "insurancecontact";
| "insurancecontact"
| "selenium";
export default function SettingsPage() {
const { toast } = useToast();
@@ -276,6 +278,9 @@ export default function SettingsPage() {
case "insurancecontact":
return <InsuranceContactCard />;
case "selenium":
return <SeleniumSettingsCard />;
default:
return null;
}
@@ -52,6 +52,7 @@ class AutomationUnitedDHClaimSubmit:
self.uniteddh_username = claim.get("uniteddhUsername", "")
self.uniteddh_password = claim.get("uniteddhPassword", "")
self.payment_group_id = claim.get("paymentGroupId", "")
self.download_dir = get_browser_manager().download_dir
os.makedirs(self.download_dir, exist_ok=True)
@@ -595,11 +596,11 @@ class AutomationUnitedDHClaimSubmit:
try:
summit_option = WebDriverWait(self.driver, 5).until(
EC.element_to_be_clickable((By.XPATH,
"//ng-dropdown-panel//div[contains(@class,'ng-option') and contains(.,'Summit Dental Care')]"
f"//ng-dropdown-panel//div[contains(@class,'ng-option') and contains(.,'{self.payment_group_id}')]"
))
)
summit_option.click()
print("[UnitedDH Claim] step1: Selected Treatment Location: Summit Dental Care")
print(f"[UnitedDH Claim] step1: Selected Treatment Location: {self.payment_group_id}")
location_selected = True
except TimeoutException:
try:
@@ -632,11 +633,11 @@ class AutomationUnitedDHClaimSubmit:
try:
summit_option = WebDriverWait(self.driver, 5).until(
EC.element_to_be_clickable((By.XPATH,
"//ng-dropdown-panel//div[contains(@class,'ng-option') and contains(.,'Summit Dental Care')]"
f"//ng-dropdown-panel//div[contains(@class,'ng-option') and contains(.,'{self.payment_group_id}')]"
))
)
summit_option.click()
print("[UnitedDH Claim] step1: Selected Billing Entity: Summit Dental Care")
print(f"[UnitedDH Claim] step1: Selected Billing Entity: {self.payment_group_id}")
billing_selected = True
except TimeoutException:
try:
@@ -52,6 +52,7 @@ class AutomationUnitedDHPreAuth:
self.uniteddh_username = claim.get("uniteddhUsername", "")
self.uniteddh_password = claim.get("uniteddhPassword", "")
self.payment_group_id = claim.get("paymentGroupId", "")
self.download_dir = get_browser_manager().download_dir
os.makedirs(self.download_dir, exist_ok=True)
@@ -554,11 +555,11 @@ class AutomationUnitedDHPreAuth:
try:
summit_option = WebDriverWait(self.driver, 5).until(
EC.element_to_be_clickable((By.XPATH,
"//ng-dropdown-panel//div[contains(@class,'ng-option') and contains(.,'Summit Dental Care')]"
f"//ng-dropdown-panel//div[contains(@class,'ng-option') and contains(.,'{self.payment_group_id}')]"
))
)
summit_option.click()
print("[UnitedDH PreAuth] step1: Selected Treatment Location: Summit Dental Care")
print(f"[UnitedDH PreAuth] step1: Selected Treatment Location: {self.payment_group_id}")
location_selected = True
except TimeoutException:
try:
@@ -590,11 +591,11 @@ class AutomationUnitedDHPreAuth:
try:
summit_option = WebDriverWait(self.driver, 5).until(
EC.element_to_be_clickable((By.XPATH,
"//ng-dropdown-panel//div[contains(@class,'ng-option') and contains(.,'Summit Dental Care')]"
f"//ng-dropdown-panel//div[contains(@class,'ng-option') and contains(.,'{self.payment_group_id}')]"
))
)
summit_option.click()
print("[UnitedDH PreAuth] step1: Selected Billing Entity: Summit Dental Care")
print(f"[UnitedDH PreAuth] step1: Selected Billing Entity: {self.payment_group_id}")
billing_selected = True
except TimeoutException:
try:
@@ -27,6 +27,7 @@ class AutomationUnitedSCOEligibilityCheck:
self.lastName = self.data.get("lastName", "")
self.unitedsco_username = self.data.get("unitedscoUsername", "")
self.unitedsco_password = self.data.get("unitedscoPassword", "")
self.payment_group_id = self.data.get("paymentGroupId", "")
# Use browser manager's download dir
self.download_dir = get_browser_manager().download_dir
@@ -653,11 +654,11 @@ class AutomationUnitedSCOEligibilityCheck:
try:
summit_option = WebDriverWait(self.driver, 5).until(
EC.element_to_be_clickable((By.XPATH,
"//ng-dropdown-panel//div[contains(@class,'ng-option') and contains(.,'Summit Dental Care')]"
f"//ng-dropdown-panel//div[contains(@class,'ng-option') and contains(.,'{self.payment_group_id}')]"
))
)
summit_option.click()
print("[UnitedSCO step1] Selected Treatment Location: Summit Dental Care")
print(f"[UnitedSCO step1] Selected Treatment Location: {self.payment_group_id}")
location_selected = True
except TimeoutException:
try:
@@ -691,11 +692,11 @@ class AutomationUnitedSCOEligibilityCheck:
try:
summit_option = WebDriverWait(self.driver, 5).until(
EC.element_to_be_clickable((By.XPATH,
"//ng-dropdown-panel//div[contains(@class,'ng-option') and contains(.,'Summit Dental Care')]"
f"//ng-dropdown-panel//div[contains(@class,'ng-option') and contains(.,'{self.payment_group_id}')]"
))
)
summit_option.click()
print("[UnitedSCO step1] Selected Billing Entity: Summit Dental Care")
print(f"[UnitedSCO step1] Selected Billing Entity: {self.payment_group_id}")
billing_selected = True
except TimeoutException:
try:
+29 -60
View File
@@ -142,6 +142,7 @@
"pdfjs-dist": "^3.11.174",
"postcss": "^8.4.47",
"react": "^19.1.0",
"react-barcode": "^1.6.1",
"react-contexify": "^6.0.0",
"react-day-picker": "9.7.0",
"react-dnd": "^16.0.1",
@@ -274,7 +275,6 @@
"integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/code-frame": "^7.29.0",
"@babel/generator": "^7.29.0",
@@ -559,7 +559,8 @@
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/@cfworker/json-schema/-/json-schema-4.1.1.tgz",
"integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==",
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/@chevrotain/cst-dts-gen": {
"version": "10.5.0",
@@ -628,8 +629,7 @@
"version": "0.3.15",
"resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.15.tgz",
"integrity": "sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==",
"license": "Apache-2.0",
"peer": true
"license": "Apache-2.0"
},
"node_modules/@electric-sql/pglite-socket": {
"version": "0.0.20",
@@ -659,7 +659,6 @@
"cpu": [
"ppc64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -676,7 +675,6 @@
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -693,7 +691,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -710,7 +707,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -727,7 +723,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -744,7 +739,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -761,7 +755,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -778,7 +771,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -795,7 +787,6 @@
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -812,7 +803,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -829,7 +819,6 @@
"cpu": [
"ia32"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -846,7 +835,6 @@
"cpu": [
"loong64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -863,7 +851,6 @@
"cpu": [
"mips64el"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -880,7 +867,6 @@
"cpu": [
"ppc64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -897,7 +883,6 @@
"cpu": [
"riscv64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -914,7 +899,6 @@
"cpu": [
"s390x"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -931,7 +915,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -948,7 +931,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -965,7 +947,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -982,7 +963,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -999,7 +979,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1016,7 +995,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1033,7 +1011,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1050,7 +1027,6 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1067,7 +1043,6 @@
"cpu": [
"ia32"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1084,7 +1059,6 @@
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -5013,7 +4987,6 @@
"integrity": "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==",
"devOptional": true,
"license": "MIT",
"peer": true,
"dependencies": {
"hoist-non-react-statics": "^3.3.0"
},
@@ -5066,7 +5039,6 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.11.tgz",
"integrity": "sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==",
"license": "MIT",
"peer": true,
"dependencies": {
"undici-types": "~6.19.2"
}
@@ -5131,7 +5103,6 @@
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
"integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
"license": "MIT",
"peer": true,
"dependencies": {
"csstype": "^3.2.2"
}
@@ -5142,7 +5113,6 @@
"integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
"devOptional": true,
"license": "MIT",
"peer": true,
"peerDependencies": {
"@types/react": "^19.2.0"
}
@@ -5281,7 +5251,6 @@
"integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.56.1",
"@typescript-eslint/types": "8.56.1",
@@ -5590,7 +5559,6 @@
"integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -6136,7 +6104,6 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.9.0",
"caniuse-lite": "^1.0.30001759",
@@ -7265,8 +7232,7 @@
"version": "8.6.0",
"resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz",
"integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==",
"license": "MIT",
"peer": true
"license": "MIT"
},
"node_modules/embla-carousel-react": {
"version": "8.6.0",
@@ -7541,7 +7507,6 @@
"integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
@@ -8765,7 +8730,6 @@
"resolved": "https://registry.npmjs.org/hono/-/hono-4.11.4.tgz",
"integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=16.9.0"
}
@@ -9139,6 +9103,12 @@
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/jsbarcode": {
"version": "3.12.3",
"resolved": "https://registry.npmjs.org/jsbarcode/-/jsbarcode-3.12.3.tgz",
"integrity": "sha512-CuHU9hC6dPsHF5oVFMo8NW76uQVjH4L22CsP4hW+dNnGywJHC/B0ThA1CTDVLnxKLrrpYdicBLnd2xsgTfRnvg==",
"license": "MIT"
},
"node_modules/jsesc": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
@@ -9290,6 +9260,7 @@
"resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.6.0.tgz",
"integrity": "sha512-GGaj5IMRfLv2HXXFzGk9diISMYLTpSTh6fzCZGKxWYW/NqEztIFtnXLq6G/RVhzFRmCykLap1fuC67LVKoQLcg==",
"license": "MIT",
"peer": true,
"dependencies": {
"p-queue": "6.6.2"
},
@@ -10141,6 +10112,7 @@
"resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
"integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
"license": "MIT",
"peer": true,
"bin": {
"mustache": "bin/mustache"
}
@@ -10485,7 +10457,6 @@
"resolved": "https://registry.npmjs.org/openai/-/openai-6.44.0.tgz",
"integrity": "sha512-09/gH+8jH0RgUwsgWHAaxsKGRT5zVZ95IaJUnqAWj6XejIBmnFRwq2WUIF37VtDEsmGrtPmvCs5+yBSeZGWvkA==",
"license": "Apache-2.0",
"peer": true,
"peerDependencies": {
"ws": "^8.18.0",
"zod": "^3.25 || ^4.0"
@@ -10563,6 +10534,7 @@
"resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz",
"integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"eventemitter3": "^4.0.4",
"p-timeout": "^3.2.0"
@@ -10594,6 +10566,7 @@
"resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
"integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
"license": "MIT",
"peer": true,
"dependencies": {
"p-finally": "^1.0.0"
},
@@ -10768,7 +10741,6 @@
"resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-3.11.174.tgz",
"integrity": "sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA==",
"license": "Apache-2.0",
"peer": true,
"engines": {
"node": ">=18"
},
@@ -10801,7 +10773,6 @@
"resolved": "https://registry.npmjs.org/pg/-/pg-8.18.0.tgz",
"integrity": "sha512-xqrUDL1b9MbkydY/s+VZ6v+xiMUmOUk7SS9d/1kpyQxoJ6U9AO1oIJyUWVZojbfe5Cc/oluutcgFG4L9RDP1iQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"pg-connection-string": "^2.11.0",
"pg-pool": "^3.11.0",
@@ -10966,7 +10937,6 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
@@ -11196,7 +11166,6 @@
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
"integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
"license": "MIT",
"peer": true,
"bin": {
"prettier": "bin/prettier.cjs"
},
@@ -11889,11 +11858,23 @@
"resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
"integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/react-barcode": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/react-barcode/-/react-barcode-1.6.1.tgz",
"integrity": "sha512-pc4ftnO5syHa/UjCruEeRsomlhoxKSugIgTA8T4dH0fvc89UMHL+/1Sp25IAphqG44pJkE5hMXhv89iS09jQyw==",
"license": "ISC",
"dependencies": {
"jsbarcode": "^3.8.0",
"prop-types": "^15.6.2"
},
"peerDependencies": {
"react": "16 - 19"
}
},
"node_modules/react-contexify": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/react-contexify/-/react-contexify-6.0.0.tgz",
@@ -11981,7 +11962,6 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz",
"integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"scheduler": "^0.27.0"
},
@@ -11994,7 +11974,6 @@
"resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.71.2.tgz",
"integrity": "sha512-1CHvcDYzuRUNOflt4MOq3ZM46AronNJtQ1S7tnX6YN4y72qhgiUItpacZUAQ0TyWYci3yz1X+rXaSxiuEm86PA==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=18.0.0"
},
@@ -12026,7 +12005,6 @@
"resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz",
"integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==",
"license": "MIT",
"peer": true,
"dependencies": {
"@types/use-sync-external-store": "^0.0.6",
"use-sync-external-store": "^1.4.0"
@@ -12307,8 +12285,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
"integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==",
"license": "MIT",
"peer": true
"license": "MIT"
},
"node_modules/redux-thunk": {
"version": "3.1.0",
@@ -13240,7 +13217,6 @@
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz",
"integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",
@@ -13534,7 +13510,6 @@
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@@ -13812,7 +13787,6 @@
"integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==",
"devOptional": true,
"license": "MIT",
"peer": true,
"dependencies": {
"esbuild": "~0.27.0",
"get-tsconfig": "^4.7.5"
@@ -13994,7 +13968,6 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"devOptional": true,
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -14285,7 +14258,6 @@
"resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz",
"integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==",
"license": "MIT",
"peer": true,
"dependencies": {
"esbuild": "^0.25.0",
"fdir": "^6.4.4",
@@ -14834,7 +14806,6 @@
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@@ -15073,7 +15044,6 @@
"resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz",
"integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=10.0.0"
},
@@ -15196,7 +15166,6 @@
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
"license": "MIT",
"peer": true,
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
File diff suppressed because one or more lines are too long
+26 -1
View File
@@ -500,6 +500,23 @@ exports.Prisma.PatientConversationScalarFieldEnum = {
updatedAt: 'updatedAt'
};
exports.Prisma.LabRxTemplateScalarFieldEnum = {
id: 'id',
userId: 'userId',
name: 'name',
labName: 'labName',
labPhone: 'labPhone',
labFax: 'labFax',
labAddress: 'labAddress',
labAccount: 'labAccount',
caseType: 'caseType',
material: 'material',
instructions: 'instructions',
sortOrder: 'sortOrder',
createdAt: 'createdAt',
updatedAt: 'updatedAt'
};
exports.Prisma.CommissionBatchScalarFieldEnum = {
id: 'id',
npiProviderId: 'npiProviderId',
@@ -516,6 +533,12 @@ exports.Prisma.CommissionBatchItemScalarFieldEnum = {
collectionAmount: 'collectionAmount'
};
exports.Prisma.SeleniumSettingsScalarFieldEnum = {
id: 'id',
userId: 'userId',
paymentGroupId: 'paymentGroupId'
};
exports.Prisma.SortOrder = {
asc: 'asc',
desc: 'desc'
@@ -667,8 +690,10 @@ exports.Prisma.ModelName = {
InsuranceContact: 'InsuranceContact',
ProcedureTimeslot: 'ProcedureTimeslot',
PatientConversation: 'PatientConversation',
LabRxTemplate: 'LabRxTemplate',
CommissionBatch: 'CommissionBatch',
CommissionBatchItem: 'CommissionBatchItem'
CommissionBatchItem: 'CommissionBatchItem',
SeleniumSettings: 'SeleniumSettings'
};
/**
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "prisma-client-d351a8e2afa5a626b25c24fc325b9f8c2c9b0ee5bb0f800b83ea538e43d12368",
"name": "prisma-client-1397903f012032ff276557e7a077db07df8a7cae6f68fef0b7224d110a42b0e3",
"main": "index.js",
"types": "index.d.ts",
"browser": "default.js",
@@ -50,6 +50,8 @@ model User {
procedureTimeslot ProcedureTimeslot?
insuranceContacts InsuranceContact[]
patientConversations PatientConversation[]
labRxTemplates LabRxTemplate[]
seleniumSettings SeleniumSettings?
}
model Patient {
@@ -694,6 +696,28 @@ model PatientConversation {
@@map("patient_conversation")
}
model LabRxTemplate {
id Int @id @default(autoincrement())
userId Int
name String
labName String?
labPhone String?
labFax String?
labAddress String?
labAccount String?
caseType String?
material String?
instructions String?
sortOrder Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@index([userId])
@@map("lab_rx_template")
}
// Commission tracking
model CommissionBatch {
id Int @id @default(autoincrement())
@@ -721,3 +745,13 @@ model CommissionBatchItem {
@@unique([commissionBatchId, paymentId])
@@index([paymentId])
}
model SeleniumSettings {
id Int @id @default(autoincrement())
userId Int @unique
paymentGroupId String @default("")
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@map("selenium_settings")
}
@@ -0,0 +1,24 @@
-- CreateTable
CREATE TABLE "lab_rx_template" (
"id" SERIAL NOT NULL,
"userId" INTEGER NOT NULL,
"name" TEXT NOT NULL,
"labName" TEXT,
"labPhone" TEXT,
"labFax" TEXT,
"labAddress" TEXT,
"labAccount" TEXT,
"caseType" TEXT,
"material" TEXT,
"instructions" TEXT,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "lab_rx_template_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE INDEX "lab_rx_template_userId_idx" ON "lab_rx_template"("userId");
-- AddForeignKey
ALTER TABLE "lab_rx_template" ADD CONSTRAINT "lab_rx_template_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "lab_rx_template" ADD COLUMN "sortOrder" INTEGER NOT NULL DEFAULT 0;
@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "lab_rx_template" ADD COLUMN "doctorName" TEXT;
@@ -0,0 +1,14 @@
-- CreateTable
CREATE TABLE "selenium_settings" (
"id" SERIAL NOT NULL,
"userId" INTEGER NOT NULL,
"paymentGroupId" TEXT NOT NULL DEFAULT '',
CONSTRAINT "selenium_settings_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "selenium_settings_userId_key" ON "selenium_settings"("userId");
-- AddForeignKey
ALTER TABLE "selenium_settings" ADD CONSTRAINT "selenium_settings_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+34
View File
@@ -50,6 +50,8 @@ model User {
procedureTimeslot ProcedureTimeslot?
insuranceContacts InsuranceContact[]
patientConversations PatientConversation[]
labRxTemplates LabRxTemplate[]
seleniumSettings SeleniumSettings?
}
model Patient {
@@ -695,6 +697,28 @@ model PatientConversation {
@@map("patient_conversation")
}
model LabRxTemplate {
id Int @id @default(autoincrement())
userId Int
name String
labName String?
labPhone String?
labFax String?
labAddress String?
labAccount String?
caseType String?
material String?
instructions String?
sortOrder Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@index([userId])
@@map("lab_rx_template")
}
// Commission tracking
model CommissionBatch {
id Int @id @default(autoincrement())
@@ -722,3 +746,13 @@ model CommissionBatchItem {
@@unique([commissionBatchId, paymentId])
@@index([paymentId])
}
model SeleniumSettings {
id Int @id @default(autoincrement())
userId Int @unique
paymentGroupId String @default("")
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@map("selenium_settings")
}
@@ -1,7 +1,7 @@
{
"version": "1.0",
"generatorVersion": "1.0.0",
"generatedAt": "2026-06-29T02:05:45.074Z",
"generatedAt": "2026-07-03T03:44:29.373Z",
"outputPath": "/home/gg/Desktop/DentalManagementMH06/packages/db/shared",
"files": [
"schemas/enums/TransactionIsolationLevel.schema.ts",
@@ -37,8 +37,10 @@
"schemas/enums/InsuranceContactScalarFieldEnum.schema.ts",
"schemas/enums/ProcedureTimeslotScalarFieldEnum.schema.ts",
"schemas/enums/PatientConversationScalarFieldEnum.schema.ts",
"schemas/enums/LabRxTemplateScalarFieldEnum.schema.ts",
"schemas/enums/CommissionBatchScalarFieldEnum.schema.ts",
"schemas/enums/CommissionBatchItemScalarFieldEnum.schema.ts",
"schemas/enums/SeleniumSettingsScalarFieldEnum.schema.ts",
"schemas/enums/SortOrder.schema.ts",
"schemas/enums/NullableJsonNullValueInput.schema.ts",
"schemas/enums/JsonNullValueInput.schema.ts",
@@ -217,6 +219,11 @@
"schemas/objects/PatientConversationWhereUniqueInput.schema.ts",
"schemas/objects/PatientConversationOrderByWithAggregationInput.schema.ts",
"schemas/objects/PatientConversationScalarWhereWithAggregatesInput.schema.ts",
"schemas/objects/LabRxTemplateWhereInput.schema.ts",
"schemas/objects/LabRxTemplateOrderByWithRelationInput.schema.ts",
"schemas/objects/LabRxTemplateWhereUniqueInput.schema.ts",
"schemas/objects/LabRxTemplateOrderByWithAggregationInput.schema.ts",
"schemas/objects/LabRxTemplateScalarWhereWithAggregatesInput.schema.ts",
"schemas/objects/CommissionBatchWhereInput.schema.ts",
"schemas/objects/CommissionBatchOrderByWithRelationInput.schema.ts",
"schemas/objects/CommissionBatchWhereUniqueInput.schema.ts",
@@ -227,6 +234,11 @@
"schemas/objects/CommissionBatchItemWhereUniqueInput.schema.ts",
"schemas/objects/CommissionBatchItemOrderByWithAggregationInput.schema.ts",
"schemas/objects/CommissionBatchItemScalarWhereWithAggregatesInput.schema.ts",
"schemas/objects/SeleniumSettingsWhereInput.schema.ts",
"schemas/objects/SeleniumSettingsOrderByWithRelationInput.schema.ts",
"schemas/objects/SeleniumSettingsWhereUniqueInput.schema.ts",
"schemas/objects/SeleniumSettingsOrderByWithAggregationInput.schema.ts",
"schemas/objects/SeleniumSettingsScalarWhereWithAggregatesInput.schema.ts",
"schemas/objects/UserCreateInput.schema.ts",
"schemas/objects/UserUncheckedCreateInput.schema.ts",
"schemas/objects/UserUpdateInput.schema.ts",
@@ -451,6 +463,13 @@
"schemas/objects/PatientConversationCreateManyInput.schema.ts",
"schemas/objects/PatientConversationUpdateManyMutationInput.schema.ts",
"schemas/objects/PatientConversationUncheckedUpdateManyInput.schema.ts",
"schemas/objects/LabRxTemplateCreateInput.schema.ts",
"schemas/objects/LabRxTemplateUncheckedCreateInput.schema.ts",
"schemas/objects/LabRxTemplateUpdateInput.schema.ts",
"schemas/objects/LabRxTemplateUncheckedUpdateInput.schema.ts",
"schemas/objects/LabRxTemplateCreateManyInput.schema.ts",
"schemas/objects/LabRxTemplateUpdateManyMutationInput.schema.ts",
"schemas/objects/LabRxTemplateUncheckedUpdateManyInput.schema.ts",
"schemas/objects/CommissionBatchCreateInput.schema.ts",
"schemas/objects/CommissionBatchUncheckedCreateInput.schema.ts",
"schemas/objects/CommissionBatchUpdateInput.schema.ts",
@@ -465,6 +484,13 @@
"schemas/objects/CommissionBatchItemCreateManyInput.schema.ts",
"schemas/objects/CommissionBatchItemUpdateManyMutationInput.schema.ts",
"schemas/objects/CommissionBatchItemUncheckedUpdateManyInput.schema.ts",
"schemas/objects/SeleniumSettingsCreateInput.schema.ts",
"schemas/objects/SeleniumSettingsUncheckedCreateInput.schema.ts",
"schemas/objects/SeleniumSettingsUpdateInput.schema.ts",
"schemas/objects/SeleniumSettingsUncheckedUpdateInput.schema.ts",
"schemas/objects/SeleniumSettingsCreateManyInput.schema.ts",
"schemas/objects/SeleniumSettingsUpdateManyMutationInput.schema.ts",
"schemas/objects/SeleniumSettingsUncheckedUpdateManyInput.schema.ts",
"schemas/objects/IntFilter.schema.ts",
"schemas/objects/StringFilter.schema.ts",
"schemas/objects/BoolFilter.schema.ts",
@@ -489,6 +515,8 @@
"schemas/objects/ProcedureTimeslotNullableScalarRelationFilter.schema.ts",
"schemas/objects/InsuranceContactListRelationFilter.schema.ts",
"schemas/objects/PatientConversationListRelationFilter.schema.ts",
"schemas/objects/LabRxTemplateListRelationFilter.schema.ts",
"schemas/objects/SeleniumSettingsNullableScalarRelationFilter.schema.ts",
"schemas/objects/PatientOrderByRelationAggregateInput.schema.ts",
"schemas/objects/AppointmentOrderByRelationAggregateInput.schema.ts",
"schemas/objects/StaffOrderByRelationAggregateInput.schema.ts",
@@ -505,6 +533,7 @@
"schemas/objects/CommunicationOrderByRelationAggregateInput.schema.ts",
"schemas/objects/InsuranceContactOrderByRelationAggregateInput.schema.ts",
"schemas/objects/PatientConversationOrderByRelationAggregateInput.schema.ts",
"schemas/objects/LabRxTemplateOrderByRelationAggregateInput.schema.ts",
"schemas/objects/UserCountOrderByAggregateInput.schema.ts",
"schemas/objects/UserAvgOrderByAggregateInput.schema.ts",
"schemas/objects/UserMaxOrderByAggregateInput.schema.ts",
@@ -756,6 +785,11 @@
"schemas/objects/PatientConversationMaxOrderByAggregateInput.schema.ts",
"schemas/objects/PatientConversationMinOrderByAggregateInput.schema.ts",
"schemas/objects/PatientConversationSumOrderByAggregateInput.schema.ts",
"schemas/objects/LabRxTemplateCountOrderByAggregateInput.schema.ts",
"schemas/objects/LabRxTemplateAvgOrderByAggregateInput.schema.ts",
"schemas/objects/LabRxTemplateMaxOrderByAggregateInput.schema.ts",
"schemas/objects/LabRxTemplateMinOrderByAggregateInput.schema.ts",
"schemas/objects/LabRxTemplateSumOrderByAggregateInput.schema.ts",
"schemas/objects/NpiProviderScalarRelationFilter.schema.ts",
"schemas/objects/CommissionBatchCountOrderByAggregateInput.schema.ts",
"schemas/objects/CommissionBatchAvgOrderByAggregateInput.schema.ts",
@@ -769,6 +803,11 @@
"schemas/objects/CommissionBatchItemMaxOrderByAggregateInput.schema.ts",
"schemas/objects/CommissionBatchItemMinOrderByAggregateInput.schema.ts",
"schemas/objects/CommissionBatchItemSumOrderByAggregateInput.schema.ts",
"schemas/objects/SeleniumSettingsCountOrderByAggregateInput.schema.ts",
"schemas/objects/SeleniumSettingsAvgOrderByAggregateInput.schema.ts",
"schemas/objects/SeleniumSettingsMaxOrderByAggregateInput.schema.ts",
"schemas/objects/SeleniumSettingsMinOrderByAggregateInput.schema.ts",
"schemas/objects/SeleniumSettingsSumOrderByAggregateInput.schema.ts",
"schemas/objects/PatientCreateNestedManyWithoutUserInput.schema.ts",
"schemas/objects/AppointmentCreateNestedManyWithoutUserInput.schema.ts",
"schemas/objects/StaffCreateNestedManyWithoutUserInput.schema.ts",
@@ -790,6 +829,8 @@
"schemas/objects/ProcedureTimeslotCreateNestedOneWithoutUserInput.schema.ts",
"schemas/objects/InsuranceContactCreateNestedManyWithoutUserInput.schema.ts",
"schemas/objects/PatientConversationCreateNestedManyWithoutUserInput.schema.ts",
"schemas/objects/LabRxTemplateCreateNestedManyWithoutUserInput.schema.ts",
"schemas/objects/SeleniumSettingsCreateNestedOneWithoutUserInput.schema.ts",
"schemas/objects/PatientUncheckedCreateNestedManyWithoutUserInput.schema.ts",
"schemas/objects/AppointmentUncheckedCreateNestedManyWithoutUserInput.schema.ts",
"schemas/objects/StaffUncheckedCreateNestedManyWithoutUserInput.schema.ts",
@@ -811,6 +852,8 @@
"schemas/objects/ProcedureTimeslotUncheckedCreateNestedOneWithoutUserInput.schema.ts",
"schemas/objects/InsuranceContactUncheckedCreateNestedManyWithoutUserInput.schema.ts",
"schemas/objects/PatientConversationUncheckedCreateNestedManyWithoutUserInput.schema.ts",
"schemas/objects/LabRxTemplateUncheckedCreateNestedManyWithoutUserInput.schema.ts",
"schemas/objects/SeleniumSettingsUncheckedCreateNestedOneWithoutUserInput.schema.ts",
"schemas/objects/StringFieldUpdateOperationsInput.schema.ts",
"schemas/objects/BoolFieldUpdateOperationsInput.schema.ts",
"schemas/objects/IntFieldUpdateOperationsInput.schema.ts",
@@ -835,6 +878,8 @@
"schemas/objects/ProcedureTimeslotUpdateOneWithoutUserNestedInput.schema.ts",
"schemas/objects/InsuranceContactUpdateManyWithoutUserNestedInput.schema.ts",
"schemas/objects/PatientConversationUpdateManyWithoutUserNestedInput.schema.ts",
"schemas/objects/LabRxTemplateUpdateManyWithoutUserNestedInput.schema.ts",
"schemas/objects/SeleniumSettingsUpdateOneWithoutUserNestedInput.schema.ts",
"schemas/objects/PatientUncheckedUpdateManyWithoutUserNestedInput.schema.ts",
"schemas/objects/AppointmentUncheckedUpdateManyWithoutUserNestedInput.schema.ts",
"schemas/objects/StaffUncheckedUpdateManyWithoutUserNestedInput.schema.ts",
@@ -856,6 +901,8 @@
"schemas/objects/ProcedureTimeslotUncheckedUpdateOneWithoutUserNestedInput.schema.ts",
"schemas/objects/InsuranceContactUncheckedUpdateManyWithoutUserNestedInput.schema.ts",
"schemas/objects/PatientConversationUncheckedUpdateManyWithoutUserNestedInput.schema.ts",
"schemas/objects/LabRxTemplateUncheckedUpdateManyWithoutUserNestedInput.schema.ts",
"schemas/objects/SeleniumSettingsUncheckedUpdateOneWithoutUserNestedInput.schema.ts",
"schemas/objects/UserCreateNestedOneWithoutPatientsInput.schema.ts",
"schemas/objects/AppointmentCreateNestedManyWithoutPatientInput.schema.ts",
"schemas/objects/AppointmentProcedureCreateNestedManyWithoutPatientInput.schema.ts",
@@ -1088,6 +1135,8 @@
"schemas/objects/UserCreateNestedOneWithoutPatientConversationsInput.schema.ts",
"schemas/objects/PatientUpdateOneRequiredWithoutConversationNestedInput.schema.ts",
"schemas/objects/UserUpdateOneRequiredWithoutPatientConversationsNestedInput.schema.ts",
"schemas/objects/UserCreateNestedOneWithoutLabRxTemplatesInput.schema.ts",
"schemas/objects/UserUpdateOneRequiredWithoutLabRxTemplatesNestedInput.schema.ts",
"schemas/objects/NpiProviderCreateNestedOneWithoutCommissionBatchesInput.schema.ts",
"schemas/objects/CommissionBatchItemCreateNestedManyWithoutCommissionBatchInput.schema.ts",
"schemas/objects/CommissionBatchItemUncheckedCreateNestedManyWithoutCommissionBatchInput.schema.ts",
@@ -1098,6 +1147,8 @@
"schemas/objects/PaymentCreateNestedOneWithoutCommissionBatchItemsInput.schema.ts",
"schemas/objects/CommissionBatchUpdateOneRequiredWithoutItemsNestedInput.schema.ts",
"schemas/objects/PaymentUpdateOneRequiredWithoutCommissionBatchItemsNestedInput.schema.ts",
"schemas/objects/UserCreateNestedOneWithoutSeleniumSettingsInput.schema.ts",
"schemas/objects/UserUpdateOneRequiredWithoutSeleniumSettingsNestedInput.schema.ts",
"schemas/objects/NestedIntFilter.schema.ts",
"schemas/objects/NestedStringFilter.schema.ts",
"schemas/objects/NestedBoolFilter.schema.ts",
@@ -1227,6 +1278,13 @@
"schemas/objects/PatientConversationUncheckedCreateWithoutUserInput.schema.ts",
"schemas/objects/PatientConversationCreateOrConnectWithoutUserInput.schema.ts",
"schemas/objects/PatientConversationCreateManyUserInputEnvelope.schema.ts",
"schemas/objects/LabRxTemplateCreateWithoutUserInput.schema.ts",
"schemas/objects/LabRxTemplateUncheckedCreateWithoutUserInput.schema.ts",
"schemas/objects/LabRxTemplateCreateOrConnectWithoutUserInput.schema.ts",
"schemas/objects/LabRxTemplateCreateManyUserInputEnvelope.schema.ts",
"schemas/objects/SeleniumSettingsCreateWithoutUserInput.schema.ts",
"schemas/objects/SeleniumSettingsUncheckedCreateWithoutUserInput.schema.ts",
"schemas/objects/SeleniumSettingsCreateOrConnectWithoutUserInput.schema.ts",
"schemas/objects/PatientUpsertWithWhereUniqueWithoutUserInput.schema.ts",
"schemas/objects/PatientUpdateWithWhereUniqueWithoutUserInput.schema.ts",
"schemas/objects/PatientUpdateManyWithWhereWithoutUserInput.schema.ts",
@@ -1311,6 +1369,14 @@
"schemas/objects/PatientConversationUpdateWithWhereUniqueWithoutUserInput.schema.ts",
"schemas/objects/PatientConversationUpdateManyWithWhereWithoutUserInput.schema.ts",
"schemas/objects/PatientConversationScalarWhereInput.schema.ts",
"schemas/objects/LabRxTemplateUpsertWithWhereUniqueWithoutUserInput.schema.ts",
"schemas/objects/LabRxTemplateUpdateWithWhereUniqueWithoutUserInput.schema.ts",
"schemas/objects/LabRxTemplateUpdateManyWithWhereWithoutUserInput.schema.ts",
"schemas/objects/LabRxTemplateScalarWhereInput.schema.ts",
"schemas/objects/SeleniumSettingsUpsertWithoutUserInput.schema.ts",
"schemas/objects/SeleniumSettingsUpdateToOneWithWhereWithoutUserInput.schema.ts",
"schemas/objects/SeleniumSettingsUpdateWithoutUserInput.schema.ts",
"schemas/objects/SeleniumSettingsUncheckedUpdateWithoutUserInput.schema.ts",
"schemas/objects/UserCreateWithoutPatientsInput.schema.ts",
"schemas/objects/UserUncheckedCreateWithoutPatientsInput.schema.ts",
"schemas/objects/UserCreateOrConnectWithoutPatientsInput.schema.ts",
@@ -1861,6 +1927,13 @@
"schemas/objects/UserUpdateToOneWithWhereWithoutPatientConversationsInput.schema.ts",
"schemas/objects/UserUpdateWithoutPatientConversationsInput.schema.ts",
"schemas/objects/UserUncheckedUpdateWithoutPatientConversationsInput.schema.ts",
"schemas/objects/UserCreateWithoutLabRxTemplatesInput.schema.ts",
"schemas/objects/UserUncheckedCreateWithoutLabRxTemplatesInput.schema.ts",
"schemas/objects/UserCreateOrConnectWithoutLabRxTemplatesInput.schema.ts",
"schemas/objects/UserUpsertWithoutLabRxTemplatesInput.schema.ts",
"schemas/objects/UserUpdateToOneWithWhereWithoutLabRxTemplatesInput.schema.ts",
"schemas/objects/UserUpdateWithoutLabRxTemplatesInput.schema.ts",
"schemas/objects/UserUncheckedUpdateWithoutLabRxTemplatesInput.schema.ts",
"schemas/objects/NpiProviderCreateWithoutCommissionBatchesInput.schema.ts",
"schemas/objects/NpiProviderUncheckedCreateWithoutCommissionBatchesInput.schema.ts",
"schemas/objects/NpiProviderCreateOrConnectWithoutCommissionBatchesInput.schema.ts",
@@ -1889,6 +1962,13 @@
"schemas/objects/PaymentUpdateToOneWithWhereWithoutCommissionBatchItemsInput.schema.ts",
"schemas/objects/PaymentUpdateWithoutCommissionBatchItemsInput.schema.ts",
"schemas/objects/PaymentUncheckedUpdateWithoutCommissionBatchItemsInput.schema.ts",
"schemas/objects/UserCreateWithoutSeleniumSettingsInput.schema.ts",
"schemas/objects/UserUncheckedCreateWithoutSeleniumSettingsInput.schema.ts",
"schemas/objects/UserCreateOrConnectWithoutSeleniumSettingsInput.schema.ts",
"schemas/objects/UserUpsertWithoutSeleniumSettingsInput.schema.ts",
"schemas/objects/UserUpdateToOneWithWhereWithoutSeleniumSettingsInput.schema.ts",
"schemas/objects/UserUpdateWithoutSeleniumSettingsInput.schema.ts",
"schemas/objects/UserUncheckedUpdateWithoutSeleniumSettingsInput.schema.ts",
"schemas/objects/PatientCreateManyUserInput.schema.ts",
"schemas/objects/AppointmentCreateManyUserInput.schema.ts",
"schemas/objects/StaffCreateManyUserInput.schema.ts",
@@ -1905,6 +1985,7 @@
"schemas/objects/CommunicationCreateManyUserInput.schema.ts",
"schemas/objects/InsuranceContactCreateManyUserInput.schema.ts",
"schemas/objects/PatientConversationCreateManyUserInput.schema.ts",
"schemas/objects/LabRxTemplateCreateManyUserInput.schema.ts",
"schemas/objects/PatientUpdateWithoutUserInput.schema.ts",
"schemas/objects/PatientUncheckedUpdateWithoutUserInput.schema.ts",
"schemas/objects/PatientUncheckedUpdateManyWithoutUserInput.schema.ts",
@@ -1953,6 +2034,9 @@
"schemas/objects/PatientConversationUpdateWithoutUserInput.schema.ts",
"schemas/objects/PatientConversationUncheckedUpdateWithoutUserInput.schema.ts",
"schemas/objects/PatientConversationUncheckedUpdateManyWithoutUserInput.schema.ts",
"schemas/objects/LabRxTemplateUpdateWithoutUserInput.schema.ts",
"schemas/objects/LabRxTemplateUncheckedUpdateWithoutUserInput.schema.ts",
"schemas/objects/LabRxTemplateUncheckedUpdateManyWithoutUserInput.schema.ts",
"schemas/objects/AppointmentCreateManyPatientInput.schema.ts",
"schemas/objects/AppointmentProcedureCreateManyPatientInput.schema.ts",
"schemas/objects/ClaimCreateManyPatientInput.schema.ts",
@@ -2225,6 +2309,11 @@
"schemas/objects/PatientConversationSumAggregateInput.schema.ts",
"schemas/objects/PatientConversationMinAggregateInput.schema.ts",
"schemas/objects/PatientConversationMaxAggregateInput.schema.ts",
"schemas/objects/LabRxTemplateCountAggregateInput.schema.ts",
"schemas/objects/LabRxTemplateAvgAggregateInput.schema.ts",
"schemas/objects/LabRxTemplateSumAggregateInput.schema.ts",
"schemas/objects/LabRxTemplateMinAggregateInput.schema.ts",
"schemas/objects/LabRxTemplateMaxAggregateInput.schema.ts",
"schemas/objects/CommissionBatchCountAggregateInput.schema.ts",
"schemas/objects/CommissionBatchAvgAggregateInput.schema.ts",
"schemas/objects/CommissionBatchSumAggregateInput.schema.ts",
@@ -2235,6 +2324,11 @@
"schemas/objects/CommissionBatchItemSumAggregateInput.schema.ts",
"schemas/objects/CommissionBatchItemMinAggregateInput.schema.ts",
"schemas/objects/CommissionBatchItemMaxAggregateInput.schema.ts",
"schemas/objects/SeleniumSettingsCountAggregateInput.schema.ts",
"schemas/objects/SeleniumSettingsAvgAggregateInput.schema.ts",
"schemas/objects/SeleniumSettingsSumAggregateInput.schema.ts",
"schemas/objects/SeleniumSettingsMinAggregateInput.schema.ts",
"schemas/objects/SeleniumSettingsMaxAggregateInput.schema.ts",
"schemas/objects/UserCountOutputTypeSelect.schema.ts",
"schemas/objects/PatientCountOutputTypeSelect.schema.ts",
"schemas/objects/AppointmentCountOutputTypeSelect.schema.ts",
@@ -2264,6 +2358,7 @@
"schemas/objects/UserCountOutputTypeCountCommunicationsArgs.schema.ts",
"schemas/objects/UserCountOutputTypeCountInsuranceContactsArgs.schema.ts",
"schemas/objects/UserCountOutputTypeCountPatientConversationsArgs.schema.ts",
"schemas/objects/UserCountOutputTypeCountLabRxTemplatesArgs.schema.ts",
"schemas/objects/PatientCountOutputTypeArgs.schema.ts",
"schemas/objects/PatientCountOutputTypeCountAppointmentsArgs.schema.ts",
"schemas/objects/PatientCountOutputTypeCountProceduresArgs.schema.ts",
@@ -2335,8 +2430,10 @@
"schemas/objects/InsuranceContactSelect.schema.ts",
"schemas/objects/ProcedureTimeslotSelect.schema.ts",
"schemas/objects/PatientConversationSelect.schema.ts",
"schemas/objects/LabRxTemplateSelect.schema.ts",
"schemas/objects/CommissionBatchSelect.schema.ts",
"schemas/objects/CommissionBatchItemSelect.schema.ts",
"schemas/objects/SeleniumSettingsSelect.schema.ts",
"schemas/objects/UserArgs.schema.ts",
"schemas/objects/PatientArgs.schema.ts",
"schemas/objects/AppointmentArgs.schema.ts",
@@ -2369,8 +2466,10 @@
"schemas/objects/InsuranceContactArgs.schema.ts",
"schemas/objects/ProcedureTimeslotArgs.schema.ts",
"schemas/objects/PatientConversationArgs.schema.ts",
"schemas/objects/LabRxTemplateArgs.schema.ts",
"schemas/objects/CommissionBatchArgs.schema.ts",
"schemas/objects/CommissionBatchItemArgs.schema.ts",
"schemas/objects/SeleniumSettingsArgs.schema.ts",
"schemas/objects/UserInclude.schema.ts",
"schemas/objects/PatientInclude.schema.ts",
"schemas/objects/AppointmentInclude.schema.ts",
@@ -2402,8 +2501,10 @@
"schemas/objects/InsuranceContactInclude.schema.ts",
"schemas/objects/ProcedureTimeslotInclude.schema.ts",
"schemas/objects/PatientConversationInclude.schema.ts",
"schemas/objects/LabRxTemplateInclude.schema.ts",
"schemas/objects/CommissionBatchInclude.schema.ts",
"schemas/objects/CommissionBatchItemInclude.schema.ts",
"schemas/objects/SeleniumSettingsInclude.schema.ts",
"schemas/findUniqueUser.schema.ts",
"schemas/findUniqueOrThrowUser.schema.ts",
"schemas/findFirstUser.schema.ts",
@@ -2948,6 +3049,23 @@
"schemas/upsertOnePatientConversation.schema.ts",
"schemas/aggregatePatientConversation.schema.ts",
"schemas/groupByPatientConversation.schema.ts",
"schemas/findUniqueLabRxTemplate.schema.ts",
"schemas/findUniqueOrThrowLabRxTemplate.schema.ts",
"schemas/findFirstLabRxTemplate.schema.ts",
"schemas/findFirstOrThrowLabRxTemplate.schema.ts",
"schemas/findManyLabRxTemplate.schema.ts",
"schemas/countLabRxTemplate.schema.ts",
"schemas/createOneLabRxTemplate.schema.ts",
"schemas/createManyLabRxTemplate.schema.ts",
"schemas/createManyAndReturnLabRxTemplate.schema.ts",
"schemas/deleteOneLabRxTemplate.schema.ts",
"schemas/deleteManyLabRxTemplate.schema.ts",
"schemas/updateOneLabRxTemplate.schema.ts",
"schemas/updateManyLabRxTemplate.schema.ts",
"schemas/updateManyAndReturnLabRxTemplate.schema.ts",
"schemas/upsertOneLabRxTemplate.schema.ts",
"schemas/aggregateLabRxTemplate.schema.ts",
"schemas/groupByLabRxTemplate.schema.ts",
"schemas/findUniqueCommissionBatch.schema.ts",
"schemas/findUniqueOrThrowCommissionBatch.schema.ts",
"schemas/findFirstCommissionBatch.schema.ts",
@@ -2982,6 +3100,23 @@
"schemas/upsertOneCommissionBatchItem.schema.ts",
"schemas/aggregateCommissionBatchItem.schema.ts",
"schemas/groupByCommissionBatchItem.schema.ts",
"schemas/findUniqueSeleniumSettings.schema.ts",
"schemas/findUniqueOrThrowSeleniumSettings.schema.ts",
"schemas/findFirstSeleniumSettings.schema.ts",
"schemas/findFirstOrThrowSeleniumSettings.schema.ts",
"schemas/findManySeleniumSettings.schema.ts",
"schemas/countSeleniumSettings.schema.ts",
"schemas/createOneSeleniumSettings.schema.ts",
"schemas/createManySeleniumSettings.schema.ts",
"schemas/createManyAndReturnSeleniumSettings.schema.ts",
"schemas/deleteOneSeleniumSettings.schema.ts",
"schemas/deleteManySeleniumSettings.schema.ts",
"schemas/updateOneSeleniumSettings.schema.ts",
"schemas/updateManySeleniumSettings.schema.ts",
"schemas/updateManyAndReturnSeleniumSettings.schema.ts",
"schemas/upsertOneSeleniumSettings.schema.ts",
"schemas/aggregateSeleniumSettings.schema.ts",
"schemas/groupBySeleniumSettings.schema.ts",
"schemas/results/UserFindUniqueResult.schema.ts",
"schemas/results/UserFindFirstResult.schema.ts",
"schemas/results/UserFindManyResult.schema.ts",
@@ -3398,6 +3533,19 @@
"schemas/results/PatientConversationAggregateResult.schema.ts",
"schemas/results/PatientConversationGroupByResult.schema.ts",
"schemas/results/PatientConversationCountResult.schema.ts",
"schemas/results/LabRxTemplateFindUniqueResult.schema.ts",
"schemas/results/LabRxTemplateFindFirstResult.schema.ts",
"schemas/results/LabRxTemplateFindManyResult.schema.ts",
"schemas/results/LabRxTemplateCreateResult.schema.ts",
"schemas/results/LabRxTemplateCreateManyResult.schema.ts",
"schemas/results/LabRxTemplateUpdateResult.schema.ts",
"schemas/results/LabRxTemplateUpdateManyResult.schema.ts",
"schemas/results/LabRxTemplateUpsertResult.schema.ts",
"schemas/results/LabRxTemplateDeleteResult.schema.ts",
"schemas/results/LabRxTemplateDeleteManyResult.schema.ts",
"schemas/results/LabRxTemplateAggregateResult.schema.ts",
"schemas/results/LabRxTemplateGroupByResult.schema.ts",
"schemas/results/LabRxTemplateCountResult.schema.ts",
"schemas/results/CommissionBatchFindUniqueResult.schema.ts",
"schemas/results/CommissionBatchFindFirstResult.schema.ts",
"schemas/results/CommissionBatchFindManyResult.schema.ts",
@@ -3424,6 +3572,19 @@
"schemas/results/CommissionBatchItemAggregateResult.schema.ts",
"schemas/results/CommissionBatchItemGroupByResult.schema.ts",
"schemas/results/CommissionBatchItemCountResult.schema.ts",
"schemas/results/SeleniumSettingsFindUniqueResult.schema.ts",
"schemas/results/SeleniumSettingsFindFirstResult.schema.ts",
"schemas/results/SeleniumSettingsFindManyResult.schema.ts",
"schemas/results/SeleniumSettingsCreateResult.schema.ts",
"schemas/results/SeleniumSettingsCreateManyResult.schema.ts",
"schemas/results/SeleniumSettingsUpdateResult.schema.ts",
"schemas/results/SeleniumSettingsUpdateManyResult.schema.ts",
"schemas/results/SeleniumSettingsUpsertResult.schema.ts",
"schemas/results/SeleniumSettingsDeleteResult.schema.ts",
"schemas/results/SeleniumSettingsDeleteManyResult.schema.ts",
"schemas/results/SeleniumSettingsAggregateResult.schema.ts",
"schemas/results/SeleniumSettingsGroupByResult.schema.ts",
"schemas/results/SeleniumSettingsCountResult.schema.ts",
"schemas/results/index.ts",
"schemas/index.ts",
"schemas/variants/pure/User.pure.ts",
@@ -3458,8 +3619,10 @@
"schemas/variants/pure/InsuranceContact.pure.ts",
"schemas/variants/pure/ProcedureTimeslot.pure.ts",
"schemas/variants/pure/PatientConversation.pure.ts",
"schemas/variants/pure/LabRxTemplate.pure.ts",
"schemas/variants/pure/CommissionBatch.pure.ts",
"schemas/variants/pure/CommissionBatchItem.pure.ts",
"schemas/variants/pure/SeleniumSettings.pure.ts",
"schemas/variants/pure/index.ts",
"schemas/variants/input/User.input.ts",
"schemas/variants/input/Patient.input.ts",
@@ -3493,8 +3656,10 @@
"schemas/variants/input/InsuranceContact.input.ts",
"schemas/variants/input/ProcedureTimeslot.input.ts",
"schemas/variants/input/PatientConversation.input.ts",
"schemas/variants/input/LabRxTemplate.input.ts",
"schemas/variants/input/CommissionBatch.input.ts",
"schemas/variants/input/CommissionBatchItem.input.ts",
"schemas/variants/input/SeleniumSettings.input.ts",
"schemas/variants/input/index.ts",
"schemas/variants/result/User.result.ts",
"schemas/variants/result/Patient.result.ts",
@@ -3528,8 +3693,10 @@
"schemas/variants/result/InsuranceContact.result.ts",
"schemas/variants/result/ProcedureTimeslot.result.ts",
"schemas/variants/result/PatientConversation.result.ts",
"schemas/variants/result/LabRxTemplate.result.ts",
"schemas/variants/result/CommissionBatch.result.ts",
"schemas/variants/result/CommissionBatchItem.result.ts",
"schemas/variants/result/SeleniumSettings.result.ts",
"schemas/variants/result/index.ts",
"schemas/variants/index.ts"
],
@@ -0,0 +1,14 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { LabRxTemplateOrderByWithRelationInputObjectSchema as LabRxTemplateOrderByWithRelationInputObjectSchema } from './objects/LabRxTemplateOrderByWithRelationInput.schema';
import { LabRxTemplateWhereInputObjectSchema as LabRxTemplateWhereInputObjectSchema } from './objects/LabRxTemplateWhereInput.schema';
import { LabRxTemplateWhereUniqueInputObjectSchema as LabRxTemplateWhereUniqueInputObjectSchema } from './objects/LabRxTemplateWhereUniqueInput.schema';
import { LabRxTemplateCountAggregateInputObjectSchema as LabRxTemplateCountAggregateInputObjectSchema } from './objects/LabRxTemplateCountAggregateInput.schema';
import { LabRxTemplateMinAggregateInputObjectSchema as LabRxTemplateMinAggregateInputObjectSchema } from './objects/LabRxTemplateMinAggregateInput.schema';
import { LabRxTemplateMaxAggregateInputObjectSchema as LabRxTemplateMaxAggregateInputObjectSchema } from './objects/LabRxTemplateMaxAggregateInput.schema';
import { LabRxTemplateAvgAggregateInputObjectSchema as LabRxTemplateAvgAggregateInputObjectSchema } from './objects/LabRxTemplateAvgAggregateInput.schema';
import { LabRxTemplateSumAggregateInputObjectSchema as LabRxTemplateSumAggregateInputObjectSchema } from './objects/LabRxTemplateSumAggregateInput.schema';
export const LabRxTemplateAggregateSchema: z.ZodType<Prisma.LabRxTemplateAggregateArgs> = z.object({ orderBy: z.union([LabRxTemplateOrderByWithRelationInputObjectSchema, LabRxTemplateOrderByWithRelationInputObjectSchema.array()]).optional(), where: LabRxTemplateWhereInputObjectSchema.optional(), cursor: LabRxTemplateWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), _count: z.union([ z.literal(true), LabRxTemplateCountAggregateInputObjectSchema ]).optional(), _min: LabRxTemplateMinAggregateInputObjectSchema.optional(), _max: LabRxTemplateMaxAggregateInputObjectSchema.optional(), _avg: LabRxTemplateAvgAggregateInputObjectSchema.optional(), _sum: LabRxTemplateSumAggregateInputObjectSchema.optional() }).strict() as unknown as z.ZodType<Prisma.LabRxTemplateAggregateArgs>;
export const LabRxTemplateAggregateZodSchema = z.object({ orderBy: z.union([LabRxTemplateOrderByWithRelationInputObjectSchema, LabRxTemplateOrderByWithRelationInputObjectSchema.array()]).optional(), where: LabRxTemplateWhereInputObjectSchema.optional(), cursor: LabRxTemplateWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), _count: z.union([ z.literal(true), LabRxTemplateCountAggregateInputObjectSchema ]).optional(), _min: LabRxTemplateMinAggregateInputObjectSchema.optional(), _max: LabRxTemplateMaxAggregateInputObjectSchema.optional(), _avg: LabRxTemplateAvgAggregateInputObjectSchema.optional(), _sum: LabRxTemplateSumAggregateInputObjectSchema.optional() }).strict();
@@ -0,0 +1,14 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { SeleniumSettingsOrderByWithRelationInputObjectSchema as SeleniumSettingsOrderByWithRelationInputObjectSchema } from './objects/SeleniumSettingsOrderByWithRelationInput.schema';
import { SeleniumSettingsWhereInputObjectSchema as SeleniumSettingsWhereInputObjectSchema } from './objects/SeleniumSettingsWhereInput.schema';
import { SeleniumSettingsWhereUniqueInputObjectSchema as SeleniumSettingsWhereUniqueInputObjectSchema } from './objects/SeleniumSettingsWhereUniqueInput.schema';
import { SeleniumSettingsCountAggregateInputObjectSchema as SeleniumSettingsCountAggregateInputObjectSchema } from './objects/SeleniumSettingsCountAggregateInput.schema';
import { SeleniumSettingsMinAggregateInputObjectSchema as SeleniumSettingsMinAggregateInputObjectSchema } from './objects/SeleniumSettingsMinAggregateInput.schema';
import { SeleniumSettingsMaxAggregateInputObjectSchema as SeleniumSettingsMaxAggregateInputObjectSchema } from './objects/SeleniumSettingsMaxAggregateInput.schema';
import { SeleniumSettingsAvgAggregateInputObjectSchema as SeleniumSettingsAvgAggregateInputObjectSchema } from './objects/SeleniumSettingsAvgAggregateInput.schema';
import { SeleniumSettingsSumAggregateInputObjectSchema as SeleniumSettingsSumAggregateInputObjectSchema } from './objects/SeleniumSettingsSumAggregateInput.schema';
export const SeleniumSettingsAggregateSchema: z.ZodType<Prisma.SeleniumSettingsAggregateArgs> = z.object({ orderBy: z.union([SeleniumSettingsOrderByWithRelationInputObjectSchema, SeleniumSettingsOrderByWithRelationInputObjectSchema.array()]).optional(), where: SeleniumSettingsWhereInputObjectSchema.optional(), cursor: SeleniumSettingsWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), _count: z.union([ z.literal(true), SeleniumSettingsCountAggregateInputObjectSchema ]).optional(), _min: SeleniumSettingsMinAggregateInputObjectSchema.optional(), _max: SeleniumSettingsMaxAggregateInputObjectSchema.optional(), _avg: SeleniumSettingsAvgAggregateInputObjectSchema.optional(), _sum: SeleniumSettingsSumAggregateInputObjectSchema.optional() }).strict() as unknown as z.ZodType<Prisma.SeleniumSettingsAggregateArgs>;
export const SeleniumSettingsAggregateZodSchema = z.object({ orderBy: z.union([SeleniumSettingsOrderByWithRelationInputObjectSchema, SeleniumSettingsOrderByWithRelationInputObjectSchema.array()]).optional(), where: SeleniumSettingsWhereInputObjectSchema.optional(), cursor: SeleniumSettingsWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), _count: z.union([ z.literal(true), SeleniumSettingsCountAggregateInputObjectSchema ]).optional(), _min: SeleniumSettingsMinAggregateInputObjectSchema.optional(), _max: SeleniumSettingsMaxAggregateInputObjectSchema.optional(), _avg: SeleniumSettingsAvgAggregateInputObjectSchema.optional(), _sum: SeleniumSettingsSumAggregateInputObjectSchema.optional() }).strict();
@@ -0,0 +1,10 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { LabRxTemplateOrderByWithRelationInputObjectSchema as LabRxTemplateOrderByWithRelationInputObjectSchema } from './objects/LabRxTemplateOrderByWithRelationInput.schema';
import { LabRxTemplateWhereInputObjectSchema as LabRxTemplateWhereInputObjectSchema } from './objects/LabRxTemplateWhereInput.schema';
import { LabRxTemplateWhereUniqueInputObjectSchema as LabRxTemplateWhereUniqueInputObjectSchema } from './objects/LabRxTemplateWhereUniqueInput.schema';
import { LabRxTemplateCountAggregateInputObjectSchema as LabRxTemplateCountAggregateInputObjectSchema } from './objects/LabRxTemplateCountAggregateInput.schema';
export const LabRxTemplateCountSchema: z.ZodType<Prisma.LabRxTemplateCountArgs> = z.object({ orderBy: z.union([LabRxTemplateOrderByWithRelationInputObjectSchema, LabRxTemplateOrderByWithRelationInputObjectSchema.array()]).optional(), where: LabRxTemplateWhereInputObjectSchema.optional(), cursor: LabRxTemplateWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), select: z.union([ z.literal(true), LabRxTemplateCountAggregateInputObjectSchema ]).optional() }).strict() as unknown as z.ZodType<Prisma.LabRxTemplateCountArgs>;
export const LabRxTemplateCountZodSchema = z.object({ orderBy: z.union([LabRxTemplateOrderByWithRelationInputObjectSchema, LabRxTemplateOrderByWithRelationInputObjectSchema.array()]).optional(), where: LabRxTemplateWhereInputObjectSchema.optional(), cursor: LabRxTemplateWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), select: z.union([ z.literal(true), LabRxTemplateCountAggregateInputObjectSchema ]).optional() }).strict();
@@ -0,0 +1,10 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { SeleniumSettingsOrderByWithRelationInputObjectSchema as SeleniumSettingsOrderByWithRelationInputObjectSchema } from './objects/SeleniumSettingsOrderByWithRelationInput.schema';
import { SeleniumSettingsWhereInputObjectSchema as SeleniumSettingsWhereInputObjectSchema } from './objects/SeleniumSettingsWhereInput.schema';
import { SeleniumSettingsWhereUniqueInputObjectSchema as SeleniumSettingsWhereUniqueInputObjectSchema } from './objects/SeleniumSettingsWhereUniqueInput.schema';
import { SeleniumSettingsCountAggregateInputObjectSchema as SeleniumSettingsCountAggregateInputObjectSchema } from './objects/SeleniumSettingsCountAggregateInput.schema';
export const SeleniumSettingsCountSchema: z.ZodType<Prisma.SeleniumSettingsCountArgs> = z.object({ orderBy: z.union([SeleniumSettingsOrderByWithRelationInputObjectSchema, SeleniumSettingsOrderByWithRelationInputObjectSchema.array()]).optional(), where: SeleniumSettingsWhereInputObjectSchema.optional(), cursor: SeleniumSettingsWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), select: z.union([ z.literal(true), SeleniumSettingsCountAggregateInputObjectSchema ]).optional() }).strict() as unknown as z.ZodType<Prisma.SeleniumSettingsCountArgs>;
export const SeleniumSettingsCountZodSchema = z.object({ orderBy: z.union([SeleniumSettingsOrderByWithRelationInputObjectSchema, SeleniumSettingsOrderByWithRelationInputObjectSchema.array()]).optional(), where: SeleniumSettingsWhereInputObjectSchema.optional(), cursor: SeleniumSettingsWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), select: z.union([ z.literal(true), SeleniumSettingsCountAggregateInputObjectSchema ]).optional() }).strict();
@@ -0,0 +1,8 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { LabRxTemplateSelectObjectSchema as LabRxTemplateSelectObjectSchema } from './objects/LabRxTemplateSelect.schema';
import { LabRxTemplateCreateManyInputObjectSchema as LabRxTemplateCreateManyInputObjectSchema } from './objects/LabRxTemplateCreateManyInput.schema';
export const LabRxTemplateCreateManyAndReturnSchema: z.ZodType<Prisma.LabRxTemplateCreateManyAndReturnArgs> = z.object({ select: LabRxTemplateSelectObjectSchema.optional(), data: z.union([ LabRxTemplateCreateManyInputObjectSchema, z.array(LabRxTemplateCreateManyInputObjectSchema) ]), skipDuplicates: z.boolean().optional() }).strict() as unknown as z.ZodType<Prisma.LabRxTemplateCreateManyAndReturnArgs>;
export const LabRxTemplateCreateManyAndReturnZodSchema = z.object({ select: LabRxTemplateSelectObjectSchema.optional(), data: z.union([ LabRxTemplateCreateManyInputObjectSchema, z.array(LabRxTemplateCreateManyInputObjectSchema) ]), skipDuplicates: z.boolean().optional() }).strict();
@@ -0,0 +1,8 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { SeleniumSettingsSelectObjectSchema as SeleniumSettingsSelectObjectSchema } from './objects/SeleniumSettingsSelect.schema';
import { SeleniumSettingsCreateManyInputObjectSchema as SeleniumSettingsCreateManyInputObjectSchema } from './objects/SeleniumSettingsCreateManyInput.schema';
export const SeleniumSettingsCreateManyAndReturnSchema: z.ZodType<Prisma.SeleniumSettingsCreateManyAndReturnArgs> = z.object({ select: SeleniumSettingsSelectObjectSchema.optional(), data: z.union([ SeleniumSettingsCreateManyInputObjectSchema, z.array(SeleniumSettingsCreateManyInputObjectSchema) ]), skipDuplicates: z.boolean().optional() }).strict() as unknown as z.ZodType<Prisma.SeleniumSettingsCreateManyAndReturnArgs>;
export const SeleniumSettingsCreateManyAndReturnZodSchema = z.object({ select: SeleniumSettingsSelectObjectSchema.optional(), data: z.union([ SeleniumSettingsCreateManyInputObjectSchema, z.array(SeleniumSettingsCreateManyInputObjectSchema) ]), skipDuplicates: z.boolean().optional() }).strict();
@@ -0,0 +1,7 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { LabRxTemplateCreateManyInputObjectSchema as LabRxTemplateCreateManyInputObjectSchema } from './objects/LabRxTemplateCreateManyInput.schema';
export const LabRxTemplateCreateManySchema: z.ZodType<Prisma.LabRxTemplateCreateManyArgs> = z.object({ data: z.union([ LabRxTemplateCreateManyInputObjectSchema, z.array(LabRxTemplateCreateManyInputObjectSchema) ]), skipDuplicates: z.boolean().optional() }).strict() as unknown as z.ZodType<Prisma.LabRxTemplateCreateManyArgs>;
export const LabRxTemplateCreateManyZodSchema = z.object({ data: z.union([ LabRxTemplateCreateManyInputObjectSchema, z.array(LabRxTemplateCreateManyInputObjectSchema) ]), skipDuplicates: z.boolean().optional() }).strict();
@@ -0,0 +1,7 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { SeleniumSettingsCreateManyInputObjectSchema as SeleniumSettingsCreateManyInputObjectSchema } from './objects/SeleniumSettingsCreateManyInput.schema';
export const SeleniumSettingsCreateManySchema: z.ZodType<Prisma.SeleniumSettingsCreateManyArgs> = z.object({ data: z.union([ SeleniumSettingsCreateManyInputObjectSchema, z.array(SeleniumSettingsCreateManyInputObjectSchema) ]), skipDuplicates: z.boolean().optional() }).strict() as unknown as z.ZodType<Prisma.SeleniumSettingsCreateManyArgs>;
export const SeleniumSettingsCreateManyZodSchema = z.object({ data: z.union([ SeleniumSettingsCreateManyInputObjectSchema, z.array(SeleniumSettingsCreateManyInputObjectSchema) ]), skipDuplicates: z.boolean().optional() }).strict();
@@ -0,0 +1,10 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { LabRxTemplateSelectObjectSchema as LabRxTemplateSelectObjectSchema } from './objects/LabRxTemplateSelect.schema';
import { LabRxTemplateIncludeObjectSchema as LabRxTemplateIncludeObjectSchema } from './objects/LabRxTemplateInclude.schema';
import { LabRxTemplateCreateInputObjectSchema as LabRxTemplateCreateInputObjectSchema } from './objects/LabRxTemplateCreateInput.schema';
import { LabRxTemplateUncheckedCreateInputObjectSchema as LabRxTemplateUncheckedCreateInputObjectSchema } from './objects/LabRxTemplateUncheckedCreateInput.schema';
export const LabRxTemplateCreateOneSchema: z.ZodType<Prisma.LabRxTemplateCreateArgs> = z.object({ select: LabRxTemplateSelectObjectSchema.optional(), include: LabRxTemplateIncludeObjectSchema.optional(), data: z.union([LabRxTemplateCreateInputObjectSchema, LabRxTemplateUncheckedCreateInputObjectSchema]) }).strict() as unknown as z.ZodType<Prisma.LabRxTemplateCreateArgs>;
export const LabRxTemplateCreateOneZodSchema = z.object({ select: LabRxTemplateSelectObjectSchema.optional(), include: LabRxTemplateIncludeObjectSchema.optional(), data: z.union([LabRxTemplateCreateInputObjectSchema, LabRxTemplateUncheckedCreateInputObjectSchema]) }).strict();
@@ -0,0 +1,10 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { SeleniumSettingsSelectObjectSchema as SeleniumSettingsSelectObjectSchema } from './objects/SeleniumSettingsSelect.schema';
import { SeleniumSettingsIncludeObjectSchema as SeleniumSettingsIncludeObjectSchema } from './objects/SeleniumSettingsInclude.schema';
import { SeleniumSettingsCreateInputObjectSchema as SeleniumSettingsCreateInputObjectSchema } from './objects/SeleniumSettingsCreateInput.schema';
import { SeleniumSettingsUncheckedCreateInputObjectSchema as SeleniumSettingsUncheckedCreateInputObjectSchema } from './objects/SeleniumSettingsUncheckedCreateInput.schema';
export const SeleniumSettingsCreateOneSchema: z.ZodType<Prisma.SeleniumSettingsCreateArgs> = z.object({ select: SeleniumSettingsSelectObjectSchema.optional(), include: SeleniumSettingsIncludeObjectSchema.optional(), data: z.union([SeleniumSettingsCreateInputObjectSchema, SeleniumSettingsUncheckedCreateInputObjectSchema]) }).strict() as unknown as z.ZodType<Prisma.SeleniumSettingsCreateArgs>;
export const SeleniumSettingsCreateOneZodSchema = z.object({ select: SeleniumSettingsSelectObjectSchema.optional(), include: SeleniumSettingsIncludeObjectSchema.optional(), data: z.union([SeleniumSettingsCreateInputObjectSchema, SeleniumSettingsUncheckedCreateInputObjectSchema]) }).strict();
@@ -0,0 +1,7 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { LabRxTemplateWhereInputObjectSchema as LabRxTemplateWhereInputObjectSchema } from './objects/LabRxTemplateWhereInput.schema';
export const LabRxTemplateDeleteManySchema: z.ZodType<Prisma.LabRxTemplateDeleteManyArgs> = z.object({ where: LabRxTemplateWhereInputObjectSchema.optional() }).strict() as unknown as z.ZodType<Prisma.LabRxTemplateDeleteManyArgs>;
export const LabRxTemplateDeleteManyZodSchema = z.object({ where: LabRxTemplateWhereInputObjectSchema.optional() }).strict();
@@ -0,0 +1,7 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { SeleniumSettingsWhereInputObjectSchema as SeleniumSettingsWhereInputObjectSchema } from './objects/SeleniumSettingsWhereInput.schema';
export const SeleniumSettingsDeleteManySchema: z.ZodType<Prisma.SeleniumSettingsDeleteManyArgs> = z.object({ where: SeleniumSettingsWhereInputObjectSchema.optional() }).strict() as unknown as z.ZodType<Prisma.SeleniumSettingsDeleteManyArgs>;
export const SeleniumSettingsDeleteManyZodSchema = z.object({ where: SeleniumSettingsWhereInputObjectSchema.optional() }).strict();
@@ -0,0 +1,9 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { LabRxTemplateSelectObjectSchema as LabRxTemplateSelectObjectSchema } from './objects/LabRxTemplateSelect.schema';
import { LabRxTemplateIncludeObjectSchema as LabRxTemplateIncludeObjectSchema } from './objects/LabRxTemplateInclude.schema';
import { LabRxTemplateWhereUniqueInputObjectSchema as LabRxTemplateWhereUniqueInputObjectSchema } from './objects/LabRxTemplateWhereUniqueInput.schema';
export const LabRxTemplateDeleteOneSchema: z.ZodType<Prisma.LabRxTemplateDeleteArgs> = z.object({ select: LabRxTemplateSelectObjectSchema.optional(), include: LabRxTemplateIncludeObjectSchema.optional(), where: LabRxTemplateWhereUniqueInputObjectSchema }).strict() as unknown as z.ZodType<Prisma.LabRxTemplateDeleteArgs>;
export const LabRxTemplateDeleteOneZodSchema = z.object({ select: LabRxTemplateSelectObjectSchema.optional(), include: LabRxTemplateIncludeObjectSchema.optional(), where: LabRxTemplateWhereUniqueInputObjectSchema }).strict();
@@ -0,0 +1,9 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { SeleniumSettingsSelectObjectSchema as SeleniumSettingsSelectObjectSchema } from './objects/SeleniumSettingsSelect.schema';
import { SeleniumSettingsIncludeObjectSchema as SeleniumSettingsIncludeObjectSchema } from './objects/SeleniumSettingsInclude.schema';
import { SeleniumSettingsWhereUniqueInputObjectSchema as SeleniumSettingsWhereUniqueInputObjectSchema } from './objects/SeleniumSettingsWhereUniqueInput.schema';
export const SeleniumSettingsDeleteOneSchema: z.ZodType<Prisma.SeleniumSettingsDeleteArgs> = z.object({ select: SeleniumSettingsSelectObjectSchema.optional(), include: SeleniumSettingsIncludeObjectSchema.optional(), where: SeleniumSettingsWhereUniqueInputObjectSchema }).strict() as unknown as z.ZodType<Prisma.SeleniumSettingsDeleteArgs>;
export const SeleniumSettingsDeleteOneZodSchema = z.object({ select: SeleniumSettingsSelectObjectSchema.optional(), include: SeleniumSettingsIncludeObjectSchema.optional(), where: SeleniumSettingsWhereUniqueInputObjectSchema }).strict();
@@ -0,0 +1,5 @@
import * as z from 'zod';
export const LabRxTemplateScalarFieldEnumSchema = z.enum(['id', 'userId', 'name', 'labName', 'labPhone', 'labFax', 'labAddress', 'labAccount', 'caseType', 'material', 'instructions', 'sortOrder', 'createdAt', 'updatedAt'])
export type LabRxTemplateScalarFieldEnum = z.infer<typeof LabRxTemplateScalarFieldEnumSchema>;
@@ -0,0 +1,5 @@
import * as z from 'zod';
export const SeleniumSettingsScalarFieldEnumSchema = z.enum(['id', 'userId', 'paymentGroupId'])
export type SeleniumSettingsScalarFieldEnum = z.infer<typeof SeleniumSettingsScalarFieldEnumSchema>;
@@ -0,0 +1,50 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { LabRxTemplateIncludeObjectSchema as LabRxTemplateIncludeObjectSchema } from './objects/LabRxTemplateInclude.schema';
import { LabRxTemplateOrderByWithRelationInputObjectSchema as LabRxTemplateOrderByWithRelationInputObjectSchema } from './objects/LabRxTemplateOrderByWithRelationInput.schema';
import { LabRxTemplateWhereInputObjectSchema as LabRxTemplateWhereInputObjectSchema } from './objects/LabRxTemplateWhereInput.schema';
import { LabRxTemplateWhereUniqueInputObjectSchema as LabRxTemplateWhereUniqueInputObjectSchema } from './objects/LabRxTemplateWhereUniqueInput.schema';
import { LabRxTemplateScalarFieldEnumSchema } from './enums/LabRxTemplateScalarFieldEnum.schema';
// Select schema needs to be in file to prevent circular imports
//------------------------------------------------------
export const LabRxTemplateFindFirstSelectSchema: z.ZodType<Prisma.LabRxTemplateSelect> = z.object({
id: z.boolean().optional(),
userId: z.boolean().optional(),
name: z.boolean().optional(),
labName: z.boolean().optional(),
labPhone: z.boolean().optional(),
labFax: z.boolean().optional(),
labAddress: z.boolean().optional(),
labAccount: z.boolean().optional(),
caseType: z.boolean().optional(),
material: z.boolean().optional(),
instructions: z.boolean().optional(),
sortOrder: z.boolean().optional(),
createdAt: z.boolean().optional(),
updatedAt: z.boolean().optional(),
user: z.boolean().optional()
}).strict() as unknown as z.ZodType<Prisma.LabRxTemplateSelect>;
export const LabRxTemplateFindFirstSelectZodSchema = z.object({
id: z.boolean().optional(),
userId: z.boolean().optional(),
name: z.boolean().optional(),
labName: z.boolean().optional(),
labPhone: z.boolean().optional(),
labFax: z.boolean().optional(),
labAddress: z.boolean().optional(),
labAccount: z.boolean().optional(),
caseType: z.boolean().optional(),
material: z.boolean().optional(),
instructions: z.boolean().optional(),
sortOrder: z.boolean().optional(),
createdAt: z.boolean().optional(),
updatedAt: z.boolean().optional(),
user: z.boolean().optional()
}).strict();
export const LabRxTemplateFindFirstSchema: z.ZodType<Prisma.LabRxTemplateFindFirstArgs> = z.object({ select: LabRxTemplateFindFirstSelectSchema.optional(), include: z.lazy(() => LabRxTemplateIncludeObjectSchema.optional()), orderBy: z.union([LabRxTemplateOrderByWithRelationInputObjectSchema, LabRxTemplateOrderByWithRelationInputObjectSchema.array()]).optional(), where: LabRxTemplateWhereInputObjectSchema.optional(), cursor: LabRxTemplateWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), distinct: z.union([LabRxTemplateScalarFieldEnumSchema, LabRxTemplateScalarFieldEnumSchema.array()]).optional() }).strict() as unknown as z.ZodType<Prisma.LabRxTemplateFindFirstArgs>;
export const LabRxTemplateFindFirstZodSchema = z.object({ select: LabRxTemplateFindFirstSelectSchema.optional(), include: z.lazy(() => LabRxTemplateIncludeObjectSchema.optional()), orderBy: z.union([LabRxTemplateOrderByWithRelationInputObjectSchema, LabRxTemplateOrderByWithRelationInputObjectSchema.array()]).optional(), where: LabRxTemplateWhereInputObjectSchema.optional(), cursor: LabRxTemplateWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), distinct: z.union([LabRxTemplateScalarFieldEnumSchema, LabRxTemplateScalarFieldEnumSchema.array()]).optional() }).strict();
@@ -0,0 +1,50 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { LabRxTemplateIncludeObjectSchema as LabRxTemplateIncludeObjectSchema } from './objects/LabRxTemplateInclude.schema';
import { LabRxTemplateOrderByWithRelationInputObjectSchema as LabRxTemplateOrderByWithRelationInputObjectSchema } from './objects/LabRxTemplateOrderByWithRelationInput.schema';
import { LabRxTemplateWhereInputObjectSchema as LabRxTemplateWhereInputObjectSchema } from './objects/LabRxTemplateWhereInput.schema';
import { LabRxTemplateWhereUniqueInputObjectSchema as LabRxTemplateWhereUniqueInputObjectSchema } from './objects/LabRxTemplateWhereUniqueInput.schema';
import { LabRxTemplateScalarFieldEnumSchema } from './enums/LabRxTemplateScalarFieldEnum.schema';
// Select schema needs to be in file to prevent circular imports
//------------------------------------------------------
export const LabRxTemplateFindFirstOrThrowSelectSchema: z.ZodType<Prisma.LabRxTemplateSelect> = z.object({
id: z.boolean().optional(),
userId: z.boolean().optional(),
name: z.boolean().optional(),
labName: z.boolean().optional(),
labPhone: z.boolean().optional(),
labFax: z.boolean().optional(),
labAddress: z.boolean().optional(),
labAccount: z.boolean().optional(),
caseType: z.boolean().optional(),
material: z.boolean().optional(),
instructions: z.boolean().optional(),
sortOrder: z.boolean().optional(),
createdAt: z.boolean().optional(),
updatedAt: z.boolean().optional(),
user: z.boolean().optional()
}).strict() as unknown as z.ZodType<Prisma.LabRxTemplateSelect>;
export const LabRxTemplateFindFirstOrThrowSelectZodSchema = z.object({
id: z.boolean().optional(),
userId: z.boolean().optional(),
name: z.boolean().optional(),
labName: z.boolean().optional(),
labPhone: z.boolean().optional(),
labFax: z.boolean().optional(),
labAddress: z.boolean().optional(),
labAccount: z.boolean().optional(),
caseType: z.boolean().optional(),
material: z.boolean().optional(),
instructions: z.boolean().optional(),
sortOrder: z.boolean().optional(),
createdAt: z.boolean().optional(),
updatedAt: z.boolean().optional(),
user: z.boolean().optional()
}).strict();
export const LabRxTemplateFindFirstOrThrowSchema: z.ZodType<Prisma.LabRxTemplateFindFirstOrThrowArgs> = z.object({ select: LabRxTemplateFindFirstOrThrowSelectSchema.optional(), include: z.lazy(() => LabRxTemplateIncludeObjectSchema.optional()), orderBy: z.union([LabRxTemplateOrderByWithRelationInputObjectSchema, LabRxTemplateOrderByWithRelationInputObjectSchema.array()]).optional(), where: LabRxTemplateWhereInputObjectSchema.optional(), cursor: LabRxTemplateWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), distinct: z.union([LabRxTemplateScalarFieldEnumSchema, LabRxTemplateScalarFieldEnumSchema.array()]).optional() }).strict() as unknown as z.ZodType<Prisma.LabRxTemplateFindFirstOrThrowArgs>;
export const LabRxTemplateFindFirstOrThrowZodSchema = z.object({ select: LabRxTemplateFindFirstOrThrowSelectSchema.optional(), include: z.lazy(() => LabRxTemplateIncludeObjectSchema.optional()), orderBy: z.union([LabRxTemplateOrderByWithRelationInputObjectSchema, LabRxTemplateOrderByWithRelationInputObjectSchema.array()]).optional(), where: LabRxTemplateWhereInputObjectSchema.optional(), cursor: LabRxTemplateWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), distinct: z.union([LabRxTemplateScalarFieldEnumSchema, LabRxTemplateScalarFieldEnumSchema.array()]).optional() }).strict();
@@ -0,0 +1,28 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { SeleniumSettingsIncludeObjectSchema as SeleniumSettingsIncludeObjectSchema } from './objects/SeleniumSettingsInclude.schema';
import { SeleniumSettingsOrderByWithRelationInputObjectSchema as SeleniumSettingsOrderByWithRelationInputObjectSchema } from './objects/SeleniumSettingsOrderByWithRelationInput.schema';
import { SeleniumSettingsWhereInputObjectSchema as SeleniumSettingsWhereInputObjectSchema } from './objects/SeleniumSettingsWhereInput.schema';
import { SeleniumSettingsWhereUniqueInputObjectSchema as SeleniumSettingsWhereUniqueInputObjectSchema } from './objects/SeleniumSettingsWhereUniqueInput.schema';
import { SeleniumSettingsScalarFieldEnumSchema } from './enums/SeleniumSettingsScalarFieldEnum.schema';
// Select schema needs to be in file to prevent circular imports
//------------------------------------------------------
export const SeleniumSettingsFindFirstOrThrowSelectSchema: z.ZodType<Prisma.SeleniumSettingsSelect> = z.object({
id: z.boolean().optional(),
userId: z.boolean().optional(),
paymentGroupId: z.boolean().optional(),
user: z.boolean().optional()
}).strict() as unknown as z.ZodType<Prisma.SeleniumSettingsSelect>;
export const SeleniumSettingsFindFirstOrThrowSelectZodSchema = z.object({
id: z.boolean().optional(),
userId: z.boolean().optional(),
paymentGroupId: z.boolean().optional(),
user: z.boolean().optional()
}).strict();
export const SeleniumSettingsFindFirstOrThrowSchema: z.ZodType<Prisma.SeleniumSettingsFindFirstOrThrowArgs> = z.object({ select: SeleniumSettingsFindFirstOrThrowSelectSchema.optional(), include: z.lazy(() => SeleniumSettingsIncludeObjectSchema.optional()), orderBy: z.union([SeleniumSettingsOrderByWithRelationInputObjectSchema, SeleniumSettingsOrderByWithRelationInputObjectSchema.array()]).optional(), where: SeleniumSettingsWhereInputObjectSchema.optional(), cursor: SeleniumSettingsWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), distinct: z.union([SeleniumSettingsScalarFieldEnumSchema, SeleniumSettingsScalarFieldEnumSchema.array()]).optional() }).strict() as unknown as z.ZodType<Prisma.SeleniumSettingsFindFirstOrThrowArgs>;
export const SeleniumSettingsFindFirstOrThrowZodSchema = z.object({ select: SeleniumSettingsFindFirstOrThrowSelectSchema.optional(), include: z.lazy(() => SeleniumSettingsIncludeObjectSchema.optional()), orderBy: z.union([SeleniumSettingsOrderByWithRelationInputObjectSchema, SeleniumSettingsOrderByWithRelationInputObjectSchema.array()]).optional(), where: SeleniumSettingsWhereInputObjectSchema.optional(), cursor: SeleniumSettingsWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), distinct: z.union([SeleniumSettingsScalarFieldEnumSchema, SeleniumSettingsScalarFieldEnumSchema.array()]).optional() }).strict();
@@ -41,6 +41,8 @@ export const UserFindFirstOrThrowSelectSchema: z.ZodType<Prisma.UserSelect> = z.
procedureTimeslot: z.boolean().optional(),
insuranceContacts: z.boolean().optional(),
patientConversations: z.boolean().optional(),
labRxTemplates: z.boolean().optional(),
seleniumSettings: z.boolean().optional(),
_count: z.boolean().optional()
}).strict() as unknown as z.ZodType<Prisma.UserSelect>;
@@ -76,6 +78,8 @@ export const UserFindFirstOrThrowSelectZodSchema = z.object({
procedureTimeslot: z.boolean().optional(),
insuranceContacts: z.boolean().optional(),
patientConversations: z.boolean().optional(),
labRxTemplates: z.boolean().optional(),
seleniumSettings: z.boolean().optional(),
_count: z.boolean().optional()
}).strict();
@@ -0,0 +1,28 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { SeleniumSettingsIncludeObjectSchema as SeleniumSettingsIncludeObjectSchema } from './objects/SeleniumSettingsInclude.schema';
import { SeleniumSettingsOrderByWithRelationInputObjectSchema as SeleniumSettingsOrderByWithRelationInputObjectSchema } from './objects/SeleniumSettingsOrderByWithRelationInput.schema';
import { SeleniumSettingsWhereInputObjectSchema as SeleniumSettingsWhereInputObjectSchema } from './objects/SeleniumSettingsWhereInput.schema';
import { SeleniumSettingsWhereUniqueInputObjectSchema as SeleniumSettingsWhereUniqueInputObjectSchema } from './objects/SeleniumSettingsWhereUniqueInput.schema';
import { SeleniumSettingsScalarFieldEnumSchema } from './enums/SeleniumSettingsScalarFieldEnum.schema';
// Select schema needs to be in file to prevent circular imports
//------------------------------------------------------
export const SeleniumSettingsFindFirstSelectSchema: z.ZodType<Prisma.SeleniumSettingsSelect> = z.object({
id: z.boolean().optional(),
userId: z.boolean().optional(),
paymentGroupId: z.boolean().optional(),
user: z.boolean().optional()
}).strict() as unknown as z.ZodType<Prisma.SeleniumSettingsSelect>;
export const SeleniumSettingsFindFirstSelectZodSchema = z.object({
id: z.boolean().optional(),
userId: z.boolean().optional(),
paymentGroupId: z.boolean().optional(),
user: z.boolean().optional()
}).strict();
export const SeleniumSettingsFindFirstSchema: z.ZodType<Prisma.SeleniumSettingsFindFirstArgs> = z.object({ select: SeleniumSettingsFindFirstSelectSchema.optional(), include: z.lazy(() => SeleniumSettingsIncludeObjectSchema.optional()), orderBy: z.union([SeleniumSettingsOrderByWithRelationInputObjectSchema, SeleniumSettingsOrderByWithRelationInputObjectSchema.array()]).optional(), where: SeleniumSettingsWhereInputObjectSchema.optional(), cursor: SeleniumSettingsWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), distinct: z.union([SeleniumSettingsScalarFieldEnumSchema, SeleniumSettingsScalarFieldEnumSchema.array()]).optional() }).strict() as unknown as z.ZodType<Prisma.SeleniumSettingsFindFirstArgs>;
export const SeleniumSettingsFindFirstZodSchema = z.object({ select: SeleniumSettingsFindFirstSelectSchema.optional(), include: z.lazy(() => SeleniumSettingsIncludeObjectSchema.optional()), orderBy: z.union([SeleniumSettingsOrderByWithRelationInputObjectSchema, SeleniumSettingsOrderByWithRelationInputObjectSchema.array()]).optional(), where: SeleniumSettingsWhereInputObjectSchema.optional(), cursor: SeleniumSettingsWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), distinct: z.union([SeleniumSettingsScalarFieldEnumSchema, SeleniumSettingsScalarFieldEnumSchema.array()]).optional() }).strict();
@@ -41,6 +41,8 @@ export const UserFindFirstSelectSchema: z.ZodType<Prisma.UserSelect> = z.object(
procedureTimeslot: z.boolean().optional(),
insuranceContacts: z.boolean().optional(),
patientConversations: z.boolean().optional(),
labRxTemplates: z.boolean().optional(),
seleniumSettings: z.boolean().optional(),
_count: z.boolean().optional()
}).strict() as unknown as z.ZodType<Prisma.UserSelect>;
@@ -76,6 +78,8 @@ export const UserFindFirstSelectZodSchema = z.object({
procedureTimeslot: z.boolean().optional(),
insuranceContacts: z.boolean().optional(),
patientConversations: z.boolean().optional(),
labRxTemplates: z.boolean().optional(),
seleniumSettings: z.boolean().optional(),
_count: z.boolean().optional()
}).strict();
@@ -0,0 +1,50 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { LabRxTemplateIncludeObjectSchema as LabRxTemplateIncludeObjectSchema } from './objects/LabRxTemplateInclude.schema';
import { LabRxTemplateOrderByWithRelationInputObjectSchema as LabRxTemplateOrderByWithRelationInputObjectSchema } from './objects/LabRxTemplateOrderByWithRelationInput.schema';
import { LabRxTemplateWhereInputObjectSchema as LabRxTemplateWhereInputObjectSchema } from './objects/LabRxTemplateWhereInput.schema';
import { LabRxTemplateWhereUniqueInputObjectSchema as LabRxTemplateWhereUniqueInputObjectSchema } from './objects/LabRxTemplateWhereUniqueInput.schema';
import { LabRxTemplateScalarFieldEnumSchema } from './enums/LabRxTemplateScalarFieldEnum.schema';
// Select schema needs to be in file to prevent circular imports
//------------------------------------------------------
export const LabRxTemplateFindManySelectSchema: z.ZodType<Prisma.LabRxTemplateSelect> = z.object({
id: z.boolean().optional(),
userId: z.boolean().optional(),
name: z.boolean().optional(),
labName: z.boolean().optional(),
labPhone: z.boolean().optional(),
labFax: z.boolean().optional(),
labAddress: z.boolean().optional(),
labAccount: z.boolean().optional(),
caseType: z.boolean().optional(),
material: z.boolean().optional(),
instructions: z.boolean().optional(),
sortOrder: z.boolean().optional(),
createdAt: z.boolean().optional(),
updatedAt: z.boolean().optional(),
user: z.boolean().optional()
}).strict() as unknown as z.ZodType<Prisma.LabRxTemplateSelect>;
export const LabRxTemplateFindManySelectZodSchema = z.object({
id: z.boolean().optional(),
userId: z.boolean().optional(),
name: z.boolean().optional(),
labName: z.boolean().optional(),
labPhone: z.boolean().optional(),
labFax: z.boolean().optional(),
labAddress: z.boolean().optional(),
labAccount: z.boolean().optional(),
caseType: z.boolean().optional(),
material: z.boolean().optional(),
instructions: z.boolean().optional(),
sortOrder: z.boolean().optional(),
createdAt: z.boolean().optional(),
updatedAt: z.boolean().optional(),
user: z.boolean().optional()
}).strict();
export const LabRxTemplateFindManySchema: z.ZodType<Prisma.LabRxTemplateFindManyArgs> = z.object({ select: LabRxTemplateFindManySelectSchema.optional(), include: z.lazy(() => LabRxTemplateIncludeObjectSchema.optional()), orderBy: z.union([LabRxTemplateOrderByWithRelationInputObjectSchema, LabRxTemplateOrderByWithRelationInputObjectSchema.array()]).optional(), where: LabRxTemplateWhereInputObjectSchema.optional(), cursor: LabRxTemplateWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), distinct: z.union([LabRxTemplateScalarFieldEnumSchema, LabRxTemplateScalarFieldEnumSchema.array()]).optional() }).strict() as unknown as z.ZodType<Prisma.LabRxTemplateFindManyArgs>;
export const LabRxTemplateFindManyZodSchema = z.object({ select: LabRxTemplateFindManySelectSchema.optional(), include: z.lazy(() => LabRxTemplateIncludeObjectSchema.optional()), orderBy: z.union([LabRxTemplateOrderByWithRelationInputObjectSchema, LabRxTemplateOrderByWithRelationInputObjectSchema.array()]).optional(), where: LabRxTemplateWhereInputObjectSchema.optional(), cursor: LabRxTemplateWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), distinct: z.union([LabRxTemplateScalarFieldEnumSchema, LabRxTemplateScalarFieldEnumSchema.array()]).optional() }).strict();
@@ -0,0 +1,28 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { SeleniumSettingsIncludeObjectSchema as SeleniumSettingsIncludeObjectSchema } from './objects/SeleniumSettingsInclude.schema';
import { SeleniumSettingsOrderByWithRelationInputObjectSchema as SeleniumSettingsOrderByWithRelationInputObjectSchema } from './objects/SeleniumSettingsOrderByWithRelationInput.schema';
import { SeleniumSettingsWhereInputObjectSchema as SeleniumSettingsWhereInputObjectSchema } from './objects/SeleniumSettingsWhereInput.schema';
import { SeleniumSettingsWhereUniqueInputObjectSchema as SeleniumSettingsWhereUniqueInputObjectSchema } from './objects/SeleniumSettingsWhereUniqueInput.schema';
import { SeleniumSettingsScalarFieldEnumSchema } from './enums/SeleniumSettingsScalarFieldEnum.schema';
// Select schema needs to be in file to prevent circular imports
//------------------------------------------------------
export const SeleniumSettingsFindManySelectSchema: z.ZodType<Prisma.SeleniumSettingsSelect> = z.object({
id: z.boolean().optional(),
userId: z.boolean().optional(),
paymentGroupId: z.boolean().optional(),
user: z.boolean().optional()
}).strict() as unknown as z.ZodType<Prisma.SeleniumSettingsSelect>;
export const SeleniumSettingsFindManySelectZodSchema = z.object({
id: z.boolean().optional(),
userId: z.boolean().optional(),
paymentGroupId: z.boolean().optional(),
user: z.boolean().optional()
}).strict();
export const SeleniumSettingsFindManySchema: z.ZodType<Prisma.SeleniumSettingsFindManyArgs> = z.object({ select: SeleniumSettingsFindManySelectSchema.optional(), include: z.lazy(() => SeleniumSettingsIncludeObjectSchema.optional()), orderBy: z.union([SeleniumSettingsOrderByWithRelationInputObjectSchema, SeleniumSettingsOrderByWithRelationInputObjectSchema.array()]).optional(), where: SeleniumSettingsWhereInputObjectSchema.optional(), cursor: SeleniumSettingsWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), distinct: z.union([SeleniumSettingsScalarFieldEnumSchema, SeleniumSettingsScalarFieldEnumSchema.array()]).optional() }).strict() as unknown as z.ZodType<Prisma.SeleniumSettingsFindManyArgs>;
export const SeleniumSettingsFindManyZodSchema = z.object({ select: SeleniumSettingsFindManySelectSchema.optional(), include: z.lazy(() => SeleniumSettingsIncludeObjectSchema.optional()), orderBy: z.union([SeleniumSettingsOrderByWithRelationInputObjectSchema, SeleniumSettingsOrderByWithRelationInputObjectSchema.array()]).optional(), where: SeleniumSettingsWhereInputObjectSchema.optional(), cursor: SeleniumSettingsWhereUniqueInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), distinct: z.union([SeleniumSettingsScalarFieldEnumSchema, SeleniumSettingsScalarFieldEnumSchema.array()]).optional() }).strict();
@@ -41,6 +41,8 @@ export const UserFindManySelectSchema: z.ZodType<Prisma.UserSelect> = z.object({
procedureTimeslot: z.boolean().optional(),
insuranceContacts: z.boolean().optional(),
patientConversations: z.boolean().optional(),
labRxTemplates: z.boolean().optional(),
seleniumSettings: z.boolean().optional(),
_count: z.boolean().optional()
}).strict() as unknown as z.ZodType<Prisma.UserSelect>;
@@ -76,6 +78,8 @@ export const UserFindManySelectZodSchema = z.object({
procedureTimeslot: z.boolean().optional(),
insuranceContacts: z.boolean().optional(),
patientConversations: z.boolean().optional(),
labRxTemplates: z.boolean().optional(),
seleniumSettings: z.boolean().optional(),
_count: z.boolean().optional()
}).strict();
@@ -0,0 +1,9 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { LabRxTemplateSelectObjectSchema as LabRxTemplateSelectObjectSchema } from './objects/LabRxTemplateSelect.schema';
import { LabRxTemplateIncludeObjectSchema as LabRxTemplateIncludeObjectSchema } from './objects/LabRxTemplateInclude.schema';
import { LabRxTemplateWhereUniqueInputObjectSchema as LabRxTemplateWhereUniqueInputObjectSchema } from './objects/LabRxTemplateWhereUniqueInput.schema';
export const LabRxTemplateFindUniqueSchema: z.ZodType<Prisma.LabRxTemplateFindUniqueArgs> = z.object({ select: LabRxTemplateSelectObjectSchema.optional(), include: LabRxTemplateIncludeObjectSchema.optional(), where: LabRxTemplateWhereUniqueInputObjectSchema }).strict() as unknown as z.ZodType<Prisma.LabRxTemplateFindUniqueArgs>;
export const LabRxTemplateFindUniqueZodSchema = z.object({ select: LabRxTemplateSelectObjectSchema.optional(), include: LabRxTemplateIncludeObjectSchema.optional(), where: LabRxTemplateWhereUniqueInputObjectSchema }).strict();
@@ -0,0 +1,9 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { LabRxTemplateSelectObjectSchema as LabRxTemplateSelectObjectSchema } from './objects/LabRxTemplateSelect.schema';
import { LabRxTemplateIncludeObjectSchema as LabRxTemplateIncludeObjectSchema } from './objects/LabRxTemplateInclude.schema';
import { LabRxTemplateWhereUniqueInputObjectSchema as LabRxTemplateWhereUniqueInputObjectSchema } from './objects/LabRxTemplateWhereUniqueInput.schema';
export const LabRxTemplateFindUniqueOrThrowSchema: z.ZodType<Prisma.LabRxTemplateFindUniqueOrThrowArgs> = z.object({ select: LabRxTemplateSelectObjectSchema.optional(), include: LabRxTemplateIncludeObjectSchema.optional(), where: LabRxTemplateWhereUniqueInputObjectSchema }).strict() as unknown as z.ZodType<Prisma.LabRxTemplateFindUniqueOrThrowArgs>;
export const LabRxTemplateFindUniqueOrThrowZodSchema = z.object({ select: LabRxTemplateSelectObjectSchema.optional(), include: LabRxTemplateIncludeObjectSchema.optional(), where: LabRxTemplateWhereUniqueInputObjectSchema }).strict();
@@ -0,0 +1,9 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { SeleniumSettingsSelectObjectSchema as SeleniumSettingsSelectObjectSchema } from './objects/SeleniumSettingsSelect.schema';
import { SeleniumSettingsIncludeObjectSchema as SeleniumSettingsIncludeObjectSchema } from './objects/SeleniumSettingsInclude.schema';
import { SeleniumSettingsWhereUniqueInputObjectSchema as SeleniumSettingsWhereUniqueInputObjectSchema } from './objects/SeleniumSettingsWhereUniqueInput.schema';
export const SeleniumSettingsFindUniqueOrThrowSchema: z.ZodType<Prisma.SeleniumSettingsFindUniqueOrThrowArgs> = z.object({ select: SeleniumSettingsSelectObjectSchema.optional(), include: SeleniumSettingsIncludeObjectSchema.optional(), where: SeleniumSettingsWhereUniqueInputObjectSchema }).strict() as unknown as z.ZodType<Prisma.SeleniumSettingsFindUniqueOrThrowArgs>;
export const SeleniumSettingsFindUniqueOrThrowZodSchema = z.object({ select: SeleniumSettingsSelectObjectSchema.optional(), include: SeleniumSettingsIncludeObjectSchema.optional(), where: SeleniumSettingsWhereUniqueInputObjectSchema }).strict();
@@ -0,0 +1,9 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { SeleniumSettingsSelectObjectSchema as SeleniumSettingsSelectObjectSchema } from './objects/SeleniumSettingsSelect.schema';
import { SeleniumSettingsIncludeObjectSchema as SeleniumSettingsIncludeObjectSchema } from './objects/SeleniumSettingsInclude.schema';
import { SeleniumSettingsWhereUniqueInputObjectSchema as SeleniumSettingsWhereUniqueInputObjectSchema } from './objects/SeleniumSettingsWhereUniqueInput.schema';
export const SeleniumSettingsFindUniqueSchema: z.ZodType<Prisma.SeleniumSettingsFindUniqueArgs> = z.object({ select: SeleniumSettingsSelectObjectSchema.optional(), include: SeleniumSettingsIncludeObjectSchema.optional(), where: SeleniumSettingsWhereUniqueInputObjectSchema }).strict() as unknown as z.ZodType<Prisma.SeleniumSettingsFindUniqueArgs>;
export const SeleniumSettingsFindUniqueZodSchema = z.object({ select: SeleniumSettingsSelectObjectSchema.optional(), include: SeleniumSettingsIncludeObjectSchema.optional(), where: SeleniumSettingsWhereUniqueInputObjectSchema }).strict();
@@ -0,0 +1,15 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { LabRxTemplateWhereInputObjectSchema as LabRxTemplateWhereInputObjectSchema } from './objects/LabRxTemplateWhereInput.schema';
import { LabRxTemplateOrderByWithAggregationInputObjectSchema as LabRxTemplateOrderByWithAggregationInputObjectSchema } from './objects/LabRxTemplateOrderByWithAggregationInput.schema';
import { LabRxTemplateScalarWhereWithAggregatesInputObjectSchema as LabRxTemplateScalarWhereWithAggregatesInputObjectSchema } from './objects/LabRxTemplateScalarWhereWithAggregatesInput.schema';
import { LabRxTemplateScalarFieldEnumSchema } from './enums/LabRxTemplateScalarFieldEnum.schema';
import { LabRxTemplateCountAggregateInputObjectSchema as LabRxTemplateCountAggregateInputObjectSchema } from './objects/LabRxTemplateCountAggregateInput.schema';
import { LabRxTemplateMinAggregateInputObjectSchema as LabRxTemplateMinAggregateInputObjectSchema } from './objects/LabRxTemplateMinAggregateInput.schema';
import { LabRxTemplateMaxAggregateInputObjectSchema as LabRxTemplateMaxAggregateInputObjectSchema } from './objects/LabRxTemplateMaxAggregateInput.schema';
import { LabRxTemplateAvgAggregateInputObjectSchema as LabRxTemplateAvgAggregateInputObjectSchema } from './objects/LabRxTemplateAvgAggregateInput.schema';
import { LabRxTemplateSumAggregateInputObjectSchema as LabRxTemplateSumAggregateInputObjectSchema } from './objects/LabRxTemplateSumAggregateInput.schema';
export const LabRxTemplateGroupBySchema: z.ZodType<Prisma.LabRxTemplateGroupByArgs> = z.object({ where: LabRxTemplateWhereInputObjectSchema.optional(), orderBy: z.union([LabRxTemplateOrderByWithAggregationInputObjectSchema, LabRxTemplateOrderByWithAggregationInputObjectSchema.array()]).optional(), having: LabRxTemplateScalarWhereWithAggregatesInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), by: z.array(LabRxTemplateScalarFieldEnumSchema), _count: z.union([ z.literal(true), LabRxTemplateCountAggregateInputObjectSchema ]).optional(), _min: LabRxTemplateMinAggregateInputObjectSchema.optional(), _max: LabRxTemplateMaxAggregateInputObjectSchema.optional(), _avg: LabRxTemplateAvgAggregateInputObjectSchema.optional(), _sum: LabRxTemplateSumAggregateInputObjectSchema.optional() }).strict() as unknown as z.ZodType<Prisma.LabRxTemplateGroupByArgs>;
export const LabRxTemplateGroupByZodSchema = z.object({ where: LabRxTemplateWhereInputObjectSchema.optional(), orderBy: z.union([LabRxTemplateOrderByWithAggregationInputObjectSchema, LabRxTemplateOrderByWithAggregationInputObjectSchema.array()]).optional(), having: LabRxTemplateScalarWhereWithAggregatesInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), by: z.array(LabRxTemplateScalarFieldEnumSchema), _count: z.union([ z.literal(true), LabRxTemplateCountAggregateInputObjectSchema ]).optional(), _min: LabRxTemplateMinAggregateInputObjectSchema.optional(), _max: LabRxTemplateMaxAggregateInputObjectSchema.optional(), _avg: LabRxTemplateAvgAggregateInputObjectSchema.optional(), _sum: LabRxTemplateSumAggregateInputObjectSchema.optional() }).strict();
@@ -0,0 +1,15 @@
import type { Prisma } from '../../generated/prisma';
import * as z from 'zod';
import { SeleniumSettingsWhereInputObjectSchema as SeleniumSettingsWhereInputObjectSchema } from './objects/SeleniumSettingsWhereInput.schema';
import { SeleniumSettingsOrderByWithAggregationInputObjectSchema as SeleniumSettingsOrderByWithAggregationInputObjectSchema } from './objects/SeleniumSettingsOrderByWithAggregationInput.schema';
import { SeleniumSettingsScalarWhereWithAggregatesInputObjectSchema as SeleniumSettingsScalarWhereWithAggregatesInputObjectSchema } from './objects/SeleniumSettingsScalarWhereWithAggregatesInput.schema';
import { SeleniumSettingsScalarFieldEnumSchema } from './enums/SeleniumSettingsScalarFieldEnum.schema';
import { SeleniumSettingsCountAggregateInputObjectSchema as SeleniumSettingsCountAggregateInputObjectSchema } from './objects/SeleniumSettingsCountAggregateInput.schema';
import { SeleniumSettingsMinAggregateInputObjectSchema as SeleniumSettingsMinAggregateInputObjectSchema } from './objects/SeleniumSettingsMinAggregateInput.schema';
import { SeleniumSettingsMaxAggregateInputObjectSchema as SeleniumSettingsMaxAggregateInputObjectSchema } from './objects/SeleniumSettingsMaxAggregateInput.schema';
import { SeleniumSettingsAvgAggregateInputObjectSchema as SeleniumSettingsAvgAggregateInputObjectSchema } from './objects/SeleniumSettingsAvgAggregateInput.schema';
import { SeleniumSettingsSumAggregateInputObjectSchema as SeleniumSettingsSumAggregateInputObjectSchema } from './objects/SeleniumSettingsSumAggregateInput.schema';
export const SeleniumSettingsGroupBySchema: z.ZodType<Prisma.SeleniumSettingsGroupByArgs> = z.object({ where: SeleniumSettingsWhereInputObjectSchema.optional(), orderBy: z.union([SeleniumSettingsOrderByWithAggregationInputObjectSchema, SeleniumSettingsOrderByWithAggregationInputObjectSchema.array()]).optional(), having: SeleniumSettingsScalarWhereWithAggregatesInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), by: z.array(SeleniumSettingsScalarFieldEnumSchema), _count: z.union([ z.literal(true), SeleniumSettingsCountAggregateInputObjectSchema ]).optional(), _min: SeleniumSettingsMinAggregateInputObjectSchema.optional(), _max: SeleniumSettingsMaxAggregateInputObjectSchema.optional(), _avg: SeleniumSettingsAvgAggregateInputObjectSchema.optional(), _sum: SeleniumSettingsSumAggregateInputObjectSchema.optional() }).strict() as unknown as z.ZodType<Prisma.SeleniumSettingsGroupByArgs>;
export const SeleniumSettingsGroupByZodSchema = z.object({ where: SeleniumSettingsWhereInputObjectSchema.optional(), orderBy: z.union([SeleniumSettingsOrderByWithAggregationInputObjectSchema, SeleniumSettingsOrderByWithAggregationInputObjectSchema.array()]).optional(), having: SeleniumSettingsScalarWhereWithAggregatesInputObjectSchema.optional(), take: z.number().optional(), skip: z.number().optional(), by: z.array(SeleniumSettingsScalarFieldEnumSchema), _count: z.union([ z.literal(true), SeleniumSettingsCountAggregateInputObjectSchema ]).optional(), _min: SeleniumSettingsMinAggregateInputObjectSchema.optional(), _max: SeleniumSettingsMaxAggregateInputObjectSchema.optional(), _avg: SeleniumSettingsAvgAggregateInputObjectSchema.optional(), _sum: SeleniumSettingsSumAggregateInputObjectSchema.optional() }).strict();
+68
View File
@@ -31,8 +31,10 @@ export * from './enums/OfficeContactScalarFieldEnum.schema'
export * from './enums/InsuranceContactScalarFieldEnum.schema'
export * from './enums/ProcedureTimeslotScalarFieldEnum.schema'
export * from './enums/PatientConversationScalarFieldEnum.schema'
export * from './enums/LabRxTemplateScalarFieldEnum.schema'
export * from './enums/CommissionBatchScalarFieldEnum.schema'
export * from './enums/CommissionBatchItemScalarFieldEnum.schema'
export * from './enums/SeleniumSettingsScalarFieldEnum.schema'
export * from './enums/SortOrder.schema'
export * from './enums/NullableJsonNullValueInput.schema'
export * from './enums/JsonNullValueInput.schema'
@@ -595,6 +597,23 @@ export * from './updateManyAndReturnPatientConversation.schema'
export * from './upsertOnePatientConversation.schema'
export * from './aggregatePatientConversation.schema'
export * from './groupByPatientConversation.schema'
export * from './findUniqueLabRxTemplate.schema'
export * from './findUniqueOrThrowLabRxTemplate.schema'
export * from './findFirstLabRxTemplate.schema'
export * from './findFirstOrThrowLabRxTemplate.schema'
export * from './findManyLabRxTemplate.schema'
export * from './countLabRxTemplate.schema'
export * from './createOneLabRxTemplate.schema'
export * from './createManyLabRxTemplate.schema'
export * from './createManyAndReturnLabRxTemplate.schema'
export * from './deleteOneLabRxTemplate.schema'
export * from './deleteManyLabRxTemplate.schema'
export * from './updateOneLabRxTemplate.schema'
export * from './updateManyLabRxTemplate.schema'
export * from './updateManyAndReturnLabRxTemplate.schema'
export * from './upsertOneLabRxTemplate.schema'
export * from './aggregateLabRxTemplate.schema'
export * from './groupByLabRxTemplate.schema'
export * from './findUniqueCommissionBatch.schema'
export * from './findUniqueOrThrowCommissionBatch.schema'
export * from './findFirstCommissionBatch.schema'
@@ -629,6 +648,23 @@ export * from './updateManyAndReturnCommissionBatchItem.schema'
export * from './upsertOneCommissionBatchItem.schema'
export * from './aggregateCommissionBatchItem.schema'
export * from './groupByCommissionBatchItem.schema'
export * from './findUniqueSeleniumSettings.schema'
export * from './findUniqueOrThrowSeleniumSettings.schema'
export * from './findFirstSeleniumSettings.schema'
export * from './findFirstOrThrowSeleniumSettings.schema'
export * from './findManySeleniumSettings.schema'
export * from './countSeleniumSettings.schema'
export * from './createOneSeleniumSettings.schema'
export * from './createManySeleniumSettings.schema'
export * from './createManyAndReturnSeleniumSettings.schema'
export * from './deleteOneSeleniumSettings.schema'
export * from './deleteManySeleniumSettings.schema'
export * from './updateOneSeleniumSettings.schema'
export * from './updateManySeleniumSettings.schema'
export * from './updateManyAndReturnSeleniumSettings.schema'
export * from './upsertOneSeleniumSettings.schema'
export * from './aggregateSeleniumSettings.schema'
export * from './groupBySeleniumSettings.schema'
export * from './results/UserFindUniqueResult.schema'
export * from './results/UserFindFirstResult.schema'
export * from './results/UserFindManyResult.schema'
@@ -1045,6 +1081,19 @@ export * from './results/PatientConversationDeleteManyResult.schema'
export * from './results/PatientConversationAggregateResult.schema'
export * from './results/PatientConversationGroupByResult.schema'
export * from './results/PatientConversationCountResult.schema'
export * from './results/LabRxTemplateFindUniqueResult.schema'
export * from './results/LabRxTemplateFindFirstResult.schema'
export * from './results/LabRxTemplateFindManyResult.schema'
export * from './results/LabRxTemplateCreateResult.schema'
export * from './results/LabRxTemplateCreateManyResult.schema'
export * from './results/LabRxTemplateUpdateResult.schema'
export * from './results/LabRxTemplateUpdateManyResult.schema'
export * from './results/LabRxTemplateUpsertResult.schema'
export * from './results/LabRxTemplateDeleteResult.schema'
export * from './results/LabRxTemplateDeleteManyResult.schema'
export * from './results/LabRxTemplateAggregateResult.schema'
export * from './results/LabRxTemplateGroupByResult.schema'
export * from './results/LabRxTemplateCountResult.schema'
export * from './results/CommissionBatchFindUniqueResult.schema'
export * from './results/CommissionBatchFindFirstResult.schema'
export * from './results/CommissionBatchFindManyResult.schema'
@@ -1071,6 +1120,19 @@ export * from './results/CommissionBatchItemDeleteManyResult.schema'
export * from './results/CommissionBatchItemAggregateResult.schema'
export * from './results/CommissionBatchItemGroupByResult.schema'
export * from './results/CommissionBatchItemCountResult.schema'
export * from './results/SeleniumSettingsFindUniqueResult.schema'
export * from './results/SeleniumSettingsFindFirstResult.schema'
export * from './results/SeleniumSettingsFindManyResult.schema'
export * from './results/SeleniumSettingsCreateResult.schema'
export * from './results/SeleniumSettingsCreateManyResult.schema'
export * from './results/SeleniumSettingsUpdateResult.schema'
export * from './results/SeleniumSettingsUpdateManyResult.schema'
export * from './results/SeleniumSettingsUpsertResult.schema'
export * from './results/SeleniumSettingsDeleteResult.schema'
export * from './results/SeleniumSettingsDeleteManyResult.schema'
export * from './results/SeleniumSettingsAggregateResult.schema'
export * from './results/SeleniumSettingsGroupByResult.schema'
export * from './results/SeleniumSettingsCountResult.schema'
export * from './results/index'
export * from './objects/index'
export * from './variants/pure/User.pure'
@@ -1105,8 +1167,10 @@ export * from './variants/pure/OfficeContact.pure'
export * from './variants/pure/InsuranceContact.pure'
export * from './variants/pure/ProcedureTimeslot.pure'
export * from './variants/pure/PatientConversation.pure'
export * from './variants/pure/LabRxTemplate.pure'
export * from './variants/pure/CommissionBatch.pure'
export * from './variants/pure/CommissionBatchItem.pure'
export * from './variants/pure/SeleniumSettings.pure'
export * from './variants/pure/index'
export * from './variants/input/User.input'
export * from './variants/input/Patient.input'
@@ -1140,8 +1204,10 @@ export * from './variants/input/OfficeContact.input'
export * from './variants/input/InsuranceContact.input'
export * from './variants/input/ProcedureTimeslot.input'
export * from './variants/input/PatientConversation.input'
export * from './variants/input/LabRxTemplate.input'
export * from './variants/input/CommissionBatch.input'
export * from './variants/input/CommissionBatchItem.input'
export * from './variants/input/SeleniumSettings.input'
export * from './variants/input/index'
export * from './variants/result/User.result'
export * from './variants/result/Patient.result'
@@ -1175,7 +1241,9 @@ export * from './variants/result/OfficeContact.result'
export * from './variants/result/InsuranceContact.result'
export * from './variants/result/ProcedureTimeslot.result'
export * from './variants/result/PatientConversation.result'
export * from './variants/result/LabRxTemplate.result'
export * from './variants/result/CommissionBatch.result'
export * from './variants/result/CommissionBatchItem.result'
export * from './variants/result/SeleniumSettings.result'
export * from './variants/result/index'
export * from './variants/index'
@@ -0,0 +1,11 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { LabRxTemplateSelectObjectSchema as LabRxTemplateSelectObjectSchema } from './LabRxTemplateSelect.schema';
import { LabRxTemplateIncludeObjectSchema as LabRxTemplateIncludeObjectSchema } from './LabRxTemplateInclude.schema'
const makeSchema = () => z.object({
select: z.lazy(() => LabRxTemplateSelectObjectSchema).optional(),
include: z.lazy(() => LabRxTemplateIncludeObjectSchema).optional()
}).strict();
export const LabRxTemplateArgsObjectSchema = makeSchema();
export const LabRxTemplateArgsObjectZodSchema = makeSchema();
@@ -0,0 +1,11 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
const makeSchema = () => z.object({
id: z.literal(true).optional(),
userId: z.literal(true).optional(),
sortOrder: z.literal(true).optional()
}).strict();
export const LabRxTemplateAvgAggregateInputObjectSchema: z.ZodType<Prisma.LabRxTemplateAvgAggregateInputType> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateAvgAggregateInputType>;
export const LabRxTemplateAvgAggregateInputObjectZodSchema = makeSchema();
@@ -0,0 +1,11 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { SortOrderSchema } from '../enums/SortOrder.schema'
const makeSchema = () => z.object({
id: SortOrderSchema.optional(),
userId: SortOrderSchema.optional(),
sortOrder: SortOrderSchema.optional()
}).strict();
export const LabRxTemplateAvgOrderByAggregateInputObjectSchema: z.ZodType<Prisma.LabRxTemplateAvgOrderByAggregateInput> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateAvgOrderByAggregateInput>;
export const LabRxTemplateAvgOrderByAggregateInputObjectZodSchema = makeSchema();
@@ -0,0 +1,23 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
const makeSchema = () => z.object({
id: z.literal(true).optional(),
userId: z.literal(true).optional(),
name: z.literal(true).optional(),
labName: z.literal(true).optional(),
labPhone: z.literal(true).optional(),
labFax: z.literal(true).optional(),
labAddress: z.literal(true).optional(),
labAccount: z.literal(true).optional(),
caseType: z.literal(true).optional(),
material: z.literal(true).optional(),
instructions: z.literal(true).optional(),
sortOrder: z.literal(true).optional(),
createdAt: z.literal(true).optional(),
updatedAt: z.literal(true).optional(),
_all: z.literal(true).optional()
}).strict();
export const LabRxTemplateCountAggregateInputObjectSchema: z.ZodType<Prisma.LabRxTemplateCountAggregateInputType> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateCountAggregateInputType>;
export const LabRxTemplateCountAggregateInputObjectZodSchema = makeSchema();
@@ -0,0 +1,22 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { SortOrderSchema } from '../enums/SortOrder.schema'
const makeSchema = () => z.object({
id: SortOrderSchema.optional(),
userId: SortOrderSchema.optional(),
name: SortOrderSchema.optional(),
labName: SortOrderSchema.optional(),
labPhone: SortOrderSchema.optional(),
labFax: SortOrderSchema.optional(),
labAddress: SortOrderSchema.optional(),
labAccount: SortOrderSchema.optional(),
caseType: SortOrderSchema.optional(),
material: SortOrderSchema.optional(),
instructions: SortOrderSchema.optional(),
sortOrder: SortOrderSchema.optional(),
createdAt: SortOrderSchema.optional(),
updatedAt: SortOrderSchema.optional()
}).strict();
export const LabRxTemplateCountOrderByAggregateInputObjectSchema: z.ZodType<Prisma.LabRxTemplateCountOrderByAggregateInput> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateCountOrderByAggregateInput>;
export const LabRxTemplateCountOrderByAggregateInputObjectZodSchema = makeSchema();
@@ -0,0 +1,20 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { UserCreateNestedOneWithoutLabRxTemplatesInputObjectSchema as UserCreateNestedOneWithoutLabRxTemplatesInputObjectSchema } from './UserCreateNestedOneWithoutLabRxTemplatesInput.schema'
const makeSchema = () => z.object({
name: z.string(),
labName: z.string().optional().nullable(),
labPhone: z.string().optional().nullable(),
labFax: z.string().optional().nullable(),
labAddress: z.string().optional().nullable(),
labAccount: z.string().optional().nullable(),
caseType: z.string().optional().nullable(),
material: z.string().optional().nullable(),
instructions: z.string().optional().nullable(),
sortOrder: z.number().int().optional(),
createdAt: z.coerce.date().optional(),
user: z.lazy(() => UserCreateNestedOneWithoutLabRxTemplatesInputObjectSchema)
}).strict();
export const LabRxTemplateCreateInputObjectSchema: z.ZodType<Prisma.LabRxTemplateCreateInput> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateCreateInput>;
export const LabRxTemplateCreateInputObjectZodSchema = makeSchema();
@@ -0,0 +1,22 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
const makeSchema = () => z.object({
id: z.number().int().optional(),
userId: z.number().int(),
name: z.string(),
labName: z.string().optional().nullable(),
labPhone: z.string().optional().nullable(),
labFax: z.string().optional().nullable(),
labAddress: z.string().optional().nullable(),
labAccount: z.string().optional().nullable(),
caseType: z.string().optional().nullable(),
material: z.string().optional().nullable(),
instructions: z.string().optional().nullable(),
sortOrder: z.number().int().optional(),
createdAt: z.coerce.date().optional(),
updatedAt: z.coerce.date().optional()
}).strict();
export const LabRxTemplateCreateManyInputObjectSchema: z.ZodType<Prisma.LabRxTemplateCreateManyInput> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateCreateManyInput>;
export const LabRxTemplateCreateManyInputObjectZodSchema = makeSchema();
@@ -0,0 +1,21 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
const makeSchema = () => z.object({
id: z.number().int().optional(),
name: z.string(),
labName: z.string().optional().nullable(),
labPhone: z.string().optional().nullable(),
labFax: z.string().optional().nullable(),
labAddress: z.string().optional().nullable(),
labAccount: z.string().optional().nullable(),
caseType: z.string().optional().nullable(),
material: z.string().optional().nullable(),
instructions: z.string().optional().nullable(),
sortOrder: z.number().int().optional(),
createdAt: z.coerce.date().optional(),
updatedAt: z.coerce.date().optional()
}).strict();
export const LabRxTemplateCreateManyUserInputObjectSchema: z.ZodType<Prisma.LabRxTemplateCreateManyUserInput> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateCreateManyUserInput>;
export const LabRxTemplateCreateManyUserInputObjectZodSchema = makeSchema();
@@ -0,0 +1,10 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { LabRxTemplateCreateManyUserInputObjectSchema as LabRxTemplateCreateManyUserInputObjectSchema } from './LabRxTemplateCreateManyUserInput.schema'
const makeSchema = () => z.object({
data: z.union([z.lazy(() => LabRxTemplateCreateManyUserInputObjectSchema), z.lazy(() => LabRxTemplateCreateManyUserInputObjectSchema).array()]),
skipDuplicates: z.boolean().optional()
}).strict();
export const LabRxTemplateCreateManyUserInputEnvelopeObjectSchema: z.ZodType<Prisma.LabRxTemplateCreateManyUserInputEnvelope> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateCreateManyUserInputEnvelope>;
export const LabRxTemplateCreateManyUserInputEnvelopeObjectZodSchema = makeSchema();
@@ -0,0 +1,16 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { LabRxTemplateCreateWithoutUserInputObjectSchema as LabRxTemplateCreateWithoutUserInputObjectSchema } from './LabRxTemplateCreateWithoutUserInput.schema';
import { LabRxTemplateUncheckedCreateWithoutUserInputObjectSchema as LabRxTemplateUncheckedCreateWithoutUserInputObjectSchema } from './LabRxTemplateUncheckedCreateWithoutUserInput.schema';
import { LabRxTemplateCreateOrConnectWithoutUserInputObjectSchema as LabRxTemplateCreateOrConnectWithoutUserInputObjectSchema } from './LabRxTemplateCreateOrConnectWithoutUserInput.schema';
import { LabRxTemplateCreateManyUserInputEnvelopeObjectSchema as LabRxTemplateCreateManyUserInputEnvelopeObjectSchema } from './LabRxTemplateCreateManyUserInputEnvelope.schema';
import { LabRxTemplateWhereUniqueInputObjectSchema as LabRxTemplateWhereUniqueInputObjectSchema } from './LabRxTemplateWhereUniqueInput.schema'
const makeSchema = () => z.object({
create: z.union([z.lazy(() => LabRxTemplateCreateWithoutUserInputObjectSchema), z.lazy(() => LabRxTemplateCreateWithoutUserInputObjectSchema).array(), z.lazy(() => LabRxTemplateUncheckedCreateWithoutUserInputObjectSchema), z.lazy(() => LabRxTemplateUncheckedCreateWithoutUserInputObjectSchema).array()]).optional(),
connectOrCreate: z.union([z.lazy(() => LabRxTemplateCreateOrConnectWithoutUserInputObjectSchema), z.lazy(() => LabRxTemplateCreateOrConnectWithoutUserInputObjectSchema).array()]).optional(),
createMany: z.lazy(() => LabRxTemplateCreateManyUserInputEnvelopeObjectSchema).optional(),
connect: z.union([z.lazy(() => LabRxTemplateWhereUniqueInputObjectSchema), z.lazy(() => LabRxTemplateWhereUniqueInputObjectSchema).array()]).optional()
}).strict();
export const LabRxTemplateCreateNestedManyWithoutUserInputObjectSchema: z.ZodType<Prisma.LabRxTemplateCreateNestedManyWithoutUserInput> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateCreateNestedManyWithoutUserInput>;
export const LabRxTemplateCreateNestedManyWithoutUserInputObjectZodSchema = makeSchema();
@@ -0,0 +1,12 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { LabRxTemplateWhereUniqueInputObjectSchema as LabRxTemplateWhereUniqueInputObjectSchema } from './LabRxTemplateWhereUniqueInput.schema';
import { LabRxTemplateCreateWithoutUserInputObjectSchema as LabRxTemplateCreateWithoutUserInputObjectSchema } from './LabRxTemplateCreateWithoutUserInput.schema';
import { LabRxTemplateUncheckedCreateWithoutUserInputObjectSchema as LabRxTemplateUncheckedCreateWithoutUserInputObjectSchema } from './LabRxTemplateUncheckedCreateWithoutUserInput.schema'
const makeSchema = () => z.object({
where: z.lazy(() => LabRxTemplateWhereUniqueInputObjectSchema),
create: z.union([z.lazy(() => LabRxTemplateCreateWithoutUserInputObjectSchema), z.lazy(() => LabRxTemplateUncheckedCreateWithoutUserInputObjectSchema)])
}).strict();
export const LabRxTemplateCreateOrConnectWithoutUserInputObjectSchema: z.ZodType<Prisma.LabRxTemplateCreateOrConnectWithoutUserInput> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateCreateOrConnectWithoutUserInput>;
export const LabRxTemplateCreateOrConnectWithoutUserInputObjectZodSchema = makeSchema();
@@ -0,0 +1,20 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
const makeSchema = () => z.object({
name: z.string(),
labName: z.string().optional().nullable(),
labPhone: z.string().optional().nullable(),
labFax: z.string().optional().nullable(),
labAddress: z.string().optional().nullable(),
labAccount: z.string().optional().nullable(),
caseType: z.string().optional().nullable(),
material: z.string().optional().nullable(),
instructions: z.string().optional().nullable(),
sortOrder: z.number().int().optional(),
createdAt: z.coerce.date().optional(),
updatedAt: z.coerce.date().optional()
}).strict();
export const LabRxTemplateCreateWithoutUserInputObjectSchema: z.ZodType<Prisma.LabRxTemplateCreateWithoutUserInput> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateCreateWithoutUserInput>;
export const LabRxTemplateCreateWithoutUserInputObjectZodSchema = makeSchema();
@@ -0,0 +1,9 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { UserArgsObjectSchema as UserArgsObjectSchema } from './UserArgs.schema'
const makeSchema = () => z.object({
user: z.union([z.boolean(), z.lazy(() => UserArgsObjectSchema)]).optional()
}).strict();
export const LabRxTemplateIncludeObjectSchema: z.ZodType<Prisma.LabRxTemplateInclude> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateInclude>;
export const LabRxTemplateIncludeObjectZodSchema = makeSchema();
@@ -0,0 +1,11 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { LabRxTemplateWhereInputObjectSchema as LabRxTemplateWhereInputObjectSchema } from './LabRxTemplateWhereInput.schema'
const makeSchema = () => z.object({
every: z.lazy(() => LabRxTemplateWhereInputObjectSchema).optional(),
some: z.lazy(() => LabRxTemplateWhereInputObjectSchema).optional(),
none: z.lazy(() => LabRxTemplateWhereInputObjectSchema).optional()
}).strict();
export const LabRxTemplateListRelationFilterObjectSchema: z.ZodType<Prisma.LabRxTemplateListRelationFilter> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateListRelationFilter>;
export const LabRxTemplateListRelationFilterObjectZodSchema = makeSchema();
@@ -0,0 +1,22 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
const makeSchema = () => z.object({
id: z.literal(true).optional(),
userId: z.literal(true).optional(),
name: z.literal(true).optional(),
labName: z.literal(true).optional(),
labPhone: z.literal(true).optional(),
labFax: z.literal(true).optional(),
labAddress: z.literal(true).optional(),
labAccount: z.literal(true).optional(),
caseType: z.literal(true).optional(),
material: z.literal(true).optional(),
instructions: z.literal(true).optional(),
sortOrder: z.literal(true).optional(),
createdAt: z.literal(true).optional(),
updatedAt: z.literal(true).optional()
}).strict();
export const LabRxTemplateMaxAggregateInputObjectSchema: z.ZodType<Prisma.LabRxTemplateMaxAggregateInputType> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateMaxAggregateInputType>;
export const LabRxTemplateMaxAggregateInputObjectZodSchema = makeSchema();
@@ -0,0 +1,22 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { SortOrderSchema } from '../enums/SortOrder.schema'
const makeSchema = () => z.object({
id: SortOrderSchema.optional(),
userId: SortOrderSchema.optional(),
name: SortOrderSchema.optional(),
labName: SortOrderSchema.optional(),
labPhone: SortOrderSchema.optional(),
labFax: SortOrderSchema.optional(),
labAddress: SortOrderSchema.optional(),
labAccount: SortOrderSchema.optional(),
caseType: SortOrderSchema.optional(),
material: SortOrderSchema.optional(),
instructions: SortOrderSchema.optional(),
sortOrder: SortOrderSchema.optional(),
createdAt: SortOrderSchema.optional(),
updatedAt: SortOrderSchema.optional()
}).strict();
export const LabRxTemplateMaxOrderByAggregateInputObjectSchema: z.ZodType<Prisma.LabRxTemplateMaxOrderByAggregateInput> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateMaxOrderByAggregateInput>;
export const LabRxTemplateMaxOrderByAggregateInputObjectZodSchema = makeSchema();
@@ -0,0 +1,22 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
const makeSchema = () => z.object({
id: z.literal(true).optional(),
userId: z.literal(true).optional(),
name: z.literal(true).optional(),
labName: z.literal(true).optional(),
labPhone: z.literal(true).optional(),
labFax: z.literal(true).optional(),
labAddress: z.literal(true).optional(),
labAccount: z.literal(true).optional(),
caseType: z.literal(true).optional(),
material: z.literal(true).optional(),
instructions: z.literal(true).optional(),
sortOrder: z.literal(true).optional(),
createdAt: z.literal(true).optional(),
updatedAt: z.literal(true).optional()
}).strict();
export const LabRxTemplateMinAggregateInputObjectSchema: z.ZodType<Prisma.LabRxTemplateMinAggregateInputType> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateMinAggregateInputType>;
export const LabRxTemplateMinAggregateInputObjectZodSchema = makeSchema();
@@ -0,0 +1,22 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { SortOrderSchema } from '../enums/SortOrder.schema'
const makeSchema = () => z.object({
id: SortOrderSchema.optional(),
userId: SortOrderSchema.optional(),
name: SortOrderSchema.optional(),
labName: SortOrderSchema.optional(),
labPhone: SortOrderSchema.optional(),
labFax: SortOrderSchema.optional(),
labAddress: SortOrderSchema.optional(),
labAccount: SortOrderSchema.optional(),
caseType: SortOrderSchema.optional(),
material: SortOrderSchema.optional(),
instructions: SortOrderSchema.optional(),
sortOrder: SortOrderSchema.optional(),
createdAt: SortOrderSchema.optional(),
updatedAt: SortOrderSchema.optional()
}).strict();
export const LabRxTemplateMinOrderByAggregateInputObjectSchema: z.ZodType<Prisma.LabRxTemplateMinOrderByAggregateInput> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateMinOrderByAggregateInput>;
export const LabRxTemplateMinOrderByAggregateInputObjectZodSchema = makeSchema();
@@ -0,0 +1,9 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { SortOrderSchema } from '../enums/SortOrder.schema'
const makeSchema = () => z.object({
_count: SortOrderSchema.optional()
}).strict();
export const LabRxTemplateOrderByRelationAggregateInputObjectSchema: z.ZodType<Prisma.LabRxTemplateOrderByRelationAggregateInput> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateOrderByRelationAggregateInput>;
export const LabRxTemplateOrderByRelationAggregateInputObjectZodSchema = makeSchema();
@@ -0,0 +1,33 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { SortOrderSchema } from '../enums/SortOrder.schema';
import { SortOrderInputObjectSchema as SortOrderInputObjectSchema } from './SortOrderInput.schema';
import { LabRxTemplateCountOrderByAggregateInputObjectSchema as LabRxTemplateCountOrderByAggregateInputObjectSchema } from './LabRxTemplateCountOrderByAggregateInput.schema';
import { LabRxTemplateAvgOrderByAggregateInputObjectSchema as LabRxTemplateAvgOrderByAggregateInputObjectSchema } from './LabRxTemplateAvgOrderByAggregateInput.schema';
import { LabRxTemplateMaxOrderByAggregateInputObjectSchema as LabRxTemplateMaxOrderByAggregateInputObjectSchema } from './LabRxTemplateMaxOrderByAggregateInput.schema';
import { LabRxTemplateMinOrderByAggregateInputObjectSchema as LabRxTemplateMinOrderByAggregateInputObjectSchema } from './LabRxTemplateMinOrderByAggregateInput.schema';
import { LabRxTemplateSumOrderByAggregateInputObjectSchema as LabRxTemplateSumOrderByAggregateInputObjectSchema } from './LabRxTemplateSumOrderByAggregateInput.schema'
const makeSchema = () => z.object({
id: SortOrderSchema.optional(),
userId: SortOrderSchema.optional(),
name: SortOrderSchema.optional(),
labName: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
labPhone: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
labFax: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
labAddress: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
labAccount: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
caseType: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
material: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
instructions: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
sortOrder: SortOrderSchema.optional(),
createdAt: SortOrderSchema.optional(),
updatedAt: SortOrderSchema.optional(),
_count: z.lazy(() => LabRxTemplateCountOrderByAggregateInputObjectSchema).optional(),
_avg: z.lazy(() => LabRxTemplateAvgOrderByAggregateInputObjectSchema).optional(),
_max: z.lazy(() => LabRxTemplateMaxOrderByAggregateInputObjectSchema).optional(),
_min: z.lazy(() => LabRxTemplateMinOrderByAggregateInputObjectSchema).optional(),
_sum: z.lazy(() => LabRxTemplateSumOrderByAggregateInputObjectSchema).optional()
}).strict();
export const LabRxTemplateOrderByWithAggregationInputObjectSchema: z.ZodType<Prisma.LabRxTemplateOrderByWithAggregationInput> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateOrderByWithAggregationInput>;
export const LabRxTemplateOrderByWithAggregationInputObjectZodSchema = makeSchema();
@@ -0,0 +1,25 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { SortOrderSchema } from '../enums/SortOrder.schema';
import { SortOrderInputObjectSchema as SortOrderInputObjectSchema } from './SortOrderInput.schema';
import { UserOrderByWithRelationInputObjectSchema as UserOrderByWithRelationInputObjectSchema } from './UserOrderByWithRelationInput.schema'
const makeSchema = () => z.object({
id: SortOrderSchema.optional(),
userId: SortOrderSchema.optional(),
name: SortOrderSchema.optional(),
labName: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
labPhone: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
labFax: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
labAddress: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
labAccount: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
caseType: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
material: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
instructions: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
sortOrder: SortOrderSchema.optional(),
createdAt: SortOrderSchema.optional(),
updatedAt: SortOrderSchema.optional(),
user: z.lazy(() => UserOrderByWithRelationInputObjectSchema).optional()
}).strict();
export const LabRxTemplateOrderByWithRelationInputObjectSchema: z.ZodType<Prisma.LabRxTemplateOrderByWithRelationInput> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateOrderByWithRelationInput>;
export const LabRxTemplateOrderByWithRelationInputObjectZodSchema = makeSchema();
@@ -0,0 +1,28 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { IntFilterObjectSchema as IntFilterObjectSchema } from './IntFilter.schema';
import { StringFilterObjectSchema as StringFilterObjectSchema } from './StringFilter.schema';
import { StringNullableFilterObjectSchema as StringNullableFilterObjectSchema } from './StringNullableFilter.schema';
import { DateTimeFilterObjectSchema as DateTimeFilterObjectSchema } from './DateTimeFilter.schema'
const labrxtemplatescalarwhereinputSchema = z.object({
AND: z.union([z.lazy(() => LabRxTemplateScalarWhereInputObjectSchema), z.lazy(() => LabRxTemplateScalarWhereInputObjectSchema).array()]).optional(),
OR: z.lazy(() => LabRxTemplateScalarWhereInputObjectSchema).array().optional(),
NOT: z.union([z.lazy(() => LabRxTemplateScalarWhereInputObjectSchema), z.lazy(() => LabRxTemplateScalarWhereInputObjectSchema).array()]).optional(),
id: z.union([z.lazy(() => IntFilterObjectSchema), z.number().int()]).optional(),
userId: z.union([z.lazy(() => IntFilterObjectSchema), z.number().int()]).optional(),
name: z.union([z.lazy(() => StringFilterObjectSchema), z.string()]).optional(),
labName: z.union([z.lazy(() => StringNullableFilterObjectSchema), z.string()]).optional().nullable(),
labPhone: z.union([z.lazy(() => StringNullableFilterObjectSchema), z.string()]).optional().nullable(),
labFax: z.union([z.lazy(() => StringNullableFilterObjectSchema), z.string()]).optional().nullable(),
labAddress: z.union([z.lazy(() => StringNullableFilterObjectSchema), z.string()]).optional().nullable(),
labAccount: z.union([z.lazy(() => StringNullableFilterObjectSchema), z.string()]).optional().nullable(),
caseType: z.union([z.lazy(() => StringNullableFilterObjectSchema), z.string()]).optional().nullable(),
material: z.union([z.lazy(() => StringNullableFilterObjectSchema), z.string()]).optional().nullable(),
instructions: z.union([z.lazy(() => StringNullableFilterObjectSchema), z.string()]).optional().nullable(),
sortOrder: z.union([z.lazy(() => IntFilterObjectSchema), z.number().int()]).optional(),
createdAt: z.union([z.lazy(() => DateTimeFilterObjectSchema), z.coerce.date()]).optional(),
updatedAt: z.union([z.lazy(() => DateTimeFilterObjectSchema), z.coerce.date()]).optional()
}).strict();
export const LabRxTemplateScalarWhereInputObjectSchema: z.ZodType<Prisma.LabRxTemplateScalarWhereInput> = labrxtemplatescalarwhereinputSchema as unknown as z.ZodType<Prisma.LabRxTemplateScalarWhereInput>;
export const LabRxTemplateScalarWhereInputObjectZodSchema = labrxtemplatescalarwhereinputSchema;
@@ -0,0 +1,28 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { IntWithAggregatesFilterObjectSchema as IntWithAggregatesFilterObjectSchema } from './IntWithAggregatesFilter.schema';
import { StringWithAggregatesFilterObjectSchema as StringWithAggregatesFilterObjectSchema } from './StringWithAggregatesFilter.schema';
import { StringNullableWithAggregatesFilterObjectSchema as StringNullableWithAggregatesFilterObjectSchema } from './StringNullableWithAggregatesFilter.schema';
import { DateTimeWithAggregatesFilterObjectSchema as DateTimeWithAggregatesFilterObjectSchema } from './DateTimeWithAggregatesFilter.schema'
const labrxtemplatescalarwherewithaggregatesinputSchema = z.object({
AND: z.union([z.lazy(() => LabRxTemplateScalarWhereWithAggregatesInputObjectSchema), z.lazy(() => LabRxTemplateScalarWhereWithAggregatesInputObjectSchema).array()]).optional(),
OR: z.lazy(() => LabRxTemplateScalarWhereWithAggregatesInputObjectSchema).array().optional(),
NOT: z.union([z.lazy(() => LabRxTemplateScalarWhereWithAggregatesInputObjectSchema), z.lazy(() => LabRxTemplateScalarWhereWithAggregatesInputObjectSchema).array()]).optional(),
id: z.union([z.lazy(() => IntWithAggregatesFilterObjectSchema), z.number().int()]).optional(),
userId: z.union([z.lazy(() => IntWithAggregatesFilterObjectSchema), z.number().int()]).optional(),
name: z.union([z.lazy(() => StringWithAggregatesFilterObjectSchema), z.string()]).optional(),
labName: z.union([z.lazy(() => StringNullableWithAggregatesFilterObjectSchema), z.string()]).optional().nullable(),
labPhone: z.union([z.lazy(() => StringNullableWithAggregatesFilterObjectSchema), z.string()]).optional().nullable(),
labFax: z.union([z.lazy(() => StringNullableWithAggregatesFilterObjectSchema), z.string()]).optional().nullable(),
labAddress: z.union([z.lazy(() => StringNullableWithAggregatesFilterObjectSchema), z.string()]).optional().nullable(),
labAccount: z.union([z.lazy(() => StringNullableWithAggregatesFilterObjectSchema), z.string()]).optional().nullable(),
caseType: z.union([z.lazy(() => StringNullableWithAggregatesFilterObjectSchema), z.string()]).optional().nullable(),
material: z.union([z.lazy(() => StringNullableWithAggregatesFilterObjectSchema), z.string()]).optional().nullable(),
instructions: z.union([z.lazy(() => StringNullableWithAggregatesFilterObjectSchema), z.string()]).optional().nullable(),
sortOrder: z.union([z.lazy(() => IntWithAggregatesFilterObjectSchema), z.number().int()]).optional(),
createdAt: z.union([z.lazy(() => DateTimeWithAggregatesFilterObjectSchema), z.coerce.date()]).optional(),
updatedAt: z.union([z.lazy(() => DateTimeWithAggregatesFilterObjectSchema), z.coerce.date()]).optional()
}).strict();
export const LabRxTemplateScalarWhereWithAggregatesInputObjectSchema: z.ZodType<Prisma.LabRxTemplateScalarWhereWithAggregatesInput> = labrxtemplatescalarwherewithaggregatesinputSchema as unknown as z.ZodType<Prisma.LabRxTemplateScalarWhereWithAggregatesInput>;
export const LabRxTemplateScalarWhereWithAggregatesInputObjectZodSchema = labrxtemplatescalarwherewithaggregatesinputSchema;
@@ -0,0 +1,23 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { UserArgsObjectSchema as UserArgsObjectSchema } from './UserArgs.schema'
const makeSchema = () => z.object({
id: z.boolean().optional(),
userId: z.boolean().optional(),
name: z.boolean().optional(),
labName: z.boolean().optional(),
labPhone: z.boolean().optional(),
labFax: z.boolean().optional(),
labAddress: z.boolean().optional(),
labAccount: z.boolean().optional(),
caseType: z.boolean().optional(),
material: z.boolean().optional(),
instructions: z.boolean().optional(),
sortOrder: z.boolean().optional(),
createdAt: z.boolean().optional(),
updatedAt: z.boolean().optional(),
user: z.union([z.boolean(), z.lazy(() => UserArgsObjectSchema)]).optional()
}).strict();
export const LabRxTemplateSelectObjectSchema: z.ZodType<Prisma.LabRxTemplateSelect> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateSelect>;
export const LabRxTemplateSelectObjectZodSchema = makeSchema();
@@ -0,0 +1,11 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
const makeSchema = () => z.object({
id: z.literal(true).optional(),
userId: z.literal(true).optional(),
sortOrder: z.literal(true).optional()
}).strict();
export const LabRxTemplateSumAggregateInputObjectSchema: z.ZodType<Prisma.LabRxTemplateSumAggregateInputType> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateSumAggregateInputType>;
export const LabRxTemplateSumAggregateInputObjectZodSchema = makeSchema();
@@ -0,0 +1,11 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { SortOrderSchema } from '../enums/SortOrder.schema'
const makeSchema = () => z.object({
id: SortOrderSchema.optional(),
userId: SortOrderSchema.optional(),
sortOrder: SortOrderSchema.optional()
}).strict();
export const LabRxTemplateSumOrderByAggregateInputObjectSchema: z.ZodType<Prisma.LabRxTemplateSumOrderByAggregateInput> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateSumOrderByAggregateInput>;
export const LabRxTemplateSumOrderByAggregateInputObjectZodSchema = makeSchema();
@@ -0,0 +1,21 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
const makeSchema = () => z.object({
id: z.number().int().optional(),
userId: z.number().int(),
name: z.string(),
labName: z.string().optional().nullable(),
labPhone: z.string().optional().nullable(),
labFax: z.string().optional().nullable(),
labAddress: z.string().optional().nullable(),
labAccount: z.string().optional().nullable(),
caseType: z.string().optional().nullable(),
material: z.string().optional().nullable(),
instructions: z.string().optional().nullable(),
sortOrder: z.number().int().optional(),
createdAt: z.coerce.date().optional()
}).strict();
export const LabRxTemplateUncheckedCreateInputObjectSchema: z.ZodType<Prisma.LabRxTemplateUncheckedCreateInput> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateUncheckedCreateInput>;
export const LabRxTemplateUncheckedCreateInputObjectZodSchema = makeSchema();
@@ -0,0 +1,16 @@
import * as z from 'zod';
import type { Prisma } from '../../../generated/prisma';
import { LabRxTemplateCreateWithoutUserInputObjectSchema as LabRxTemplateCreateWithoutUserInputObjectSchema } from './LabRxTemplateCreateWithoutUserInput.schema';
import { LabRxTemplateUncheckedCreateWithoutUserInputObjectSchema as LabRxTemplateUncheckedCreateWithoutUserInputObjectSchema } from './LabRxTemplateUncheckedCreateWithoutUserInput.schema';
import { LabRxTemplateCreateOrConnectWithoutUserInputObjectSchema as LabRxTemplateCreateOrConnectWithoutUserInputObjectSchema } from './LabRxTemplateCreateOrConnectWithoutUserInput.schema';
import { LabRxTemplateCreateManyUserInputEnvelopeObjectSchema as LabRxTemplateCreateManyUserInputEnvelopeObjectSchema } from './LabRxTemplateCreateManyUserInputEnvelope.schema';
import { LabRxTemplateWhereUniqueInputObjectSchema as LabRxTemplateWhereUniqueInputObjectSchema } from './LabRxTemplateWhereUniqueInput.schema'
const makeSchema = () => z.object({
create: z.union([z.lazy(() => LabRxTemplateCreateWithoutUserInputObjectSchema), z.lazy(() => LabRxTemplateCreateWithoutUserInputObjectSchema).array(), z.lazy(() => LabRxTemplateUncheckedCreateWithoutUserInputObjectSchema), z.lazy(() => LabRxTemplateUncheckedCreateWithoutUserInputObjectSchema).array()]).optional(),
connectOrCreate: z.union([z.lazy(() => LabRxTemplateCreateOrConnectWithoutUserInputObjectSchema), z.lazy(() => LabRxTemplateCreateOrConnectWithoutUserInputObjectSchema).array()]).optional(),
createMany: z.lazy(() => LabRxTemplateCreateManyUserInputEnvelopeObjectSchema).optional(),
connect: z.union([z.lazy(() => LabRxTemplateWhereUniqueInputObjectSchema), z.lazy(() => LabRxTemplateWhereUniqueInputObjectSchema).array()]).optional()
}).strict();
export const LabRxTemplateUncheckedCreateNestedManyWithoutUserInputObjectSchema: z.ZodType<Prisma.LabRxTemplateUncheckedCreateNestedManyWithoutUserInput> = makeSchema() as unknown as z.ZodType<Prisma.LabRxTemplateUncheckedCreateNestedManyWithoutUserInput>;
export const LabRxTemplateUncheckedCreateNestedManyWithoutUserInputObjectZodSchema = makeSchema();

Some files were not shown because too many files have changed in this diff Show More