feat: rename DDMA to ClaimMD across selenium service, remove MH/CMSP eligibility feature
Rename ddma_browser_manager/helpers/worker files to claimmd_* naming in SeleniumService. Remove the MassHealth (MH) and CMSP eligibility-check feature end to end: buttons and dead placeholder buttons on the insurance eligibility page, their handlers and auto-trigger wiring, the chatbot's MassHealth-only manual paste flow, backend routes/queue job types/processors, and the corresponding Python Selenium worker endpoints. Multi-provider eligibility checking (DDMA, Delta, Tufts SCO, United SCO, CCA, BCBS MA) and the Twilio SMS eligibility flow are untouched. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
00fd213291
commit
a3d2960c98
@@ -1,4 +1,4 @@
|
|||||||
{
|
{
|
||||||
"is_task_list_visible": true,
|
"is_task_list_visible": true,
|
||||||
"active_task": "backend#dev"
|
"active_task": "frontend#dev"
|
||||||
}
|
}
|
||||||
@@ -7,7 +7,6 @@
|
|||||||
*/
|
*/
|
||||||
import { InProcessQueue } from "./inProcessQueue";
|
import { InProcessQueue } from "./inProcessQueue";
|
||||||
import { io } from "../socket";
|
import { io } from "../socket";
|
||||||
import { runEligibilityProcessor } from "./processors/eligibilityProcessor";
|
|
||||||
import { runClaimStatusProcessor } from "./processors/claimStatusProcessor";
|
import { runClaimStatusProcessor } from "./processors/claimStatusProcessor";
|
||||||
import { runClaimSubmitProcessor } from "./processors/claimSubmitProcessor";
|
import { runClaimSubmitProcessor } from "./processors/claimSubmitProcessor";
|
||||||
import { runOcrProcessor } from "./processors/ocrProcessor";
|
import { runOcrProcessor } from "./processors/ocrProcessor";
|
||||||
@@ -23,8 +22,6 @@ import { runUnitedDHClaimProcessor } from "./processors/unitedDHClaimProcessor";
|
|||||||
import { runUnitedDHPreAuthProcessor } from "./processors/unitedDHPreAuthProcessor";
|
import { runUnitedDHPreAuthProcessor } from "./processors/unitedDHPreAuthProcessor";
|
||||||
import { runTuftsSCOPreAuthProcessor } from "./processors/tuftsSCOPreAuthProcessor";
|
import { runTuftsSCOPreAuthProcessor } from "./processors/tuftsSCOPreAuthProcessor";
|
||||||
import { runTuftsSCOClaimProcessor } from "./processors/tuftsSCOClaimProcessor";
|
import { runTuftsSCOClaimProcessor } from "./processors/tuftsSCOClaimProcessor";
|
||||||
import { runEligibilityHistoryProcessor } from "./processors/eligibilityHistoryProcessor";
|
|
||||||
import { runCmspEligibilityHistoryRemainingProcessor } from "./processors/cmspEligibilityHistoryRemainingProcessor";
|
|
||||||
import { runBcbsMaEligibilityProcessor } from "./processors/bcbsMaEligibilityProcessor";
|
import { runBcbsMaEligibilityProcessor } from "./processors/bcbsMaEligibilityProcessor";
|
||||||
import type { SeleniumJobData, OcrJobData } from "./queues";
|
import type { SeleniumJobData, OcrJobData } from "./queues";
|
||||||
|
|
||||||
@@ -59,16 +56,6 @@ export function enqueueSeleniumJob(data: SeleniumJobData): string {
|
|||||||
message: "Selenium browser starting…",
|
message: "Selenium browser starting…",
|
||||||
});
|
});
|
||||||
|
|
||||||
if (jobType === "eligibility-check") {
|
|
||||||
return runEligibilityProcessor({
|
|
||||||
enrichedPayload: data.enrichedPayload,
|
|
||||||
userId: data.userId,
|
|
||||||
insuranceId: data.insuranceId!,
|
|
||||||
formFirstName: data.formFirstName,
|
|
||||||
formLastName: data.formLastName,
|
|
||||||
formDob: data.formDob,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (jobType === "claim-status-check") {
|
if (jobType === "claim-status-check") {
|
||||||
return runClaimStatusProcessor({
|
return runClaimStatusProcessor({
|
||||||
enrichedPayload: data.enrichedPayload,
|
enrichedPayload: data.enrichedPayload,
|
||||||
@@ -231,26 +218,6 @@ export function enqueueSeleniumJob(data: SeleniumJobData): string {
|
|||||||
job.id
|
job.id
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (jobType === "cmsp-eligibility-history-remaining-check") {
|
|
||||||
return runCmspEligibilityHistoryRemainingProcessor({
|
|
||||||
enrichedPayload: data.enrichedPayload,
|
|
||||||
userId: data.userId,
|
|
||||||
insuranceId: data.insuranceId!,
|
|
||||||
formFirstName: data.formFirstName,
|
|
||||||
formLastName: data.formLastName,
|
|
||||||
formDob: data.formDob,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (jobType === "mh-eligibility-history-check") {
|
|
||||||
return runEligibilityHistoryProcessor({
|
|
||||||
enrichedPayload: data.enrichedPayload,
|
|
||||||
userId: data.userId,
|
|
||||||
insuranceId: data.insuranceId!,
|
|
||||||
formFirstName: data.formFirstName,
|
|
||||||
formLastName: data.formLastName,
|
|
||||||
formDob: data.formDob,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (jobType === "bcbs-ma-eligibility-check") {
|
if (jobType === "bcbs-ma-eligibility-check") {
|
||||||
return runBcbsMaEligibilityProcessor(
|
return runBcbsMaEligibilityProcessor(
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,169 +0,0 @@
|
|||||||
/**
|
|
||||||
* Processor for "cmsp-eligibility-history-remaining-check" jobs.
|
|
||||||
* Saves eligibility PDF, service history PDF, and accumulator PDF
|
|
||||||
* to the patient's ELIGIBILITY_STATUS document group.
|
|
||||||
*/
|
|
||||||
import fs from "fs/promises";
|
|
||||||
import path from "path";
|
|
||||||
import { storage } from "../../storage";
|
|
||||||
import { emptyFolderContainingFile } from "../../utils/emptyTempFolder";
|
|
||||||
import forwardToPatientDataExtractorService from "../../services/patientDataExtractorService";
|
|
||||||
import {
|
|
||||||
callPythonSync,
|
|
||||||
splitName,
|
|
||||||
createOrUpdatePatientByInsuranceId,
|
|
||||||
} from "./_shared";
|
|
||||||
|
|
||||||
export interface CmspEligibilityHistoryRemainingProcessorInput {
|
|
||||||
enrichedPayload: any;
|
|
||||||
userId: number;
|
|
||||||
insuranceId: string;
|
|
||||||
formFirstName?: string;
|
|
||||||
formLastName?: string;
|
|
||||||
formDob?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CmspEligibilityHistoryRemainingProcessorResult {
|
|
||||||
patientUpdateStatus?: string;
|
|
||||||
pdfUploadStatus?: string;
|
|
||||||
pdfFileId?: number | null;
|
|
||||||
pdfFilename?: string | null;
|
|
||||||
memberDetailsPdfFileId?: number | null;
|
|
||||||
memberDetailsPdfFilename?: string | null;
|
|
||||||
historyPdfFileId?: number | null;
|
|
||||||
historyPdfFilename?: string | null;
|
|
||||||
accumulatorPdfFileId?: number | null;
|
|
||||||
accumulatorPdfFilename?: string | null;
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function runCmspEligibilityHistoryRemainingProcessor(
|
|
||||||
input: CmspEligibilityHistoryRemainingProcessorInput
|
|
||||||
): Promise<CmspEligibilityHistoryRemainingProcessorResult> {
|
|
||||||
const { enrichedPayload, userId, insuranceId, formFirstName, formLastName, formDob } = input;
|
|
||||||
|
|
||||||
const seleniumResult = await callPythonSync("/cmsp-eligibility-history-remaining-check", {
|
|
||||||
data: enrichedPayload,
|
|
||||||
});
|
|
||||||
|
|
||||||
const outputResult: CmspEligibilityHistoryRemainingProcessorResult = {};
|
|
||||||
|
|
||||||
// Extract patient name
|
|
||||||
const seleniumFirst = seleniumResult.firstName?.trim() || null;
|
|
||||||
const seleniumLast = seleniumResult.lastName?.trim() || null;
|
|
||||||
const seleniumName = seleniumResult.name?.trim() || null;
|
|
||||||
const seleniumInsurance = seleniumResult.insurance?.trim() || null;
|
|
||||||
|
|
||||||
const extracted: { firstName?: string | null; lastName?: string | null } = {};
|
|
||||||
|
|
||||||
if (seleniumFirst || seleniumLast) {
|
|
||||||
extracted.firstName = seleniumFirst;
|
|
||||||
extracted.lastName = seleniumLast;
|
|
||||||
} else if (seleniumName) {
|
|
||||||
const parts = splitName(seleniumName);
|
|
||||||
extracted.firstName = parts.firstName || null;
|
|
||||||
extracted.lastName = parts.lastName || null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!extracted.firstName && !extracted.lastName && seleniumResult?.pdf_path?.endsWith(".pdf")) {
|
|
||||||
try {
|
|
||||||
const pdfBuffer = await fs.readFile(seleniumResult.pdf_path);
|
|
||||||
const extraction = await forwardToPatientDataExtractorService({
|
|
||||||
buffer: pdfBuffer,
|
|
||||||
originalname: path.basename(seleniumResult.pdf_path),
|
|
||||||
mimetype: "application/pdf",
|
|
||||||
} as any);
|
|
||||||
if (extraction.name) {
|
|
||||||
const parts = splitName(extraction.name);
|
|
||||||
extracted.firstName = parts.firstName || null;
|
|
||||||
extracted.lastName = parts.lastName || null;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.error("[cmspProcessor] PDF name extraction failed:", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const preferFirst = extracted.firstName || formFirstName || null;
|
|
||||||
const preferLast = extracted.lastName || formLastName || null;
|
|
||||||
|
|
||||||
let patient;
|
|
||||||
try {
|
|
||||||
patient = await createOrUpdatePatientByInsuranceId({
|
|
||||||
insuranceId,
|
|
||||||
firstName: preferFirst,
|
|
||||||
lastName: preferLast,
|
|
||||||
dob: formDob,
|
|
||||||
userId,
|
|
||||||
});
|
|
||||||
} catch (e: any) {
|
|
||||||
throw new Error(`Failed to create/update patient: ${e.message}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (patient && patient.id !== undefined) {
|
|
||||||
let newStatus = "UNKNOWN";
|
|
||||||
if (seleniumResult.eligibility === "Y") newStatus = "ACTIVE";
|
|
||||||
else if (seleniumResult.eligibility === "N") newStatus = "INACTIVE";
|
|
||||||
|
|
||||||
const updates: any = { status: newStatus };
|
|
||||||
if (seleniumInsurance) updates.insuranceProvider = seleniumInsurance;
|
|
||||||
await storage.updatePatient(patient.id, updates);
|
|
||||||
outputResult.patientUpdateStatus = `Patient status updated to ${newStatus}`;
|
|
||||||
|
|
||||||
// Helper: save a single PDF to the patient's ELIGIBILITY_STATUS group
|
|
||||||
const saveToGroup = async (pdfPath: string): Promise<number | null> => {
|
|
||||||
try {
|
|
||||||
const buffer = await fs.readFile(pdfPath);
|
|
||||||
const groupTitleKey = "ELIGIBILITY_STATUS";
|
|
||||||
const groupTitle = "Eligibility Status";
|
|
||||||
let group = await storage.findPdfGroupByPatientTitleKey(patient!.id, groupTitleKey);
|
|
||||||
if (!group) group = await storage.createPdfGroup(patient!.id, groupTitle, groupTitleKey);
|
|
||||||
if (!group?.id) throw new Error("PDF group creation failed");
|
|
||||||
const created = await storage.createPdfFile(group.id, path.basename(pdfPath), buffer);
|
|
||||||
if (created && typeof created === "object" && "id" in created) {
|
|
||||||
return Number(created.id);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
} catch (e: any) {
|
|
||||||
console.error("[cmspProcessor] saveToGroup failed:", e.message);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Save eligibility PDF
|
|
||||||
if (seleniumResult.pdf_path?.endsWith(".pdf")) {
|
|
||||||
outputResult.pdfFileId = await saveToGroup(seleniumResult.pdf_path);
|
|
||||||
outputResult.pdfFilename = path.basename(seleniumResult.pdf_path);
|
|
||||||
outputResult.pdfUploadStatus = outputResult.pdfFileId ? "Eligibility PDF saved" : "Eligibility PDF upload failed";
|
|
||||||
} else {
|
|
||||||
outputResult.pdfUploadStatus = "No eligibility PDF returned by Selenium";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save member details PDF
|
|
||||||
if (seleniumResult.member_details_pdf_path?.endsWith(".pdf")) {
|
|
||||||
outputResult.memberDetailsPdfFileId = await saveToGroup(seleniumResult.member_details_pdf_path);
|
|
||||||
outputResult.memberDetailsPdfFilename = path.basename(seleniumResult.member_details_pdf_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save history PDF
|
|
||||||
if (seleniumResult.history_pdf_path?.endsWith(".pdf")) {
|
|
||||||
outputResult.historyPdfFileId = await saveToGroup(seleniumResult.history_pdf_path);
|
|
||||||
outputResult.historyPdfFilename = path.basename(seleniumResult.history_pdf_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save accumulator PDF
|
|
||||||
if (seleniumResult.accumulator_pdf_path?.endsWith(".pdf")) {
|
|
||||||
outputResult.accumulatorPdfFileId = await saveToGroup(seleniumResult.accumulator_pdf_path);
|
|
||||||
outputResult.accumulatorPdfFilename = path.basename(seleniumResult.accumulator_pdf_path);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
outputResult.patientUpdateStatus = "Patient not found or missing ID; no update performed";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cleanup temp files
|
|
||||||
try {
|
|
||||||
if (seleniumResult.pdf_path) await emptyFolderContainingFile(seleniumResult.pdf_path);
|
|
||||||
} catch (e) {
|
|
||||||
console.error("[cmspProcessor] cleanup failed:", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
return outputResult;
|
|
||||||
}
|
|
||||||
@@ -1,167 +0,0 @@
|
|||||||
/**
|
|
||||||
* Processor for "mh-eligibility-history-check" jobs.
|
|
||||||
* Runs MH eligibility + service history selenium flow and saves both PDFs
|
|
||||||
* to the patient's ELIGIBILITY_STATUS document group.
|
|
||||||
*/
|
|
||||||
import fs from "fs/promises";
|
|
||||||
import path from "path";
|
|
||||||
import { storage } from "../../storage";
|
|
||||||
import { emptyFolderContainingFile } from "../../utils/emptyTempFolder";
|
|
||||||
import forwardToPatientDataExtractorService from "../../services/patientDataExtractorService";
|
|
||||||
import {
|
|
||||||
callPythonSync,
|
|
||||||
splitName,
|
|
||||||
createOrUpdatePatientByInsuranceId,
|
|
||||||
} from "./_shared";
|
|
||||||
|
|
||||||
export interface EligibilityHistoryProcessorInput {
|
|
||||||
enrichedPayload: any;
|
|
||||||
userId: number;
|
|
||||||
insuranceId: string;
|
|
||||||
formFirstName?: string;
|
|
||||||
formLastName?: string;
|
|
||||||
formDob?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface EligibilityHistoryProcessorResult {
|
|
||||||
patientUpdateStatus?: string;
|
|
||||||
pdfUploadStatus?: string;
|
|
||||||
pdfFileId?: number | null;
|
|
||||||
pdfFilename?: string | null;
|
|
||||||
memberDetailsPdfFileId?: number | null;
|
|
||||||
memberDetailsPdfFilename?: string | null;
|
|
||||||
historyPdfFileId?: number | null;
|
|
||||||
historyPdfFilename?: string | null;
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function runEligibilityHistoryProcessor(
|
|
||||||
input: EligibilityHistoryProcessorInput
|
|
||||||
): Promise<EligibilityHistoryProcessorResult> {
|
|
||||||
const { enrichedPayload, userId, insuranceId, formFirstName, formLastName, formDob } = input;
|
|
||||||
|
|
||||||
const seleniumResult = await callPythonSync("/mh-eligibility-history-check", {
|
|
||||||
data: enrichedPayload,
|
|
||||||
});
|
|
||||||
|
|
||||||
const outputResult: EligibilityHistoryProcessorResult = {};
|
|
||||||
|
|
||||||
// Extract patient name
|
|
||||||
const seleniumFirst = seleniumResult.firstName?.trim() || null;
|
|
||||||
const seleniumLast = seleniumResult.lastName?.trim() || null;
|
|
||||||
const seleniumName = seleniumResult.name?.trim() || null;
|
|
||||||
const seleniumInsurance = seleniumResult.insurance?.trim() || null;
|
|
||||||
|
|
||||||
const extracted: { firstName?: string | null; lastName?: string | null } = {};
|
|
||||||
|
|
||||||
if (seleniumFirst || seleniumLast) {
|
|
||||||
extracted.firstName = seleniumFirst;
|
|
||||||
extracted.lastName = seleniumLast;
|
|
||||||
} else if (seleniumName) {
|
|
||||||
const parts = splitName(seleniumName);
|
|
||||||
extracted.firstName = parts.firstName || null;
|
|
||||||
extracted.lastName = parts.lastName || null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!extracted.firstName && !extracted.lastName && seleniumResult?.pdf_path?.endsWith(".pdf")) {
|
|
||||||
try {
|
|
||||||
const pdfBuffer = await fs.readFile(seleniumResult.pdf_path);
|
|
||||||
const extraction = await forwardToPatientDataExtractorService({
|
|
||||||
buffer: pdfBuffer,
|
|
||||||
originalname: path.basename(seleniumResult.pdf_path),
|
|
||||||
mimetype: "application/pdf",
|
|
||||||
} as any);
|
|
||||||
if (extraction.name) {
|
|
||||||
const parts = splitName(extraction.name);
|
|
||||||
extracted.firstName = parts.firstName || null;
|
|
||||||
extracted.lastName = parts.lastName || null;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.error("[eligibilityHistoryProcessor] PDF name extraction failed:", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const preferFirst = extracted.firstName || formFirstName || null;
|
|
||||||
const preferLast = extracted.lastName || formLastName || null;
|
|
||||||
|
|
||||||
let patient;
|
|
||||||
try {
|
|
||||||
patient = await createOrUpdatePatientByInsuranceId({
|
|
||||||
insuranceId,
|
|
||||||
firstName: preferFirst,
|
|
||||||
lastName: preferLast,
|
|
||||||
dob: formDob,
|
|
||||||
userId,
|
|
||||||
});
|
|
||||||
} catch (e: any) {
|
|
||||||
throw new Error(`Failed to create/update patient: ${e.message}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (patient && patient.id !== undefined) {
|
|
||||||
let newStatus = "UNKNOWN";
|
|
||||||
if (seleniumResult.eligibility === "Y") newStatus = "ACTIVE";
|
|
||||||
else if (seleniumResult.eligibility === "N") newStatus = "INACTIVE";
|
|
||||||
|
|
||||||
const updates: any = { status: newStatus };
|
|
||||||
if (seleniumInsurance) updates.insuranceProvider = seleniumInsurance;
|
|
||||||
await storage.updatePatient(patient.id, updates);
|
|
||||||
outputResult.patientUpdateStatus = `Patient status updated to ${newStatus}`;
|
|
||||||
|
|
||||||
// Helper: save a PDF buffer to the patient's ELIGIBILITY_STATUS group
|
|
||||||
const saveToGroup = async (pdfPath: string): Promise<number | null> => {
|
|
||||||
try {
|
|
||||||
const buffer = await fs.readFile(pdfPath);
|
|
||||||
const groupTitleKey = "ELIGIBILITY_STATUS";
|
|
||||||
const groupTitle = "Eligibility Status";
|
|
||||||
let group = await storage.findPdfGroupByPatientTitleKey(patient!.id, groupTitleKey);
|
|
||||||
if (!group) group = await storage.createPdfGroup(patient!.id, groupTitle, groupTitleKey);
|
|
||||||
if (!group?.id) throw new Error("PDF group creation failed");
|
|
||||||
const created = await storage.createPdfFile(group.id, path.basename(pdfPath), buffer);
|
|
||||||
if (created && typeof created === "object" && "id" in created) {
|
|
||||||
return Number(created.id);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
} catch (e: any) {
|
|
||||||
console.error("[eligibilityHistoryProcessor] saveToGroup failed:", e.message);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Save eligibility PDF
|
|
||||||
let eligibilityPdfFileId: number | null = null;
|
|
||||||
if (seleniumResult.pdf_path?.endsWith(".pdf")) {
|
|
||||||
eligibilityPdfFileId = await saveToGroup(seleniumResult.pdf_path);
|
|
||||||
outputResult.pdfUploadStatus = eligibilityPdfFileId
|
|
||||||
? "Eligibility PDF saved"
|
|
||||||
: "Eligibility PDF upload failed";
|
|
||||||
outputResult.pdfFilename = path.basename(seleniumResult.pdf_path);
|
|
||||||
} else {
|
|
||||||
outputResult.pdfUploadStatus = "No eligibility PDF returned by Selenium";
|
|
||||||
}
|
|
||||||
outputResult.pdfFileId = eligibilityPdfFileId;
|
|
||||||
|
|
||||||
// Save member details PDF
|
|
||||||
if (seleniumResult.member_details_pdf_path?.endsWith(".pdf")) {
|
|
||||||
outputResult.memberDetailsPdfFileId = await saveToGroup(seleniumResult.member_details_pdf_path);
|
|
||||||
outputResult.memberDetailsPdfFilename = path.basename(seleniumResult.member_details_pdf_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save history PDF
|
|
||||||
let historyPdfFileId: number | null = null;
|
|
||||||
if (seleniumResult.history_pdf_path?.endsWith(".pdf")) {
|
|
||||||
historyPdfFileId = await saveToGroup(seleniumResult.history_pdf_path);
|
|
||||||
outputResult.historyPdfFilename = path.basename(seleniumResult.history_pdf_path);
|
|
||||||
}
|
|
||||||
outputResult.historyPdfFileId = historyPdfFileId;
|
|
||||||
} else {
|
|
||||||
outputResult.patientUpdateStatus = "Patient not found or missing ID; no update performed";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cleanup temp files
|
|
||||||
try {
|
|
||||||
if (seleniumResult.pdf_path) await emptyFolderContainingFile(seleniumResult.pdf_path);
|
|
||||||
} catch (e) {
|
|
||||||
console.error("[eligibilityHistoryProcessor] cleanup failed:", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
return outputResult;
|
|
||||||
}
|
|
||||||
@@ -3,7 +3,6 @@ import { redisConnection } from "./connection";
|
|||||||
|
|
||||||
/** Job types dispatched to the selenium Python worker. */
|
/** Job types dispatched to the selenium Python worker. */
|
||||||
export type SeleniumJobType =
|
export type SeleniumJobType =
|
||||||
| "eligibility-check"
|
|
||||||
| "claim-status-check"
|
| "claim-status-check"
|
||||||
| "claim-submit"
|
| "claim-submit"
|
||||||
| "claim-pre-auth"
|
| "claim-pre-auth"
|
||||||
@@ -19,8 +18,6 @@ export type SeleniumJobType =
|
|||||||
| "uniteddh-preauth-submit"
|
| "uniteddh-preauth-submit"
|
||||||
| "tuftssco-preauth-submit"
|
| "tuftssco-preauth-submit"
|
||||||
| "tuftssco-eligibility-check"
|
| "tuftssco-eligibility-check"
|
||||||
| "mh-eligibility-history-check"
|
|
||||||
| "cmsp-eligibility-history-remaining-check"
|
|
||||||
| "bcbs-ma-eligibility-check";
|
| "bcbs-ma-eligibility-check";
|
||||||
|
|
||||||
export interface SeleniumJobData {
|
export interface SeleniumJobData {
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { Worker, Job } from "bullmq";
|
|||||||
import { redisConnection } from "../connection";
|
import { redisConnection } from "../connection";
|
||||||
import { SeleniumJobData } from "../queues";
|
import { SeleniumJobData } from "../queues";
|
||||||
import { io } from "../../socket";
|
import { io } from "../../socket";
|
||||||
import { runEligibilityProcessor } from "../processors/eligibilityProcessor";
|
|
||||||
import { runClaimStatusProcessor } from "../processors/claimStatusProcessor";
|
import { runClaimStatusProcessor } from "../processors/claimStatusProcessor";
|
||||||
import { runClaimSubmitProcessor } from "../processors/claimSubmitProcessor";
|
import { runClaimSubmitProcessor } from "../processors/claimSubmitProcessor";
|
||||||
|
|
||||||
@@ -27,7 +26,7 @@ function emitJobUpdate(
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function processSeleniumJob(job: Job<SeleniumJobData>) {
|
async function processSeleniumJob(job: Job<SeleniumJobData>) {
|
||||||
const { jobType, userId, socketId, enrichedPayload } = job.data;
|
const { jobType, socketId, enrichedPayload } = job.data;
|
||||||
const jobId = job.id ?? job.name;
|
const jobId = job.id ?? job.name;
|
||||||
|
|
||||||
emitJobUpdate(socketId, jobId, jobType, "active", {
|
emitJobUpdate(socketId, jobId, jobType, "active", {
|
||||||
@@ -37,16 +36,7 @@ async function processSeleniumJob(job: Job<SeleniumJobData>) {
|
|||||||
try {
|
try {
|
||||||
let result: any;
|
let result: any;
|
||||||
|
|
||||||
if (jobType === "eligibility-check") {
|
if (jobType === "claim-status-check") {
|
||||||
result = await runEligibilityProcessor({
|
|
||||||
enrichedPayload,
|
|
||||||
userId,
|
|
||||||
insuranceId: job.data.insuranceId!,
|
|
||||||
formFirstName: job.data.formFirstName,
|
|
||||||
formLastName: job.data.formLastName,
|
|
||||||
formDob: job.data.formDob,
|
|
||||||
});
|
|
||||||
} else if (jobType === "claim-status-check") {
|
|
||||||
result = await runClaimStatusProcessor({
|
result = await runClaimStatusProcessor({
|
||||||
enrichedPayload,
|
enrichedPayload,
|
||||||
insuranceId: job.data.insuranceId!,
|
insuranceId: job.data.insuranceId!,
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import {
|
|||||||
} from "../../../../packages/db/types/patient-types";
|
} from "../../../../packages/db/types/patient-types";
|
||||||
import { formatDobForAgent } from "../utils/dateUtils";
|
import { formatDobForAgent } from "../utils/dateUtils";
|
||||||
import { seleniumQueue } from "../queue/queues";
|
import { seleniumQueue } from "../queue/queues";
|
||||||
import { enqueueSeleniumJob, getSeleniumJobStatus } from "../queue/jobRunner";
|
import { getSeleniumJobStatus } from "../queue/jobRunner";
|
||||||
|
|
||||||
const router = Router();
|
const router = Router();
|
||||||
|
|
||||||
@@ -113,160 +113,6 @@ async function createOrUpdatePatientByInsuranceId(options: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* /eligibility-check
|
|
||||||
* - run selenium
|
|
||||||
* - if pdf created -> call extractor -> get name
|
|
||||||
* - create or update patient (by memberId)
|
|
||||||
* - attach PDF to patient (create pdf group/file)
|
|
||||||
* - return { patient, pdfFileId, extractedName ... }
|
|
||||||
*/
|
|
||||||
router.post(
|
|
||||||
"/eligibility-check",
|
|
||||||
async (req: Request, res: Response): Promise<any> => {
|
|
||||||
if (!req.body.data) {
|
|
||||||
return res
|
|
||||||
.status(400)
|
|
||||||
.json({ error: "Missing Insurance Eligibility data for selenium" });
|
|
||||||
}
|
|
||||||
if (!req.user || !req.user.id) {
|
|
||||||
return res.status(401).json({ error: "Unauthorized: user info missing" });
|
|
||||||
}
|
|
||||||
|
|
||||||
const insuranceEligibilityData =
|
|
||||||
typeof req.body.data === "string"
|
|
||||||
? JSON.parse(req.body.data)
|
|
||||||
: req.body.data;
|
|
||||||
|
|
||||||
const credentials = await storage.getInsuranceCredentialByUserAndSiteKey(
|
|
||||||
req.user.id,
|
|
||||||
insuranceEligibilityData.insuranceSiteKey
|
|
||||||
);
|
|
||||||
if (!credentials) {
|
|
||||||
return res.status(404).json({
|
|
||||||
error:
|
|
||||||
"No insurance credentials found for this provider, Kindly Update this at Settings Page.",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const insuranceId = String(insuranceEligibilityData.memberId ?? "").trim();
|
|
||||||
if (!insuranceId) {
|
|
||||||
return res.status(400).json({ error: "Missing memberId" });
|
|
||||||
}
|
|
||||||
|
|
||||||
const enrichedData = {
|
|
||||||
...insuranceEligibilityData,
|
|
||||||
massdhpUsername: credentials.username,
|
|
||||||
massdhpPassword: credentials.password,
|
|
||||||
};
|
|
||||||
|
|
||||||
const job = await seleniumQueue.add("eligibility-check", {
|
|
||||||
jobType: "eligibility-check",
|
|
||||||
userId: req.user.id,
|
|
||||||
socketId: req.body.socketId,
|
|
||||||
enrichedPayload: enrichedData,
|
|
||||||
insuranceId,
|
|
||||||
formFirstName: insuranceEligibilityData.firstName,
|
|
||||||
formLastName: insuranceEligibilityData.lastName,
|
|
||||||
formDob: insuranceEligibilityData.dateOfBirth,
|
|
||||||
});
|
|
||||||
|
|
||||||
return res.json({ jobId: job.id, status: "queued" });
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
router.post(
|
|
||||||
"/eligibility-history-check",
|
|
||||||
async (req: Request, res: Response): Promise<any> => {
|
|
||||||
if (!req.body.data) {
|
|
||||||
return res.status(400).json({ error: "Missing Insurance Eligibility data for selenium" });
|
|
||||||
}
|
|
||||||
if (!req.user || !req.user.id) {
|
|
||||||
return res.status(401).json({ error: "Unauthorized: user info missing" });
|
|
||||||
}
|
|
||||||
|
|
||||||
const data =
|
|
||||||
typeof req.body.data === "string" ? JSON.parse(req.body.data) : req.body.data;
|
|
||||||
|
|
||||||
const credentials = await storage.getInsuranceCredentialByUserAndSiteKey(req.user.id, "MH");
|
|
||||||
if (!credentials) {
|
|
||||||
return res.status(404).json({
|
|
||||||
error: "No MassHealth credentials found. Please update them in Settings.",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const insuranceId = String(data.memberId ?? "").trim();
|
|
||||||
if (!insuranceId) {
|
|
||||||
return res.status(400).json({ error: "Missing memberId" });
|
|
||||||
}
|
|
||||||
|
|
||||||
const enrichedData = {
|
|
||||||
...data,
|
|
||||||
massdhpUsername: credentials.username,
|
|
||||||
massdhpPassword: credentials.password,
|
|
||||||
};
|
|
||||||
|
|
||||||
const jobId = enqueueSeleniumJob({
|
|
||||||
jobType: "mh-eligibility-history-check",
|
|
||||||
userId: req.user.id,
|
|
||||||
socketId: req.body.socketId,
|
|
||||||
enrichedPayload: enrichedData,
|
|
||||||
insuranceId,
|
|
||||||
formFirstName: data.firstName,
|
|
||||||
formLastName: data.lastName,
|
|
||||||
formDob: data.dateOfBirth,
|
|
||||||
});
|
|
||||||
|
|
||||||
return res.json({ jobId, status: "queued" });
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
router.post(
|
|
||||||
"/cmsp-eligibility-history-remaining-check",
|
|
||||||
async (req: Request, res: Response): Promise<any> => {
|
|
||||||
if (!req.body.data) {
|
|
||||||
return res.status(400).json({ error: "Missing data for selenium" });
|
|
||||||
}
|
|
||||||
if (!req.user || !req.user.id) {
|
|
||||||
return res.status(401).json({ error: "Unauthorized: user info missing" });
|
|
||||||
}
|
|
||||||
|
|
||||||
const data =
|
|
||||||
typeof req.body.data === "string" ? JSON.parse(req.body.data) : req.body.data;
|
|
||||||
|
|
||||||
const credentials = await storage.getInsuranceCredentialByUserAndSiteKey(req.user.id, "MH");
|
|
||||||
if (!credentials) {
|
|
||||||
return res.status(404).json({
|
|
||||||
error: "No MassHealth credentials found. Please update them in Settings.",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const insuranceId = String(data.memberId ?? "").trim();
|
|
||||||
if (!insuranceId) {
|
|
||||||
return res.status(400).json({ error: "Missing memberId" });
|
|
||||||
}
|
|
||||||
|
|
||||||
const enrichedData = {
|
|
||||||
...data,
|
|
||||||
massdhpUsername: credentials.username,
|
|
||||||
massdhpPassword: credentials.password,
|
|
||||||
};
|
|
||||||
|
|
||||||
const jobId = enqueueSeleniumJob({
|
|
||||||
jobType: "cmsp-eligibility-history-remaining-check",
|
|
||||||
userId: req.user.id,
|
|
||||||
socketId: req.body.socketId,
|
|
||||||
enrichedPayload: enrichedData,
|
|
||||||
insuranceId,
|
|
||||||
formFirstName: data.firstName,
|
|
||||||
formLastName: data.lastName,
|
|
||||||
formDob: data.dateOfBirth,
|
|
||||||
});
|
|
||||||
|
|
||||||
return res.json({ jobId, status: "queued" });
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
router.post(
|
router.post(
|
||||||
"/claim-status-check",
|
"/claim-status-check",
|
||||||
async (req: Request, res: Response): Promise<any> => {
|
async (req: Request, res: Response): Promise<any> => {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700&display=swap" rel="stylesheet" />
|
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700&display=swap" rel="stylesheet" />
|
||||||
<title>My Dental Office Management</title>
|
<title>Wellspring Acupuncture Office Management</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
|
|||||||
@@ -419,7 +419,7 @@ export function DdmaEligibilityButton({
|
|||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<CheckCircle className="h-4 w-4 mr-2" />
|
<CheckCircle className="h-4 w-4 mr-2" />
|
||||||
Delta MA
|
Claim MD
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { useState, useRef, useEffect } from "react";
|
|||||||
import {
|
import {
|
||||||
Bot,
|
Bot,
|
||||||
X,
|
X,
|
||||||
ChevronRight,
|
|
||||||
Stethoscope,
|
Stethoscope,
|
||||||
Calendar,
|
Calendar,
|
||||||
FileText,
|
FileText,
|
||||||
@@ -13,7 +12,6 @@ import {
|
|||||||
Paperclip,
|
Paperclip,
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import { Label } from "@/components/ui/label";
|
|
||||||
import { useLocation } from "wouter";
|
import { useLocation } from "wouter";
|
||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { apiRequest } from "@/lib/queryClient";
|
import { apiRequest } from "@/lib/queryClient";
|
||||||
@@ -21,8 +19,6 @@ import { setChatbotPendingFiles } from "@/lib/chatbotFileStore";
|
|||||||
|
|
||||||
type Step =
|
type Step =
|
||||||
| "menu"
|
| "menu"
|
||||||
| "eligibility-input"
|
|
||||||
| "eligibility-confirm"
|
|
||||||
| "ai-loading"
|
| "ai-loading"
|
||||||
| "patient-found"
|
| "patient-found"
|
||||||
| "eligibility-id-ready"
|
| "eligibility-id-ready"
|
||||||
@@ -53,12 +49,6 @@ interface PatientResult {
|
|||||||
dateOfBirth: string | null;
|
dateOfBirth: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface EligibilityData {
|
|
||||||
memberId: string;
|
|
||||||
dob: string;
|
|
||||||
dobISO: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface CheckAndClaimData {
|
interface CheckAndClaimData {
|
||||||
patient: PatientResult | null;
|
patient: PatientResult | null;
|
||||||
memberId: string;
|
memberId: string;
|
||||||
@@ -75,40 +65,6 @@ function makeMsg(role: "bot" | "user", text: string, isLoading = false): Message
|
|||||||
return { id: ++msgCounter, role, text, isLoading };
|
return { id: ++msgCounter, role, text, isLoading };
|
||||||
}
|
}
|
||||||
|
|
||||||
function getAutoCheck(dobISO: string): "mh" | "cmsp" {
|
|
||||||
const [y, m, d] = dobISO.split("-").map(Number);
|
|
||||||
const today = new Date();
|
|
||||||
let age = today.getFullYear() - (y ?? 0);
|
|
||||||
const monthDiff = today.getMonth() + 1 - (m ?? 0);
|
|
||||||
if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < (d ?? 0))) age--;
|
|
||||||
return age >= 21 ? "mh" : "cmsp";
|
|
||||||
}
|
|
||||||
|
|
||||||
function parseEligibilityInput(
|
|
||||||
raw: string
|
|
||||||
): { memberId: string; display: string; iso: string } | null {
|
|
||||||
const dateMatch = raw.match(/\b(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})\b/);
|
|
||||||
if (!dateMatch) return null;
|
|
||||||
const m = dateMatch[1];
|
|
||||||
const d = dateMatch[2];
|
|
||||||
const y = dateMatch[3];
|
|
||||||
if (!m || !d || !y) return null;
|
|
||||||
const month = parseInt(m, 10);
|
|
||||||
const day = parseInt(d, 10);
|
|
||||||
const year = parseInt(y, 10);
|
|
||||||
if (month < 1 || month > 12 || day < 1 || day > 31 || year < 1900) return null;
|
|
||||||
|
|
||||||
const withoutDate = raw.replace(dateMatch[0], "");
|
|
||||||
const memberId = (withoutDate.match(/[a-zA-Z0-9]/g) ?? []).join("");
|
|
||||||
if (!memberId) return null;
|
|
||||||
|
|
||||||
return {
|
|
||||||
memberId,
|
|
||||||
display: `${m.padStart(2, "0")}/${d.padStart(2, "0")}/${y}`,
|
|
||||||
iso: `${y}-${m.padStart(2, "0")}-${d.padStart(2, "0")}`,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
const CHAT_STORAGE_KEY = "chatbot_messages";
|
const CHAT_STORAGE_KEY = "chatbot_messages";
|
||||||
const CHATBOT_JOB_TS_KEY = "chatbot_job_started_at";
|
const CHATBOT_JOB_TS_KEY = "chatbot_job_started_at";
|
||||||
|
|
||||||
@@ -158,9 +114,6 @@ export function ChatbotButton() {
|
|||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
const [step, setStep] = useState<Step>("menu");
|
const [step, setStep] = useState<Step>("menu");
|
||||||
const [messages, setMessages] = useState<Message[]>(loadSavedMessages);
|
const [messages, setMessages] = useState<Message[]>(loadSavedMessages);
|
||||||
const [pasteInput, setPasteInput] = useState("");
|
|
||||||
const [parseError, setParseError] = useState("");
|
|
||||||
const [eligibilityData, setEligibilityData] = useState<EligibilityData | null>(null);
|
|
||||||
const [freeTextInput, setFreeTextInput] = useState("");
|
const [freeTextInput, setFreeTextInput] = useState("");
|
||||||
const [patientResult, setPatientResult] = useState<PatientResult | null>(null);
|
const [patientResult, setPatientResult] = useState<PatientResult | null>(null);
|
||||||
const [eligibilityIdData, setEligibilityIdData] = useState<{ memberId: string; dob: string; siteKey: string; autoCheck: string; patient: PatientResult | null; appointmentDate?: string | null } | null>(null);
|
const [eligibilityIdData, setEligibilityIdData] = useState<{ memberId: string; dob: string; siteKey: string; autoCheck: string; patient: PatientResult | null; appointmentDate?: string | null } | null>(null);
|
||||||
@@ -206,7 +159,6 @@ export function ChatbotButton() {
|
|||||||
const [pendingFiles, setPendingFiles] = useState<File[]>([]);
|
const [pendingFiles, setPendingFiles] = useState<File[]>([]);
|
||||||
const [, setLocation] = useLocation();
|
const [, setLocation] = useLocation();
|
||||||
const messagesEndRef = useRef<HTMLDivElement>(null);
|
const messagesEndRef = useRef<HTMLDivElement>(null);
|
||||||
const pasteRef = useRef<HTMLTextAreaElement>(null);
|
|
||||||
const freeTextRef = useRef<HTMLTextAreaElement>(null);
|
const freeTextRef = useRef<HTMLTextAreaElement>(null);
|
||||||
const fileInputRef = useRef<HTMLInputElement>(null);
|
const fileInputRef = useRef<HTMLInputElement>(null);
|
||||||
|
|
||||||
@@ -244,9 +196,6 @@ export function ChatbotButton() {
|
|||||||
}, [messages]);
|
}, [messages]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (step === "eligibility-input") {
|
|
||||||
setTimeout(() => pasteRef.current?.focus(), 50);
|
|
||||||
}
|
|
||||||
if (step === "menu") {
|
if (step === "menu") {
|
||||||
setTimeout(() => freeTextRef.current?.focus(), 50);
|
setTimeout(() => freeTextRef.current?.focus(), 50);
|
||||||
}
|
}
|
||||||
@@ -266,9 +215,6 @@ export function ChatbotButton() {
|
|||||||
// Resets step/data only — keeps message history
|
// Resets step/data only — keeps message history
|
||||||
const resetStep = () => {
|
const resetStep = () => {
|
||||||
setStep("menu");
|
setStep("menu");
|
||||||
setPasteInput("");
|
|
||||||
setParseError("");
|
|
||||||
setEligibilityData(null);
|
|
||||||
setFreeTextInput("");
|
setFreeTextInput("");
|
||||||
setPatientResult(null);
|
setPatientResult(null);
|
||||||
setEligibilityIdData(null);
|
setEligibilityIdData(null);
|
||||||
@@ -300,7 +246,7 @@ export function ChatbotButton() {
|
|||||||
resetStep();
|
resetStep();
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleOptionSelect = (option: "eligibility" | "schedule" | "claims") => {
|
const handleOptionSelect = (option: "schedule" | "claims") => {
|
||||||
if (option === "schedule") {
|
if (option === "schedule") {
|
||||||
addMsg("user", "Schedule an appointment");
|
addMsg("user", "Schedule an appointment");
|
||||||
addMsg("bot", "Opening the appointments page...");
|
addMsg("bot", "Opening the appointments page...");
|
||||||
@@ -309,67 +255,9 @@ export function ChatbotButton() {
|
|||||||
addMsg("user", "View claims");
|
addMsg("user", "View claims");
|
||||||
addMsg("bot", "Opening the claims page...");
|
addMsg("bot", "Opening the claims page...");
|
||||||
setTimeout(() => { setLocation("/claims"); setOpen(false); resetStep(); }, 600);
|
setTimeout(() => { setLocation("/claims"); setOpen(false); resetStep(); }, 600);
|
||||||
} else if (option === "eligibility") {
|
|
||||||
addMsg("user", "Check Eligibility");
|
|
||||||
addMsg("bot", "Please enter the patient's Member ID and Date of Birth:");
|
|
||||||
setStep("eligibility-input");
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleEligibilitySubmit = () => {
|
|
||||||
const parsed = parseEligibilityInput(pasteInput);
|
|
||||||
if (!parsed) {
|
|
||||||
setParseError("Couldn't find both a Member ID and a date. Try: 123456789 01/15/1985");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setParseError("");
|
|
||||||
const data: EligibilityData = { memberId: parsed.memberId, dob: parsed.display, dobISO: parsed.iso };
|
|
||||||
setEligibilityData(data);
|
|
||||||
addMsg("user", pasteInput.trim());
|
|
||||||
addMsg("bot", `Ready to check MassHealth eligibility for:\n• Member ID: ${parsed.memberId}\n• Date of Birth: ${parsed.display}\n\nShall I proceed?`);
|
|
||||||
setStep("eligibility-confirm");
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleConfirm = () => {
|
|
||||||
if (!eligibilityData) return;
|
|
||||||
addMsg("user", "Yes, check now");
|
|
||||||
addMsg("bot", "Opening the eligibility check page with this patient...");
|
|
||||||
sessionStorage.setItem("chatbot_eligibility", JSON.stringify({
|
|
||||||
memberId: eligibilityData.memberId,
|
|
||||||
dob: eligibilityData.dobISO,
|
|
||||||
autoCheck: getAutoCheck(eligibilityData.dobISO),
|
|
||||||
}));
|
|
||||||
window.dispatchEvent(new CustomEvent("chatbot:eligibility-prefill"));
|
|
||||||
setTimeout(() => { setLocation("/insurance-status"); setOpen(false); resetStep(); }, 600);
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleEligibilityFromPatient = () => {
|
|
||||||
if (!patientResult?.insuranceId || !patientResult?.dateOfBirth) return;
|
|
||||||
addMsg("user", "Check eligibility now");
|
|
||||||
addMsg("bot", "Opening the eligibility check page...");
|
|
||||||
prefillAndNavigate(patientResult.insuranceId, patientResult.dateOfBirth, getAutoCheck(patientResult.dateOfBirth));
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleEligibilityAndAppointmentFromPatient = async () => {
|
|
||||||
if (!patientResult?.insuranceId || !patientResult?.dateOfBirth) return;
|
|
||||||
addMsg("user", "Check eligibility & add to schedule (today)");
|
|
||||||
addMsg("bot", "Creating appointment for today...", true);
|
|
||||||
try {
|
|
||||||
const res = await apiRequest("POST", "/api/ai/create-appointment-today", {
|
|
||||||
patientId: patientResult.id,
|
|
||||||
});
|
|
||||||
const data = await res.json();
|
|
||||||
if (!res.ok) {
|
|
||||||
replaceLastMsg(data.message ?? "Could not create appointment.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
replaceLastMsg(`Appointment added at ${data.startTime} (${data.column ?? "Column A"}) — opening eligibility check page...`);
|
|
||||||
} catch {
|
|
||||||
replaceLastMsg("Could not create appointment — opening eligibility check page...");
|
|
||||||
}
|
|
||||||
prefillAndNavigate(patientResult.insuranceId, patientResult.dateOfBirth, getAutoCheck(patientResult.dateOfBirth));
|
|
||||||
};
|
|
||||||
|
|
||||||
const prefillAndNavigate = (memberId: string, dobISO: string, autoCheck: string) => {
|
const prefillAndNavigate = (memberId: string, dobISO: string, autoCheck: string) => {
|
||||||
sessionStorage.setItem("chatbot_eligibility", JSON.stringify({ memberId, dob: dobISO, autoCheck }));
|
sessionStorage.setItem("chatbot_eligibility", JSON.stringify({ memberId, dob: dobISO, autoCheck }));
|
||||||
window.dispatchEvent(new CustomEvent("chatbot:eligibility-prefill"));
|
window.dispatchEvent(new CustomEvent("chatbot:eligibility-prefill"));
|
||||||
@@ -728,14 +616,7 @@ export function ChatbotButton() {
|
|||||||
|
|
||||||
{/* Quick-action buttons (menu step) */}
|
{/* Quick-action buttons (menu step) */}
|
||||||
{step === "menu" && (
|
{step === "menu" && (
|
||||||
<div className="grid grid-cols-2 gap-2 pt-1">
|
<div className="grid grid-cols-1 gap-2 pt-1">
|
||||||
<button
|
|
||||||
onClick={() => handleOptionSelect("eligibility")}
|
|
||||||
className="flex items-center gap-2 p-3 rounded-xl border border-primary/30 hover:bg-primary/5 text-sm text-left transition-colors"
|
|
||||||
>
|
|
||||||
<Stethoscope className="h-4 w-4 text-primary shrink-0" />
|
|
||||||
<span>Check Eligibility</span>
|
|
||||||
</button>
|
|
||||||
<button
|
<button
|
||||||
onClick={() => handleOptionSelect("schedule")}
|
onClick={() => handleOptionSelect("schedule")}
|
||||||
className="flex items-center gap-2 p-3 rounded-xl border border-blue-300 hover:bg-blue-50 text-sm text-left transition-colors"
|
className="flex items-center gap-2 p-3 rounded-xl border border-blue-300 hover:bg-blue-50 text-sm text-left transition-colors"
|
||||||
@@ -745,7 +626,7 @@ export function ChatbotButton() {
|
|||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={() => handleOptionSelect("claims")}
|
onClick={() => handleOptionSelect("claims")}
|
||||||
className="flex items-center gap-2 p-3 rounded-xl border border-orange-300 hover:bg-orange-50 text-sm text-left transition-colors col-span-2"
|
className="flex items-center gap-2 p-3 rounded-xl border border-orange-300 hover:bg-orange-50 text-sm text-left transition-colors"
|
||||||
>
|
>
|
||||||
<FileText className="h-4 w-4 text-orange-500 shrink-0" />
|
<FileText className="h-4 w-4 text-orange-500 shrink-0" />
|
||||||
<span>Claims</span>
|
<span>Claims</span>
|
||||||
@@ -753,58 +634,6 @@ export function ChatbotButton() {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{/* Eligibility manual input */}
|
|
||||||
{step === "eligibility-input" && (
|
|
||||||
<div className="space-y-2 bg-gray-50 rounded-xl p-3 border">
|
|
||||||
<Label className="text-xs text-gray-600">Paste Member ID and Date of Birth</Label>
|
|
||||||
<textarea
|
|
||||||
ref={pasteRef}
|
|
||||||
rows={3}
|
|
||||||
placeholder={"e.g. 123456789 01/15/1985\nor 01/15/1985 123456789"}
|
|
||||||
value={pasteInput}
|
|
||||||
onChange={(e) => { setPasteInput(e.target.value); setParseError(""); }}
|
|
||||||
className={cn(
|
|
||||||
"w-full rounded-md border bg-white px-3 py-2 text-sm resize-none focus:outline-none focus:ring-2 focus:ring-ring",
|
|
||||||
parseError && "border-red-400"
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
{parseError && <p className="text-xs text-red-500">{parseError}</p>}
|
|
||||||
<div className="flex gap-2">
|
|
||||||
<Button
|
|
||||||
size="sm"
|
|
||||||
className="flex-1 h-8 text-xs"
|
|
||||||
onClick={handleEligibilitySubmit}
|
|
||||||
disabled={!pasteInput.trim()}
|
|
||||||
>
|
|
||||||
Continue <ChevronRight className="h-3 w-3 ml-1" />
|
|
||||||
</Button>
|
|
||||||
<Button size="sm" variant="ghost" className="h-8 text-xs" onClick={resetStep}>
|
|
||||||
Cancel
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{/* Eligibility confirm */}
|
|
||||||
{step === "eligibility-confirm" && (
|
|
||||||
<div className="flex gap-2">
|
|
||||||
<Button size="sm" className="flex-1 h-8 text-xs" onClick={handleConfirm}>
|
|
||||||
Yes, Check Now
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
size="sm"
|
|
||||||
variant="outline"
|
|
||||||
className="h-8 text-xs"
|
|
||||||
onClick={() => {
|
|
||||||
setStep("eligibility-input");
|
|
||||||
setMessages((prev) => prev.slice(0, -2));
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Edit
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{/* AI-found patient card */}
|
{/* AI-found patient card */}
|
||||||
{step === "patient-found" && patientResult && (
|
{step === "patient-found" && patientResult && (
|
||||||
<div className="bg-blue-50 border border-blue-200 rounded-xl p-3 space-y-2">
|
<div className="bg-blue-50 border border-blue-200 rounded-xl p-3 space-y-2">
|
||||||
@@ -821,26 +650,6 @@ export function ChatbotButton() {
|
|||||||
<p className="text-xs text-gray-500">DOB: {patientResult.dateOfBirth}</p>
|
<p className="text-xs text-gray-500">DOB: {patientResult.dateOfBirth}</p>
|
||||||
)}
|
)}
|
||||||
<div className="flex flex-col gap-2 pt-1">
|
<div className="flex flex-col gap-2 pt-1">
|
||||||
{patientResult.insuranceId && patientResult.dateOfBirth && (
|
|
||||||
<>
|
|
||||||
<Button
|
|
||||||
size="sm"
|
|
||||||
className="w-full h-8 text-xs bg-primary hover:bg-primary/90"
|
|
||||||
onClick={handleEligibilityFromPatient}
|
|
||||||
>
|
|
||||||
<Stethoscope className="h-3 w-3 mr-1" />
|
|
||||||
Check Eligibility
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
size="sm"
|
|
||||||
className="w-full h-8 text-xs bg-emerald-600 hover:bg-emerald-700 text-white"
|
|
||||||
onClick={handleEligibilityAndAppointmentFromPatient}
|
|
||||||
>
|
|
||||||
<Calendar className="h-3 w-3 mr-1" />
|
|
||||||
Eligibility & Appointment Today
|
|
||||||
</Button>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
<Button size="sm" variant="ghost" className="w-full h-8 text-xs" onClick={resetStep}>
|
<Button size="sm" variant="ghost" className="w-full h-8 text-xs" onClick={resetStep}>
|
||||||
Cancel
|
Cancel
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ export function TopAppBar() {
|
|||||||
</svg>
|
</svg>
|
||||||
|
|
||||||
<h1 className="text-lg font-medium text-primary">
|
<h1 className="text-lg font-medium text-primary">
|
||||||
My Dental Office Management
|
Wellspring Acupuncture Office Management
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
|
|||||||
@@ -40,6 +40,27 @@ export function DateInput({
|
|||||||
}
|
}
|
||||||
}, [value]);
|
}, [value]);
|
||||||
|
|
||||||
|
const handleBlur = () => {
|
||||||
|
// If the user finished typing a 2-digit year (e.g. "02/12/03") the live-typing
|
||||||
|
// logic below never commits it, since it waits for a 4-digit year. On blur,
|
||||||
|
// expand a trailing 2-digit year so the date isn't silently dropped.
|
||||||
|
const match = inputValue.match(/^(\d{1,2})\/(\d{1,2})\/(\d{2})$/);
|
||||||
|
if (!match) return;
|
||||||
|
|
||||||
|
const [, mmStr, ddStr, yyStr] = match;
|
||||||
|
const mm = mmStr.padStart(2, "0");
|
||||||
|
const dd = ddStr.padStart(2, "0");
|
||||||
|
const currentYearLastTwo = new Date().getFullYear() % 100;
|
||||||
|
const yy = parseInt(yyStr, 10);
|
||||||
|
const yyyy = yy <= currentYearLastTwo ? 2000 + yy : 1900 + yy;
|
||||||
|
|
||||||
|
const parsed = new Date(yyyy, +mm - 1, +dd);
|
||||||
|
if (!isNaN(parsed.getTime())) {
|
||||||
|
setInputValue(format(parsed, "MM/dd/yyyy"));
|
||||||
|
onChange(parsed);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
const raw = e.target.value;
|
const raw = e.target.value;
|
||||||
|
|
||||||
@@ -148,6 +169,7 @@ export function DateInput({
|
|||||||
placeholder="MM/DD/YYYY"
|
placeholder="MM/DD/YYYY"
|
||||||
value={inputValue}
|
value={inputValue}
|
||||||
onChange={handleInputChange}
|
onChange={handleInputChange}
|
||||||
|
onBlur={handleBlur}
|
||||||
/>
|
/>
|
||||||
<Popover open={open} onOpenChange={setOpen}>
|
<Popover open={open} onOpenChange={setOpen}>
|
||||||
<PopoverTrigger asChild>
|
<PopoverTrigger asChild>
|
||||||
|
|||||||
@@ -1120,22 +1120,10 @@ export default function AppointmentsPage() {
|
|||||||
const patient = apt ? patientsFromDay.find((p) => p.id === apt.patientId) : null;
|
const patient = apt ? patientsFromDay.find((p) => p.id === apt.patientId) : null;
|
||||||
const insuranceProvider = (patient as any)?.insuranceProvider as string | null ?? null;
|
const insuranceProvider = (patient as any)?.insuranceProvider as string | null ?? null;
|
||||||
const p = insuranceProvider?.toLowerCase() ?? "";
|
const p = insuranceProvider?.toLowerCase() ?? "";
|
||||||
const isMassHealth = p.includes("masshealth");
|
|
||||||
|
|
||||||
let autoCheck = "other-providers";
|
let autoCheck = "other-providers";
|
||||||
|
|
||||||
if (isMassHealth) {
|
if (p.includes("delta dental ma")) {
|
||||||
const dob = (patient as any)?.dateOfBirth;
|
|
||||||
let age: number | null = null;
|
|
||||||
if (dob) {
|
|
||||||
const dobDate = typeof dob === "string" ? new Date(dob) : dob as Date;
|
|
||||||
const today = new Date();
|
|
||||||
age = today.getFullYear() - dobDate.getFullYear();
|
|
||||||
const m = today.getMonth() - dobDate.getMonth();
|
|
||||||
if (m < 0 || (m === 0 && today.getDate() < dobDate.getDate())) age--;
|
|
||||||
}
|
|
||||||
autoCheck = age !== null && age >= 21 ? "mh-history" : "cmsp";
|
|
||||||
} else if (p.includes("delta dental ma")) {
|
|
||||||
autoCheck = "ddma";
|
autoCheck = "ddma";
|
||||||
} else if (p.includes("delta dental ins")) {
|
} else if (p.includes("delta dental ins")) {
|
||||||
autoCheck = "delta-ins";
|
autoCheck = "delta-ins";
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ export default function AuthPage() {
|
|||||||
<Card className="p-8 bg-white">
|
<Card className="p-8 bg-white">
|
||||||
<div className="mb-10 text-center">
|
<div className="mb-10 text-center">
|
||||||
<h1 className="text-3xl font-bold text-primary mb-3 tracking-tight">
|
<h1 className="text-3xl font-bold text-primary mb-3 tracking-tight">
|
||||||
My Dental Office Management
|
Wellspring Acupuncture Office Management
|
||||||
</h1>
|
</h1>
|
||||||
<p className="text-sm font-semibold tracking-[0.15em] bg-clip-text text-transparent animate-gradient-flash"
|
<p className="text-sm font-semibold tracking-[0.15em] bg-clip-text text-transparent animate-gradient-flash"
|
||||||
style={{ backgroundImage: "linear-gradient(90deg, #7c3aed, #d946ef, #06b6d4, #7c3aed)", backgroundSize: "200% 100%" }}>
|
style={{ backgroundImage: "linear-gradient(90deg, #7c3aed, #d946ef, #06b6d4, #7c3aed)", backgroundSize: "200% 100%" }}>
|
||||||
|
|||||||
@@ -28,13 +28,12 @@ import {
|
|||||||
clearTaskStatus,
|
clearTaskStatus,
|
||||||
} from "@/redux/slices/seleniumTaskSlice";
|
} from "@/redux/slices/seleniumTaskSlice";
|
||||||
import { SeleniumTaskBanner } from "@/components/ui/selenium-task-banner";
|
import { SeleniumTaskBanner } from "@/components/ui/selenium-task-banner";
|
||||||
import { formatLocalDate, parseLocalDate } from "@/utils/dateUtils";
|
import { parseLocalDate } from "@/utils/dateUtils";
|
||||||
import { socket } from "@/lib/socket";
|
import { socket } from "@/lib/socket";
|
||||||
import { InsertPatient, Patient } from "@repo/db/types";
|
import { InsertPatient, Patient } from "@repo/db/types";
|
||||||
import { DateInput } from "@/components/ui/dateInput";
|
import { DateInput } from "@/components/ui/dateInput";
|
||||||
import { QK_PATIENTS_BASE } from "@/components/patients/patient-table";
|
import { QK_PATIENTS_BASE } from "@/components/patients/patient-table";
|
||||||
import { PdfPreviewModal } from "@/components/insurance-status/pdf-preview-modal";
|
import { PdfPreviewModal } from "@/components/insurance-status/pdf-preview-modal";
|
||||||
import { DualPdfPreviewModal } from "@/components/insurance-status/dual-pdf-preview-modal";
|
|
||||||
import { useLocation } from "wouter";
|
import { useLocation } from "wouter";
|
||||||
import { DdmaEligibilityButton } from "@/components/insurance-status/ddma-buton-modal";
|
import { DdmaEligibilityButton } from "@/components/insurance-status/ddma-buton-modal";
|
||||||
import { DeltaInsEligibilityButton } from "@/components/insurance-status/deltains-button-modal";
|
import { DeltaInsEligibilityButton } from "@/components/insurance-status/deltains-button-modal";
|
||||||
@@ -111,15 +110,6 @@ export default function InsuranceStatusPage() {
|
|||||||
const [firstName, setFirstName] = useState("");
|
const [firstName, setFirstName] = useState("");
|
||||||
const [lastName, setLastName] = useState("");
|
const [lastName, setLastName] = useState("");
|
||||||
const isFormIncomplete = !memberId || !dateOfBirth;
|
const isFormIncomplete = !memberId || !dateOfBirth;
|
||||||
const [isCheckingEligibilityStatus, setIsCheckingEligibilityStatus] =
|
|
||||||
useState(false);
|
|
||||||
const [isCheckingEligibilityAppointment, setIsCheckingEligibilityAppointment] =
|
|
||||||
useState(false);
|
|
||||||
const [isCheckingEligibilityClaimsPreAuth, setIsCheckingEligibilityClaimsPreAuth] =
|
|
||||||
useState(false);
|
|
||||||
const [isCheckingEligibilityHistory, setIsCheckingEligibilityHistory] =
|
|
||||||
useState(false);
|
|
||||||
const [isCheckingCMSP, setIsCheckingCMSP] = useState(false);
|
|
||||||
|
|
||||||
// AI Call Insurance section
|
// AI Call Insurance section
|
||||||
const [aiCallOpen, setAiCallOpen] = useState(false);
|
const [aiCallOpen, setAiCallOpen] = useState(false);
|
||||||
@@ -147,27 +137,7 @@ export default function InsuranceStatusPage() {
|
|||||||
string | null
|
string | null
|
||||||
>(null);
|
>(null);
|
||||||
|
|
||||||
// Dual PDF modal state (used by MH Eligibility & History)
|
const pendingAutoCheck = useRef<"ddma" | "delta-ins" | "united-sco" | "tufts-sco" | "cca" | null>(null);
|
||||||
const [dualPreviewOpen, setDualPreviewOpen] = useState(false);
|
|
||||||
const [dualEligibilityPdfId, setDualEligibilityPdfId] = useState<number | null>(null);
|
|
||||||
const [dualEligibilityFilename, setDualEligibilityFilename] = useState<string | null>(null);
|
|
||||||
const [dualMemberDetailsPdfId, setDualMemberDetailsPdfId] = useState<number | null>(null);
|
|
||||||
const [dualMemberDetailsFilename, setDualMemberDetailsFilename] = useState<string | null>(null);
|
|
||||||
const [dualHistoryPdfId, setDualHistoryPdfId] = useState<number | null>(null);
|
|
||||||
const [dualHistoryFilename, setDualHistoryFilename] = useState<string | null>(null);
|
|
||||||
|
|
||||||
// CMSP PDF modal state (used by CMSP Eligibility & History & Remaining)
|
|
||||||
const [cmspPreviewOpen, setCmspPreviewOpen] = useState(false);
|
|
||||||
const [cmspEligibilityPdfId, setCmspEligibilityPdfId] = useState<number | null>(null);
|
|
||||||
const [cmspEligibilityFilename, setCmspEligibilityFilename] = useState<string | null>(null);
|
|
||||||
const [cmspMemberDetailsPdfId, setCmspMemberDetailsPdfId] = useState<number | null>(null);
|
|
||||||
const [cmspMemberDetailsFilename, setCmspMemberDetailsFilename] = useState<string | null>(null);
|
|
||||||
const [cmspHistoryPdfId, setCmspHistoryPdfId] = useState<number | null>(null);
|
|
||||||
const [cmspHistoryFilename, setCmspHistoryFilename] = useState<string | null>(null);
|
|
||||||
const [cmspAccumulatorPdfId, setCmspAccumulatorPdfId] = useState<number | null>(null);
|
|
||||||
const [cmspAccumulatorFilename, setCmspAccumulatorFilename] = useState<string | null>(null);
|
|
||||||
|
|
||||||
const pendingAutoCheck = useRef<"mh" | "mh-history" | "cmsp" | "ddma" | "delta-ins" | "united-sco" | "tufts-sco" | "cca" | null>(null);
|
|
||||||
const [triggerTarget, setTriggerTarget] = useState<string | null>(null);
|
const [triggerTarget, setTriggerTarget] = useState<string | null>(null);
|
||||||
const pendingScrollTo = useRef<string | null>(null);
|
const pendingScrollTo = useRef<string | null>(null);
|
||||||
const [prefillTick, setPrefillTick] = useState(0);
|
const [prefillTick, setPrefillTick] = useState(0);
|
||||||
@@ -280,56 +250,6 @@ export default function InsuranceStatusPage() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const isUnder14 = (dob: Date): boolean => {
|
|
||||||
const cutoff = new Date(dob);
|
|
||||||
cutoff.setFullYear(cutoff.getFullYear() + 14);
|
|
||||||
return new Date() < cutoff;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Shared: run MH eligibility selenium job, return jobResult or throw
|
|
||||||
const runMHEligibilitySelenium = async (): Promise<any> => {
|
|
||||||
const formattedDob = dateOfBirth ? formatLocalDate(dateOfBirth) : "";
|
|
||||||
|
|
||||||
const data = {
|
|
||||||
memberId,
|
|
||||||
dateOfBirth: formattedDob,
|
|
||||||
insuranceSiteKey: "MH",
|
|
||||||
firstName: firstName || undefined,
|
|
||||||
lastName: lastName || undefined,
|
|
||||||
};
|
|
||||||
|
|
||||||
dispatch(
|
|
||||||
setTaskStatus({
|
|
||||||
key: "eligibilityCheck",
|
|
||||||
status: "pending",
|
|
||||||
message: "Sending Data to Selenium...",
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
const response = await apiRequest(
|
|
||||||
"POST",
|
|
||||||
"/api/insurance-status/eligibility-check",
|
|
||||||
{ data: data, socketId: socket.id },
|
|
||||||
);
|
|
||||||
const enqueueResult = await response.json();
|
|
||||||
if (enqueueResult.error) throw new Error(enqueueResult.error);
|
|
||||||
|
|
||||||
const jobId = enqueueResult.jobId;
|
|
||||||
if (!jobId) throw new Error("No jobId returned from server");
|
|
||||||
|
|
||||||
dispatch(
|
|
||||||
setTaskStatus({
|
|
||||||
key: "eligibilityCheck",
|
|
||||||
status: "pending",
|
|
||||||
message: "Selenium browser starting...",
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
return waitForSeleniumJob(jobId, (msg) =>
|
|
||||||
dispatch(setTaskStatus({ key: "eligibilityCheck", status: "pending", message: msg }))
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleAddPatient = async () => {
|
const handleAddPatient = async () => {
|
||||||
const newPatient: InsertPatient = {
|
const newPatient: InsertPatient = {
|
||||||
firstName,
|
firstName,
|
||||||
@@ -343,347 +263,13 @@ export default function InsuranceStatusPage() {
|
|||||||
await addPatientMutation.mutateAsync(newPatient);
|
await addPatientMutation.mutateAsync(newPatient);
|
||||||
};
|
};
|
||||||
|
|
||||||
// MH Eligibility — check eligibility, save to DB, open PDF preview
|
|
||||||
const handleMHEligibilityButton = async () => {
|
|
||||||
if (!memberId || !dateOfBirth) {
|
|
||||||
toast({
|
|
||||||
title: "Missing Fields",
|
|
||||||
description: "Please fill in all the required fields: Member ID, Date of Birth.",
|
|
||||||
variant: "destructive",
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isUnder14(dateOfBirth)) {
|
|
||||||
toast({ title: "CMSP Patient", description: "Patient is under 14 — running CMSP Eligibility & History & Remaining instead.", variant: "default" });
|
|
||||||
return handleCMSPButton();
|
|
||||||
}
|
|
||||||
|
|
||||||
setIsCheckingEligibilityStatus(true);
|
|
||||||
try {
|
|
||||||
const jobResult = await runMHEligibilitySelenium();
|
|
||||||
|
|
||||||
dispatch(
|
|
||||||
setTaskStatus({
|
|
||||||
key: "eligibilityCheck",
|
|
||||||
status: "success",
|
|
||||||
message: "Patient status is updated, and its eligibility pdf is uploaded at Document Page.",
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
toast({
|
|
||||||
title: "Selenium service done.",
|
|
||||||
description: "Your Patient Eligibility is fetched and updated, Kindly search through the patient.",
|
|
||||||
variant: "default",
|
|
||||||
});
|
|
||||||
|
|
||||||
setSelectedPatient(null);
|
|
||||||
await queryClient.invalidateQueries({ queryKey: QK_PATIENTS_BASE });
|
|
||||||
void tryAppointmentFromChatbot();
|
|
||||||
|
|
||||||
if (jobResult.pdfFileId) {
|
|
||||||
setPreviewPdfId(Number(jobResult.pdfFileId));
|
|
||||||
setPreviewFallbackFilename(jobResult.pdfFilename ?? `eligibility_${memberId}.pdf`);
|
|
||||||
setPreviewOpen(true);
|
|
||||||
}
|
|
||||||
processNextInQueue();
|
|
||||||
} catch (error: any) {
|
|
||||||
dispatch(setTaskStatus({ key: "eligibilityCheck", status: "error", message: error.message || "Selenium submission failed" }));
|
|
||||||
toast({ title: "Selenium service error", description: error.message || "An error occurred.", variant: "destructive" });
|
|
||||||
} finally {
|
|
||||||
setIsCheckingEligibilityStatus(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// MH Eligibility & Appointment — check eligibility, save to DB, create appointment for today
|
|
||||||
const handleMHEligibilityAppointmentButton = async () => {
|
|
||||||
if (!memberId || !dateOfBirth) {
|
|
||||||
toast({
|
|
||||||
title: "Missing Fields",
|
|
||||||
description: "Please fill in all the required fields: Member ID, Date of Birth.",
|
|
||||||
variant: "destructive",
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setIsCheckingEligibilityAppointment(true);
|
|
||||||
try {
|
|
||||||
const jobResult = await runMHEligibilitySelenium();
|
|
||||||
|
|
||||||
const isInactive = jobResult?.patientUpdateStatus?.includes("INACTIVE");
|
|
||||||
|
|
||||||
if (isInactive) {
|
|
||||||
dispatch(
|
|
||||||
setTaskStatus({
|
|
||||||
key: "eligibilityCheck",
|
|
||||||
status: "error",
|
|
||||||
message: "Insurance is inactive. No appointment created.",
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
toast({
|
|
||||||
title: "Insurance Inactive",
|
|
||||||
description: "Patient insurance is inactive. No appointment was created.",
|
|
||||||
variant: "destructive",
|
|
||||||
});
|
|
||||||
await queryClient.invalidateQueries({ queryKey: QK_PATIENTS_BASE });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
await queryClient.invalidateQueries({ queryKey: QK_PATIENTS_BASE });
|
|
||||||
|
|
||||||
// Look up the patient (created/updated by the Selenium worker) then create today's appointment
|
|
||||||
let apptTime: string | null = null;
|
|
||||||
try {
|
|
||||||
const lookupRes = await apiRequest("GET", `/api/patients/by-insurance-id?insuranceId=${encodeURIComponent(memberId)}`);
|
|
||||||
if (lookupRes.ok) {
|
|
||||||
const patient = await lookupRes.json();
|
|
||||||
if (patient?.id) {
|
|
||||||
const apptRes = await apiRequest("POST", "/api/ai/create-appointment-today", { patientId: patient.id });
|
|
||||||
if (apptRes.ok) {
|
|
||||||
const apptData = await apptRes.json();
|
|
||||||
apptTime = apptData.startTime ? `${apptData.startTime} (${apptData.column ?? "Column A"})` : null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch {}
|
|
||||||
|
|
||||||
dispatch(
|
|
||||||
setTaskStatus({
|
|
||||||
key: "eligibilityCheck",
|
|
||||||
status: "success",
|
|
||||||
message: apptTime
|
|
||||||
? `Eligibility checked. Appointment created at ${apptTime}.`
|
|
||||||
: "Eligibility checked. Could not create appointment — please add manually.",
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
toast({
|
|
||||||
title: "Eligibility checked.",
|
|
||||||
description: apptTime
|
|
||||||
? `Patient added to today's schedule at ${apptTime}.`
|
|
||||||
: "Eligibility saved. Could not create appointment — Column A may be full.",
|
|
||||||
variant: "default",
|
|
||||||
});
|
|
||||||
|
|
||||||
setSelectedPatient(null);
|
|
||||||
|
|
||||||
if (jobResult.pdfFileId) {
|
|
||||||
setPreviewPdfId(Number(jobResult.pdfFileId));
|
|
||||||
setPreviewFallbackFilename(jobResult.pdfFilename ?? `eligibility_${memberId}.pdf`);
|
|
||||||
setPreviewOpen(true);
|
|
||||||
}
|
|
||||||
} catch (error: any) {
|
|
||||||
dispatch(setTaskStatus({ key: "eligibilityCheck", status: "error", message: error.message || "Selenium submission failed" }));
|
|
||||||
toast({ title: "Selenium service error", description: error.message || "An error occurred.", variant: "destructive" });
|
|
||||||
} finally {
|
|
||||||
setIsCheckingEligibilityAppointment(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// MH Eligibility & Claims/PreAuth — check eligibility, save to DB, navigate to claims
|
|
||||||
const handleMHEligibilityClaimsPreAuthButton = async () => {
|
|
||||||
if (!memberId || !dateOfBirth) {
|
|
||||||
toast({
|
|
||||||
title: "Missing Fields",
|
|
||||||
description: "Please fill in all the required fields: Member ID, Date of Birth.",
|
|
||||||
variant: "destructive",
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setIsCheckingEligibilityClaimsPreAuth(true);
|
|
||||||
try {
|
|
||||||
await runMHEligibilitySelenium();
|
|
||||||
|
|
||||||
dispatch(
|
|
||||||
setTaskStatus({
|
|
||||||
key: "eligibilityCheck",
|
|
||||||
status: "success",
|
|
||||||
message: "Eligibility checked and saved. Redirecting to Claims/PreAuth...",
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
toast({
|
|
||||||
title: "Eligibility checked.",
|
|
||||||
description: "Patient eligibility saved. Redirecting to Claims/PreAuth.",
|
|
||||||
variant: "default",
|
|
||||||
});
|
|
||||||
|
|
||||||
setSelectedPatient(null);
|
|
||||||
await queryClient.invalidateQueries({ queryKey: QK_PATIENTS_BASE });
|
|
||||||
setLocation("/claims");
|
|
||||||
} catch (error: any) {
|
|
||||||
dispatch(setTaskStatus({ key: "eligibilityCheck", status: "error", message: error.message || "Selenium submission failed" }));
|
|
||||||
toast({ title: "Selenium service error", description: error.message || "An error occurred.", variant: "destructive" });
|
|
||||||
} finally {
|
|
||||||
setIsCheckingEligibilityClaimsPreAuth(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// MH Eligibility & History — eligibility check + service history, saves both PDFs, auto-downloads eligibility PDF only
|
|
||||||
const handleMHEligibilityHistoryButton = async () => {
|
|
||||||
if (!memberId || !dateOfBirth) {
|
|
||||||
toast({
|
|
||||||
title: "Missing Fields",
|
|
||||||
description: "Please fill in all the required fields: Member ID, Date of Birth.",
|
|
||||||
variant: "destructive",
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isUnder14(dateOfBirth)) {
|
|
||||||
toast({ title: "CMSP Patient", description: "Patient is under 14 — running CMSP Eligibility & History & Remaining instead.", variant: "default" });
|
|
||||||
return handleCMSPButton();
|
|
||||||
}
|
|
||||||
|
|
||||||
setIsCheckingEligibilityHistory(true);
|
|
||||||
try {
|
|
||||||
const formattedDob = dateOfBirth ? formatLocalDate(dateOfBirth) : "";
|
|
||||||
const data = {
|
|
||||||
memberId,
|
|
||||||
dateOfBirth: formattedDob,
|
|
||||||
insuranceSiteKey: "MH",
|
|
||||||
firstName: firstName || undefined,
|
|
||||||
lastName: lastName || undefined,
|
|
||||||
};
|
|
||||||
|
|
||||||
dispatch(setTaskStatus({ key: "eligibilityCheck", status: "pending", message: "Sending Data to Selenium..." }));
|
|
||||||
|
|
||||||
const response = await apiRequest(
|
|
||||||
"POST",
|
|
||||||
"/api/insurance-status/eligibility-history-check",
|
|
||||||
{ data, socketId: socket.id },
|
|
||||||
);
|
|
||||||
const enqueueResult = await response.json();
|
|
||||||
if (enqueueResult.error) throw new Error(enqueueResult.error);
|
|
||||||
|
|
||||||
const jobId = enqueueResult.jobId;
|
|
||||||
if (!jobId) throw new Error("No jobId returned from server");
|
|
||||||
|
|
||||||
dispatch(setTaskStatus({ key: "eligibilityCheck", status: "pending", message: "Selenium browser starting..." }));
|
|
||||||
|
|
||||||
const jobResult = await waitForSeleniumJob(jobId, (msg) =>
|
|
||||||
dispatch(setTaskStatus({ key: "eligibilityCheck", status: "pending", message: msg }))
|
|
||||||
);
|
|
||||||
|
|
||||||
dispatch(setTaskStatus({ key: "eligibilityCheck", status: "success", message: "Eligibility and service history PDFs saved to Documents." }));
|
|
||||||
toast({
|
|
||||||
title: "Done",
|
|
||||||
description: "Eligibility and service history PDFs saved. Eligibility PDF downloading now.",
|
|
||||||
variant: "default",
|
|
||||||
});
|
|
||||||
|
|
||||||
const claimed = await tryClaimFromChatbot(selectedPatient?.id);
|
|
||||||
void tryAppointmentFromChatbot();
|
|
||||||
if (claimed) return;
|
|
||||||
setSelectedPatient(null);
|
|
||||||
await queryClient.invalidateQueries({ queryKey: QK_PATIENTS_BASE });
|
|
||||||
processNextInQueue();
|
|
||||||
|
|
||||||
// Open all PDFs side by side in the modal
|
|
||||||
if (jobResult.pdfFileId || jobResult.memberDetailsPdfFileId || jobResult.historyPdfFileId) {
|
|
||||||
setDualEligibilityPdfId(jobResult.pdfFileId ? Number(jobResult.pdfFileId) : null);
|
|
||||||
setDualEligibilityFilename(jobResult.pdfFilename ?? `eligibility_${memberId}.pdf`);
|
|
||||||
setDualMemberDetailsPdfId(jobResult.memberDetailsPdfFileId ? Number(jobResult.memberDetailsPdfFileId) : null);
|
|
||||||
setDualMemberDetailsFilename(jobResult.memberDetailsPdfFilename ?? `eligibility_member_details_${memberId}.pdf`);
|
|
||||||
setDualHistoryPdfId(jobResult.historyPdfFileId ? Number(jobResult.historyPdfFileId) : null);
|
|
||||||
setDualHistoryFilename(jobResult.historyPdfFilename ?? `eligibility_history_${memberId}.pdf`);
|
|
||||||
setDualPreviewOpen(true);
|
|
||||||
}
|
|
||||||
} catch (error: any) {
|
|
||||||
dispatch(setTaskStatus({ key: "eligibilityCheck", status: "error", message: error.message || "Selenium submission failed" }));
|
|
||||||
toast({ title: "Selenium service error", description: error.message || "An error occurred.", variant: "destructive" });
|
|
||||||
} finally {
|
|
||||||
setIsCheckingEligibilityHistory(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// CMSP Eligibility & History & Remaining — eligibility + service history + accumulator PDFs
|
|
||||||
const handleCMSPButton = async () => {
|
|
||||||
if (!memberId || !dateOfBirth) {
|
|
||||||
toast({
|
|
||||||
title: "Missing Fields",
|
|
||||||
description: "Please fill in Member ID and Date of Birth.",
|
|
||||||
variant: "destructive",
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setIsCheckingCMSP(true);
|
|
||||||
try {
|
|
||||||
const formattedDob = dateOfBirth ? formatLocalDate(dateOfBirth) : "";
|
|
||||||
const data = {
|
|
||||||
memberId,
|
|
||||||
dateOfBirth: formattedDob,
|
|
||||||
insuranceSiteKey: "MH",
|
|
||||||
firstName: firstName || undefined,
|
|
||||||
lastName: lastName || undefined,
|
|
||||||
};
|
|
||||||
|
|
||||||
dispatch(setTaskStatus({ key: "eligibilityCheck", status: "pending", message: "Sending Data to Selenium..." }));
|
|
||||||
|
|
||||||
const response = await apiRequest(
|
|
||||||
"POST",
|
|
||||||
"/api/insurance-status/cmsp-eligibility-history-remaining-check",
|
|
||||||
{ data, socketId: socket.id },
|
|
||||||
);
|
|
||||||
const enqueueResult = await response.json();
|
|
||||||
if (enqueueResult.error) throw new Error(enqueueResult.error);
|
|
||||||
|
|
||||||
const jobId = enqueueResult.jobId;
|
|
||||||
if (!jobId) throw new Error("No jobId returned from server");
|
|
||||||
|
|
||||||
dispatch(setTaskStatus({ key: "eligibilityCheck", status: "pending", message: "Selenium browser starting..." }));
|
|
||||||
|
|
||||||
const jobResult = await waitForSeleniumJob(jobId, (msg) =>
|
|
||||||
dispatch(setTaskStatus({ key: "eligibilityCheck", status: "pending", message: msg }))
|
|
||||||
);
|
|
||||||
|
|
||||||
dispatch(setTaskStatus({ key: "eligibilityCheck", status: "success", message: "CMSP PDFs saved to Documents." }));
|
|
||||||
toast({
|
|
||||||
title: "Done",
|
|
||||||
description: "Eligibility, history, and accumulator PDFs saved.",
|
|
||||||
variant: "default",
|
|
||||||
});
|
|
||||||
|
|
||||||
setSelectedPatient(null);
|
|
||||||
await queryClient.invalidateQueries({ queryKey: QK_PATIENTS_BASE });
|
|
||||||
processNextInQueue();
|
|
||||||
|
|
||||||
// Open 4-panel modal
|
|
||||||
if (jobResult.pdfFileId || jobResult.memberDetailsPdfFileId || jobResult.historyPdfFileId || jobResult.accumulatorPdfFileId) {
|
|
||||||
setCmspEligibilityPdfId(jobResult.pdfFileId ? Number(jobResult.pdfFileId) : null);
|
|
||||||
setCmspEligibilityFilename(jobResult.pdfFilename ?? `cmsp_eligibility_${memberId}.pdf`);
|
|
||||||
setCmspMemberDetailsPdfId(jobResult.memberDetailsPdfFileId ? Number(jobResult.memberDetailsPdfFileId) : null);
|
|
||||||
setCmspMemberDetailsFilename(jobResult.memberDetailsPdfFilename ?? `cmsp_member_details_${memberId}.pdf`);
|
|
||||||
setCmspHistoryPdfId(jobResult.historyPdfFileId ? Number(jobResult.historyPdfFileId) : null);
|
|
||||||
setCmspHistoryFilename(jobResult.historyPdfFilename ?? `cmsp_history_${memberId}.pdf`);
|
|
||||||
setCmspAccumulatorPdfId(jobResult.accumulatorPdfFileId ? Number(jobResult.accumulatorPdfFileId) : null);
|
|
||||||
setCmspAccumulatorFilename(jobResult.accumulatorPdfFilename ?? `cmsp_accumulator_${memberId}.pdf`);
|
|
||||||
setCmspPreviewOpen(true);
|
|
||||||
}
|
|
||||||
} catch (error: any) {
|
|
||||||
dispatch(setTaskStatus({ key: "eligibilityCheck", status: "error", message: error.message || "Selenium submission failed" }));
|
|
||||||
toast({ title: "Selenium service error", description: error.message || "An error occurred.", variant: "destructive" });
|
|
||||||
} finally {
|
|
||||||
setIsCheckingCMSP(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Auto-trigger after prefill (from chatbot or schedule page "Check Eligibility")
|
// Auto-trigger after prefill (from chatbot or schedule page "Check Eligibility")
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!pendingAutoCheck.current || !memberId || !dateOfBirth) return;
|
if (!pendingAutoCheck.current || !memberId || !dateOfBirth) return;
|
||||||
const check = pendingAutoCheck.current;
|
const check = pendingAutoCheck.current;
|
||||||
pendingAutoCheck.current = null;
|
pendingAutoCheck.current = null;
|
||||||
if (check === "mh" || check === "mh-history") {
|
|
||||||
if (isUnder14(dateOfBirth)) {
|
|
||||||
handleCMSPButton();
|
|
||||||
} else {
|
|
||||||
handleMHEligibilityHistoryButton();
|
|
||||||
}
|
|
||||||
} else if (check === "cmsp") {
|
|
||||||
handleCMSPButton();
|
|
||||||
} else {
|
|
||||||
// Button-component-handled providers: pass target to their autoTrigger prop
|
// Button-component-handled providers: pass target to their autoTrigger prop
|
||||||
setTriggerTarget(check);
|
setTriggerTarget(check);
|
||||||
}
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [memberId, dateOfBirth, prefillTick]);
|
}, [memberId, dateOfBirth, prefillTick]);
|
||||||
|
|
||||||
@@ -820,7 +406,7 @@ export default function InsuranceStatusPage() {
|
|||||||
const autoCheck = params.get("autoCheck") as typeof pendingAutoCheck.current;
|
const autoCheck = params.get("autoCheck") as typeof pendingAutoCheck.current;
|
||||||
const scrollTo = params.get("scrollTo");
|
const scrollTo = params.get("scrollTo");
|
||||||
|
|
||||||
const knownAutoChecks = ["mh", "mh-history", "cmsp", "ddma", "delta-ins", "united-sco", "tufts-sco", "cca"] as const;
|
const knownAutoChecks = ["ddma", "delta-ins", "united-sco", "tufts-sco", "cca"] as const;
|
||||||
if (autoCheck && (knownAutoChecks as readonly string[]).includes(autoCheck)) {
|
if (autoCheck && (knownAutoChecks as readonly string[]).includes(autoCheck)) {
|
||||||
pendingAutoCheck.current = autoCheck;
|
pendingAutoCheck.current = autoCheck;
|
||||||
} else if (scrollTo) {
|
} else if (scrollTo) {
|
||||||
@@ -932,102 +518,6 @@ export default function InsuranceStatusPage() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex flex-col-2 gap-4">
|
|
||||||
<Button
|
|
||||||
onClick={() => handleMHEligibilityButton()}
|
|
||||||
className="w-full"
|
|
||||||
disabled={isCheckingEligibilityStatus}
|
|
||||||
>
|
|
||||||
{isCheckingEligibilityStatus ? (
|
|
||||||
<>
|
|
||||||
<LoaderCircleIcon className="h-4 w-4 mr-2 animate-spin" />
|
|
||||||
Processing...
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<CheckCircle className="h-4 w-4 mr-2" />
|
|
||||||
MH Eligibility
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
<Button
|
|
||||||
onClick={() => handleMHEligibilityAppointmentButton()}
|
|
||||||
className="w-full"
|
|
||||||
disabled={isCheckingEligibilityAppointment}
|
|
||||||
>
|
|
||||||
{isCheckingEligibilityAppointment ? (
|
|
||||||
<>
|
|
||||||
<LoaderCircleIcon className="h-4 w-4 mr-2 animate-spin" />
|
|
||||||
Processing...
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<CheckCircle className="h-4 w-4 mr-2" />
|
|
||||||
MH Eligibility&Appointment
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
<Button
|
|
||||||
onClick={() => handleMHEligibilityClaimsPreAuthButton()}
|
|
||||||
className="w-full"
|
|
||||||
disabled={isCheckingEligibilityClaimsPreAuth}
|
|
||||||
>
|
|
||||||
{isCheckingEligibilityClaimsPreAuth ? (
|
|
||||||
<>
|
|
||||||
<LoaderCircleIcon className="h-4 w-4 mr-2 animate-spin" />
|
|
||||||
Processing...
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<CheckCircle className="h-4 w-4 mr-2" />
|
|
||||||
MH Eligibility&Claims/PreAuth
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="flex flex-col-2 gap-4 mt-4">
|
|
||||||
<Button
|
|
||||||
id="eligibility-mh-history"
|
|
||||||
className="w-full"
|
|
||||||
disabled={isCheckingEligibilityHistory}
|
|
||||||
onClick={() => handleMHEligibilityHistoryButton()}
|
|
||||||
>
|
|
||||||
{isCheckingEligibilityHistory ? (
|
|
||||||
<>
|
|
||||||
<LoaderCircleIcon className="h-4 w-4 mr-2 animate-spin" />
|
|
||||||
Processing...
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<CheckCircle className="h-4 w-4 mr-2" />
|
|
||||||
MH Eligibility & History
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
<Button
|
|
||||||
id="eligibility-cmsp"
|
|
||||||
className="w-full"
|
|
||||||
disabled={isCheckingCMSP}
|
|
||||||
onClick={() => handleCMSPButton()}
|
|
||||||
>
|
|
||||||
{isCheckingCMSP ? (
|
|
||||||
<>
|
|
||||||
<LoaderCircleIcon className="h-4 w-4 mr-2 animate-spin" />
|
|
||||||
Processing...
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<CheckCircle className="h-4 w-4 mr-2" />
|
|
||||||
CMSP Eligibility & History & Remaining
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* TEMP PROVIDER BUTTONS */}
|
{/* TEMP PROVIDER BUTTONS */}
|
||||||
<div id="eligibility-other-providers" className="space-y-4 mt-6">
|
<div id="eligibility-other-providers" className="space-y-4 mt-6">
|
||||||
<h3 className="text-sm font-medium text-muted-foreground">
|
<h3 className="text-sm font-medium text-muted-foreground">
|
||||||
@@ -1169,81 +659,6 @@ export default function InsuranceStatusPage() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Row 3 */}
|
|
||||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
|
||||||
<Button
|
|
||||||
className="w-full"
|
|
||||||
variant="outline"
|
|
||||||
disabled={isFormIncomplete}
|
|
||||||
>
|
|
||||||
<CheckCircle className="h-4 w-4 mr-2" />
|
|
||||||
United AAPR
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
<Button
|
|
||||||
className="w-full"
|
|
||||||
variant="outline"
|
|
||||||
disabled={isFormIncomplete}
|
|
||||||
>
|
|
||||||
<CheckCircle className="h-4 w-4 mr-2" />
|
|
||||||
Aetna
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
className="w-full"
|
|
||||||
variant="outline"
|
|
||||||
disabled={isFormIncomplete}
|
|
||||||
>
|
|
||||||
<CheckCircle className="h-4 w-4 mr-2" />
|
|
||||||
Altus
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
className="w-full"
|
|
||||||
variant="outline"
|
|
||||||
disabled={isFormIncomplete}
|
|
||||||
>
|
|
||||||
<CheckCircle className="h-4 w-4 mr-2" />
|
|
||||||
Metlife Dental
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
<Button
|
|
||||||
className="w-full"
|
|
||||||
variant="outline"
|
|
||||||
disabled={isFormIncomplete}
|
|
||||||
>
|
|
||||||
<CheckCircle className="h-4 w-4 mr-2" />
|
|
||||||
Cigna
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
<Button
|
|
||||||
className="w-full"
|
|
||||||
variant="outline"
|
|
||||||
disabled={isFormIncomplete}
|
|
||||||
>
|
|
||||||
<CheckCircle className="h-4 w-4 mr-2" />
|
|
||||||
Delta WA
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Row 5 */}
|
|
||||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
|
||||||
<Button
|
|
||||||
className="w-full"
|
|
||||||
variant="outline"
|
|
||||||
disabled={isFormIncomplete}
|
|
||||||
>
|
|
||||||
<CheckCircle className="h-4 w-4 mr-2" />
|
|
||||||
Delta IL
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
<Button
|
|
||||||
className="w-full"
|
|
||||||
variant="outline"
|
|
||||||
disabled={isFormIncomplete}
|
|
||||||
>
|
|
||||||
<CheckCircle className="h-4 w-4 mr-2" />
|
|
||||||
Others
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
@@ -1394,78 +809,6 @@ export default function InsuranceStatusPage() {
|
|||||||
autoDownload
|
autoDownload
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{/* 4-panel modal for CMSP — eligibility, member details, history, accumulator */}
|
|
||||||
<DualPdfPreviewModal
|
|
||||||
open={cmspPreviewOpen}
|
|
||||||
onClose={() => {
|
|
||||||
setCmspPreviewOpen(false);
|
|
||||||
setCmspEligibilityPdfId(null);
|
|
||||||
setCmspEligibilityFilename(null);
|
|
||||||
setCmspMemberDetailsPdfId(null);
|
|
||||||
setCmspMemberDetailsFilename(null);
|
|
||||||
setCmspHistoryPdfId(null);
|
|
||||||
setCmspHistoryFilename(null);
|
|
||||||
setCmspAccumulatorPdfId(null);
|
|
||||||
setCmspAccumulatorFilename(null);
|
|
||||||
}}
|
|
||||||
title="CMSP Eligibility, History & Remaining"
|
|
||||||
panels={[
|
|
||||||
{
|
|
||||||
pdfId: cmspEligibilityPdfId,
|
|
||||||
fallbackFilename: cmspEligibilityFilename,
|
|
||||||
label: "Eligibility",
|
|
||||||
autoDownload: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
pdfId: cmspMemberDetailsPdfId,
|
|
||||||
fallbackFilename: cmspMemberDetailsFilename,
|
|
||||||
label: "Member Details",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
pdfId: cmspHistoryPdfId,
|
|
||||||
fallbackFilename: cmspHistoryFilename,
|
|
||||||
label: "Service History",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
pdfId: cmspAccumulatorPdfId,
|
|
||||||
fallbackFilename: cmspAccumulatorFilename,
|
|
||||||
label: "Accumulator (Remaining)",
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
|
|
||||||
{/* 3-panel modal for MH Eligibility & History */}
|
|
||||||
<DualPdfPreviewModal
|
|
||||||
open={dualPreviewOpen}
|
|
||||||
onClose={() => {
|
|
||||||
setDualPreviewOpen(false);
|
|
||||||
setDualEligibilityPdfId(null);
|
|
||||||
setDualEligibilityFilename(null);
|
|
||||||
setDualMemberDetailsPdfId(null);
|
|
||||||
setDualMemberDetailsFilename(null);
|
|
||||||
setDualHistoryPdfId(null);
|
|
||||||
setDualHistoryFilename(null);
|
|
||||||
}}
|
|
||||||
title="MH Eligibility & Service History"
|
|
||||||
panels={[
|
|
||||||
{
|
|
||||||
pdfId: dualEligibilityPdfId,
|
|
||||||
fallbackFilename: dualEligibilityFilename,
|
|
||||||
label: "Eligibility",
|
|
||||||
autoDownload: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
pdfId: dualMemberDetailsPdfId,
|
|
||||||
fallbackFilename: dualMemberDetailsFilename,
|
|
||||||
label: "Member Details",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
pdfId: dualHistoryPdfId,
|
|
||||||
fallbackFilename: dualHistoryFilename,
|
|
||||||
label: "Service History",
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,15 +6,13 @@ import uvicorn
|
|||||||
import asyncio
|
import asyncio
|
||||||
from selenium_claimSubmitWorker import AutomationMassHealthClaimsLogin
|
from selenium_claimSubmitWorker import AutomationMassHealthClaimsLogin
|
||||||
from selenium_eligibilityCheckWorker import AutomationMassHealthEligibilityCheck
|
from selenium_eligibilityCheckWorker import AutomationMassHealthEligibilityCheck
|
||||||
from selenium_MH_eligibilityHistoryCheckWorker import AutomationMassHealthEligibilityHistoryCheck
|
|
||||||
from selenium_CMSP_eligibilityHistoryRemainingCheckWorker import AutomationCMSPEligibilityHistoryRemainingCheck
|
|
||||||
from selenium_claimStatusCheckWorker import AutomationMassHealthClaimStatusCheck
|
from selenium_claimStatusCheckWorker import AutomationMassHealthClaimStatusCheck
|
||||||
from selenium_preAuthWorker import AutomationMassHealthPreAuth
|
from selenium_preAuthWorker import AutomationMassHealthPreAuth
|
||||||
from selenium_MHSinglePaymentCheckWorker import AutomationMassHealthSinglePaymentCheck
|
from selenium_MHSinglePaymentCheckWorker import AutomationMassHealthSinglePaymentCheck
|
||||||
from selenium_MHBatchPaymentCheckWorker import AutomationMassHealthBatchPaymentCheck
|
from selenium_MHBatchPaymentCheckWorker import AutomationMassHealthBatchPaymentCheck
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
import helpers_ddma_eligibility as hddma
|
import helpers_claimmd_eligibility as hddma
|
||||||
import helpers_deltains_eligibility as hdeltains
|
import helpers_deltains_eligibility as hdeltains
|
||||||
import helpers_unitedsco_eligibility as hunitedsco
|
import helpers_unitedsco_eligibility as hunitedsco
|
||||||
import helpers_dentaquest_eligibility as hdentaquest
|
import helpers_dentaquest_eligibility as hdentaquest
|
||||||
@@ -29,7 +27,7 @@ import helpers_tuftssco_preauth as htuftssco_preauth
|
|||||||
import helpers_bcbs_ma_eligibility as hbcbs_ma
|
import helpers_bcbs_ma_eligibility as hbcbs_ma
|
||||||
|
|
||||||
# Import startup session-clear functions
|
# Import startup session-clear functions
|
||||||
from ddma_browser_manager import clear_ddma_session_on_startup
|
from claimmd_browser_manager import clear_ddma_session_on_startup
|
||||||
from deltains_browser_manager import clear_deltains_session_on_startup
|
from deltains_browser_manager import clear_deltains_session_on_startup
|
||||||
from unitedsco_browser_manager import clear_unitedsco_session_on_startup
|
from unitedsco_browser_manager import clear_unitedsco_session_on_startup
|
||||||
from dentaquest_browser_manager import clear_dentaquest_session_on_startup
|
from dentaquest_browser_manager import clear_dentaquest_session_on_startup
|
||||||
@@ -146,83 +144,6 @@ async def start_workflow(request: Request):
|
|||||||
async with lock:
|
async with lock:
|
||||||
active_jobs -= 1
|
active_jobs -= 1
|
||||||
|
|
||||||
# Endpoint: 2a — MH Eligibility + Service History
|
|
||||||
@app.post("/mh-eligibility-history-check")
|
|
||||||
async def mh_eligibility_history_check(request: Request):
|
|
||||||
global active_jobs, waiting_jobs
|
|
||||||
data = await request.json()
|
|
||||||
|
|
||||||
async with lock:
|
|
||||||
waiting_jobs += 1
|
|
||||||
|
|
||||||
async with semaphore:
|
|
||||||
async with lock:
|
|
||||||
waiting_jobs -= 1
|
|
||||||
active_jobs += 1
|
|
||||||
try:
|
|
||||||
bot = AutomationMassHealthEligibilityHistoryCheck(data)
|
|
||||||
result = bot.main_workflow("https://provider.masshealth-dental.org/mh_provider_login")
|
|
||||||
|
|
||||||
if result.get("status") == "error":
|
|
||||||
return {"status": "error", "message": result.get("message")}
|
|
||||||
|
|
||||||
port = os.getenv("PORT", "5002")
|
|
||||||
url_host = os.getenv("HOST", "localhost")
|
|
||||||
|
|
||||||
if result.get("pdf_path"):
|
|
||||||
filename = os.path.basename(result["pdf_path"])
|
|
||||||
result["pdf_url"] = f"http://{url_host}:{port}/downloads/{filename}"
|
|
||||||
|
|
||||||
if result.get("history_pdf_path"):
|
|
||||||
filename = os.path.basename(result["history_pdf_path"])
|
|
||||||
result["history_pdf_url"] = f"http://{url_host}:{port}/downloads/{filename}"
|
|
||||||
|
|
||||||
return result
|
|
||||||
except Exception as e:
|
|
||||||
return {"status": "error", "message": str(e)}
|
|
||||||
finally:
|
|
||||||
async with lock:
|
|
||||||
active_jobs -= 1
|
|
||||||
|
|
||||||
# Endpoint: 2b — CMSP Eligibility + Service History + Accumulator (Remaining)
|
|
||||||
@app.post("/cmsp-eligibility-history-remaining-check")
|
|
||||||
async def cmsp_eligibility_history_remaining_check(request: Request):
|
|
||||||
global active_jobs, waiting_jobs
|
|
||||||
data = await request.json()
|
|
||||||
|
|
||||||
async with lock:
|
|
||||||
waiting_jobs += 1
|
|
||||||
|
|
||||||
async with semaphore:
|
|
||||||
async with lock:
|
|
||||||
waiting_jobs -= 1
|
|
||||||
active_jobs += 1
|
|
||||||
try:
|
|
||||||
bot = AutomationCMSPEligibilityHistoryRemainingCheck(data)
|
|
||||||
result = bot.main_workflow("https://provider.masshealth-dental.org/mh_provider_login")
|
|
||||||
|
|
||||||
if result.get("status") == "error":
|
|
||||||
return {"status": "error", "message": result.get("message")}
|
|
||||||
|
|
||||||
port = os.getenv("PORT", "5002")
|
|
||||||
url_host = os.getenv("HOST", "localhost")
|
|
||||||
|
|
||||||
for key, url_key in [
|
|
||||||
("pdf_path", "pdf_url"),
|
|
||||||
("history_pdf_path", "history_pdf_url"),
|
|
||||||
("accumulator_pdf_path", "accumulator_pdf_url"),
|
|
||||||
]:
|
|
||||||
if result.get(key):
|
|
||||||
filename = os.path.basename(result[key])
|
|
||||||
result[url_key] = f"http://{url_host}:{port}/downloads/{filename}"
|
|
||||||
|
|
||||||
return result
|
|
||||||
except Exception as e:
|
|
||||||
return {"status": "error", "message": str(e)}
|
|
||||||
finally:
|
|
||||||
async with lock:
|
|
||||||
active_jobs -= 1
|
|
||||||
|
|
||||||
# Endpoint: 2.1 — Start the automation for Claims login (open browser and log in)
|
# Endpoint: 2.1 — Start the automation for Claims login (open browser and log in)
|
||||||
@app.post("/claims-login")
|
@app.post("/claims-login")
|
||||||
async def start_claims_login(request: Request):
|
async def start_claims_login(request: Request):
|
||||||
@@ -410,7 +331,7 @@ async def ddma_eligibility(request: Request):
|
|||||||
waiting_jobs += 1
|
waiting_jobs += 1
|
||||||
|
|
||||||
# run in background (queued under semaphore)
|
# run in background (queued under semaphore)
|
||||||
asyncio.create_task(_ddma_worker_wrapper(sid, data, url="https://providers.deltadentalma.com/onboarding/start/"))
|
asyncio.create_task(_ddma_worker_wrapper(sid, data, url="https://www.deltadentalma.com/sign-in"))
|
||||||
|
|
||||||
return {"status": "started", "session_id": sid}
|
return {"status": "started", "session_id": sid}
|
||||||
|
|
||||||
|
|||||||
+9
-13
@@ -7,7 +7,7 @@ from selenium.webdriver.support.ui import WebDriverWait
|
|||||||
from selenium.webdriver.support import expected_conditions as EC
|
from selenium.webdriver.support import expected_conditions as EC
|
||||||
from selenium.common.exceptions import WebDriverException, TimeoutException
|
from selenium.common.exceptions import WebDriverException, TimeoutException
|
||||||
|
|
||||||
from selenium_DDMA_eligibilityCheckWorker import AutomationDeltaDentalMAEligibilityCheck
|
from selenium_ClaimMD_eligibilityCheckWorker import AutomationDeltaDentalMAEligibilityCheck
|
||||||
|
|
||||||
# In-memory session store
|
# In-memory session store
|
||||||
sessions: Dict[str, Dict[str, Any]] = {}
|
sessions: Dict[str, Dict[str, Any]] = {}
|
||||||
@@ -146,13 +146,11 @@ async def start_ddma_run(sid: str, data: dict, url: str):
|
|||||||
if otp_value:
|
if otp_value:
|
||||||
print(f"[OTP poll {poll+1}] OTP received from app, typing it in...")
|
print(f"[OTP poll {poll+1}] OTP received from app, typing it in...")
|
||||||
try:
|
try:
|
||||||
otp_input = driver.find_element(By.XPATH,
|
otp_input = driver.find_element(By.XPATH, "//input[@data-test-id='MfaCode']")
|
||||||
"//input[contains(@aria-label,'Verification') or contains(@placeholder,'verification') or @type='tel' or contains(@aria-lable,'Verification code') or contains(@placeholder,'Enter your verification code')]"
|
|
||||||
)
|
|
||||||
otp_input.clear()
|
otp_input.clear()
|
||||||
otp_input.send_keys(otp_value)
|
otp_input.send_keys(otp_value)
|
||||||
try:
|
try:
|
||||||
verify_btn = driver.find_element(By.XPATH, "//button[@type='button' and @aria-label='Verify']")
|
verify_btn = driver.find_element(By.XPATH, "//button[@data-test-id='ConfirmSubmitButton']")
|
||||||
verify_btn.click()
|
verify_btn.click()
|
||||||
except Exception:
|
except Exception:
|
||||||
otp_input.send_keys("\n")
|
otp_input.send_keys("\n")
|
||||||
@@ -169,7 +167,7 @@ async def start_ddma_run(sid: str, data: dict, url: str):
|
|||||||
if "member" in current_url or "dashboard" in current_url or "eligibility" in current_url:
|
if "member" in current_url or "dashboard" in current_url or "eligibility" in current_url:
|
||||||
try:
|
try:
|
||||||
member_search = WebDriverWait(driver, 5).until(
|
member_search = WebDriverWait(driver, 5).until(
|
||||||
EC.presence_of_element_located((By.XPATH, '//input[@placeholder="Search by member ID"]'))
|
EC.presence_of_element_located((By.XPATH, "//a[contains(@href, 'check-patient-benefits-search')]"))
|
||||||
)
|
)
|
||||||
print("[OTP] Member search found — login successful!")
|
print("[OTP] Member search found — login successful!")
|
||||||
login_success = True
|
login_success = True
|
||||||
@@ -179,16 +177,14 @@ async def start_ddma_run(sid: str, data: dict, url: str):
|
|||||||
|
|
||||||
# Check if OTP input is still visible (user hasn't finished)
|
# Check if OTP input is still visible (user hasn't finished)
|
||||||
try:
|
try:
|
||||||
otp_input_elem = driver.find_element(By.XPATH,
|
otp_input_elem = driver.find_element(By.XPATH, "//input[@data-test-id='MfaCode']")
|
||||||
"//input[contains(@aria-label,'Verification') or contains(@placeholder,'verification') or @type='tel']"
|
|
||||||
)
|
|
||||||
print(f"[OTP poll {poll+1}] OTP input still visible - waiting...")
|
print(f"[OTP poll {poll+1}] OTP input still visible - waiting...")
|
||||||
except Exception:
|
except Exception:
|
||||||
# OTP input gone — may mean login is completing; try members page
|
# OTP input gone — may mean login is completing; try members page
|
||||||
if "onboarding" in current_url or "start" in current_url:
|
if "sign-in" in current_url:
|
||||||
print("[OTP] OTP input gone, trying to navigate to members page...")
|
print("[OTP] OTP input gone, trying to navigate to members page...")
|
||||||
try:
|
try:
|
||||||
driver.get("https://providers.deltadentalma.com/members")
|
driver.get("https://www.deltadentalma.com/private/provider/dashboard")
|
||||||
await asyncio.sleep(2)
|
await asyncio.sleep(2)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
@@ -200,10 +196,10 @@ async def start_ddma_run(sid: str, data: dict, url: str):
|
|||||||
# Final check — navigate directly to members page
|
# Final check — navigate directly to members page
|
||||||
try:
|
try:
|
||||||
print("[OTP] Final attempt - navigating to members page...")
|
print("[OTP] Final attempt - navigating to members page...")
|
||||||
driver.get("https://providers.deltadentalma.com/members")
|
driver.get("https://www.deltadentalma.com/private/provider/dashboard")
|
||||||
await asyncio.sleep(3)
|
await asyncio.sleep(3)
|
||||||
member_search = WebDriverWait(driver, 10).until(
|
member_search = WebDriverWait(driver, 10).until(
|
||||||
EC.presence_of_element_located((By.XPATH, '//input[@placeholder="Search by member ID"]'))
|
EC.presence_of_element_located((By.XPATH, "//a[contains(@href, 'check-patient-benefits-search')]"))
|
||||||
)
|
)
|
||||||
print("[OTP] Member search found — login successful!")
|
print("[OTP] Member search found — login successful!")
|
||||||
login_success = True
|
login_success = True
|
||||||
@@ -8,7 +8,7 @@ from selenium.webdriver.support import expected_conditions as EC
|
|||||||
from selenium.common.exceptions import WebDriverException, TimeoutException
|
from selenium.common.exceptions import WebDriverException, TimeoutException
|
||||||
|
|
||||||
from selenium_DDMA_claimSubmitWorker import AutomationDDMAClaimSubmit
|
from selenium_DDMA_claimSubmitWorker import AutomationDDMAClaimSubmit
|
||||||
from ddma_browser_manager import get_browser_manager
|
from claimmd_browser_manager import get_browser_manager
|
||||||
|
|
||||||
sessions: Dict[str, Dict[str, Any]] = {}
|
sessions: Dict[str, Dict[str, Any]] = {}
|
||||||
|
|
||||||
@@ -56,7 +56,7 @@ async def _remove_session_later(sid: str, delay: int = 20):
|
|||||||
|
|
||||||
async def start_ddma_claim_run(sid: str, data: dict, url: str):
|
async def start_ddma_claim_run(sid: str, data: dict, url: str):
|
||||||
"""
|
"""
|
||||||
Run the DDMA claim workflow — mirrors helpers_ddma_eligibility exactly for
|
Run the DDMA claim workflow — mirrors helpers_claimmd_eligibility exactly for
|
||||||
login/OTP, then continues into claim-specific steps.
|
login/OTP, then continues into claim-specific steps.
|
||||||
|
|
||||||
OTP handling uses two complementary strategies:
|
OTP handling uses two complementary strategies:
|
||||||
@@ -321,7 +321,7 @@ async def start_ddma_claim_run(sid: str, data: dict, url: str):
|
|||||||
|
|
||||||
# Close the browser window after claim (session preserved in profile)
|
# Close the browser window after claim (session preserved in profile)
|
||||||
try:
|
try:
|
||||||
from ddma_browser_manager import get_browser_manager
|
from claimmd_browser_manager import get_browser_manager
|
||||||
get_browser_manager().quit_driver()
|
get_browser_manager().quit_driver()
|
||||||
print("[DDMA Claim] Browser closed - session preserved in profile")
|
print("[DDMA Claim] Browser closed - session preserved in profile")
|
||||||
except Exception as close_err:
|
except Exception as close_err:
|
||||||
|
|||||||
@@ -1,453 +0,0 @@
|
|||||||
from selenium import webdriver
|
|
||||||
from selenium.common import TimeoutException
|
|
||||||
from selenium.webdriver.chrome.service import Service
|
|
||||||
from selenium.webdriver.common.by import By
|
|
||||||
from selenium.webdriver.support.ui import WebDriverWait, Select
|
|
||||||
from selenium.webdriver.support import expected_conditions as EC
|
|
||||||
from webdriver_manager.chrome import ChromeDriverManager
|
|
||||||
import time
|
|
||||||
import os
|
|
||||||
import base64
|
|
||||||
|
|
||||||
|
|
||||||
class AutomationCMSPEligibilityHistoryRemainingCheck:
|
|
||||||
def __init__(self, data):
|
|
||||||
self.headless = False
|
|
||||||
self.driver = None
|
|
||||||
self.extracted_data = {}
|
|
||||||
self.eligibility_tab = None
|
|
||||||
self.member_details_tab = None
|
|
||||||
self.accumulator_tab = None
|
|
||||||
|
|
||||||
self.data = data.get("data")
|
|
||||||
|
|
||||||
self.massdhp_username = self.data.get("massdhpUsername", "")
|
|
||||||
self.massdhp_password = self.data.get("massdhpPassword", "")
|
|
||||||
self.dateOfBirth = self.data.get("dateOfBirth", "")
|
|
||||||
self.memberId = self.data.get("memberId", "")
|
|
||||||
self.firstName = self.data.get("firstName", "")
|
|
||||||
self.lastName = self.data.get("lastName", "")
|
|
||||||
|
|
||||||
# Convert dateOfBirth from YYYY-MM-DD to MMDDYYYY
|
|
||||||
if self.dateOfBirth and "-" in self.dateOfBirth:
|
|
||||||
parts = self.dateOfBirth.split("-")
|
|
||||||
if len(parts) == 3:
|
|
||||||
year, month, day = parts
|
|
||||||
self.dateOfBirth = f"{month.zfill(2)}{day.zfill(2)}{year}"
|
|
||||||
|
|
||||||
self.download_dir = os.path.abspath("downloads")
|
|
||||||
os.makedirs(self.download_dir, exist_ok=True)
|
|
||||||
|
|
||||||
# ── driver ──────────────────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
def config_driver(self):
|
|
||||||
options = webdriver.ChromeOptions()
|
|
||||||
if self.headless:
|
|
||||||
options.add_argument("--headless")
|
|
||||||
|
|
||||||
prefs = {
|
|
||||||
"download.default_directory": self.download_dir,
|
|
||||||
"plugins.always_open_pdf_externally": False,
|
|
||||||
"download.prompt_for_download": False,
|
|
||||||
"download.directory_upgrade": True,
|
|
||||||
}
|
|
||||||
options.add_experimental_option("prefs", prefs)
|
|
||||||
|
|
||||||
s = Service(ChromeDriverManager().install())
|
|
||||||
self.driver = webdriver.Chrome(service=s, options=options)
|
|
||||||
|
|
||||||
# ── login (same MassHealth credentials) ─────────────────────────────────────
|
|
||||||
|
|
||||||
def login(self):
|
|
||||||
wait = WebDriverWait(self.driver, 30)
|
|
||||||
try:
|
|
||||||
signin_button = wait.until(
|
|
||||||
EC.element_to_be_clickable(
|
|
||||||
(By.CSS_SELECTOR, "a.btn.btn-block.btn-primary[href='https://connectsso.masshealth-dental.org/mhprovider/index.html']")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
signin_button.click()
|
|
||||||
time.sleep(3)
|
|
||||||
|
|
||||||
email_field = wait.until(EC.presence_of_element_located((By.ID, "User")))
|
|
||||||
email_field.clear()
|
|
||||||
email_field.send_keys(self.massdhp_username)
|
|
||||||
|
|
||||||
password_field = wait.until(EC.presence_of_element_located((By.ID, "Password")))
|
|
||||||
password_field.clear()
|
|
||||||
password_field.send_keys(self.massdhp_password)
|
|
||||||
|
|
||||||
login_button = wait.until(
|
|
||||||
EC.element_to_be_clickable(
|
|
||||||
(By.CSS_SELECTOR, "input[type='submit'][name='submit'][value='Login']")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
login_button.click()
|
|
||||||
return "Success"
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[login] Error: {e}")
|
|
||||||
return "ERROR:LOGIN FAILED"
|
|
||||||
|
|
||||||
# ── step 1 — search member, extract eligibility data ────────────────────────
|
|
||||||
|
|
||||||
def step1(self):
|
|
||||||
wait = WebDriverWait(self.driver, 30)
|
|
||||||
substep = "init"
|
|
||||||
try:
|
|
||||||
substep = "patient_management"
|
|
||||||
patient_mgmt = wait.until(
|
|
||||||
EC.presence_of_element_located(
|
|
||||||
(By.XPATH, "//strong[@translate='Patient Management']")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
self.driver.execute_script("arguments[0].scrollIntoView(true);", patient_mgmt)
|
|
||||||
self.driver.execute_script("arguments[0].click();", patient_mgmt)
|
|
||||||
time.sleep(2)
|
|
||||||
|
|
||||||
substep = "member_eligibility_link"
|
|
||||||
eligibility_link = wait.until(
|
|
||||||
EC.presence_of_element_located(
|
|
||||||
(By.XPATH, "//a[@translate='Member Eligibility']")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
self.driver.execute_script("arguments[0].click();", eligibility_link)
|
|
||||||
time.sleep(2)
|
|
||||||
|
|
||||||
substep = "provider_dropdown"
|
|
||||||
provider_dropdown = wait.until(
|
|
||||||
EC.presence_of_element_located((By.NAME, "provider"))
|
|
||||||
)
|
|
||||||
select_provider = Select(provider_dropdown)
|
|
||||||
first_option = next(
|
|
||||||
(o for o in select_provider.options if o.get_attribute("value").strip()),
|
|
||||||
select_provider.options[0]
|
|
||||||
)
|
|
||||||
select_provider.select_by_value(first_option.get_attribute("value"))
|
|
||||||
time.sleep(2)
|
|
||||||
|
|
||||||
substep = "member_dob"
|
|
||||||
member_dob = wait.until(
|
|
||||||
EC.presence_of_all_elements_located((By.NAME, "dateInput"))
|
|
||||||
)[1]
|
|
||||||
member_dob.clear()
|
|
||||||
member_dob.send_keys(self.dateOfBirth)
|
|
||||||
|
|
||||||
substep = "member_number"
|
|
||||||
member_number = wait.until(
|
|
||||||
EC.presence_of_element_located((By.NAME, "memberNumber"))
|
|
||||||
)
|
|
||||||
member_number.clear()
|
|
||||||
member_number.send_keys(self.memberId)
|
|
||||||
|
|
||||||
substep = "search_button"
|
|
||||||
search_button = wait.until(
|
|
||||||
EC.element_to_be_clickable((By.XPATH, "//button[contains(@class,'btn-primary')]"))
|
|
||||||
)
|
|
||||||
search_button.click()
|
|
||||||
|
|
||||||
substep = "wait_results"
|
|
||||||
wait.until(
|
|
||||||
EC.presence_of_element_located(
|
|
||||||
(By.XPATH, "//h4[text()='Eligible' or text()='Ineligible']")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
self.extracted_data = self._extract_data_from_page()
|
|
||||||
print(f"[step1] data extracted: {self.extracted_data}")
|
|
||||||
return "Success"
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[step1] FAILED at substep='{substep}': {e}")
|
|
||||||
return f"ERROR:STEP1:{substep}"
|
|
||||||
|
|
||||||
# ── helpers ─────────────────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
def _cell_text(self, cell):
|
|
||||||
text = cell.text.strip()
|
|
||||||
if not text:
|
|
||||||
try:
|
|
||||||
text = (self.driver.execute_script("return arguments[0].innerText;", cell) or "").strip()
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
return text
|
|
||||||
|
|
||||||
def _normalize_id(self, s):
|
|
||||||
return "".join(c for c in str(s) if c.isalnum()).lower()
|
|
||||||
|
|
||||||
def _extract_data_from_page(self):
|
|
||||||
wait = WebDriverWait(self.driver, 15)
|
|
||||||
try:
|
|
||||||
wait.until(
|
|
||||||
EC.presence_of_element_located(
|
|
||||||
(By.XPATH, "//h4[text()='Eligible' or text()='Ineligible']/following::table[1]/tbody/tr")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
for status_label, elig_flag in [("Eligible", "Y"), ("Ineligible", "N")]:
|
|
||||||
rows = self.driver.find_elements(
|
|
||||||
By.XPATH,
|
|
||||||
f"//h4[text()='{status_label}']/following::table[1]/tbody/tr"
|
|
||||||
)
|
|
||||||
for row in rows:
|
|
||||||
cells = row.find_elements(By.TAG_NAME, "td")
|
|
||||||
if len(cells) < 3:
|
|
||||||
continue
|
|
||||||
norm_cell = self._normalize_id(self._cell_text(cells[2]))
|
|
||||||
norm_self = self._normalize_id(self.memberId)
|
|
||||||
if norm_self and norm_cell and (norm_self in norm_cell or norm_cell in norm_self):
|
|
||||||
full_name = self._cell_text(cells[4]) if len(cells) > 4 else ""
|
|
||||||
plan_name = (
|
|
||||||
self._cell_text(cells[6]) if len(cells) > 6
|
|
||||||
else (self._cell_text(cells[-1]) if len(cells) > 4 else "")
|
|
||||||
)
|
|
||||||
name_parts = full_name.split()
|
|
||||||
return {
|
|
||||||
"eligibility": elig_flag,
|
|
||||||
"firstName": name_parts[0] if name_parts else "",
|
|
||||||
"lastName": " ".join(name_parts[1:]) if len(name_parts) > 1 else "",
|
|
||||||
"insurance": plan_name,
|
|
||||||
}
|
|
||||||
return {"eligibility": None}
|
|
||||||
except Exception as e:
|
|
||||||
print("Extraction error:", e)
|
|
||||||
return {"eligibility": None}
|
|
||||||
|
|
||||||
# ── step 2 — print eligibility PDF, return to results tab ───────────────────
|
|
||||||
|
|
||||||
def step2_eligibility_pdf(self):
|
|
||||||
wait = WebDriverWait(self.driver, 30)
|
|
||||||
self.eligibility_tab = self.driver.current_window_handle
|
|
||||||
try:
|
|
||||||
download_button = wait.until(
|
|
||||||
EC.element_to_be_clickable(
|
|
||||||
(By.XPATH, "//button[contains(.,'Printer Friendly Format')]")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
download_button.click()
|
|
||||||
|
|
||||||
try:
|
|
||||||
WebDriverWait(self.driver, 10).until(lambda d: len(d.window_handles) > 1)
|
|
||||||
new_tabs = [t for t in self.driver.window_handles if t != self.eligibility_tab]
|
|
||||||
self.driver.switch_to.window(new_tabs[0])
|
|
||||||
wait.until(lambda d: d.execute_script("return document.readyState") == "complete")
|
|
||||||
wait.until(EC.presence_of_element_located((By.TAG_NAME, "body")))
|
|
||||||
time.sleep(2)
|
|
||||||
except TimeoutException:
|
|
||||||
print("No new tab for eligibility; printing current page directly")
|
|
||||||
|
|
||||||
safe_member = "".join(c for c in str(self.memberId) if c.isalnum() or c in "-_.")
|
|
||||||
pdf_filename = f"cmsp_eligibility_{safe_member}.pdf"
|
|
||||||
pdf_data = self.driver.execute_cdp_cmd("Page.printToPDF", {"printBackground": True})
|
|
||||||
pdf_bytes = base64.b64decode(pdf_data["data"])
|
|
||||||
pdf_path = os.path.join(self.download_dir, pdf_filename)
|
|
||||||
with open(pdf_path, "wb") as f:
|
|
||||||
f.write(pdf_bytes)
|
|
||||||
print("Eligibility PDF saved at:", pdf_path)
|
|
||||||
|
|
||||||
if self.driver.current_window_handle != self.eligibility_tab:
|
|
||||||
self.driver.close()
|
|
||||||
self.driver.switch_to.window(self.eligibility_tab)
|
|
||||||
time.sleep(1)
|
|
||||||
|
|
||||||
return pdf_path
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[step2_eligibility_pdf] failed: {e}")
|
|
||||||
if self.eligibility_tab and self.driver.current_window_handle != self.eligibility_tab:
|
|
||||||
try:
|
|
||||||
self.driver.close()
|
|
||||||
self.driver.switch_to.window(self.eligibility_tab)
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
raise
|
|
||||||
|
|
||||||
# ── step 3 — click member ID link → member details ──────────────────────────
|
|
||||||
|
|
||||||
def step3_click_member_id(self):
|
|
||||||
wait = WebDriverWait(self.driver, 30)
|
|
||||||
substep = "ng_bind_link"
|
|
||||||
try:
|
|
||||||
member_link = wait.until(
|
|
||||||
EC.element_to_be_clickable(
|
|
||||||
(By.CSS_SELECTOR, "a[ng-bind='member.memberNumber']")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
self.driver.execute_script("arguments[0].click();", member_link)
|
|
||||||
time.sleep(2)
|
|
||||||
print(f"[step3] clicked member ID link, URL: {self.driver.current_url}")
|
|
||||||
return "Success"
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[step3] FAILED at substep='{substep}': {e}")
|
|
||||||
return f"ERROR:STEP3:{substep}"
|
|
||||||
|
|
||||||
# ── step 3b — print member details page as PDF via CDP ───────────────────────
|
|
||||||
|
|
||||||
def step3b_member_details_pdf(self):
|
|
||||||
wait = WebDriverWait(self.driver, 30)
|
|
||||||
try:
|
|
||||||
wait.until(lambda d: d.execute_script("return document.readyState") == "complete")
|
|
||||||
time.sleep(2)
|
|
||||||
|
|
||||||
safe_member = "".join(c for c in str(self.memberId) if c.isalnum() or c in "-_.")
|
|
||||||
pdf_filename = f"cmsp_member_details_{safe_member}.pdf"
|
|
||||||
pdf_data = self.driver.execute_cdp_cmd("Page.printToPDF", {"printBackground": True})
|
|
||||||
pdf_bytes = base64.b64decode(pdf_data["data"])
|
|
||||||
pdf_path = os.path.join(self.download_dir, pdf_filename)
|
|
||||||
with open(pdf_path, "wb") as f:
|
|
||||||
f.write(pdf_bytes)
|
|
||||||
print("Member details PDF saved at:", pdf_path)
|
|
||||||
return pdf_path
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[step3b_member_details_pdf] failed: {e}")
|
|
||||||
return None
|
|
||||||
|
|
||||||
# ── step 4 — duplicate member details tab ───────────────────────────────────
|
|
||||||
# Opens the same member details URL in a new tab so that Tab A can navigate
|
|
||||||
# to service history while Tab B navigates to accumulator independently.
|
|
||||||
|
|
||||||
def step4_open_duplicate_tab(self):
|
|
||||||
try:
|
|
||||||
self.member_details_tab = self.driver.current_window_handle
|
|
||||||
member_details_url = self.driver.current_url
|
|
||||||
|
|
||||||
self.driver.execute_script("window.open(arguments[0]);", member_details_url)
|
|
||||||
time.sleep(3)
|
|
||||||
|
|
||||||
all_tabs = self.driver.window_handles
|
|
||||||
self.accumulator_tab = next(
|
|
||||||
t for t in all_tabs
|
|
||||||
if t not in [self.eligibility_tab, self.member_details_tab]
|
|
||||||
)
|
|
||||||
print(f"[step4] duplicate tab opened: {self.accumulator_tab}")
|
|
||||||
return "Success"
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[step4] FAILED: {e}")
|
|
||||||
return f"ERROR:STEP4:open_duplicate_tab"
|
|
||||||
|
|
||||||
# ── step 5 — Tab A: service history → CDP print ──────────────────────────────
|
|
||||||
|
|
||||||
def step5_service_history_pdf(self):
|
|
||||||
wait = WebDriverWait(self.driver, 30)
|
|
||||||
try:
|
|
||||||
self.driver.switch_to.window(self.member_details_tab)
|
|
||||||
|
|
||||||
history_link = wait.until(
|
|
||||||
EC.element_to_be_clickable(
|
|
||||||
(By.CSS_SELECTOR, "a.btn.btn-primary[href*='service-history']")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
self.driver.execute_script("arguments[0].scrollIntoView(true);", history_link)
|
|
||||||
self.driver.execute_script("arguments[0].click();", history_link)
|
|
||||||
time.sleep(2)
|
|
||||||
|
|
||||||
wait.until(lambda d: d.execute_script("return document.readyState") == "complete")
|
|
||||||
time.sleep(3)
|
|
||||||
|
|
||||||
safe_member = "".join(c for c in str(self.memberId) if c.isalnum() or c in "-_.")
|
|
||||||
pdf_filename = f"cmsp_history_{safe_member}.pdf"
|
|
||||||
pdf_data = self.driver.execute_cdp_cmd("Page.printToPDF", {"printBackground": True})
|
|
||||||
pdf_bytes = base64.b64decode(pdf_data["data"])
|
|
||||||
pdf_path = os.path.join(self.download_dir, pdf_filename)
|
|
||||||
with open(pdf_path, "wb") as f:
|
|
||||||
f.write(pdf_bytes)
|
|
||||||
print("History PDF saved at:", pdf_path)
|
|
||||||
return pdf_path
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[step5_service_history_pdf] failed: {e}")
|
|
||||||
return None
|
|
||||||
|
|
||||||
# ── step 6 — Tab B: accumulator → wait for data → CDP print ─────────────────
|
|
||||||
|
|
||||||
def step6_accumulator_pdf(self):
|
|
||||||
wait = WebDriverWait(self.driver, 30)
|
|
||||||
try:
|
|
||||||
self.driver.switch_to.window(self.accumulator_tab)
|
|
||||||
|
|
||||||
# Wait for the duplicate member details page to fully load
|
|
||||||
wait.until(lambda d: d.execute_script("return document.readyState") == "complete")
|
|
||||||
time.sleep(2)
|
|
||||||
|
|
||||||
# Click View Accumulator
|
|
||||||
accumulator_link = wait.until(
|
|
||||||
EC.element_to_be_clickable(
|
|
||||||
(By.CSS_SELECTOR, "a.btn.btn-primary[ng-if='vm.showAccumulator']")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
self.driver.execute_script("arguments[0].scrollIntoView(true);", accumulator_link)
|
|
||||||
self.driver.execute_script("arguments[0].click();", accumulator_link)
|
|
||||||
time.sleep(2)
|
|
||||||
|
|
||||||
# Wait for accumulator page to load then print whatever is on screen —
|
|
||||||
# member info is always present even when there are no dollar amounts
|
|
||||||
wait.until(lambda d: d.execute_script("return document.readyState") == "complete")
|
|
||||||
time.sleep(4)
|
|
||||||
|
|
||||||
safe_member = "".join(c for c in str(self.memberId) if c.isalnum() or c in "-_.")
|
|
||||||
pdf_filename = f"cmsp_accumulator_{safe_member}.pdf"
|
|
||||||
pdf_data = self.driver.execute_cdp_cmd("Page.printToPDF", {"printBackground": True})
|
|
||||||
pdf_bytes = base64.b64decode(pdf_data["data"])
|
|
||||||
pdf_path = os.path.join(self.download_dir, pdf_filename)
|
|
||||||
with open(pdf_path, "wb") as f:
|
|
||||||
f.write(pdf_bytes)
|
|
||||||
print("Accumulator PDF saved at:", pdf_path)
|
|
||||||
return pdf_path
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[step6_accumulator_pdf] failed: {e}")
|
|
||||||
return None
|
|
||||||
|
|
||||||
# ── main workflow ────────────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
def main_workflow(self, url):
|
|
||||||
try:
|
|
||||||
self.config_driver()
|
|
||||||
self.driver.maximize_window()
|
|
||||||
self.driver.get(url)
|
|
||||||
time.sleep(3)
|
|
||||||
|
|
||||||
login_result = self.login()
|
|
||||||
if login_result.startswith("ERROR"):
|
|
||||||
return {"status": "error", "message": login_result}
|
|
||||||
|
|
||||||
step1_result = self.step1()
|
|
||||||
if step1_result.startswith("ERROR"):
|
|
||||||
return {"status": "error", "message": step1_result}
|
|
||||||
|
|
||||||
eligibility_pdf_path = self.step2_eligibility_pdf()
|
|
||||||
|
|
||||||
step3_result = self.step3_click_member_id()
|
|
||||||
if step3_result.startswith("ERROR"):
|
|
||||||
return {"status": "partial", "message": step3_result,
|
|
||||||
"pdf_path": eligibility_pdf_path, "file_type": "pdf"}
|
|
||||||
|
|
||||||
member_details_pdf_path = self.step3b_member_details_pdf()
|
|
||||||
|
|
||||||
# Duplicate the member details tab so service history and accumulator
|
|
||||||
# can be opened independently without back-navigation
|
|
||||||
step4_result = self.step4_open_duplicate_tab()
|
|
||||||
if step4_result.startswith("ERROR"):
|
|
||||||
return {"status": "partial", "message": step4_result,
|
|
||||||
"pdf_path": eligibility_pdf_path,
|
|
||||||
"member_details_pdf_path": member_details_pdf_path,
|
|
||||||
"file_type": "pdf"}
|
|
||||||
|
|
||||||
# Tab A: service history PDF
|
|
||||||
history_pdf_path = self.step5_service_history_pdf()
|
|
||||||
|
|
||||||
# Tab B: accumulator PDF
|
|
||||||
accumulator_pdf_path = self.step6_accumulator_pdf()
|
|
||||||
|
|
||||||
result = {
|
|
||||||
"status": "success",
|
|
||||||
"pdf_path": eligibility_pdf_path,
|
|
||||||
"member_details_pdf_path": member_details_pdf_path,
|
|
||||||
"history_pdf_path": history_pdf_path,
|
|
||||||
"accumulator_pdf_path": accumulator_pdf_path,
|
|
||||||
"file_type": "pdf",
|
|
||||||
"message": "Eligibility, member details, service history, and accumulator PDFs captured",
|
|
||||||
}
|
|
||||||
if self.extracted_data:
|
|
||||||
result.update(self.extracted_data)
|
|
||||||
return result
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
return {"status": "error", "message": str(e)}
|
|
||||||
finally:
|
|
||||||
if self.driver:
|
|
||||||
self.driver.quit()
|
|
||||||
+216
-225
@@ -10,8 +10,9 @@ import time
|
|||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import base64
|
import base64
|
||||||
|
import calendar
|
||||||
|
|
||||||
from ddma_browser_manager import get_browser_manager
|
from claimmd_browser_manager import get_browser_manager
|
||||||
|
|
||||||
class AutomationDeltaDentalMAEligibilityCheck:
|
class AutomationDeltaDentalMAEligibilityCheck:
|
||||||
def __init__(self, data):
|
def __init__(self, data):
|
||||||
@@ -45,7 +46,7 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
|
|
||||||
# Try to click logout button if visible
|
# Try to click logout button if visible
|
||||||
try:
|
try:
|
||||||
self.driver.get("https://providers.deltadentalma.com/")
|
self.driver.get("https://www.deltadentalma.com/")
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
|
|
||||||
logout_selectors = [
|
logout_selectors = [
|
||||||
@@ -99,27 +100,27 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
current_url = self.driver.current_url
|
current_url = self.driver.current_url
|
||||||
print(f"[login] Current URL: {current_url}")
|
print(f"[login] Current URL: {current_url}")
|
||||||
|
|
||||||
logged_in_patterns = ["member", "dashboard", "eligibility", "search", "patients"]
|
logged_in_patterns = ["member", "dashboard", "eligibility", "search", "patients", "private/provider"]
|
||||||
is_logged_in_url = any(pattern in current_url.lower() for pattern in logged_in_patterns)
|
is_logged_in_url = any(pattern in current_url.lower() for pattern in logged_in_patterns)
|
||||||
|
|
||||||
if is_logged_in_url and "onboarding" not in current_url.lower():
|
if is_logged_in_url and "sign-in" not in current_url.lower():
|
||||||
print("[login] Already on logged-in page - skipping login entirely")
|
print("[login] Already on logged-in page - skipping login entirely")
|
||||||
if "member" not in current_url.lower():
|
if "member" not in current_url.lower():
|
||||||
try:
|
try:
|
||||||
member_search = WebDriverWait(self.driver, 5).until(
|
member_search = WebDriverWait(self.driver, 5).until(
|
||||||
EC.presence_of_element_located((By.XPATH, '//input[@placeholder="Search by member ID"]'))
|
EC.presence_of_element_located((By.XPATH, "//a[contains(@href, 'check-patient-benefits-search')]"))
|
||||||
)
|
)
|
||||||
print("[login] Found member search input - returning ALREADY_LOGGED_IN")
|
print("[login] Found member search input - returning ALREADY_LOGGED_IN")
|
||||||
return "ALREADY_LOGGED_IN"
|
return "ALREADY_LOGGED_IN"
|
||||||
except TimeoutException:
|
except TimeoutException:
|
||||||
members_url = "https://providers.deltadentalma.com/members"
|
members_url = "https://www.deltadentalma.com/private/provider/dashboard"
|
||||||
print(f"[login] Navigating to members page: {members_url}")
|
print(f"[login] Navigating to members page: {members_url}")
|
||||||
self.driver.get(members_url)
|
self.driver.get(members_url)
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
member_search = WebDriverWait(self.driver, 5).until(
|
member_search = WebDriverWait(self.driver, 5).until(
|
||||||
EC.presence_of_element_located((By.XPATH, '//input[@placeholder="Search by member ID"]'))
|
EC.presence_of_element_located((By.XPATH, "//a[contains(@href, 'check-patient-benefits-search')]"))
|
||||||
)
|
)
|
||||||
print("[login] Member search found - ALREADY_LOGGED_IN")
|
print("[login] Member search found - ALREADY_LOGGED_IN")
|
||||||
return "ALREADY_LOGGED_IN"
|
return "ALREADY_LOGGED_IN"
|
||||||
@@ -137,9 +138,9 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
current_url = self.driver.current_url
|
current_url = self.driver.current_url
|
||||||
print(f"[login] URL after navigation: {current_url}")
|
print(f"[login] URL after navigation: {current_url}")
|
||||||
|
|
||||||
if "onboarding" not in current_url.lower():
|
if "sign-in" not in current_url.lower():
|
||||||
member_search = WebDriverWait(self.driver, 3).until(
|
member_search = WebDriverWait(self.driver, 3).until(
|
||||||
EC.presence_of_element_located((By.XPATH, '//input[@placeholder="Search by member ID"]'))
|
EC.presence_of_element_located((By.XPATH, "//a[contains(@href, 'check-patient-benefits-search')]"))
|
||||||
)
|
)
|
||||||
if member_search:
|
if member_search:
|
||||||
print("[login] Session valid - skipping login")
|
print("[login] Session valid - skipping login")
|
||||||
@@ -172,7 +173,7 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
try:
|
try:
|
||||||
otp_candidate = WebDriverWait(self.driver, 10).until(
|
otp_candidate = WebDriverWait(self.driver, 10).until(
|
||||||
EC.presence_of_element_located(
|
EC.presence_of_element_located(
|
||||||
(By.XPATH, "//input[contains(@aria-lable,'Verification code') or contains(@placeholder,'Enter your verification code') or contains(@aria-label,'Verification code')]")
|
(By.XPATH, "//input[@data-test-id='MfaCode']")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if otp_candidate:
|
if otp_candidate:
|
||||||
@@ -189,7 +190,7 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
try:
|
try:
|
||||||
member_search = WebDriverWait(self.driver, 5).until(
|
member_search = WebDriverWait(self.driver, 5).until(
|
||||||
EC.presence_of_element_located((By.XPATH, '//input[@placeholder="Search by member ID"]'))
|
EC.presence_of_element_located((By.XPATH, "//a[contains(@href, 'check-patient-benefits-search')]"))
|
||||||
)
|
)
|
||||||
if member_search:
|
if member_search:
|
||||||
print("[login] Already authenticated after modal dismiss")
|
print("[login] Already authenticated after modal dismiss")
|
||||||
@@ -200,30 +201,21 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
# Fill login form
|
# Fill login form
|
||||||
try:
|
try:
|
||||||
email_field = WebDriverWait(self.driver, 10).until(
|
email_field = WebDriverWait(self.driver, 10).until(
|
||||||
EC.element_to_be_clickable((By.XPATH, "//input[@name='username' and @type='text']"))
|
EC.element_to_be_clickable((By.XPATH, "//input[@data-test-id='Username']"))
|
||||||
)
|
)
|
||||||
except TimeoutException:
|
except TimeoutException:
|
||||||
print("[login] Could not find login form - page may have changed")
|
print("[login] Could not find login form - page may have changed")
|
||||||
return "ERROR: Login form not found"
|
return "ERROR: Login form not found"
|
||||||
|
|
||||||
email_field = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@name='username' and @type='text']")))
|
email_field = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@data-test-id='Username']")))
|
||||||
email_field.clear()
|
email_field.clear()
|
||||||
email_field.send_keys(self.massddma_username)
|
email_field.send_keys(self.massddma_username)
|
||||||
|
|
||||||
password_field = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@name='password' and @type='password']")))
|
password_field = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@data-test-id='Password']")))
|
||||||
password_field.clear()
|
password_field.clear()
|
||||||
password_field.send_keys(self.massddma_password)
|
password_field.send_keys(self.massddma_password)
|
||||||
|
|
||||||
# Remember me
|
login_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@data-test-id='SigninSubmitButton']")))
|
||||||
try:
|
|
||||||
remember_me_checkbox = wait.until(EC.element_to_be_clickable(
|
|
||||||
(By.XPATH, "//label[.//span[contains(text(),'Remember me')]]")
|
|
||||||
))
|
|
||||||
remember_me_checkbox.click()
|
|
||||||
except Exception:
|
|
||||||
print("[login] Remember me checkbox not found (continuing).")
|
|
||||||
|
|
||||||
login_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@type='submit' and @aria-label='Sign in']")))
|
|
||||||
login_button.click()
|
login_button.click()
|
||||||
|
|
||||||
# Save credentials hash after login attempt
|
# Save credentials hash after login attempt
|
||||||
@@ -234,7 +226,7 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
try:
|
try:
|
||||||
otp_candidate = WebDriverWait(self.driver, 30).until(
|
otp_candidate = WebDriverWait(self.driver, 30).until(
|
||||||
EC.presence_of_element_located(
|
EC.presence_of_element_located(
|
||||||
(By.XPATH, "//input[contains(@aria-lable,'Verification code') or contains(@placeholder,'Enter your verification code')]")
|
(By.XPATH, "//input[@data-test-id='MfaCode']")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if otp_candidate:
|
if otp_candidate:
|
||||||
@@ -247,7 +239,7 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
current_url = self.driver.current_url.lower()
|
current_url = self.driver.current_url.lower()
|
||||||
if "member" in current_url or "dashboard" in current_url:
|
if "member" in current_url or "dashboard" in current_url:
|
||||||
member_search = WebDriverWait(self.driver, 5).until(
|
member_search = WebDriverWait(self.driver, 5).until(
|
||||||
EC.presence_of_element_located((By.XPATH, '//input[@placeholder="Search by member ID"]'))
|
EC.presence_of_element_located((By.XPATH, "//a[contains(@href, 'check-patient-benefits-search')]"))
|
||||||
)
|
)
|
||||||
print("[login] Login successful - now on member search page")
|
print("[login] Login successful - now on member search page")
|
||||||
return "SUCCESS"
|
return "SUCCESS"
|
||||||
@@ -264,7 +256,7 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
except TimeoutException:
|
except TimeoutException:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
if "onboarding" in self.driver.current_url.lower() or "login" in self.driver.current_url.lower():
|
if "sign-in" in self.driver.current_url.lower():
|
||||||
print("[login] Login failed - still on login page")
|
print("[login] Login failed - still on login page")
|
||||||
return "ERROR:LOGIN FAILED: Still on login page"
|
return "ERROR:LOGIN FAILED: Still on login page"
|
||||||
|
|
||||||
@@ -275,103 +267,66 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
print("[login] Exception during login:", e)
|
print("[login] Exception during login:", e)
|
||||||
return f"ERROR:LOGIN FAILED: {e}"
|
return f"ERROR:LOGIN FAILED: {e}"
|
||||||
|
|
||||||
def _select_provider_dropdown(self):
|
|
||||||
"""
|
|
||||||
Click the provider dropdown on the member search page and select the option
|
|
||||||
matching self.providerName (case-insensitive). Falls back to the first option.
|
|
||||||
The button data-testid is 'member-search_provider_select-btn'.
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
short_wait = WebDriverWait(self.driver, 5)
|
|
||||||
try:
|
|
||||||
provider_btn = short_wait.until(
|
|
||||||
EC.element_to_be_clickable(
|
|
||||||
(By.XPATH, '//button[@data-testid="member-search_provider_select-btn"]')
|
|
||||||
)
|
|
||||||
)
|
|
||||||
except TimeoutException:
|
|
||||||
print("[DDMA step1] No provider dropdown found — skipping")
|
|
||||||
return
|
|
||||||
|
|
||||||
provider_btn.click()
|
|
||||||
time.sleep(0.5)
|
|
||||||
|
|
||||||
try:
|
|
||||||
WebDriverWait(self.driver, 5).until(
|
|
||||||
EC.presence_of_element_located((By.XPATH, "//*[@role='option']"))
|
|
||||||
)
|
|
||||||
except TimeoutException:
|
|
||||||
print("[DDMA step1] Provider listbox did not open")
|
|
||||||
return
|
|
||||||
|
|
||||||
options = self.driver.find_elements(By.XPATH, "//*[@role='option']")
|
|
||||||
print(f"[DDMA step1] Provider options: {[o.text.strip() for o in options]}")
|
|
||||||
|
|
||||||
target = (self.providerName or "").strip().lower()
|
|
||||||
selected = False
|
|
||||||
|
|
||||||
if target:
|
|
||||||
for opt in options:
|
|
||||||
if target in opt.text.lower():
|
|
||||||
opt.click()
|
|
||||||
print(f"[DDMA step1] Selected provider: '{opt.text.strip()}'")
|
|
||||||
selected = True
|
|
||||||
break
|
|
||||||
|
|
||||||
if not selected and options:
|
|
||||||
options[0].click()
|
|
||||||
print(f"[DDMA step1] No match for '{self.providerName}', selected first: '{options[0].text.strip()}'")
|
|
||||||
|
|
||||||
time.sleep(0.3)
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[DDMA step1] Provider selection error (non-fatal): {e}")
|
|
||||||
|
|
||||||
def step1(self):
|
def step1(self):
|
||||||
"""Fill search form with all available fields (flexible search)."""
|
"""Open the Group/Health Connector search page and search by Subscriber ID + Birthdate."""
|
||||||
wait = WebDriverWait(self.driver, 30)
|
wait = WebDriverWait(self.driver, 30)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
fields = []
|
fields = []
|
||||||
if self.memberId:
|
if self.memberId:
|
||||||
fields.append(f"ID: {self.memberId}")
|
fields.append(f"SubscriberID: {self.memberId}")
|
||||||
if self.firstName:
|
|
||||||
fields.append(f"FirstName: {self.firstName}")
|
|
||||||
if self.lastName:
|
|
||||||
fields.append(f"LastName: {self.lastName}")
|
|
||||||
if self.dateOfBirth:
|
if self.dateOfBirth:
|
||||||
fields.append(f"DOB: {self.dateOfBirth}")
|
fields.append(f"DOB: {self.dateOfBirth}")
|
||||||
print(f"[DDMA step1] Starting search with: {', '.join(fields)}")
|
print(f"[DDMA step1] Starting search with: {', '.join(fields)}")
|
||||||
|
|
||||||
# Wait for the search page to be fully loaded before interacting
|
search_page_url = "https://www.deltadentalma.com/private/provider/check-patient-benefits-search"
|
||||||
wait.until(EC.presence_of_element_located(
|
|
||||||
(By.XPATH, '//input[@placeholder="Search by member ID"]')
|
|
||||||
))
|
|
||||||
time.sleep(1)
|
|
||||||
|
|
||||||
# Select provider from dropdown based on NPI settings
|
# Try navigating straight to the search page first — avoids any click/visibility issues
|
||||||
self._select_provider_dropdown()
|
print(f"[DDMA step1] Navigating directly to search page: {search_page_url}")
|
||||||
|
self.driver.get(search_page_url)
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
def replace_with_sendkeys(el, value):
|
if "check-patient-benefits-search" not in self.driver.current_url.lower():
|
||||||
el.click()
|
# Direct deep-link didn't stick (e.g. bounced back to sign-in/dashboard) —
|
||||||
el.send_keys(Keys.CONTROL, "a")
|
# fall back to clicking the Group/Health Connector link from the dashboard.
|
||||||
el.send_keys(Keys.BACKSPACE)
|
print(f"[DDMA step1] Direct navigation redirected to: {self.driver.current_url} — falling back to clicking the link")
|
||||||
el.send_keys(value)
|
|
||||||
|
|
||||||
# 1. Fill Member ID if provided
|
if "private/provider/dashboard" not in self.driver.current_url.lower():
|
||||||
if self.memberId:
|
dashboard_url = "https://www.deltadentalma.com/private/provider/dashboard"
|
||||||
|
print(f"[DDMA step1] Navigating to dashboard: {dashboard_url}")
|
||||||
|
self.driver.get(dashboard_url)
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
link_xpath = "//a[contains(@href, 'check-patient-benefits-search')]"
|
||||||
try:
|
try:
|
||||||
member_id_input = wait.until(EC.presence_of_element_located(
|
connector_link = WebDriverWait(self.driver, 20).until(
|
||||||
(By.XPATH, '//input[@placeholder="Search by member ID"]')
|
EC.element_to_be_clickable((By.XPATH, link_xpath))
|
||||||
))
|
)
|
||||||
member_id_input.clear()
|
connector_link.click()
|
||||||
member_id_input.send_keys(self.memberId)
|
except TimeoutException:
|
||||||
print(f"[DDMA step1] Entered Member ID: {self.memberId}")
|
# Element may exist but be hidden (e.g. a responsive duplicate) — try any match via JS click
|
||||||
time.sleep(0.2)
|
candidates = self.driver.find_elements(By.XPATH, link_xpath)
|
||||||
except Exception as e:
|
print(f"[DDMA step1] element_to_be_clickable timed out; found {len(candidates)} matching link(s) in DOM")
|
||||||
print(f"[DDMA step1] Warning: Could not fill Member ID: {e}")
|
if candidates:
|
||||||
|
try:
|
||||||
|
self.driver.execute_script("arguments[0].click();", candidates[0])
|
||||||
|
except Exception as js_err:
|
||||||
|
print(f"[DDMA step1] JS click failed: {js_err}")
|
||||||
|
print(f"[DDMA step1] Current URL: {self.driver.current_url}")
|
||||||
|
return "ERROR: Could not open Group/Health Connector search page"
|
||||||
|
else:
|
||||||
|
print(f"[DDMA step1] No Group/Health Connector link found in DOM. Current URL: {self.driver.current_url}")
|
||||||
|
return "ERROR: Could not open Group/Health Connector search page"
|
||||||
|
|
||||||
# 2. Fill DOB if provided
|
try:
|
||||||
|
wait.until(lambda d: "check-patient-benefits-search" in d.current_url)
|
||||||
|
except TimeoutException:
|
||||||
|
print(f"[DDMA step1] Click did not navigate to search page. Current URL: {self.driver.current_url}")
|
||||||
|
return "ERROR: Could not open Group/Health Connector search page"
|
||||||
|
|
||||||
|
print(f"[DDMA step1] On Group/Health Connector search page: {self.driver.current_url}")
|
||||||
|
|
||||||
|
# Fill Birthdate (masked mm/dd/yyyy input — send digits only, mask inserts slashes)
|
||||||
if self.dateOfBirth:
|
if self.dateOfBirth:
|
||||||
try:
|
try:
|
||||||
dob_parts = self.dateOfBirth.split("-")
|
dob_parts = self.dateOfBirth.split("-")
|
||||||
@@ -379,54 +334,57 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
month = dob_parts[1].zfill(2)
|
month = dob_parts[1].zfill(2)
|
||||||
day = dob_parts[2].zfill(2)
|
day = dob_parts[2].zfill(2)
|
||||||
|
|
||||||
dob_container = wait.until(
|
birthdate_input = wait.until(EC.element_to_be_clickable(
|
||||||
EC.presence_of_element_located(
|
(By.XPATH, "//input[@data-test-id='InStateSearchBirthdate']")
|
||||||
(By.XPATH, "//div[@data-testid='member-search_date-of-birth']")
|
))
|
||||||
)
|
birthdate_input.click()
|
||||||
)
|
birthdate_input.send_keys(Keys.CONTROL, "a")
|
||||||
|
birthdate_input.send_keys(Keys.BACKSPACE)
|
||||||
month_elem = dob_container.find_element(By.XPATH, ".//span[@data-type='month' and @contenteditable='true']")
|
birthdate_input.send_keys(f"{month}{day}{year}")
|
||||||
day_elem = dob_container.find_element(By.XPATH, ".//span[@data-type='day' and @contenteditable='true']")
|
print(f"[DDMA step1] Filled Birthdate: {month}/{day}/{year}")
|
||||||
year_elem = dob_container.find_element(By.XPATH, ".//span[@data-type='year' and @contenteditable='true']")
|
|
||||||
|
|
||||||
replace_with_sendkeys(month_elem, month)
|
|
||||||
time.sleep(0.05)
|
|
||||||
replace_with_sendkeys(day_elem, day)
|
|
||||||
time.sleep(0.05)
|
|
||||||
replace_with_sendkeys(year_elem, year)
|
|
||||||
print(f"[DDMA step1] Filled DOB: {month}/{day}/{year}")
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[DDMA step1] Warning: Could not fill DOB: {e}")
|
print(f"[DDMA step1] Warning: Could not fill Birthdate: {e}")
|
||||||
|
|
||||||
|
# Fill Subscriber ID (== member ID)
|
||||||
|
if self.memberId:
|
||||||
|
try:
|
||||||
|
subscriber_input = wait.until(EC.element_to_be_clickable(
|
||||||
|
(By.XPATH, "//input[@data-test-id='InStateSearchSubscriberId']")
|
||||||
|
))
|
||||||
|
subscriber_input.clear()
|
||||||
|
subscriber_input.send_keys(self.memberId)
|
||||||
|
print(f"[DDMA step1] Filled Subscriber ID: {self.memberId}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[DDMA step1] Warning: Could not fill Subscriber ID: {e}")
|
||||||
|
|
||||||
time.sleep(0.3)
|
time.sleep(0.3)
|
||||||
|
|
||||||
# Click Search button
|
# Click Search button
|
||||||
continue_btn = wait.until(EC.element_to_be_clickable(
|
search_btn = wait.until(EC.element_to_be_clickable(
|
||||||
(By.XPATH, '//button[@data-testid="member-search_search-button"]')
|
(By.XPATH, "//button[@data-test-id='InStateSearchButton']")
|
||||||
))
|
))
|
||||||
continue_btn.click()
|
search_btn.click()
|
||||||
print("[DDMA step1] Clicked Search button")
|
print("[DDMA step1] Clicked Search button")
|
||||||
|
|
||||||
# Wait for either results row or no-results message (up to 15s)
|
# Wait for either the Members results table to render, or (when the
|
||||||
|
# Subscriber ID + DOB match exactly one family member) DDMA to skip
|
||||||
|
# the results list and navigate straight to the patient detail page.
|
||||||
|
# Note: the detail page URL is nested UNDER the search page path
|
||||||
|
# (".../check-patient-benefits-search/check-patient-benefit-details"),
|
||||||
|
# so "check-patient-benefits-search" alone can't distinguish them —
|
||||||
|
# only the detail page's own "-benefit-details" segment can.
|
||||||
try:
|
try:
|
||||||
WebDriverWait(self.driver, 15).until(
|
WebDriverWait(self.driver, 15).until(
|
||||||
EC.any_of(
|
lambda d: d.find_elements(By.XPATH, "//table//tbody//tr")
|
||||||
EC.presence_of_element_located((By.XPATH, "//tbody//tr")),
|
or "check-patient-benefit-details" in d.current_url.lower()
|
||||||
EC.presence_of_element_located((By.XPATH, '//div[@data-testid="member-search-result-no-results"]')),
|
|
||||||
)
|
)
|
||||||
)
|
time.sleep(2)
|
||||||
time.sleep(3)
|
|
||||||
except TimeoutException:
|
except TimeoutException:
|
||||||
pass # proceed and let step2 handle missing results
|
print("[DDMA step1] Warning: No results table appeared within timeout")
|
||||||
|
|
||||||
# Check for no-results error
|
|
||||||
try:
|
|
||||||
error_msg = self.driver.find_element(By.XPATH, '//div[@data-testid="member-search-result-no-results"]')
|
|
||||||
if error_msg:
|
|
||||||
print("[DDMA step1] Error: No results found")
|
|
||||||
return "ERROR: INVALID SEARCH CRITERIA"
|
return "ERROR: INVALID SEARCH CRITERIA"
|
||||||
except Exception:
|
|
||||||
pass
|
if "check-patient-benefit-details" in self.driver.current_url.lower():
|
||||||
|
print(f"[DDMA step1] Search navigated directly to detail page: {self.driver.current_url}")
|
||||||
|
|
||||||
print("[DDMA step1] Search completed successfully")
|
print("[DDMA step1] Search completed successfully")
|
||||||
return "Success"
|
return "Success"
|
||||||
@@ -442,6 +400,24 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
try:
|
try:
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
eligibilityText = "unknown"
|
||||||
|
foundMemberId = self.memberId or ""
|
||||||
|
# If the caller already knows this patient (e.g. an existing patient record
|
||||||
|
# being rechecked), use that name directly — no need to scrape/parse it off
|
||||||
|
# the DDMA page, only the eligibility status is actually needed.
|
||||||
|
patientName = f"{self.firstName} {self.lastName}".strip() if self.firstName and self.lastName else ""
|
||||||
|
known_patient_name = bool(patientName)
|
||||||
|
|
||||||
|
# DDMA now sometimes skips the family-members results table entirely and
|
||||||
|
# navigates straight to the single-patient detail page (when Subscriber ID +
|
||||||
|
# DOB match exactly one person). In that case there's no members table to
|
||||||
|
# parse here — skip straight to the detail-page fallback extraction below.
|
||||||
|
already_on_detail_page = "check-patient-benefit-details" in self.driver.current_url.lower()
|
||||||
|
|
||||||
|
rows = []
|
||||||
|
target_row = None
|
||||||
|
|
||||||
|
if not already_on_detail_page:
|
||||||
# Wait for results table, then pause for full render
|
# Wait for results table, then pause for full render
|
||||||
try:
|
try:
|
||||||
WebDriverWait(self.driver, 10).until(
|
WebDriverWait(self.driver, 10).until(
|
||||||
@@ -451,85 +427,74 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
except TimeoutException:
|
except TimeoutException:
|
||||||
print("[DDMA step2] Warning: Results table not found within timeout")
|
print("[DDMA step2] Warning: Results table not found within timeout")
|
||||||
|
|
||||||
eligibilityText = "unknown"
|
# The Members table lists the whole family sharing this subscriber ID —
|
||||||
foundMemberId = self.memberId or ""
|
# find the row matching this patient's DOB (falls back to last name, then first row).
|
||||||
patientName = ""
|
rows = self.driver.find_elements(By.XPATH, "//table//tbody//tr")
|
||||||
|
print(f"[DDMA step2] Found {len(rows)} family member row(s)")
|
||||||
|
else:
|
||||||
|
print(f"[DDMA step2] Already on detail page: {self.driver.current_url}")
|
||||||
|
|
||||||
# Extract patient name from search results row
|
if self.dateOfBirth and rows:
|
||||||
try:
|
try:
|
||||||
first_row = self.driver.find_element(By.XPATH, "(//tbody//tr)[1]")
|
dob_parts = self.dateOfBirth.split("-")
|
||||||
row_text = first_row.text.strip()
|
dob_year, dob_month, dob_day = dob_parts[0], int(dob_parts[1]), int(dob_parts[2])
|
||||||
print(f"[DDMA step2] First row text: {row_text[:150]}...")
|
expected_dob = f"{calendar.month_abbr[dob_month]} {dob_day}, {dob_year}".lower()
|
||||||
|
for row in rows:
|
||||||
lines = row_text.split('\n') if row_text else []
|
cells = row.find_elements(By.XPATH, "./td")
|
||||||
for line in lines:
|
if len(cells) >= 3 and cells[2].text.strip().lower() == expected_dob:
|
||||||
line = line.strip()
|
target_row = row
|
||||||
if not line:
|
|
||||||
continue
|
|
||||||
if re.match(r"^[A-Za-z\s\-']{2,60}$", line):
|
|
||||||
patientName = line
|
|
||||||
print(f"[DDMA step2] Extracted patient name from row: '{patientName}'")
|
|
||||||
break
|
break
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[DDMA step2] Error reading first row: {e}")
|
print(f"[DDMA step2] DOB matching error (non-fatal): {e}")
|
||||||
|
|
||||||
try:
|
if target_row is None and self.lastName and rows:
|
||||||
short_wait = WebDriverWait(self.driver, 3)
|
for row in rows:
|
||||||
status_link = short_wait.until(EC.presence_of_element_located((
|
if self.lastName.strip().lower() in row.text.lower():
|
||||||
By.XPATH,
|
target_row = row
|
||||||
"(//tbody//tr)[1]//a[contains(@href, 'member-eligibility-search')]"
|
|
||||||
)))
|
|
||||||
eligibilityText = status_link.text.strip().lower()
|
|
||||||
print(f"[DDMA step2] Found eligibility status: {eligibilityText}")
|
|
||||||
except Exception:
|
|
||||||
try:
|
|
||||||
alt_status = self.driver.find_element(By.XPATH, "//*[contains(text(),'Active') or contains(text(),'Inactive') or contains(text(),'Eligible')]")
|
|
||||||
eligibilityText = alt_status.text.strip().lower()
|
|
||||||
if "active" in eligibilityText or "eligible" in eligibilityText:
|
|
||||||
eligibilityText = "active"
|
|
||||||
elif "inactive" in eligibilityText:
|
|
||||||
eligibilityText = "inactive"
|
|
||||||
print(f"[DDMA step2] Found eligibility via alternative: {eligibilityText}")
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Find the member-details URL from the first row
|
|
||||||
print("[DDMA step2] Looking for patient detail link...")
|
|
||||||
detail_url = None
|
|
||||||
|
|
||||||
link_selectors = [
|
|
||||||
"(//table//tbody//tr)[1]//td[1]//a",
|
|
||||||
"(//tbody//tr)[1]//a[contains(@href, 'member-details')]",
|
|
||||||
"(//tbody//tr)[1]//a[contains(@href, 'member')]",
|
|
||||||
"//a[contains(@href, 'member-details')]",
|
|
||||||
]
|
|
||||||
for selector in link_selectors:
|
|
||||||
try:
|
|
||||||
link_el = WebDriverWait(self.driver, 5).until(
|
|
||||||
EC.presence_of_element_located((By.XPATH, selector))
|
|
||||||
)
|
|
||||||
href = link_el.get_attribute("href")
|
|
||||||
if href and "member-details" in href:
|
|
||||||
detail_url = href
|
|
||||||
print(f"[DDMA step2] Found detail URL: {href}")
|
|
||||||
break
|
break
|
||||||
except Exception:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if detail_url:
|
if target_row is None and rows:
|
||||||
# Always navigate via driver.get() — this blocks until the new page loads,
|
target_row = rows[0]
|
||||||
# unlike click() which returns immediately and causes a race condition.
|
print("[DDMA step2] No DOB/name match — defaulting to first family member row")
|
||||||
print(f"[DDMA step2] Navigating to detail page: {detail_url}")
|
|
||||||
self.driver.get(detail_url)
|
|
||||||
|
|
||||||
# Confirm we actually landed on the detail page (not redirected away)
|
if target_row is not None:
|
||||||
|
try:
|
||||||
|
cells = target_row.find_elements(By.XPATH, "./td")
|
||||||
|
if cells and not known_patient_name:
|
||||||
|
patientName = cells[0].text.strip()
|
||||||
|
print(f"[DDMA step2] Extracted patient name from row: '{patientName}'")
|
||||||
|
if len(cells) >= 2 and cells[1].text.strip():
|
||||||
|
foundMemberId = cells[1].text.strip()
|
||||||
|
if len(cells) >= 7:
|
||||||
|
status_text = cells[6].text.strip().lower()
|
||||||
|
if "inactive" in status_text or "termed" in status_text:
|
||||||
|
eligibilityText = "inactive"
|
||||||
|
elif "active" in status_text:
|
||||||
|
eligibilityText = "active"
|
||||||
|
else:
|
||||||
|
eligibilityText = status_text
|
||||||
|
print(f"[DDMA step2] Found eligibility status: {eligibilityText}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[DDMA step2] Error reading matched row cells: {e}")
|
||||||
|
|
||||||
|
# Click into the member's detail page
|
||||||
|
try:
|
||||||
|
name_link = target_row.find_element(By.XPATH, ".//a")
|
||||||
|
name_link.click()
|
||||||
|
print(f"[DDMA step2] Clicked into detail page for: {patientName}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[DDMA step2] Warning: Could not click patient name link: {e}")
|
||||||
|
else:
|
||||||
|
print("[DDMA step2] Warning: No family member rows found in search results")
|
||||||
|
|
||||||
|
# Wait for the detail page to load (URL gains the "-benefit-details" segment)
|
||||||
try:
|
try:
|
||||||
WebDriverWait(self.driver, 15).until(
|
WebDriverWait(self.driver, 15).until(
|
||||||
lambda d: "member-details" in d.current_url
|
lambda d: "check-patient-benefit-details" in d.current_url.lower()
|
||||||
)
|
)
|
||||||
print(f"[DDMA step2] Confirmed on detail page: {self.driver.current_url}")
|
print(f"[DDMA step2] Navigated to detail page: {self.driver.current_url}")
|
||||||
except Exception:
|
except Exception:
|
||||||
print(f"[DDMA step2] Warning: URL after navigation: {self.driver.current_url}")
|
print(f"[DDMA step2] Warning: Still on search page: {self.driver.current_url}")
|
||||||
|
|
||||||
# Wait for meaningful content on the detail page
|
# Wait for meaningful content on the detail page
|
||||||
for selector in [
|
for selector in [
|
||||||
@@ -547,7 +512,8 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
|
|
||||||
time.sleep(3) # Let JavaScript finish rendering all sections
|
time.sleep(3) # Let JavaScript finish rendering all sections
|
||||||
|
|
||||||
# Get full page text as lines
|
# Fallback: refine patient name from the detail page text if row extraction failed
|
||||||
|
if not patientName:
|
||||||
try:
|
try:
|
||||||
page_lines = self.driver.execute_script(
|
page_lines = self.driver.execute_script(
|
||||||
"return document.body.innerText;"
|
"return document.body.innerText;"
|
||||||
@@ -576,15 +542,29 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
# Preferred: the "Benefits for JOSHUA ZHANG" heading names the actual
|
||||||
|
# patient. "Subscriber name:" is the policy holder (e.g. a parent), so
|
||||||
|
# it is only used below if this heading is missing.
|
||||||
|
for line in page_lines:
|
||||||
|
heading = re.match(r'^benefits\s+for\s+(.+)$', line, re.IGNORECASE)
|
||||||
|
if heading and looks_like_name(heading.group(1)):
|
||||||
|
patientName = heading.group(1).strip()
|
||||||
|
print(f"[DDMA step2] Extracted name from 'Benefits for' heading: '{patientName}'")
|
||||||
|
break
|
||||||
|
|
||||||
# Scan lines for the "Name" label. When "Name" appears alone we scan
|
# Scan lines for the "Name" label. When "Name" appears alone we scan
|
||||||
# forward past accessibility text to the first plausible name value.
|
# forward past accessibility text to the first plausible name value.
|
||||||
for i, line in enumerate(page_lines):
|
for i, line in enumerate(page_lines):
|
||||||
|
if patientName:
|
||||||
|
break
|
||||||
# Case 1: "Name : Value" or "Name: Value" on the same line
|
# Case 1: "Name : Value" or "Name: Value" on the same line
|
||||||
|
# (DDMA's detail page labels this "Subscriber name:", so that
|
||||||
|
# prefix must be accepted rather than excluded)
|
||||||
same_line = re.match(
|
same_line = re.match(
|
||||||
r'^(?:member\s+)?name\s*[:\-]\s*(.+)$', line, re.IGNORECASE
|
r'^(?:member\s+|subscriber\s+)?name\s*[:\-]\s*(.+)$', line, re.IGNORECASE
|
||||||
)
|
)
|
||||||
if same_line and not re.search(
|
if same_line and not re.search(
|
||||||
r'(provider|group|subscriber|plan)\s+name', line, re.IGNORECASE
|
r'(provider|group|plan)\s+name', line, re.IGNORECASE
|
||||||
):
|
):
|
||||||
candidate = same_line.group(1).strip()
|
candidate = same_line.group(1).strip()
|
||||||
if looks_like_name(candidate):
|
if looks_like_name(candidate):
|
||||||
@@ -593,7 +573,7 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
break
|
break
|
||||||
|
|
||||||
# Case 2: "Name" or "Name:" alone on a line — scan forward for value
|
# Case 2: "Name" or "Name:" alone on a line — scan forward for value
|
||||||
elif re.match(r'^(?:member\s+)?name\s*:?\s*$', line, re.IGNORECASE):
|
elif re.match(r'^(?:member\s+|subscriber\s+)?name\s*:?\s*$', line, re.IGNORECASE):
|
||||||
for j in range(i + 1, min(i + 6, len(page_lines))):
|
for j in range(i + 1, min(i + 6, len(page_lines))):
|
||||||
candidate = page_lines[j].strip()
|
candidate = page_lines[j].strip()
|
||||||
if looks_like_name(candidate):
|
if looks_like_name(candidate):
|
||||||
@@ -602,8 +582,6 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
break
|
break
|
||||||
if patientName:
|
if patientName:
|
||||||
break
|
break
|
||||||
else:
|
|
||||||
print("[DDMA step2] Warning: Could not find patient detail link")
|
|
||||||
|
|
||||||
# Clean patient name — strip any remaining date artifacts
|
# Clean patient name — strip any remaining date artifacts
|
||||||
if patientName:
|
if patientName:
|
||||||
@@ -614,6 +592,27 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
if not patientName:
|
if not patientName:
|
||||||
print("[DDMA step2] Could not extract patient name from detail page")
|
print("[DDMA step2] Could not extract patient name from detail page")
|
||||||
|
|
||||||
|
# Fallback: refine eligibility status from the detail page's "Coverage is:"
|
||||||
|
# label if the family-table row extraction didn't set it (e.g. DDMA
|
||||||
|
# navigated straight to the detail page, skipping the members table).
|
||||||
|
if eligibilityText == "unknown":
|
||||||
|
try:
|
||||||
|
page_text = self.driver.execute_script("return document.body.innerText;")
|
||||||
|
coverage_match = re.search(
|
||||||
|
r'coverage\s+is\s*[:\-]?\s*([A-Za-z]+)', page_text, re.IGNORECASE
|
||||||
|
)
|
||||||
|
if coverage_match:
|
||||||
|
status_text = coverage_match.group(1).strip().lower()
|
||||||
|
if "inactive" in status_text or "termed" in status_text:
|
||||||
|
eligibilityText = "inactive"
|
||||||
|
elif "active" in status_text:
|
||||||
|
eligibilityText = "active"
|
||||||
|
else:
|
||||||
|
eligibilityText = status_text
|
||||||
|
print(f"[DDMA step2] Extracted eligibility from 'Coverage is:' label: '{eligibilityText}'")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[DDMA step2] Could not extract eligibility from 'Coverage is:' label: {e}")
|
||||||
|
|
||||||
# Wait for the page to be fully ready before capturing PDF
|
# Wait for the page to be fully ready before capturing PDF
|
||||||
try:
|
try:
|
||||||
WebDriverWait(self.driver, 30).until(
|
WebDriverWait(self.driver, 30).until(
|
||||||
@@ -650,14 +649,6 @@ class AutomationDeltaDentalMAEligibilityCheck:
|
|||||||
|
|
||||||
print(f"[DDMA step2] PDF saved at: {pdf_path}")
|
print(f"[DDMA step2] PDF saved at: {pdf_path}")
|
||||||
|
|
||||||
# Close the browser window after PDF (session preserved in profile)
|
|
||||||
try:
|
|
||||||
from ddma_browser_manager import get_browser_manager
|
|
||||||
get_browser_manager().quit_driver()
|
|
||||||
print("[step2] Browser closed - session preserved in profile")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[step2] Error closing browser: {e}")
|
|
||||||
|
|
||||||
print(f"[DDMA step2] Final — PatientName: '{patientName}', MemberID: '{foundMemberId}'")
|
print(f"[DDMA step2] Final — PatientName: '{patientName}', MemberID: '{foundMemberId}'")
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -11,7 +11,7 @@ import json
|
|||||||
import base64
|
import base64
|
||||||
from datetime import date
|
from datetime import date
|
||||||
|
|
||||||
from ddma_browser_manager import get_browser_manager
|
from claimmd_browser_manager import get_browser_manager
|
||||||
|
|
||||||
MEMBERS_URL = "https://providers.deltadentalma.com/members"
|
MEMBERS_URL = "https://providers.deltadentalma.com/members"
|
||||||
|
|
||||||
|
|||||||
@@ -1,471 +0,0 @@
|
|||||||
from selenium import webdriver
|
|
||||||
from selenium.common import TimeoutException
|
|
||||||
from selenium.webdriver.chrome.service import Service
|
|
||||||
from selenium.webdriver.common.by import By
|
|
||||||
from selenium.webdriver.support.ui import WebDriverWait, Select
|
|
||||||
from selenium.webdriver.support import expected_conditions as EC
|
|
||||||
from webdriver_manager.chrome import ChromeDriverManager
|
|
||||||
import time
|
|
||||||
import os
|
|
||||||
import base64
|
|
||||||
|
|
||||||
|
|
||||||
class AutomationMassHealthEligibilityHistoryCheck:
|
|
||||||
def __init__(self, data):
|
|
||||||
self.headless = False
|
|
||||||
self.driver = None
|
|
||||||
self.extracted_data = {}
|
|
||||||
self.eligibility_tab = None # handle to the eligibility results tab
|
|
||||||
|
|
||||||
self.data = data.get("data")
|
|
||||||
|
|
||||||
self.massdhp_username = self.data.get("massdhpUsername", "")
|
|
||||||
self.massdhp_password = self.data.get("massdhpPassword", "")
|
|
||||||
self.dateOfBirth = self.data.get("dateOfBirth", "")
|
|
||||||
self.memberId = self.data.get("memberId", "")
|
|
||||||
self.firstName = self.data.get("firstName", "")
|
|
||||||
self.lastName = self.data.get("lastName", "")
|
|
||||||
|
|
||||||
# Convert dateOfBirth from YYYY-MM-DD to MMDDYYYY
|
|
||||||
if self.dateOfBirth and "-" in self.dateOfBirth:
|
|
||||||
parts = self.dateOfBirth.split("-")
|
|
||||||
if len(parts) == 3:
|
|
||||||
year, month, day = parts
|
|
||||||
self.dateOfBirth = f"{month.zfill(2)}{day.zfill(2)}{year}"
|
|
||||||
|
|
||||||
self.download_dir = os.path.abspath("downloads")
|
|
||||||
os.makedirs(self.download_dir, exist_ok=True)
|
|
||||||
|
|
||||||
# ── driver ──────────────────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
def config_driver(self):
|
|
||||||
options = webdriver.ChromeOptions()
|
|
||||||
if self.headless:
|
|
||||||
options.add_argument("--headless")
|
|
||||||
|
|
||||||
prefs = {
|
|
||||||
"download.default_directory": self.download_dir,
|
|
||||||
"plugins.always_open_pdf_externally": False,
|
|
||||||
"download.prompt_for_download": False,
|
|
||||||
"download.directory_upgrade": True,
|
|
||||||
}
|
|
||||||
options.add_experimental_option("prefs", prefs)
|
|
||||||
|
|
||||||
s = Service(ChromeDriverManager().install())
|
|
||||||
self.driver = webdriver.Chrome(service=s, options=options)
|
|
||||||
|
|
||||||
# ── login ───────────────────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
def login(self):
|
|
||||||
wait = WebDriverWait(self.driver, 30)
|
|
||||||
try:
|
|
||||||
signin_button = wait.until(
|
|
||||||
EC.element_to_be_clickable(
|
|
||||||
(By.CSS_SELECTOR, "a.btn.btn-block.btn-primary[href='https://connectsso.masshealth-dental.org/mhprovider/index.html']")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
signin_button.click()
|
|
||||||
time.sleep(3)
|
|
||||||
|
|
||||||
email_field = wait.until(EC.presence_of_element_located((By.ID, "User")))
|
|
||||||
email_field.clear()
|
|
||||||
email_field.send_keys(self.massdhp_username)
|
|
||||||
|
|
||||||
password_field = wait.until(EC.presence_of_element_located((By.ID, "Password")))
|
|
||||||
password_field.clear()
|
|
||||||
password_field.send_keys(self.massdhp_password)
|
|
||||||
|
|
||||||
login_button = wait.until(
|
|
||||||
EC.element_to_be_clickable(
|
|
||||||
(By.CSS_SELECTOR, "input[type='submit'][name='submit'][value='Login']")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
login_button.click()
|
|
||||||
|
|
||||||
# Wait for the SSO redirect. On some machines Chrome opens the dashboard
|
|
||||||
# in a new tab and closes the SSO tab — poll ALL window handles.
|
|
||||||
print("[login] Waiting for SSO redirect to provider.masshealth-dental.org ...")
|
|
||||||
deadline = time.time() + 30
|
|
||||||
found = False
|
|
||||||
while time.time() < deadline:
|
|
||||||
time.sleep(0.5)
|
|
||||||
for handle in self.driver.window_handles:
|
|
||||||
try:
|
|
||||||
self.driver.switch_to.window(handle)
|
|
||||||
if self.driver.current_url.startswith("https://provider.masshealth-dental.org"):
|
|
||||||
print(f"[login] Redirect complete. URL: {self.driver.current_url}")
|
|
||||||
found = True
|
|
||||||
break
|
|
||||||
except Exception:
|
|
||||||
continue
|
|
||||||
if found:
|
|
||||||
break
|
|
||||||
|
|
||||||
if not found:
|
|
||||||
print("[login] Redirect timeout — portal window not found in any tab.")
|
|
||||||
return "ERROR: Login redirect timed out — check credentials or portal availability."
|
|
||||||
|
|
||||||
return "Success"
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[login] Error: {e}")
|
|
||||||
return "ERROR:LOGIN FAILED"
|
|
||||||
|
|
||||||
# ── step 1 — search member, extract eligibility data ────────────────────────
|
|
||||||
|
|
||||||
def step1(self):
|
|
||||||
wait = WebDriverWait(self.driver, 30)
|
|
||||||
substep = "init"
|
|
||||||
try:
|
|
||||||
print(f"[step1] URL: {self.driver.current_url}")
|
|
||||||
|
|
||||||
substep = "patient_management"
|
|
||||||
patient_mgmt = wait.until(
|
|
||||||
EC.presence_of_element_located(
|
|
||||||
(By.XPATH, "//strong[@translate='Patient Management']")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
self.driver.execute_script("arguments[0].scrollIntoView(true);", patient_mgmt)
|
|
||||||
self.driver.execute_script("arguments[0].click();", patient_mgmt)
|
|
||||||
time.sleep(2)
|
|
||||||
|
|
||||||
substep = "member_eligibility_link"
|
|
||||||
eligibility_link = wait.until(
|
|
||||||
EC.presence_of_element_located(
|
|
||||||
(By.XPATH, "//a[@translate='Member Eligibility']")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
self.driver.execute_script("arguments[0].click();", eligibility_link)
|
|
||||||
time.sleep(2)
|
|
||||||
|
|
||||||
substep = "provider_dropdown"
|
|
||||||
provider_dropdown = wait.until(
|
|
||||||
EC.presence_of_element_located((By.NAME, "provider"))
|
|
||||||
)
|
|
||||||
select_provider = Select(provider_dropdown)
|
|
||||||
options = [o.text for o in select_provider.options]
|
|
||||||
print(f"[step1] provider options: {options}")
|
|
||||||
|
|
||||||
substep = "select_provider"
|
|
||||||
first_option = next(
|
|
||||||
(o for o in select_provider.options if o.get_attribute("value").strip()),
|
|
||||||
select_provider.options[0]
|
|
||||||
)
|
|
||||||
print(f"[step1] selecting provider: '{first_option.text}'")
|
|
||||||
select_provider.select_by_value(first_option.get_attribute("value"))
|
|
||||||
time.sleep(2)
|
|
||||||
|
|
||||||
substep = "member_dob"
|
|
||||||
member_dob = wait.until(
|
|
||||||
EC.presence_of_all_elements_located((By.NAME, "dateInput"))
|
|
||||||
)[1]
|
|
||||||
member_dob.clear()
|
|
||||||
member_dob.send_keys(self.dateOfBirth)
|
|
||||||
|
|
||||||
substep = "member_number"
|
|
||||||
member_number = wait.until(
|
|
||||||
EC.presence_of_element_located((By.NAME, "memberNumber"))
|
|
||||||
)
|
|
||||||
member_number.clear()
|
|
||||||
member_number.send_keys(self.memberId)
|
|
||||||
|
|
||||||
substep = "search_button"
|
|
||||||
search_button = wait.until(
|
|
||||||
EC.element_to_be_clickable((By.XPATH, "//button[contains(@class,'btn-primary')]"))
|
|
||||||
)
|
|
||||||
search_button.click()
|
|
||||||
|
|
||||||
substep = "wait_results"
|
|
||||||
wait.until(
|
|
||||||
EC.presence_of_element_located(
|
|
||||||
(By.XPATH, "//h4[text()='Eligible' or text()='Ineligible']")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
self.extracted_data = self._extract_data_from_page()
|
|
||||||
print(f"[step1] data extracted: {self.extracted_data}")
|
|
||||||
return "Success"
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[step1] FAILED at substep='{substep}': {e}")
|
|
||||||
print(f"[step1] URL at failure: {self.driver.current_url}")
|
|
||||||
return f"ERROR:STEP1:{substep}"
|
|
||||||
|
|
||||||
# ── helpers ─────────────────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
def _cell_text(self, cell):
|
|
||||||
text = cell.text.strip()
|
|
||||||
if not text:
|
|
||||||
try:
|
|
||||||
text = (self.driver.execute_script("return arguments[0].innerText;", cell) or "").strip()
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
return text
|
|
||||||
|
|
||||||
def _normalize_id(self, s):
|
|
||||||
return "".join(c for c in str(s) if c.isalnum()).lower()
|
|
||||||
|
|
||||||
def _extract_data_from_page(self):
|
|
||||||
wait = WebDriverWait(self.driver, 15)
|
|
||||||
extracted = {}
|
|
||||||
try:
|
|
||||||
wait.until(
|
|
||||||
EC.presence_of_element_located(
|
|
||||||
(By.XPATH, "//h4[text()='Eligible' or text()='Ineligible']/following::table[1]/tbody/tr")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
# AngularJS populates cell text after elements appear in the DOM.
|
|
||||||
# Retry a few times until a row with non-empty cell[2] is found.
|
|
||||||
for attempt in range(4):
|
|
||||||
for status_label, elig_flag in [("Eligible", "Y"), ("Ineligible", "N")]:
|
|
||||||
rows = self.driver.find_elements(
|
|
||||||
By.XPATH,
|
|
||||||
f"//h4[text()='{status_label}']/following::table[1]/tbody/tr"
|
|
||||||
)
|
|
||||||
for row in rows:
|
|
||||||
cells = row.find_elements(By.TAG_NAME, "td")
|
|
||||||
if len(cells) < 3:
|
|
||||||
continue
|
|
||||||
member_number = self._cell_text(cells[2])
|
|
||||||
norm_cell = self._normalize_id(member_number)
|
|
||||||
norm_self = self._normalize_id(self.memberId)
|
|
||||||
if norm_self and norm_cell and (norm_self in norm_cell or norm_cell in norm_self):
|
|
||||||
full_name = self._cell_text(cells[4]) if len(cells) > 4 else ""
|
|
||||||
plan_name = (
|
|
||||||
self._cell_text(cells[6]) if len(cells) > 6
|
|
||||||
else (self._cell_text(cells[-1]) if len(cells) > 4 else "")
|
|
||||||
)
|
|
||||||
name_parts = full_name.split()
|
|
||||||
extracted = {
|
|
||||||
"eligibility": elig_flag,
|
|
||||||
"firstName": name_parts[0] if name_parts else "",
|
|
||||||
"lastName": " ".join(name_parts[1:]) if len(name_parts) > 1 else "",
|
|
||||||
"insurance": plan_name,
|
|
||||||
}
|
|
||||||
print(f"[extraction] MATCHED {status_label} → name='{full_name}' plan='{plan_name}'")
|
|
||||||
return extracted
|
|
||||||
if attempt < 3:
|
|
||||||
print(f"[extraction] cells not yet populated (attempt {attempt + 1}), retrying...")
|
|
||||||
time.sleep(1.5)
|
|
||||||
|
|
||||||
print(f"[extraction] No matching row for memberId='{self.memberId}'")
|
|
||||||
return {"eligibility": None}
|
|
||||||
except Exception as e:
|
|
||||||
print("Extraction error:", e)
|
|
||||||
return {"eligibility": None}
|
|
||||||
|
|
||||||
# ── step 2 — print eligibility PDF, stay on results tab ─────────────────────
|
|
||||||
|
|
||||||
def step2_eligibility_pdf(self):
|
|
||||||
wait = WebDriverWait(self.driver, 30)
|
|
||||||
self.eligibility_tab = self.driver.current_window_handle
|
|
||||||
|
|
||||||
try:
|
|
||||||
download_button = wait.until(
|
|
||||||
EC.element_to_be_clickable(
|
|
||||||
(By.XPATH, "//button[contains(.,'Printer Friendly Format')]")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
download_button.click()
|
|
||||||
|
|
||||||
try:
|
|
||||||
WebDriverWait(self.driver, 10).until(lambda d: len(d.window_handles) > 1)
|
|
||||||
new_tabs = [t for t in self.driver.window_handles if t != self.eligibility_tab]
|
|
||||||
self.driver.switch_to.window(new_tabs[0])
|
|
||||||
wait.until(lambda d: d.execute_script("return document.readyState") == "complete")
|
|
||||||
wait.until(EC.presence_of_element_located((By.TAG_NAME, "body")))
|
|
||||||
time.sleep(2)
|
|
||||||
print("Printer-friendly tab opened:", self.driver.current_url)
|
|
||||||
except TimeoutException:
|
|
||||||
print("No new tab for eligibility; printing current page directly")
|
|
||||||
|
|
||||||
safe_member = "".join(c for c in str(self.memberId) if c.isalnum() or c in "-_.")
|
|
||||||
pdf_filename = f"eligibility_{safe_member}.pdf"
|
|
||||||
pdf_data = self.driver.execute_cdp_cmd("Page.printToPDF", {"printBackground": True})
|
|
||||||
pdf_bytes = base64.b64decode(pdf_data["data"])
|
|
||||||
pdf_path = os.path.join(self.download_dir, pdf_filename)
|
|
||||||
with open(pdf_path, "wb") as f:
|
|
||||||
f.write(pdf_bytes)
|
|
||||||
print("Eligibility PDF saved at:", pdf_path)
|
|
||||||
|
|
||||||
# Close printer-friendly tab and return to eligibility results
|
|
||||||
if self.driver.current_window_handle != self.eligibility_tab:
|
|
||||||
self.driver.close()
|
|
||||||
self.driver.switch_to.window(self.eligibility_tab)
|
|
||||||
time.sleep(1)
|
|
||||||
|
|
||||||
return pdf_path
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[step2_eligibility_pdf] failed: {e}")
|
|
||||||
# Ensure we are back on the eligibility results tab even on error
|
|
||||||
if self.eligibility_tab and self.driver.current_window_handle != self.eligibility_tab:
|
|
||||||
try:
|
|
||||||
self.driver.close()
|
|
||||||
self.driver.switch_to.window(self.eligibility_tab)
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
raise
|
|
||||||
|
|
||||||
# ── step 3 — click member ID link → member details page ─────────────────────
|
|
||||||
|
|
||||||
def step3_click_member_id(self):
|
|
||||||
wait = WebDriverWait(self.driver, 30)
|
|
||||||
substep = "init"
|
|
||||||
try:
|
|
||||||
substep = "ng_bind_link"
|
|
||||||
member_link = wait.until(
|
|
||||||
EC.element_to_be_clickable(
|
|
||||||
(By.CSS_SELECTOR, "a[ng-bind='member.memberNumber']")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
self.driver.execute_script("arguments[0].click();", member_link)
|
|
||||||
time.sleep(2)
|
|
||||||
print(f"[step3] clicked member ID link, URL: {self.driver.current_url}")
|
|
||||||
return "Success"
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[step3] FAILED at substep='{substep}': {e}")
|
|
||||||
return f"ERROR:STEP3:{substep}"
|
|
||||||
|
|
||||||
# ── step 3b — print member details page as PDF via CDP ───────────────────────
|
|
||||||
|
|
||||||
def step3b_member_details_pdf(self):
|
|
||||||
wait = WebDriverWait(self.driver, 30)
|
|
||||||
try:
|
|
||||||
wait.until(lambda d: d.execute_script("return document.readyState") == "complete")
|
|
||||||
time.sleep(2)
|
|
||||||
|
|
||||||
safe_member = "".join(c for c in str(self.memberId) if c.isalnum() or c in "-_.")
|
|
||||||
pdf_filename = f"eligibility_member_details_{safe_member}.pdf"
|
|
||||||
pdf_data = self.driver.execute_cdp_cmd("Page.printToPDF", {"printBackground": True})
|
|
||||||
pdf_bytes = base64.b64decode(pdf_data["data"])
|
|
||||||
pdf_path = os.path.join(self.download_dir, pdf_filename)
|
|
||||||
with open(pdf_path, "wb") as f:
|
|
||||||
f.write(pdf_bytes)
|
|
||||||
print("Member details PDF saved at:", pdf_path)
|
|
||||||
return pdf_path
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[step3b_member_details_pdf] failed: {e}")
|
|
||||||
return None
|
|
||||||
|
|
||||||
# ── step 4 — click "View Service History" on member details page ─────────────
|
|
||||||
|
|
||||||
def step4_view_service_history(self):
|
|
||||||
wait = WebDriverWait(self.driver, 30)
|
|
||||||
substep = "init"
|
|
||||||
try:
|
|
||||||
# Primary: href contains /service-history and has btn-primary class
|
|
||||||
substep = "service_history_link"
|
|
||||||
history_link = wait.until(
|
|
||||||
EC.element_to_be_clickable(
|
|
||||||
(By.CSS_SELECTOR, "a.btn.btn-primary[href*='service-history']")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
self.driver.execute_script("arguments[0].scrollIntoView(true);", history_link)
|
|
||||||
self.driver.execute_script("arguments[0].click();", history_link)
|
|
||||||
time.sleep(2)
|
|
||||||
print(f"[step4] navigated to service history, URL: {self.driver.current_url}")
|
|
||||||
return "Success"
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[step4] FAILED at substep='{substep}': {e}")
|
|
||||||
return f"ERROR:STEP4:{substep}"
|
|
||||||
|
|
||||||
# ── step 5 — print service history PDF ──────────────────────────────────────
|
|
||||||
|
|
||||||
def step5_history_pdf(self):
|
|
||||||
wait = WebDriverWait(self.driver, 30)
|
|
||||||
current_tab = self.driver.current_window_handle
|
|
||||||
try:
|
|
||||||
print_button = wait.until(
|
|
||||||
EC.element_to_be_clickable(
|
|
||||||
(By.CSS_SELECTOR, "button.btn.btn-primary[ng-click='vm.printPage()']")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
print_button.click()
|
|
||||||
|
|
||||||
try:
|
|
||||||
WebDriverWait(self.driver, 10).until(lambda d: len(d.window_handles) > 1)
|
|
||||||
new_tabs = [t for t in self.driver.window_handles if t != current_tab]
|
|
||||||
self.driver.switch_to.window(new_tabs[0])
|
|
||||||
wait.until(lambda d: d.execute_script("return document.readyState") == "complete")
|
|
||||||
wait.until(EC.presence_of_element_located((By.TAG_NAME, "body")))
|
|
||||||
time.sleep(2)
|
|
||||||
print("History printer-friendly tab opened:", self.driver.current_url)
|
|
||||||
except TimeoutException:
|
|
||||||
print("No new tab for history; printing current page directly")
|
|
||||||
|
|
||||||
safe_member = "".join(c for c in str(self.memberId) if c.isalnum() or c in "-_.")
|
|
||||||
pdf_filename = f"eligibility_history_{safe_member}.pdf"
|
|
||||||
pdf_data = self.driver.execute_cdp_cmd("Page.printToPDF", {"printBackground": True})
|
|
||||||
pdf_bytes = base64.b64decode(pdf_data["data"])
|
|
||||||
pdf_path = os.path.join(self.download_dir, pdf_filename)
|
|
||||||
with open(pdf_path, "wb") as f:
|
|
||||||
f.write(pdf_bytes)
|
|
||||||
print("History PDF saved at:", pdf_path)
|
|
||||||
return pdf_path
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[step5_history_pdf] failed: {e}")
|
|
||||||
return None
|
|
||||||
|
|
||||||
# ── main workflow ────────────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
def main_workflow(self, url):
|
|
||||||
try:
|
|
||||||
self.config_driver()
|
|
||||||
self.driver.maximize_window()
|
|
||||||
self.driver.get(url)
|
|
||||||
time.sleep(3)
|
|
||||||
|
|
||||||
login_result = self.login()
|
|
||||||
if login_result.startswith("ERROR"):
|
|
||||||
return {"status": "error", "message": login_result}
|
|
||||||
|
|
||||||
step1_result = self.step1()
|
|
||||||
if step1_result.startswith("ERROR"):
|
|
||||||
return {"status": "error", "message": step1_result}
|
|
||||||
|
|
||||||
# Print eligibility PDF; stays on results tab afterwards
|
|
||||||
eligibility_pdf_path = self.step2_eligibility_pdf()
|
|
||||||
|
|
||||||
# Click the member ID link → member details
|
|
||||||
step3_result = self.step3_click_member_id()
|
|
||||||
if step3_result.startswith("ERROR"):
|
|
||||||
return {
|
|
||||||
"status": "partial",
|
|
||||||
"message": step3_result,
|
|
||||||
"pdf_path": eligibility_pdf_path,
|
|
||||||
"file_type": "pdf",
|
|
||||||
}
|
|
||||||
|
|
||||||
# Print member details page
|
|
||||||
member_details_pdf_path = self.step3b_member_details_pdf()
|
|
||||||
|
|
||||||
# Click "View Service History"
|
|
||||||
step4_result = self.step4_view_service_history()
|
|
||||||
if step4_result.startswith("ERROR"):
|
|
||||||
return {
|
|
||||||
"status": "partial",
|
|
||||||
"message": step4_result,
|
|
||||||
"pdf_path": eligibility_pdf_path,
|
|
||||||
"member_details_pdf_path": member_details_pdf_path,
|
|
||||||
"file_type": "pdf",
|
|
||||||
}
|
|
||||||
|
|
||||||
# Print history PDF
|
|
||||||
history_pdf_path = self.step5_history_pdf()
|
|
||||||
|
|
||||||
result = {
|
|
||||||
"status": "success",
|
|
||||||
"pdf_path": eligibility_pdf_path,
|
|
||||||
"member_details_pdf_path": member_details_pdf_path,
|
|
||||||
"history_pdf_path": history_pdf_path,
|
|
||||||
"file_type": "pdf",
|
|
||||||
"message": "Eligibility, member details, and service history PDFs captured",
|
|
||||||
}
|
|
||||||
if self.extracted_data:
|
|
||||||
result.update(self.extracted_data)
|
|
||||||
return result
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
return {"status": "error", "message": str(e)}
|
|
||||||
finally:
|
|
||||||
if self.driver:
|
|
||||||
self.driver.quit()
|
|
||||||
@@ -71,7 +71,7 @@ echo ""
|
|||||||
echo "=============================="
|
echo "=============================="
|
||||||
echo " STEP 13 — Desktop shortcuts "
|
echo " STEP 13 — Desktop shortcuts "
|
||||||
echo "=============================="
|
echo "=============================="
|
||||||
bash ~/Desktop/DentalManagementMH06/setup-desktop-shortcut.sh
|
bash ~/Desktop/Wellspringmanagement01/setup-desktop-shortcut.sh
|
||||||
echo "✓ Desktop shortcuts created"
|
echo "✓ Desktop shortcuts created"
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
@@ -79,6 +79,6 @@ echo "============================================"
|
|||||||
echo " All steps complete!"
|
echo " All steps complete!"
|
||||||
echo ""
|
echo ""
|
||||||
echo " STEP 12 — To run the app, open 2 terminals:"
|
echo " STEP 12 — To run the app, open 2 terminals:"
|
||||||
echo " Terminal 1: cd ~/Desktop/DentalManagementMH06 && npm run dev"
|
echo " Terminal 1: cd ~/Desktop/Wellspringmanagement01 && npm run dev"
|
||||||
echo " Terminal 2: cd ~/Desktop/DentalManagementMH06/apps/SeleniumService && .venv/bin/python3 agent.py"
|
echo " Terminal 2: cd ~/Desktop/Wellspringmanagement01/apps/SeleniumService && .venv/bin/python3 agent.py"
|
||||||
echo "============================================"
|
echo "============================================"
|
||||||
|
|||||||
Generated
+26
@@ -659,6 +659,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"ppc64"
|
"ppc64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -675,6 +676,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -691,6 +693,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -707,6 +710,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -723,6 +727,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -739,6 +744,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -755,6 +761,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -771,6 +778,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -787,6 +795,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -803,6 +812,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -819,6 +829,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"ia32"
|
"ia32"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -835,6 +846,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"loong64"
|
"loong64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -851,6 +863,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"mips64el"
|
"mips64el"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -867,6 +880,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"ppc64"
|
"ppc64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -883,6 +897,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"riscv64"
|
"riscv64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -899,6 +914,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"s390x"
|
"s390x"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -915,6 +931,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -931,6 +948,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -947,6 +965,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -963,6 +982,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -979,6 +999,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -995,6 +1016,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -1011,6 +1033,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -1027,6 +1050,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -1043,6 +1067,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"ia32"
|
"ia32"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
@@ -1059,6 +1084,7 @@
|
|||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
Warnings:
|
||||||
|
|
||||||
|
- You are about to drop the column `doctorName` on the `lab_rx_template` table. All the data in the column will be lost.
|
||||||
|
|
||||||
|
*/
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "Patient" ALTER COLUMN "updatedAt" DROP DEFAULT;
|
||||||
|
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "User" ADD COLUMN "autoMhCheckDayOfWeek" INTEGER NOT NULL DEFAULT 1,
|
||||||
|
ADD COLUMN "autoMhCheckEnabled" BOOLEAN NOT NULL DEFAULT false,
|
||||||
|
ADD COLUMN "autoMhCheckHour" INTEGER NOT NULL DEFAULT 13;
|
||||||
|
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "lab_rx_template" DROP COLUMN "doctorName";
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"generatorVersion": "1.0.0",
|
"generatorVersion": "1.0.0",
|
||||||
"generatedAt": "2026-07-03T03:44:29.373Z",
|
"generatedAt": "2026-09-22T04:11:49.276Z",
|
||||||
"outputPath": "/home/gg/Desktop/DentalManagementMH06/packages/db/shared",
|
"outputPath": "/home/kk/Desktop/DentalManagementMH06/packages/db/shared",
|
||||||
"files": [
|
"files": [
|
||||||
"schemas/enums/TransactionIsolationLevel.schema.ts",
|
"schemas/enums/TransactionIsolationLevel.schema.ts",
|
||||||
"schemas/enums/UserScalarFieldEnum.schema.ts",
|
"schemas/enums/UserScalarFieldEnum.schema.ts",
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
|
|
||||||
import { Prisma } from '../../generated/prisma';
|
import type { Prisma } from '../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
|
|
||||||
// DECIMAL HELPERS
|
// DECIMAL HELPERS
|
||||||
//------------------------------------------------------
|
//------------------------------------------------------
|
||||||
@@ -23,7 +24,7 @@ export const isValidDecimalInput = (
|
|||||||
if (v === undefined || v === null) return false;
|
if (v === undefined || v === null) return false;
|
||||||
return (
|
return (
|
||||||
// Explicit instance checks first
|
// Explicit instance checks first
|
||||||
v instanceof Prisma.Decimal ||
|
v instanceof Decimal ||
|
||||||
// If Decimal.js is present and imported by the generator, this symbol exists at runtime
|
// If Decimal.js is present and imported by the generator, this symbol exists at runtime
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
// @ts-ignore - Decimal may be undefined when not installed; codegen controls the import
|
// @ts-ignore - Decimal may be undefined when not installed; codegen controls the import
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema';
|
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema';
|
||||||
import { AppointmentCreateNestedOneWithoutProceduresInputObjectSchema as AppointmentCreateNestedOneWithoutProceduresInputObjectSchema } from './AppointmentCreateNestedOneWithoutProceduresInput.schema';
|
import { AppointmentCreateNestedOneWithoutProceduresInputObjectSchema as AppointmentCreateNestedOneWithoutProceduresInputObjectSchema } from './AppointmentCreateNestedOneWithoutProceduresInput.schema';
|
||||||
import { PatientCreateNestedOneWithoutProceduresInputObjectSchema as PatientCreateNestedOneWithoutProceduresInputObjectSchema } from './PatientCreateNestedOneWithoutProceduresInput.schema';
|
import { PatientCreateNestedOneWithoutProceduresInputObjectSchema as PatientCreateNestedOneWithoutProceduresInputObjectSchema } from './PatientCreateNestedOneWithoutProceduresInput.schema';
|
||||||
import { NpiProviderCreateNestedOneWithoutAppointmentProceduresInputObjectSchema as NpiProviderCreateNestedOneWithoutAppointmentProceduresInputObjectSchema } from './NpiProviderCreateNestedOneWithoutAppointmentProceduresInput.schema'
|
import { NpiProviderCreateNestedOneWithoutAppointmentProceduresInputObjectSchema as NpiProviderCreateNestedOneWithoutAppointmentProceduresInputObjectSchema } from './NpiProviderCreateNestedOneWithoutAppointmentProceduresInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
procedureCode: z.string(),
|
procedureCode: z.string(),
|
||||||
procedureLabel: z.string().optional().nullable(),
|
procedureLabel: z.string().optional().nullable(),
|
||||||
@@ -14,7 +15,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,9 +1,10 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema'
|
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
patientId: z.number().int(),
|
patientId: z.number().int(),
|
||||||
@@ -14,7 +15,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema'
|
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
appointmentId: z.number().int(),
|
appointmentId: z.number().int(),
|
||||||
@@ -15,7 +16,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,9 +1,10 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema'
|
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
appointmentId: z.number().int(),
|
appointmentId: z.number().int(),
|
||||||
@@ -14,7 +15,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,9 +1,10 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema'
|
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
appointmentId: z.number().int(),
|
appointmentId: z.number().int(),
|
||||||
@@ -14,7 +15,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,11 +1,12 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema';
|
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema';
|
||||||
import { PatientCreateNestedOneWithoutProceduresInputObjectSchema as PatientCreateNestedOneWithoutProceduresInputObjectSchema } from './PatientCreateNestedOneWithoutProceduresInput.schema';
|
import { PatientCreateNestedOneWithoutProceduresInputObjectSchema as PatientCreateNestedOneWithoutProceduresInputObjectSchema } from './PatientCreateNestedOneWithoutProceduresInput.schema';
|
||||||
import { NpiProviderCreateNestedOneWithoutAppointmentProceduresInputObjectSchema as NpiProviderCreateNestedOneWithoutAppointmentProceduresInputObjectSchema } from './NpiProviderCreateNestedOneWithoutAppointmentProceduresInput.schema'
|
import { NpiProviderCreateNestedOneWithoutAppointmentProceduresInputObjectSchema as NpiProviderCreateNestedOneWithoutAppointmentProceduresInputObjectSchema } from './NpiProviderCreateNestedOneWithoutAppointmentProceduresInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
procedureCode: z.string(),
|
procedureCode: z.string(),
|
||||||
procedureLabel: z.string().optional().nullable(),
|
procedureLabel: z.string().optional().nullable(),
|
||||||
@@ -13,7 +14,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,11 +1,12 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema';
|
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema';
|
||||||
import { AppointmentCreateNestedOneWithoutProceduresInputObjectSchema as AppointmentCreateNestedOneWithoutProceduresInputObjectSchema } from './AppointmentCreateNestedOneWithoutProceduresInput.schema';
|
import { AppointmentCreateNestedOneWithoutProceduresInputObjectSchema as AppointmentCreateNestedOneWithoutProceduresInputObjectSchema } from './AppointmentCreateNestedOneWithoutProceduresInput.schema';
|
||||||
import { PatientCreateNestedOneWithoutProceduresInputObjectSchema as PatientCreateNestedOneWithoutProceduresInputObjectSchema } from './PatientCreateNestedOneWithoutProceduresInput.schema'
|
import { PatientCreateNestedOneWithoutProceduresInputObjectSchema as PatientCreateNestedOneWithoutProceduresInputObjectSchema } from './PatientCreateNestedOneWithoutProceduresInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
procedureCode: z.string(),
|
procedureCode: z.string(),
|
||||||
procedureLabel: z.string().optional().nullable(),
|
procedureLabel: z.string().optional().nullable(),
|
||||||
@@ -13,7 +14,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,11 +1,12 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema';
|
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema';
|
||||||
import { AppointmentCreateNestedOneWithoutProceduresInputObjectSchema as AppointmentCreateNestedOneWithoutProceduresInputObjectSchema } from './AppointmentCreateNestedOneWithoutProceduresInput.schema';
|
import { AppointmentCreateNestedOneWithoutProceduresInputObjectSchema as AppointmentCreateNestedOneWithoutProceduresInputObjectSchema } from './AppointmentCreateNestedOneWithoutProceduresInput.schema';
|
||||||
import { NpiProviderCreateNestedOneWithoutAppointmentProceduresInputObjectSchema as NpiProviderCreateNestedOneWithoutAppointmentProceduresInputObjectSchema } from './NpiProviderCreateNestedOneWithoutAppointmentProceduresInput.schema'
|
import { NpiProviderCreateNestedOneWithoutAppointmentProceduresInputObjectSchema as NpiProviderCreateNestedOneWithoutAppointmentProceduresInputObjectSchema } from './NpiProviderCreateNestedOneWithoutAppointmentProceduresInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
procedureCode: z.string(),
|
procedureCode: z.string(),
|
||||||
procedureLabel: z.string().optional().nullable(),
|
procedureLabel: z.string().optional().nullable(),
|
||||||
@@ -13,7 +14,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFilterObjectSchema as IntFilterObjectSchema } from './IntFilter.schema';
|
import { IntFilterObjectSchema as IntFilterObjectSchema } from './IntFilter.schema';
|
||||||
import { IntNullableFilterObjectSchema as IntNullableFilterObjectSchema } from './IntNullableFilter.schema';
|
import { IntNullableFilterObjectSchema as IntNullableFilterObjectSchema } from './IntNullableFilter.schema';
|
||||||
import { StringFilterObjectSchema as StringFilterObjectSchema } from './StringFilter.schema';
|
import { StringFilterObjectSchema as StringFilterObjectSchema } from './StringFilter.schema';
|
||||||
@@ -11,6 +10,8 @@ import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema';
|
|||||||
import { DateTimeFilterObjectSchema as DateTimeFilterObjectSchema } from './DateTimeFilter.schema'
|
import { DateTimeFilterObjectSchema as DateTimeFilterObjectSchema } from './DateTimeFilter.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const appointmentprocedurescalarwhereinputSchema = z.object({
|
const appointmentprocedurescalarwhereinputSchema = z.object({
|
||||||
AND: z.union([z.lazy(() => AppointmentProcedureScalarWhereInputObjectSchema), z.lazy(() => AppointmentProcedureScalarWhereInputObjectSchema).array()]).optional(),
|
AND: z.union([z.lazy(() => AppointmentProcedureScalarWhereInputObjectSchema), z.lazy(() => AppointmentProcedureScalarWhereInputObjectSchema).array()]).optional(),
|
||||||
OR: z.lazy(() => AppointmentProcedureScalarWhereInputObjectSchema).array().optional(),
|
OR: z.lazy(() => AppointmentProcedureScalarWhereInputObjectSchema).array().optional(),
|
||||||
@@ -25,7 +26,7 @@ const appointmentprocedurescalarwhereinputSchema = z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntWithAggregatesFilterObjectSchema as IntWithAggregatesFilterObjectSchema } from './IntWithAggregatesFilter.schema';
|
import { IntWithAggregatesFilterObjectSchema as IntWithAggregatesFilterObjectSchema } from './IntWithAggregatesFilter.schema';
|
||||||
import { IntNullableWithAggregatesFilterObjectSchema as IntNullableWithAggregatesFilterObjectSchema } from './IntNullableWithAggregatesFilter.schema';
|
import { IntNullableWithAggregatesFilterObjectSchema as IntNullableWithAggregatesFilterObjectSchema } from './IntNullableWithAggregatesFilter.schema';
|
||||||
import { StringWithAggregatesFilterObjectSchema as StringWithAggregatesFilterObjectSchema } from './StringWithAggregatesFilter.schema';
|
import { StringWithAggregatesFilterObjectSchema as StringWithAggregatesFilterObjectSchema } from './StringWithAggregatesFilter.schema';
|
||||||
@@ -11,6 +10,8 @@ import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema';
|
|||||||
import { DateTimeWithAggregatesFilterObjectSchema as DateTimeWithAggregatesFilterObjectSchema } from './DateTimeWithAggregatesFilter.schema'
|
import { DateTimeWithAggregatesFilterObjectSchema as DateTimeWithAggregatesFilterObjectSchema } from './DateTimeWithAggregatesFilter.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const appointmentprocedurescalarwherewithaggregatesinputSchema = z.object({
|
const appointmentprocedurescalarwherewithaggregatesinputSchema = z.object({
|
||||||
AND: z.union([z.lazy(() => AppointmentProcedureScalarWhereWithAggregatesInputObjectSchema), z.lazy(() => AppointmentProcedureScalarWhereWithAggregatesInputObjectSchema).array()]).optional(),
|
AND: z.union([z.lazy(() => AppointmentProcedureScalarWhereWithAggregatesInputObjectSchema), z.lazy(() => AppointmentProcedureScalarWhereWithAggregatesInputObjectSchema).array()]).optional(),
|
||||||
OR: z.lazy(() => AppointmentProcedureScalarWhereWithAggregatesInputObjectSchema).array().optional(),
|
OR: z.lazy(() => AppointmentProcedureScalarWhereWithAggregatesInputObjectSchema).array().optional(),
|
||||||
@@ -25,7 +26,7 @@ const appointmentprocedurescalarwherewithaggregatesinputSchema = z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,9 +1,10 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema'
|
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
appointmentId: z.number().int(),
|
appointmentId: z.number().int(),
|
||||||
@@ -15,7 +16,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,9 +1,10 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema'
|
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
patientId: z.number().int(),
|
patientId: z.number().int(),
|
||||||
@@ -14,7 +15,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,9 +1,10 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema'
|
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
appointmentId: z.number().int(),
|
appointmentId: z.number().int(),
|
||||||
@@ -14,7 +15,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,9 +1,10 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema'
|
import { ProcedureSourceSchema } from '../enums/ProcedureSource.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
appointmentId: z.number().int(),
|
appointmentId: z.number().int(),
|
||||||
@@ -14,7 +15,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { NullableIntFieldUpdateOperationsInputObjectSchema as NullableIntFieldUpdateOperationsInputObjectSchema } from './NullableIntFieldUpdateOperationsInput.schema';
|
import { NullableIntFieldUpdateOperationsInputObjectSchema as NullableIntFieldUpdateOperationsInputObjectSchema } from './NullableIntFieldUpdateOperationsInput.schema';
|
||||||
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
||||||
@@ -11,6 +10,8 @@ import { EnumProcedureSourceFieldUpdateOperationsInputObjectSchema as EnumProced
|
|||||||
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
appointmentId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
appointmentId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
@@ -22,7 +23,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { NullableIntFieldUpdateOperationsInputObjectSchema as NullableIntFieldUpdateOperationsInputObjectSchema } from './NullableIntFieldUpdateOperationsInput.schema';
|
import { NullableIntFieldUpdateOperationsInputObjectSchema as NullableIntFieldUpdateOperationsInputObjectSchema } from './NullableIntFieldUpdateOperationsInput.schema';
|
||||||
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
||||||
@@ -11,6 +10,8 @@ import { EnumProcedureSourceFieldUpdateOperationsInputObjectSchema as EnumProced
|
|||||||
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
appointmentId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
appointmentId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
@@ -22,7 +23,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { NullableIntFieldUpdateOperationsInputObjectSchema as NullableIntFieldUpdateOperationsInputObjectSchema } from './NullableIntFieldUpdateOperationsInput.schema';
|
import { NullableIntFieldUpdateOperationsInputObjectSchema as NullableIntFieldUpdateOperationsInputObjectSchema } from './NullableIntFieldUpdateOperationsInput.schema';
|
||||||
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
||||||
@@ -11,6 +10,8 @@ import { EnumProcedureSourceFieldUpdateOperationsInputObjectSchema as EnumProced
|
|||||||
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
patientId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
patientId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
@@ -21,7 +22,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
||||||
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
||||||
@@ -10,6 +9,8 @@ import { EnumProcedureSourceFieldUpdateOperationsInputObjectSchema as EnumProced
|
|||||||
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
appointmentId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
appointmentId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
@@ -20,7 +21,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { NullableIntFieldUpdateOperationsInputObjectSchema as NullableIntFieldUpdateOperationsInputObjectSchema } from './NullableIntFieldUpdateOperationsInput.schema';
|
import { NullableIntFieldUpdateOperationsInputObjectSchema as NullableIntFieldUpdateOperationsInputObjectSchema } from './NullableIntFieldUpdateOperationsInput.schema';
|
||||||
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
||||||
@@ -11,6 +10,8 @@ import { EnumProcedureSourceFieldUpdateOperationsInputObjectSchema as EnumProced
|
|||||||
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
appointmentId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
appointmentId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
@@ -21,7 +22,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { NullableIntFieldUpdateOperationsInputObjectSchema as NullableIntFieldUpdateOperationsInputObjectSchema } from './NullableIntFieldUpdateOperationsInput.schema';
|
import { NullableIntFieldUpdateOperationsInputObjectSchema as NullableIntFieldUpdateOperationsInputObjectSchema } from './NullableIntFieldUpdateOperationsInput.schema';
|
||||||
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
||||||
@@ -11,6 +10,8 @@ import { EnumProcedureSourceFieldUpdateOperationsInputObjectSchema as EnumProced
|
|||||||
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
patientId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
patientId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
@@ -21,7 +22,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
||||||
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
||||||
@@ -10,6 +9,8 @@ import { EnumProcedureSourceFieldUpdateOperationsInputObjectSchema as EnumProced
|
|||||||
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
appointmentId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
appointmentId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
@@ -20,7 +21,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { NullableIntFieldUpdateOperationsInputObjectSchema as NullableIntFieldUpdateOperationsInputObjectSchema } from './NullableIntFieldUpdateOperationsInput.schema';
|
import { NullableIntFieldUpdateOperationsInputObjectSchema as NullableIntFieldUpdateOperationsInputObjectSchema } from './NullableIntFieldUpdateOperationsInput.schema';
|
||||||
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
||||||
@@ -11,6 +10,8 @@ import { EnumProcedureSourceFieldUpdateOperationsInputObjectSchema as EnumProced
|
|||||||
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
appointmentId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
appointmentId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
@@ -21,7 +22,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
||||||
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
||||||
import { NullableDecimalFieldUpdateOperationsInputObjectSchema as NullableDecimalFieldUpdateOperationsInputObjectSchema } from './NullableDecimalFieldUpdateOperationsInput.schema';
|
import { NullableDecimalFieldUpdateOperationsInputObjectSchema as NullableDecimalFieldUpdateOperationsInputObjectSchema } from './NullableDecimalFieldUpdateOperationsInput.schema';
|
||||||
@@ -12,6 +11,8 @@ import { PatientUpdateOneRequiredWithoutProceduresNestedInputObjectSchema as Pat
|
|||||||
import { NpiProviderUpdateOneWithoutAppointmentProceduresNestedInputObjectSchema as NpiProviderUpdateOneWithoutAppointmentProceduresNestedInputObjectSchema } from './NpiProviderUpdateOneWithoutAppointmentProceduresNestedInput.schema'
|
import { NpiProviderUpdateOneWithoutAppointmentProceduresNestedInputObjectSchema as NpiProviderUpdateOneWithoutAppointmentProceduresNestedInputObjectSchema } from './NpiProviderUpdateOneWithoutAppointmentProceduresNestedInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
procedureCode: z.union([z.string(), z.lazy(() => StringFieldUpdateOperationsInputObjectSchema)]).optional(),
|
procedureCode: z.union([z.string(), z.lazy(() => StringFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
procedureLabel: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
|
procedureLabel: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
|
||||||
@@ -19,7 +20,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
||||||
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
||||||
import { NullableDecimalFieldUpdateOperationsInputObjectSchema as NullableDecimalFieldUpdateOperationsInputObjectSchema } from './NullableDecimalFieldUpdateOperationsInput.schema';
|
import { NullableDecimalFieldUpdateOperationsInputObjectSchema as NullableDecimalFieldUpdateOperationsInputObjectSchema } from './NullableDecimalFieldUpdateOperationsInput.schema';
|
||||||
@@ -9,6 +8,8 @@ import { EnumProcedureSourceFieldUpdateOperationsInputObjectSchema as EnumProced
|
|||||||
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
procedureCode: z.union([z.string(), z.lazy(() => StringFieldUpdateOperationsInputObjectSchema)]).optional(),
|
procedureCode: z.union([z.string(), z.lazy(() => StringFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
procedureLabel: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
|
procedureLabel: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
|
||||||
@@ -16,7 +17,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
||||||
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
||||||
import { NullableDecimalFieldUpdateOperationsInputObjectSchema as NullableDecimalFieldUpdateOperationsInputObjectSchema } from './NullableDecimalFieldUpdateOperationsInput.schema';
|
import { NullableDecimalFieldUpdateOperationsInputObjectSchema as NullableDecimalFieldUpdateOperationsInputObjectSchema } from './NullableDecimalFieldUpdateOperationsInput.schema';
|
||||||
@@ -11,6 +10,8 @@ import { PatientUpdateOneRequiredWithoutProceduresNestedInputObjectSchema as Pat
|
|||||||
import { NpiProviderUpdateOneWithoutAppointmentProceduresNestedInputObjectSchema as NpiProviderUpdateOneWithoutAppointmentProceduresNestedInputObjectSchema } from './NpiProviderUpdateOneWithoutAppointmentProceduresNestedInput.schema'
|
import { NpiProviderUpdateOneWithoutAppointmentProceduresNestedInputObjectSchema as NpiProviderUpdateOneWithoutAppointmentProceduresNestedInputObjectSchema } from './NpiProviderUpdateOneWithoutAppointmentProceduresNestedInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
procedureCode: z.union([z.string(), z.lazy(() => StringFieldUpdateOperationsInputObjectSchema)]).optional(),
|
procedureCode: z.union([z.string(), z.lazy(() => StringFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
procedureLabel: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
|
procedureLabel: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
|
||||||
@@ -18,7 +19,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
||||||
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
||||||
import { NullableDecimalFieldUpdateOperationsInputObjectSchema as NullableDecimalFieldUpdateOperationsInputObjectSchema } from './NullableDecimalFieldUpdateOperationsInput.schema';
|
import { NullableDecimalFieldUpdateOperationsInputObjectSchema as NullableDecimalFieldUpdateOperationsInputObjectSchema } from './NullableDecimalFieldUpdateOperationsInput.schema';
|
||||||
@@ -11,6 +10,8 @@ import { AppointmentUpdateOneRequiredWithoutProceduresNestedInputObjectSchema as
|
|||||||
import { PatientUpdateOneRequiredWithoutProceduresNestedInputObjectSchema as PatientUpdateOneRequiredWithoutProceduresNestedInputObjectSchema } from './PatientUpdateOneRequiredWithoutProceduresNestedInput.schema'
|
import { PatientUpdateOneRequiredWithoutProceduresNestedInputObjectSchema as PatientUpdateOneRequiredWithoutProceduresNestedInputObjectSchema } from './PatientUpdateOneRequiredWithoutProceduresNestedInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
procedureCode: z.union([z.string(), z.lazy(() => StringFieldUpdateOperationsInputObjectSchema)]).optional(),
|
procedureCode: z.union([z.string(), z.lazy(() => StringFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
procedureLabel: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
|
procedureLabel: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
|
||||||
@@ -18,7 +19,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
import { StringFieldUpdateOperationsInputObjectSchema as StringFieldUpdateOperationsInputObjectSchema } from './StringFieldUpdateOperationsInput.schema';
|
||||||
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
||||||
import { NullableDecimalFieldUpdateOperationsInputObjectSchema as NullableDecimalFieldUpdateOperationsInputObjectSchema } from './NullableDecimalFieldUpdateOperationsInput.schema';
|
import { NullableDecimalFieldUpdateOperationsInputObjectSchema as NullableDecimalFieldUpdateOperationsInputObjectSchema } from './NullableDecimalFieldUpdateOperationsInput.schema';
|
||||||
@@ -11,6 +10,8 @@ import { AppointmentUpdateOneRequiredWithoutProceduresNestedInputObjectSchema as
|
|||||||
import { NpiProviderUpdateOneWithoutAppointmentProceduresNestedInputObjectSchema as NpiProviderUpdateOneWithoutAppointmentProceduresNestedInputObjectSchema } from './NpiProviderUpdateOneWithoutAppointmentProceduresNestedInput.schema'
|
import { NpiProviderUpdateOneWithoutAppointmentProceduresNestedInputObjectSchema as NpiProviderUpdateOneWithoutAppointmentProceduresNestedInputObjectSchema } from './NpiProviderUpdateOneWithoutAppointmentProceduresNestedInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
procedureCode: z.union([z.string(), z.lazy(() => StringFieldUpdateOperationsInputObjectSchema)]).optional(),
|
procedureCode: z.union([z.string(), z.lazy(() => StringFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
procedureLabel: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
|
procedureLabel: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
|
||||||
@@ -18,7 +19,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFilterObjectSchema as IntFilterObjectSchema } from './IntFilter.schema';
|
import { IntFilterObjectSchema as IntFilterObjectSchema } from './IntFilter.schema';
|
||||||
import { IntNullableFilterObjectSchema as IntNullableFilterObjectSchema } from './IntNullableFilter.schema';
|
import { IntNullableFilterObjectSchema as IntNullableFilterObjectSchema } from './IntNullableFilter.schema';
|
||||||
import { StringFilterObjectSchema as StringFilterObjectSchema } from './StringFilter.schema';
|
import { StringFilterObjectSchema as StringFilterObjectSchema } from './StringFilter.schema';
|
||||||
@@ -17,6 +16,8 @@ import { NpiProviderNullableScalarRelationFilterObjectSchema as NpiProviderNulla
|
|||||||
import { NpiProviderWhereInputObjectSchema as NpiProviderWhereInputObjectSchema } from './NpiProviderWhereInput.schema'
|
import { NpiProviderWhereInputObjectSchema as NpiProviderWhereInputObjectSchema } from './NpiProviderWhereInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const appointmentprocedurewhereinputSchema = z.object({
|
const appointmentprocedurewhereinputSchema = z.object({
|
||||||
AND: z.union([z.lazy(() => AppointmentProcedureWhereInputObjectSchema), z.lazy(() => AppointmentProcedureWhereInputObjectSchema).array()]).optional(),
|
AND: z.union([z.lazy(() => AppointmentProcedureWhereInputObjectSchema), z.lazy(() => AppointmentProcedureWhereInputObjectSchema).array()]).optional(),
|
||||||
OR: z.lazy(() => AppointmentProcedureWhereInputObjectSchema).array().optional(),
|
OR: z.lazy(() => AppointmentProcedureWhereInputObjectSchema).array().optional(),
|
||||||
@@ -31,7 +32,7 @@ const appointmentprocedurewhereinputSchema = z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'fee' must be a Decimal",
|
message: "Field 'fee' must be a Decimal",
|
||||||
|
|||||||
@@ -1,16 +1,17 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { NpiProviderCreateNestedOneWithoutCommissionBatchesInputObjectSchema as NpiProviderCreateNestedOneWithoutCommissionBatchesInputObjectSchema } from './NpiProviderCreateNestedOneWithoutCommissionBatchesInput.schema';
|
import { NpiProviderCreateNestedOneWithoutCommissionBatchesInputObjectSchema as NpiProviderCreateNestedOneWithoutCommissionBatchesInputObjectSchema } from './NpiProviderCreateNestedOneWithoutCommissionBatchesInput.schema';
|
||||||
import { CommissionBatchItemCreateNestedManyWithoutCommissionBatchInputObjectSchema as CommissionBatchItemCreateNestedManyWithoutCommissionBatchInputObjectSchema } from './CommissionBatchItemCreateNestedManyWithoutCommissionBatchInput.schema'
|
import { CommissionBatchItemCreateNestedManyWithoutCommissionBatchInputObjectSchema as CommissionBatchItemCreateNestedManyWithoutCommissionBatchInputObjectSchema } from './CommissionBatchItemCreateNestedManyWithoutCommissionBatchInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
totalCollection: z.union([
|
totalCollection: z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -19,7 +20,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
|
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
npiProviderId: z.number().int(),
|
npiProviderId: z.number().int(),
|
||||||
@@ -11,7 +11,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -20,7 +20,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
+5
-5
@@ -1,16 +1,16 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
|
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
totalCollection: z.union([
|
totalCollection: z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -19,7 +19,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { NpiProviderCreateNestedOneWithoutCommissionBatchesInputObjectSchema as NpiProviderCreateNestedOneWithoutCommissionBatchesInputObjectSchema } from './NpiProviderCreateNestedOneWithoutCommissionBatchesInput.schema'
|
import { NpiProviderCreateNestedOneWithoutCommissionBatchesInputObjectSchema as NpiProviderCreateNestedOneWithoutCommissionBatchesInputObjectSchema } from './NpiProviderCreateNestedOneWithoutCommissionBatchesInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
totalCollection: z.union([
|
totalCollection: z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -18,7 +19,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
+5
-4
@@ -1,15 +1,16 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { CommissionBatchItemCreateNestedManyWithoutCommissionBatchInputObjectSchema as CommissionBatchItemCreateNestedManyWithoutCommissionBatchInputObjectSchema } from './CommissionBatchItemCreateNestedManyWithoutCommissionBatchInput.schema'
|
import { CommissionBatchItemCreateNestedManyWithoutCommissionBatchInputObjectSchema as CommissionBatchItemCreateNestedManyWithoutCommissionBatchInputObjectSchema } from './CommissionBatchItemCreateNestedManyWithoutCommissionBatchInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
totalCollection: z.union([
|
totalCollection: z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -18,7 +19,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
@@ -1,16 +1,17 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { CommissionBatchCreateNestedOneWithoutItemsInputObjectSchema as CommissionBatchCreateNestedOneWithoutItemsInputObjectSchema } from './CommissionBatchCreateNestedOneWithoutItemsInput.schema';
|
import { CommissionBatchCreateNestedOneWithoutItemsInputObjectSchema as CommissionBatchCreateNestedOneWithoutItemsInputObjectSchema } from './CommissionBatchCreateNestedOneWithoutItemsInput.schema';
|
||||||
import { PaymentCreateNestedOneWithoutCommissionBatchItemsInputObjectSchema as PaymentCreateNestedOneWithoutCommissionBatchItemsInputObjectSchema } from './PaymentCreateNestedOneWithoutCommissionBatchItemsInput.schema'
|
import { PaymentCreateNestedOneWithoutCommissionBatchItemsInputObjectSchema as PaymentCreateNestedOneWithoutCommissionBatchItemsInputObjectSchema } from './PaymentCreateNestedOneWithoutCommissionBatchItemsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
collectionAmount: z.union([
|
collectionAmount: z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
+4
-4
@@ -1,9 +1,9 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
|
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
paymentId: z.number().int(),
|
paymentId: z.number().int(),
|
||||||
@@ -11,7 +11,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
|
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
commissionBatchId: z.number().int(),
|
commissionBatchId: z.number().int(),
|
||||||
@@ -12,7 +12,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
+4
-4
@@ -1,9 +1,9 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
|
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
commissionBatchId: z.number().int(),
|
commissionBatchId: z.number().int(),
|
||||||
@@ -11,7 +11,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,15 +1,16 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { PaymentCreateNestedOneWithoutCommissionBatchItemsInputObjectSchema as PaymentCreateNestedOneWithoutCommissionBatchItemsInputObjectSchema } from './PaymentCreateNestedOneWithoutCommissionBatchItemsInput.schema'
|
import { PaymentCreateNestedOneWithoutCommissionBatchItemsInputObjectSchema as PaymentCreateNestedOneWithoutCommissionBatchItemsInputObjectSchema } from './PaymentCreateNestedOneWithoutCommissionBatchItemsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
collectionAmount: z.union([
|
collectionAmount: z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,15 +1,16 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { CommissionBatchCreateNestedOneWithoutItemsInputObjectSchema as CommissionBatchCreateNestedOneWithoutItemsInputObjectSchema } from './CommissionBatchCreateNestedOneWithoutItemsInput.schema'
|
import { CommissionBatchCreateNestedOneWithoutItemsInputObjectSchema as CommissionBatchCreateNestedOneWithoutItemsInputObjectSchema } from './CommissionBatchCreateNestedOneWithoutItemsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
collectionAmount: z.union([
|
collectionAmount: z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFilterObjectSchema as IntFilterObjectSchema } from './IntFilter.schema';
|
import { IntFilterObjectSchema as IntFilterObjectSchema } from './IntFilter.schema';
|
||||||
import { DecimalFilterObjectSchema as DecimalFilterObjectSchema } from './DecimalFilter.schema'
|
import { DecimalFilterObjectSchema as DecimalFilterObjectSchema } from './DecimalFilter.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const commissionbatchitemscalarwhereinputSchema = z.object({
|
const commissionbatchitemscalarwhereinputSchema = z.object({
|
||||||
AND: z.union([z.lazy(() => CommissionBatchItemScalarWhereInputObjectSchema), z.lazy(() => CommissionBatchItemScalarWhereInputObjectSchema).array()]).optional(),
|
AND: z.union([z.lazy(() => CommissionBatchItemScalarWhereInputObjectSchema), z.lazy(() => CommissionBatchItemScalarWhereInputObjectSchema).array()]).optional(),
|
||||||
OR: z.lazy(() => CommissionBatchItemScalarWhereInputObjectSchema).array().optional(),
|
OR: z.lazy(() => CommissionBatchItemScalarWhereInputObjectSchema).array().optional(),
|
||||||
@@ -16,7 +17,7 @@ const commissionbatchitemscalarwhereinputSchema = z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,10 +1,11 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntWithAggregatesFilterObjectSchema as IntWithAggregatesFilterObjectSchema } from './IntWithAggregatesFilter.schema';
|
import { IntWithAggregatesFilterObjectSchema as IntWithAggregatesFilterObjectSchema } from './IntWithAggregatesFilter.schema';
|
||||||
import { DecimalWithAggregatesFilterObjectSchema as DecimalWithAggregatesFilterObjectSchema } from './DecimalWithAggregatesFilter.schema'
|
import { DecimalWithAggregatesFilterObjectSchema as DecimalWithAggregatesFilterObjectSchema } from './DecimalWithAggregatesFilter.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const commissionbatchitemscalarwherewithaggregatesinputSchema = z.object({
|
const commissionbatchitemscalarwherewithaggregatesinputSchema = z.object({
|
||||||
AND: z.union([z.lazy(() => CommissionBatchItemScalarWhereWithAggregatesInputObjectSchema), z.lazy(() => CommissionBatchItemScalarWhereWithAggregatesInputObjectSchema).array()]).optional(),
|
AND: z.union([z.lazy(() => CommissionBatchItemScalarWhereWithAggregatesInputObjectSchema), z.lazy(() => CommissionBatchItemScalarWhereWithAggregatesInputObjectSchema).array()]).optional(),
|
||||||
OR: z.lazy(() => CommissionBatchItemScalarWhereWithAggregatesInputObjectSchema).array().optional(),
|
OR: z.lazy(() => CommissionBatchItemScalarWhereWithAggregatesInputObjectSchema).array().optional(),
|
||||||
@@ -16,7 +17,7 @@ const commissionbatchitemscalarwherewithaggregatesinputSchema = z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
+4
-4
@@ -1,9 +1,9 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
|
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
commissionBatchId: z.number().int(),
|
commissionBatchId: z.number().int(),
|
||||||
@@ -12,7 +12,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
+4
-4
@@ -1,9 +1,9 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
|
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
paymentId: z.number().int(),
|
paymentId: z.number().int(),
|
||||||
@@ -11,7 +11,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
+4
-4
@@ -1,9 +1,9 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
|
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
commissionBatchId: z.number().int(),
|
commissionBatchId: z.number().int(),
|
||||||
@@ -11,7 +11,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,10 +1,11 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema'
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
commissionBatchId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
commissionBatchId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
@@ -13,7 +14,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,10 +1,11 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema'
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
commissionBatchId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
commissionBatchId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
@@ -13,7 +14,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,10 +1,11 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema'
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
paymentId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
paymentId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
@@ -12,7 +13,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,10 +1,11 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema'
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
commissionBatchId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
commissionBatchId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
@@ -12,7 +13,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,10 +1,11 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema'
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
paymentId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
paymentId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
@@ -12,7 +13,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,10 +1,11 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema'
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
commissionBatchId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
commissionBatchId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
@@ -12,7 +13,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
@@ -1,17 +1,18 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
||||||
import { CommissionBatchUpdateOneRequiredWithoutItemsNestedInputObjectSchema as CommissionBatchUpdateOneRequiredWithoutItemsNestedInputObjectSchema } from './CommissionBatchUpdateOneRequiredWithoutItemsNestedInput.schema';
|
import { CommissionBatchUpdateOneRequiredWithoutItemsNestedInputObjectSchema as CommissionBatchUpdateOneRequiredWithoutItemsNestedInputObjectSchema } from './CommissionBatchUpdateOneRequiredWithoutItemsNestedInput.schema';
|
||||||
import { PaymentUpdateOneRequiredWithoutCommissionBatchItemsNestedInputObjectSchema as PaymentUpdateOneRequiredWithoutCommissionBatchItemsNestedInputObjectSchema } from './PaymentUpdateOneRequiredWithoutCommissionBatchItemsNestedInput.schema'
|
import { PaymentUpdateOneRequiredWithoutCommissionBatchItemsNestedInputObjectSchema as PaymentUpdateOneRequiredWithoutCommissionBatchItemsNestedInputObjectSchema } from './PaymentUpdateOneRequiredWithoutCommissionBatchItemsNestedInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
collectionAmount: z.union([z.union([
|
collectionAmount: z.union([z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,15 +1,16 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema'
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
collectionAmount: z.union([z.union([
|
collectionAmount: z.union([z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,16 +1,17 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
||||||
import { PaymentUpdateOneRequiredWithoutCommissionBatchItemsNestedInputObjectSchema as PaymentUpdateOneRequiredWithoutCommissionBatchItemsNestedInputObjectSchema } from './PaymentUpdateOneRequiredWithoutCommissionBatchItemsNestedInput.schema'
|
import { PaymentUpdateOneRequiredWithoutCommissionBatchItemsNestedInputObjectSchema as PaymentUpdateOneRequiredWithoutCommissionBatchItemsNestedInputObjectSchema } from './PaymentUpdateOneRequiredWithoutCommissionBatchItemsNestedInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
collectionAmount: z.union([z.union([
|
collectionAmount: z.union([z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
+4
-3
@@ -1,16 +1,17 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
||||||
import { CommissionBatchUpdateOneRequiredWithoutItemsNestedInputObjectSchema as CommissionBatchUpdateOneRequiredWithoutItemsNestedInputObjectSchema } from './CommissionBatchUpdateOneRequiredWithoutItemsNestedInput.schema'
|
import { CommissionBatchUpdateOneRequiredWithoutItemsNestedInputObjectSchema as CommissionBatchUpdateOneRequiredWithoutItemsNestedInputObjectSchema } from './CommissionBatchUpdateOneRequiredWithoutItemsNestedInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
collectionAmount: z.union([z.union([
|
collectionAmount: z.union([z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFilterObjectSchema as IntFilterObjectSchema } from './IntFilter.schema';
|
import { IntFilterObjectSchema as IntFilterObjectSchema } from './IntFilter.schema';
|
||||||
import { DecimalFilterObjectSchema as DecimalFilterObjectSchema } from './DecimalFilter.schema';
|
import { DecimalFilterObjectSchema as DecimalFilterObjectSchema } from './DecimalFilter.schema';
|
||||||
import { CommissionBatchScalarRelationFilterObjectSchema as CommissionBatchScalarRelationFilterObjectSchema } from './CommissionBatchScalarRelationFilter.schema';
|
import { CommissionBatchScalarRelationFilterObjectSchema as CommissionBatchScalarRelationFilterObjectSchema } from './CommissionBatchScalarRelationFilter.schema';
|
||||||
@@ -9,6 +8,8 @@ import { PaymentScalarRelationFilterObjectSchema as PaymentScalarRelationFilterO
|
|||||||
import { PaymentWhereInputObjectSchema as PaymentWhereInputObjectSchema } from './PaymentWhereInput.schema'
|
import { PaymentWhereInputObjectSchema as PaymentWhereInputObjectSchema } from './PaymentWhereInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const commissionbatchitemwhereinputSchema = z.object({
|
const commissionbatchitemwhereinputSchema = z.object({
|
||||||
AND: z.union([z.lazy(() => CommissionBatchItemWhereInputObjectSchema), z.lazy(() => CommissionBatchItemWhereInputObjectSchema).array()]).optional(),
|
AND: z.union([z.lazy(() => CommissionBatchItemWhereInputObjectSchema), z.lazy(() => CommissionBatchItemWhereInputObjectSchema).array()]).optional(),
|
||||||
OR: z.lazy(() => CommissionBatchItemWhereInputObjectSchema).array().optional(),
|
OR: z.lazy(() => CommissionBatchItemWhereInputObjectSchema).array().optional(),
|
||||||
@@ -20,7 +21,7 @@ const commissionbatchitemwhereinputSchema = z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'collectionAmount' must be a Decimal",
|
message: "Field 'collectionAmount' must be a Decimal",
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFilterObjectSchema as IntFilterObjectSchema } from './IntFilter.schema';
|
import { IntFilterObjectSchema as IntFilterObjectSchema } from './IntFilter.schema';
|
||||||
import { DecimalFilterObjectSchema as DecimalFilterObjectSchema } from './DecimalFilter.schema';
|
import { DecimalFilterObjectSchema as DecimalFilterObjectSchema } from './DecimalFilter.schema';
|
||||||
import { StringNullableFilterObjectSchema as StringNullableFilterObjectSchema } from './StringNullableFilter.schema';
|
import { StringNullableFilterObjectSchema as StringNullableFilterObjectSchema } from './StringNullableFilter.schema';
|
||||||
import { DateTimeFilterObjectSchema as DateTimeFilterObjectSchema } from './DateTimeFilter.schema'
|
import { DateTimeFilterObjectSchema as DateTimeFilterObjectSchema } from './DateTimeFilter.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const commissionbatchscalarwhereinputSchema = z.object({
|
const commissionbatchscalarwhereinputSchema = z.object({
|
||||||
AND: z.union([z.lazy(() => CommissionBatchScalarWhereInputObjectSchema), z.lazy(() => CommissionBatchScalarWhereInputObjectSchema).array()]).optional(),
|
AND: z.union([z.lazy(() => CommissionBatchScalarWhereInputObjectSchema), z.lazy(() => CommissionBatchScalarWhereInputObjectSchema).array()]).optional(),
|
||||||
OR: z.lazy(() => CommissionBatchScalarWhereInputObjectSchema).array().optional(),
|
OR: z.lazy(() => CommissionBatchScalarWhereInputObjectSchema).array().optional(),
|
||||||
@@ -17,7 +18,7 @@ const commissionbatchscalarwhereinputSchema = z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -26,7 +27,7 @@ const commissionbatchscalarwhereinputSchema = z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
+5
-4
@@ -1,12 +1,13 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntWithAggregatesFilterObjectSchema as IntWithAggregatesFilterObjectSchema } from './IntWithAggregatesFilter.schema';
|
import { IntWithAggregatesFilterObjectSchema as IntWithAggregatesFilterObjectSchema } from './IntWithAggregatesFilter.schema';
|
||||||
import { DecimalWithAggregatesFilterObjectSchema as DecimalWithAggregatesFilterObjectSchema } from './DecimalWithAggregatesFilter.schema';
|
import { DecimalWithAggregatesFilterObjectSchema as DecimalWithAggregatesFilterObjectSchema } from './DecimalWithAggregatesFilter.schema';
|
||||||
import { StringNullableWithAggregatesFilterObjectSchema as StringNullableWithAggregatesFilterObjectSchema } from './StringNullableWithAggregatesFilter.schema';
|
import { StringNullableWithAggregatesFilterObjectSchema as StringNullableWithAggregatesFilterObjectSchema } from './StringNullableWithAggregatesFilter.schema';
|
||||||
import { DateTimeWithAggregatesFilterObjectSchema as DateTimeWithAggregatesFilterObjectSchema } from './DateTimeWithAggregatesFilter.schema'
|
import { DateTimeWithAggregatesFilterObjectSchema as DateTimeWithAggregatesFilterObjectSchema } from './DateTimeWithAggregatesFilter.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const commissionbatchscalarwherewithaggregatesinputSchema = z.object({
|
const commissionbatchscalarwherewithaggregatesinputSchema = z.object({
|
||||||
AND: z.union([z.lazy(() => CommissionBatchScalarWhereWithAggregatesInputObjectSchema), z.lazy(() => CommissionBatchScalarWhereWithAggregatesInputObjectSchema).array()]).optional(),
|
AND: z.union([z.lazy(() => CommissionBatchScalarWhereWithAggregatesInputObjectSchema), z.lazy(() => CommissionBatchScalarWhereWithAggregatesInputObjectSchema).array()]).optional(),
|
||||||
OR: z.lazy(() => CommissionBatchScalarWhereWithAggregatesInputObjectSchema).array().optional(),
|
OR: z.lazy(() => CommissionBatchScalarWhereWithAggregatesInputObjectSchema).array().optional(),
|
||||||
@@ -17,7 +18,7 @@ const commissionbatchscalarwherewithaggregatesinputSchema = z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -26,7 +27,7 @@ const commissionbatchscalarwherewithaggregatesinputSchema = z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { CommissionBatchItemUncheckedCreateNestedManyWithoutCommissionBatchInputObjectSchema as CommissionBatchItemUncheckedCreateNestedManyWithoutCommissionBatchInputObjectSchema } from './CommissionBatchItemUncheckedCreateNestedManyWithoutCommissionBatchInput.schema'
|
import { CommissionBatchItemUncheckedCreateNestedManyWithoutCommissionBatchInputObjectSchema as CommissionBatchItemUncheckedCreateNestedManyWithoutCommissionBatchInputObjectSchema } from './CommissionBatchItemUncheckedCreateNestedManyWithoutCommissionBatchInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
npiProviderId: z.number().int(),
|
npiProviderId: z.number().int(),
|
||||||
@@ -11,7 +12,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -20,7 +21,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
+5
-5
@@ -1,9 +1,9 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
|
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
npiProviderId: z.number().int(),
|
npiProviderId: z.number().int(),
|
||||||
@@ -11,7 +11,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -20,7 +20,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
+5
-4
@@ -1,16 +1,17 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { CommissionBatchItemUncheckedCreateNestedManyWithoutCommissionBatchInputObjectSchema as CommissionBatchItemUncheckedCreateNestedManyWithoutCommissionBatchInputObjectSchema } from './CommissionBatchItemUncheckedCreateNestedManyWithoutCommissionBatchInput.schema'
|
import { CommissionBatchItemUncheckedCreateNestedManyWithoutCommissionBatchInputObjectSchema as CommissionBatchItemUncheckedCreateNestedManyWithoutCommissionBatchInputObjectSchema } from './CommissionBatchItemUncheckedCreateNestedManyWithoutCommissionBatchInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.number().int().optional(),
|
id: z.number().int().optional(),
|
||||||
totalCollection: z.union([
|
totalCollection: z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -19,7 +20,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
||||||
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
||||||
@@ -8,6 +7,8 @@ import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOp
|
|||||||
import { CommissionBatchItemUncheckedUpdateManyWithoutCommissionBatchNestedInputObjectSchema as CommissionBatchItemUncheckedUpdateManyWithoutCommissionBatchNestedInputObjectSchema } from './CommissionBatchItemUncheckedUpdateManyWithoutCommissionBatchNestedInput.schema'
|
import { CommissionBatchItemUncheckedUpdateManyWithoutCommissionBatchNestedInputObjectSchema as CommissionBatchItemUncheckedUpdateManyWithoutCommissionBatchNestedInputObjectSchema } from './CommissionBatchItemUncheckedUpdateManyWithoutCommissionBatchNestedInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
npiProviderId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
npiProviderId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
@@ -15,7 +16,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -24,7 +25,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
+5
-4
@@ -1,12 +1,13 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
||||||
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
||||||
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
npiProviderId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
npiProviderId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
@@ -14,7 +15,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -23,7 +24,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
+5
-4
@@ -1,19 +1,20 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
||||||
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
||||||
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
totalCollection: z.union([z.union([
|
totalCollection: z.union([z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -22,7 +23,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
+5
-4
@@ -1,12 +1,13 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
||||||
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
||||||
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
npiProviderId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
npiProviderId: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
@@ -14,7 +15,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -23,7 +24,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
+5
-4
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
import { IntFieldUpdateOperationsInputObjectSchema as IntFieldUpdateOperationsInputObjectSchema } from './IntFieldUpdateOperationsInput.schema';
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
||||||
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
||||||
@@ -8,13 +7,15 @@ import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOp
|
|||||||
import { CommissionBatchItemUncheckedUpdateManyWithoutCommissionBatchNestedInputObjectSchema as CommissionBatchItemUncheckedUpdateManyWithoutCommissionBatchNestedInputObjectSchema } from './CommissionBatchItemUncheckedUpdateManyWithoutCommissionBatchNestedInput.schema'
|
import { CommissionBatchItemUncheckedUpdateManyWithoutCommissionBatchNestedInputObjectSchema as CommissionBatchItemUncheckedUpdateManyWithoutCommissionBatchNestedInputObjectSchema } from './CommissionBatchItemUncheckedUpdateManyWithoutCommissionBatchNestedInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
id: z.union([z.number().int(), z.lazy(() => IntFieldUpdateOperationsInputObjectSchema)]).optional(),
|
||||||
totalCollection: z.union([z.union([
|
totalCollection: z.union([z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -23,7 +24,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
||||||
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
||||||
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema';
|
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema';
|
||||||
@@ -8,12 +7,14 @@ import { NpiProviderUpdateOneRequiredWithoutCommissionBatchesNestedInputObjectSc
|
|||||||
import { CommissionBatchItemUpdateManyWithoutCommissionBatchNestedInputObjectSchema as CommissionBatchItemUpdateManyWithoutCommissionBatchNestedInputObjectSchema } from './CommissionBatchItemUpdateManyWithoutCommissionBatchNestedInput.schema'
|
import { CommissionBatchItemUpdateManyWithoutCommissionBatchNestedInputObjectSchema as CommissionBatchItemUpdateManyWithoutCommissionBatchNestedInputObjectSchema } from './CommissionBatchItemUpdateManyWithoutCommissionBatchNestedInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
totalCollection: z.union([z.union([
|
totalCollection: z.union([z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -22,7 +23,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
@@ -1,17 +1,18 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
||||||
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
||||||
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
totalCollection: z.union([z.union([
|
totalCollection: z.union([z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -20,7 +21,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
@@ -1,18 +1,19 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
||||||
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
||||||
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema';
|
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema';
|
||||||
import { NpiProviderUpdateOneRequiredWithoutCommissionBatchesNestedInputObjectSchema as NpiProviderUpdateOneRequiredWithoutCommissionBatchesNestedInputObjectSchema } from './NpiProviderUpdateOneRequiredWithoutCommissionBatchesNestedInput.schema'
|
import { NpiProviderUpdateOneRequiredWithoutCommissionBatchesNestedInputObjectSchema as NpiProviderUpdateOneRequiredWithoutCommissionBatchesNestedInputObjectSchema } from './NpiProviderUpdateOneRequiredWithoutCommissionBatchesNestedInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
totalCollection: z.union([z.union([
|
totalCollection: z.union([z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -21,7 +22,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
+5
-4
@@ -1,18 +1,19 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
import { DecimalFieldUpdateOperationsInputObjectSchema as DecimalFieldUpdateOperationsInputObjectSchema } from './DecimalFieldUpdateOperationsInput.schema';
|
||||||
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
import { NullableStringFieldUpdateOperationsInputObjectSchema as NullableStringFieldUpdateOperationsInputObjectSchema } from './NullableStringFieldUpdateOperationsInput.schema';
|
||||||
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema';
|
import { DateTimeFieldUpdateOperationsInputObjectSchema as DateTimeFieldUpdateOperationsInputObjectSchema } from './DateTimeFieldUpdateOperationsInput.schema';
|
||||||
import { CommissionBatchItemUpdateManyWithoutCommissionBatchNestedInputObjectSchema as CommissionBatchItemUpdateManyWithoutCommissionBatchNestedInputObjectSchema } from './CommissionBatchItemUpdateManyWithoutCommissionBatchNestedInput.schema'
|
import { CommissionBatchItemUpdateManyWithoutCommissionBatchNestedInputObjectSchema as CommissionBatchItemUpdateManyWithoutCommissionBatchNestedInputObjectSchema } from './CommissionBatchItemUpdateManyWithoutCommissionBatchNestedInput.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
totalCollection: z.union([z.union([
|
totalCollection: z.union([z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -21,7 +22,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { IntFilterObjectSchema as IntFilterObjectSchema } from './IntFilter.schema';
|
import { IntFilterObjectSchema as IntFilterObjectSchema } from './IntFilter.schema';
|
||||||
import { DecimalFilterObjectSchema as DecimalFilterObjectSchema } from './DecimalFilter.schema';
|
import { DecimalFilterObjectSchema as DecimalFilterObjectSchema } from './DecimalFilter.schema';
|
||||||
import { StringNullableFilterObjectSchema as StringNullableFilterObjectSchema } from './StringNullableFilter.schema';
|
import { StringNullableFilterObjectSchema as StringNullableFilterObjectSchema } from './StringNullableFilter.schema';
|
||||||
@@ -10,6 +9,8 @@ import { NpiProviderWhereInputObjectSchema as NpiProviderWhereInputObjectSchema
|
|||||||
import { CommissionBatchItemListRelationFilterObjectSchema as CommissionBatchItemListRelationFilterObjectSchema } from './CommissionBatchItemListRelationFilter.schema'
|
import { CommissionBatchItemListRelationFilterObjectSchema as CommissionBatchItemListRelationFilterObjectSchema } from './CommissionBatchItemListRelationFilter.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const commissionbatchwhereinputSchema = z.object({
|
const commissionbatchwhereinputSchema = z.object({
|
||||||
AND: z.union([z.lazy(() => CommissionBatchWhereInputObjectSchema), z.lazy(() => CommissionBatchWhereInputObjectSchema).array()]).optional(),
|
AND: z.union([z.lazy(() => CommissionBatchWhereInputObjectSchema), z.lazy(() => CommissionBatchWhereInputObjectSchema).array()]).optional(),
|
||||||
OR: z.lazy(() => CommissionBatchWhereInputObjectSchema).array().optional(),
|
OR: z.lazy(() => CommissionBatchWhereInputObjectSchema).array().optional(),
|
||||||
@@ -20,7 +21,7 @@ const commissionbatchwhereinputSchema = z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'totalCollection' must be a Decimal",
|
message: "Field 'totalCollection' must be a Decimal",
|
||||||
@@ -29,7 +30,7 @@ const commissionbatchwhereinputSchema = z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'commissionAmount' must be a Decimal",
|
message: "Field 'commissionAmount' must be a Decimal",
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
|
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
set: z.union([
|
set: z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'set' must be a Decimal",
|
message: "Field 'set' must be a Decimal",
|
||||||
@@ -18,7 +18,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'increment' must be a Decimal",
|
message: "Field 'increment' must be a Decimal",
|
||||||
@@ -27,7 +27,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'decrement' must be a Decimal",
|
message: "Field 'decrement' must be a Decimal",
|
||||||
@@ -36,7 +36,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'multiply' must be a Decimal",
|
message: "Field 'multiply' must be a Decimal",
|
||||||
@@ -45,7 +45,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'divide' must be a Decimal",
|
message: "Field 'divide' must be a Decimal",
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
import * as z from 'zod';
|
import * as z from 'zod';
|
||||||
import { Prisma } from '../../../generated/prisma';
|
import type { Prisma } from '../../../generated/prisma';
|
||||||
import Decimal from 'decimal.js';
|
|
||||||
import { NestedDecimalFilterObjectSchema as NestedDecimalFilterObjectSchema } from './NestedDecimalFilter.schema'
|
import { NestedDecimalFilterObjectSchema as NestedDecimalFilterObjectSchema } from './NestedDecimalFilter.schema'
|
||||||
|
|
||||||
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
import { DecimalJSLikeSchema, isValidDecimalInput } from '../../helpers/decimal-helpers';
|
||||||
|
|
||||||
|
import Decimal from "decimal.js";
|
||||||
const makeSchema = () => z.object({
|
const makeSchema = () => z.object({
|
||||||
equals: z.union([
|
equals: z.union([
|
||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'equals' must be a Decimal",
|
message: "Field 'equals' must be a Decimal",
|
||||||
@@ -18,7 +19,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'in' must be a Decimal",
|
message: "Field 'in' must be a Decimal",
|
||||||
@@ -27,7 +28,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'notIn' must be a Decimal",
|
message: "Field 'notIn' must be a Decimal",
|
||||||
@@ -36,7 +37,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'lt' must be a Decimal",
|
message: "Field 'lt' must be a Decimal",
|
||||||
@@ -45,7 +46,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'lte' must be a Decimal",
|
message: "Field 'lte' must be a Decimal",
|
||||||
@@ -54,7 +55,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'gt' must be a Decimal",
|
message: "Field 'gt' must be a Decimal",
|
||||||
@@ -63,7 +64,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'gte' must be a Decimal",
|
message: "Field 'gte' must be a Decimal",
|
||||||
@@ -72,7 +73,7 @@ const makeSchema = () => z.object({
|
|||||||
z.number(),
|
z.number(),
|
||||||
z.string(),
|
z.string(),
|
||||||
z.instanceof(Decimal),
|
z.instanceof(Decimal),
|
||||||
z.instanceof(Prisma.Decimal),
|
z.instanceof(Decimal),
|
||||||
DecimalJSLikeSchema,
|
DecimalJSLikeSchema,
|
||||||
]).refine((v) => isValidDecimalInput(v), {
|
]).refine((v) => isValidDecimalInput(v), {
|
||||||
message: "Field 'not' must be a Decimal",
|
message: "Field 'not' must be a Decimal",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user