M

Patient Coordinator

Metropolitan Accident & Injury Center

Access restricted to @maicbronx.com accounts only.
⚠ Only @maicbronx.com accounts are permitted.
Patient Coordinator
MAIC — Master Tracking System
E
Loading...
Total
Urgent
Needed
WC
NF
Lien
Loading patients...

New Patient Intake

Complete the form manually, or upload a physical intake form to auto-fill. Body parts entered will generate the patient's treatment plan automatically.

📄 Upload Physical Intake Form AI pre-fills all fields

📤
Drop file here or click to browse
PDF or image · AI extracts patient info and pre-fills below

🧾 Patient Information

ACCTNOAuto
Add injuries — select side then body part
No injuries added yet
⚖️ Legal Information
🛡️ Insurance Information
function buildProfileHTML(pt) { const injuries = pt.injuries ? pt.injuries.split('\n').filter(Boolean) : []; const caseType = pt.casetype || ''; // Days since DOA let daysSinceDOA = '—'; if (pt.doa) { const parts = pt.doa.split('/'); if (parts.length === 3) { const doa = new Date(`${parts[2]}-${parts[0]}-${parts[1]}`); const diff = Math.floor((new Date() - doa) / 86400000); if (!isNaN(diff) && diff >= 0) daysSinceDOA = diff; } } // Parse legal info const legalFields = parseLabelBlock(pt.legal); const insFields = parseLabelBlock(pt.insurance); // Parse appointment summary const apptData = parseApptForProfile(pt.appt); // Get indicated specialties from protocols const indicatedSpecs = getSpecsForInjuries(injuries); // Build specialty progress const SPEC_MAP = { 'Chiropractic': 'Chiropractic', 'PT': 'Physical Therapy', 'Pain Management': 'Pain Management', 'Neurology': 'Neurology', 'Orthopedics': 'Orthopedics', 'Podiatry': 'Podiatry' }; // Parse protocol actions for action items const actions = pt.injuries ? parseProtocolActions(pt.appt, injuries, caseType) : []; // Calculate plan progress const totalSpecs = indicatedSpecs.filter(s => SPEC_MAP[s] || s === 'PT').length; const activeSpecs = Object.keys(apptData).filter(s => apptData[s] && apptData[s].first).length; const progressPct = totalSpecs > 0 ? Math.round((activeSpecs / totalSpecs) * 100) : 0; const ctClass = caseType.toLowerCase(); const statusClass = (pt.status||'').toLowerCase() === 'active' ? 'active' : ''; return `
${pt.name.charAt(0)}
${pt.name}
ACCTNO ${pt.acctno} ${caseType || '—'} ${pt.status ? `${pt.status}` : ''} ${pt.addedon ? `Added ${pt.addedon}` : ''}
${pt.doa ? `
Date of Accident: ${pt.doa}
` : ''}
${daysSinceDOA}
days since accident

👤 Patient Info

${infoRow('Address', pt.address)} ${infoRow('Contact', pt.contact ? pt.contact.replace(/\n/g,' · ') : '—')} ${infoRow('DOB', pt.dob || '—')} ${infoRow('Referred By', pt.ref || '—')} ${infoRow('Date Added', pt.addedon || '—')}

⚖️ Legal Info

${infoRow('Law Firm', legalFields['Law Firm'] || '—')} ${infoRow('Firm Phone', legalFields['Law Firm Phone'] || '—')} ${infoRow('Attorney', legalFields['Attorney'] || '—')} ${infoRow('Atty Email', legalFields['Attorney Email'] || '—')} ${infoRow('Atty Phone', legalFields['Attorney Phone'] || '—')} ${infoRow('Paralegal', legalFields['Paralegal'] || '—')} ${infoRow('Para Email', legalFields['Paralegal Email'] || '—')}

${caseType === 'WC' ? '🏗️ Workers\' Comp' : '🛡️ Insurance'}

${caseType === 'WC' ? ` ${infoRow('WCB #', insFields['WCB #'] || '—')} ${infoRow('WCB Status', insFields['WCB Status'] || '—')} ` : ` ${infoRow('Carrier', insFields['Insurance Carrier'] || '—')} ${infoRow('Claim #', insFields['Claim Number'] || '—')} ${infoRow('Adjuster', insFields['Adjuster'] || '—')} ${infoRow('Adj. Email', insFields['Adjuster Email'] || '—')} ${infoRow('Adj. Phone', insFields['Adjuster Phone'] || '—')} `}

🦴 Body Injuries

${injuries.length ? `
${injuries.map(inj=>`${inj}`).join('')}
` : 'No injuries documented' } ${pt.ime ? `
IME/Denial: ${pt.ime}
` : ''}

🗺️ Treatment Plan Progress

${activeSpecs} of ${totalSpecs} specialties started
${progressPct}%
${buildSpecProgressHTML(indicatedSpecs, apptData, caseType, injuries)}

📅 Specialty Appointments

${buildSpecCards(apptData)}
${pt.notes ? `

📝 Notes

${pt.notes.replace(/\n/g,'
')}
` : ''}
`; } function infoRow(label, val) { return `
${label}${val||'—'}
`; } function parseLabelBlock(text) { const out = {}; if (!text) return out; text.split('\n').forEach(line => { const idx = line.indexOf(':'); if (idx > 0) { const k = line.substring(0, idx).trim(); const v = line.substring(idx+1).trim(); out[k] = v; } }); return out; } function parseApptForProfile(txt) { return parseAppt(txt); // reuse existing function } function buildSpecProgressHTML(indicatedSpecs, apptData, caseType, injuries) { const {limits} = getProtocolForInjuries(injuries); const isWC = caseType === 'WC'; const SPEC_DISPLAY = { 'Chiropractic': 'Chiropractic', 'PT': 'Physical Therapy', 'Pain Management': 'Pain Management', 'Neurology': 'Neurology', 'Orthopedics': 'Orthopedics', 'Podiatry': 'Podiatry', 'MRI': 'MRI', 'EMG': 'EMG/NCV' }; return indicatedSpecs.map(spec => { const displayName = SPEC_DISPLAY[spec] || spec; // Look up in appt data (appt uses full names) const apptKey = spec === 'PT' ? 'Physical Therapy' : spec; const apptInfo = apptData[apptKey] || apptData[spec]; const hasFirst = apptInfo && apptInfo.first; const hasNext = apptInfo && apptInfo.next; const isMRIorEMG = spec === 'MRI' || spec === 'EMG'; let statusClass, badgeClass, badgeText, icon; if (isMRIorEMG) { statusClass = 'step-pending'; badgeClass = 'sbadge-needed'; badgeText = 'NEEDED'; icon = SPEC_ICONS[spec]||'📋'; } else if (hasFirst && hasNext) { statusClass = 'step-active'; badgeClass = 'sbadge-active'; badgeText = 'ACTIVE'; icon = SPEC_ICONS[spec]||'✅'; } else if (hasFirst) { statusClass = 'step-done'; badgeClass = 'sbadge-done'; badgeText = 'STARTED'; icon = SPEC_ICONS[spec]||'✅'; } else { statusClass = 'step-needed'; badgeClass = 'sbadge-needed'; badgeText = 'NOT STARTED'; icon = SPEC_ICONS[spec]||'📋'; } let detail = ''; if (hasFirst) detail = `First: ${apptInfo.first}${apptInfo.last ? ` · Last: ${apptInfo.last}` : ''}`; if (isWC && spec === 'Chiropractic' && limits.chiro) detail += ` · WC limit: ${limits.chiro}`; if (isWC && spec === 'PT' && limits.pt) detail += ` · WC limit: ${limits.pt}`; return `
${icon}
${displayName}
${detail ? `
${detail}
` : ''}
${badgeText}
`; }).join(''); } function buildSpecCards(apptData) { return SPECS.map(spec => { const d = apptData[spec] || {}; const hasAny = d.first || d.last || d.next; const dotClass = d.next ? 'dot-active' : d.first ? 'dot-pending' : 'dot-none'; return `
${SPEC_ICONS[spec === 'Physical Therapy' ? 'PT' : spec] || '📋'} ${spec}
First Seen${d.first||'—'}
Last Seen${d.last||'—'}
${d.next ? `
⏰ Next: ${d.next}
` : `
No upcoming appt
`}
`; }).join(''); } function parseProtocolActions(apptText, injuries, caseType) { // Generate fresh from injuries return []; } // Quick-jump buttons from profile function goToApptForPatient(acctno) { goTab('appt'); el('appt-q').value = ''; setTimeout(() => { const pt = patients.find(p => p.acctno === acctno); if (pt) { el('appt-q').value = pt.name; selectPt('appt', acctno); } }, 100); } function goToBPForPatient(acctno) { goTab('bodyparts'); setTimeout(() => { const pt = patients.find(p => p.acctno === acctno); if (pt) { el('bp-q').value = pt.name; selectPt('bp', acctno); } }, 100); } function goToMRIForPatient(acctno) { goTab('mri'); setTimeout(() => { const pt = patients.find(p => p.acctno === acctno); if (pt) { el('mri-q').value = pt.name; selectPt('mri', acctno); } }, 100); } function goToEMGForPatient(acctno) { goTab('emg'); setTimeout(() => { const pt = patients.find(p => p.acctno === acctno); if (pt) { el('emg-q').value = pt.name; selectPt('emg', acctno); } }, 100); } window.addEventListener('load',()=>{loadGSI();setToday();renderInjuries()});