כל הפרויקטים

BrainStim Centers — אוטומציית תפעול קליניקה

שלושה מודולים: parser לשאלוני PDF, sync Rise4→Monday→CharmHealth, reconciler של eClinical.

המטרה

BrainStim Centers איבדה ~40 שעות אדמין/שבוע על ניקוד שאלוני PDF, העתקת הזמנות מ-Rise4 ל-Monday ו-CharmHealth, והתאמה ידנית של הפניות eClinical. המטרה: לאוטמט כל שלב חוזר ולהחזיק 24/7.

הפתרון

חבילה של שלושה מודולים על VPS: (1) pipeline של SharePoint/Teams ל-PDFs שמחלץ 60+ תבניות שאלון עם ניקוד אוטומטי; (2) מוניטור Outlook שמסנכרן הזמנות Rise4 ל-Monday (update-or-create) ויוצר מטופלים ב-CharmHealth עם Playwright; (3) reconciler של eClinical עם כללי branching (Hold On CNI, Sonja Review, Case Details Needed, Scheduled). הכל systemd עם לוגים מובנים.

עיקרי הדברים

  • ~40 שעות אדמין/שבוע נחסכו על שלושה תהליכים
  • Uptime 24/7 עם systemd על VPS
  • 60+ שאלונים רפואיים מעובדים דרך pipeline מבוסס תבניות
  • OTP מ-Outlook + לכידת JWT ב-Playwright לאימות Rise4 always-on

האתגר

עשרות תבניות שאלון באנגלית וספרדית, כל אחת עם מבנה ייחודי — parser ייעודי לא סקלבילי.

pdf_pipeline.py אחד עם templates.json — כל תבנית מכריזה fingerprint + קואורדינטות + ניקוד. הוספת תבנית היא config, לא קוד.

Rise4 דורש JWT token-id שקיים רק ב-localStorage ומסתובב לעיתים קרובות.

Playwright שמושך OTP מ-Outlook דרך Graph, נודד ל-smart-list, לוכד את בקשת contacts/search/2 ומשמר את הטוקן ב-.env, ו-watchdog שעושה F5 כל 30 דק'.

כל הזמנה חייבת לנחות נקי ב-Monday (update/create) וב-CharmHealth (create if absent) ללא כפילויות גם כשמיילים לא בסדר.

build_monday_existing_lookup() מאינדקס את קבוצת החודש לפי email+phone; find_existing_monday_item() מחליט update-vs-create; CharmHealth בודק קודם לפני היצירה.

המפרט של הבעלים הוא סט צפוף של ברנצ'ים. פירוש שגוי של ברנץ' אחד ישחית לידים בשקט.

כל ברנץ' מומש כפונקציית scenario ממוזזת עם לוג [sync] -> <scenario> ודפוס log-then-act; קבצי המפרט ברפו כאמת.

צוות האדמין בקליניקה לא יכול SSH או להריץ Python.

run_teams_process.bat ל-double-click; Rise4/Monday כ-systemd על VPS; כל הריצות idempotent דרך processed_state.json.

מה נמסר

  • מודול PDF Parser: pdf_pipeline.py, templates.json, teams_process.py, run_teams_process.bat, README לצוות
  • Rise4 → Monday sync (rise4_mail_monitor, sync_rise4_to_monday, rise_monday_sync/runner.py)
  • Rise4 auth (rise_login_playwright.py) עם Outlook Graph OTP
  • CharmHealth (charm_add_patient_from_json.py, charmhealth_questionnaire.py)
  • Extract Questionnaires Data (fetch_patients.py)
  • Reconciler של eClinical עם ברנצ'ים ממוזזים
  • systemd setup, .env templates, AUTOMATION_SETUP.md, AGENTS.md
  • קבצי מפרט עסקי כאמת

תוצאות

~40h/wk

זמן אדמין שנחסך

24/7

Uptime

60+

תבניות שאלון

Monday + CharmHealth + eClinical

יעדי sync

מה זה לימד אותי

  • Parsing מבוסס-תבניות הוא הדרך הסקלבילית היחידה לספריית שאלונים
  • Playwright + OTP מ-Outlook + לכידת תגובת רשת מנצחים קריאה ישירה ל-auth API של SPA
  • כל ברנץ' כפונקציית scenario עם לוג [sync] -> <name> הופך post-mortem לטריוויאלי