המטרה
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 לטריוויאלי
