Compare commits
10
Commits
26da3394aa
...
00fd213291
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
00fd213291 | ||
|
|
191ed129d8 | ||
|
|
305a07874d | ||
|
|
6e779fc630 | ||
|
|
ce2e03e505 | ||
|
|
75ecd7cc20 | ||
|
|
abb2a0ac96 | ||
|
|
ac4d8c4c74 | ||
|
|
998ef0ac95 | ||
|
|
15a1091f35 |
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
},
|
||||
};
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
},
|
||||
];
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
Generated
+29
-60
@@ -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
@@ -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'
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
+3734
-2
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -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;
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
+16
@@ -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();
|
||||
+12
@@ -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();
|
||||
+9
@@ -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;
|
||||
+28
@@ -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();
|
||||
+16
@@ -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
Reference in New Issue
Block a user