Files
Wellspringmanagement01/apps/Backend/src/routes/insuranceStatusCCAClaim.ts
T
GiteadandClaude Sonnet 4.6 0e664e4813 feat: add CCA claim submission with Selenium automation
- Add CCA claim submit Selenium worker (login, fill form, attach docs, submit, capture dashboard PDF)
- Add CCA fee schedule (procedureCodesMH.json renamed, procedureCodesCCA.json added with D6010)
- Add backend route /api/claims/cca-claim, processor, and Selenium client
- Wire CCA claim handler in claims-page with job tracking and PDF preview popup
- Add insurance type dropdown in claim form (same options as eligibility page)
- Auto-populate insurance type from patient.insuranceProvider in claim form and patient edit form
- Map fee schedule by insurance type in Map Price button and combo buttons
- Fix CCA login speed (remove fixed sleeps, use readyState check)
- Fix CCA claim DOB format bug (was sending MM-DD-YYYY, now sends YYYY-MM-DD)
- Fix npiProviderId not saved for CCA claims
- Change Add Service → CCA Claim button (blue), MH → MH Claim

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 13:34:03 -04:00

96 lines
2.7 KiB
TypeScript

import { Router, Request, Response } from "express";
import { storage } from "../storage";
import { enqueueSeleniumJob } from "../queue/jobRunner";
import multer from "multer";
const router = Router();
const upload = multer({ storage: multer.memoryStorage() });
/**
* POST /cca-claim
*
* Enqueues a CCA claim submission job.
* Accepts multipart/form-data with optional pdfs/images attachments.
*
* Body fields:
* data — JSON string with claim payload (memberId, dateOfBirth, serviceDate,
* serviceLines, patientName, etc.)
* socketId — socket.io client id
* claimId — existing claim DB id (optional)
*
* Response: { status: "queued", jobId: "…" }
*/
router.post(
"/cca-claim",
upload.fields([
{ name: "pdfs", maxCount: 10 },
{ name: "images", maxCount: 10 },
]),
async (req: Request, res: Response): Promise<any> => {
if (!req.user?.id) {
return res.status(401).json({ error: "Unauthorized: user info missing" });
}
try {
const claimData =
typeof req.body.data === "string"
? JSON.parse(req.body.data)
: req.body.data ?? {};
const pdfs =
(req.files as Record<string, Express.Multer.File[]>)?.pdfs ?? [];
const images =
(req.files as Record<string, Express.Multer.File[]>)?.images ?? [];
// Fetch CCA credentials
const credentials = await storage.getInsuranceCredentialByUserAndSiteKey(
req.user.id,
"CCA"
);
if (!credentials) {
return res.status(404).json({
error:
"No CCA credentials found. Please add them on the Settings page.",
});
}
const filesForQueue = [...pdfs, ...images].map((f) => ({
originalname: f.originalname,
bufferBase64: f.buffer.toString("base64"),
mimetype: f.mimetype,
}));
const enrichedPayload = {
claim: {
...claimData,
cca_username: credentials.username,
cca_password: credentials.password,
},
files: filesForQueue,
};
const socketId: string | undefined = req.body.socketId;
const claimId: number | undefined = claimData.claimId
? Number(claimData.claimId)
: undefined;
const jobId = enqueueSeleniumJob({
jobType: "cca-claim-submit",
userId: req.user.id,
socketId,
enrichedPayload,
claimId,
});
return res.json({ status: "queued", jobId });
} catch (err: any) {
console.error("[cca-claim route] error:", err);
return res.status(500).json({
error: err.message || "Failed to enqueue CCA claim job",
});
}
}
);
export default router;