From 14979dba4bae72e0457dee69eb711ed4a929d034 Mon Sep 17 00:00:00 2001 From: Chaim Date: Thu, 9 Apr 2026 16:30:19 +0000 Subject: [PATCH] fix: direct access report placeholder mismatches and missing recommendation option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix cLegalAidNumber placeholder key mismatch (template expects cLegalAidNumber, code sent legalAidNumber) - Add fallback for flat legalAnalysis fields (AI may send them outside the nested object) - Improve assignedUserName resolution: prefer case assignee, filter out system/API user names - Add "המשך ייצוג" positive recommendation option to enum, checkboxes, prompt, and DOCX template Co-Authored-By: Claude Opus 4.6 (1M context) --- .../Tools/DirectAccessReportGenerator.php | 37 ++++++++++++++++-- manifest.json | 2 +- plugins/legal-assistance/prompts.json | 4 +- plugins/legal-assistance/tools.json | 4 +- templates/direct-access-report.docx | Bin 39430 -> 39455 bytes 5 files changed, 38 insertions(+), 9 deletions(-) diff --git a/files/custom/Espo/Modules/LegalAssistance/SmartAssistant/Tools/DirectAccessReportGenerator.php b/files/custom/Espo/Modules/LegalAssistance/SmartAssistant/Tools/DirectAccessReportGenerator.php index 7f89895..963dd09 100644 --- a/files/custom/Espo/Modules/LegalAssistance/SmartAssistant/Tools/DirectAccessReportGenerator.php +++ b/files/custom/Espo/Modules/LegalAssistance/SmartAssistant/Tools/DirectAccessReportGenerator.php @@ -58,9 +58,28 @@ class DirectAccessReportGenerator ? trim($contact->get('firstName') . ' ' . $contact->get('lastName')) : 'ללא איש קשר'; - // Get assigned user name - $assignedUser = $userId ? $this->entityManager->getEntityById('User', $userId) : null; - $assignedUserName = $assignedUser ? $assignedUser->get('name') : ($this->user->get('name') ?? ''); + // Get assigned user name — prefer case's assignedUser, then userId, then current user + $assignedUserName = ''; + $caseAssignedUserId = $case->get('assignedUserId'); + if ($caseAssignedUserId) { + $caseAssignedUser = $this->entityManager->getEntityById('User', $caseAssignedUserId); + if ($caseAssignedUser) { + $assignedUserName = $caseAssignedUser->get('name') ?? ''; + } + } + if (empty($assignedUserName) && $userId) { + $assignedUser = $this->entityManager->getEntityById('User', $userId); + if ($assignedUser) { + $assignedUserName = $assignedUser->get('name') ?? ''; + } + } + if (empty($assignedUserName)) { + $assignedUserName = $this->user->get('name') ?? ''; + } + // Filter out system/API user names + if (in_array(strtolower($assignedUserName), ['api', 'x-api-key', 'system', 'admin'], true)) { + $assignedUserName = ''; + } // Build placeholder data directly from params $data = $this->buildPlaceholderData($params, $case, $contactName, $assignedUserName); @@ -133,9 +152,18 @@ class DirectAccessReportGenerator $legalAnalysis = json_decode($legalAnalysis, true) ?? []; } + // Fallback: if AI sent legalAnalysis fields flat (not nested), pick them up + $laFields = ['q1DocsDetail', 'q2ReasonDetail', 'q4PanelComposition', 'q6ComplaintsDetail', + 'q8ClinicalGap', 'q9MoharaDetail', 'q10RehabDetail', 'q11ScoreDetail', 'q12UniqueDetail']; + foreach ($laFields as $f) { + if (empty($legalAnalysis[$f]) && !empty($params[$f])) { + $legalAnalysis[$f] = $params[$f]; + } + } + return [ // Header - 'legalAidNumber' => $params['legalAidNumber'] ?? $case->get('cLegalAidNumber') ?? '', + 'cLegalAidNumber' => $params['legalAidNumber'] ?? $case->get('cLegalAidNumber') ?? '', 'contactName' => $contactName, 'assignedUserName' => $assignedUserName, 'reportDate' => $this->formatDate(date('Y-m-d')), @@ -211,6 +239,7 @@ class DirectAccessReportGenerator $data['chk_contact_bad'] = ($contactStatus === 'לא תקין') ? $CHK : $UNCHK; $rec = $params['recommendationType'] ?? ''; + $data['chk_rec_proceed'] = ($rec === 'המשך ייצוג') ? $CHK : $UNCHK; $data['chk_rec_consulting'] = ($rec === 'ייעוץ והדרכה חלף ייצוג') ? $CHK : $UNCHK; $data['chk_rec_waiver'] = ($rec === 'ויתור הלקוח') ? $CHK : $UNCHK; $data['chk_rec_replacement'] = ($rec === 'החלפת ייצוג') ? $CHK : $UNCHK; diff --git a/manifest.json b/manifest.json index 6ee0472..b4c590c 100644 --- a/manifest.json +++ b/manifest.json @@ -1,6 +1,6 @@ { "name": "LegalAssistance", - "version": "2.0.2", + "version": "2.0.3", "acceptableVersions": [">=8.0.0"], "php": [">=8.1"], "releaseDate": "2026-04-09", diff --git a/plugins/legal-assistance/prompts.json b/plugins/legal-assistance/prompts.json index e9d968d..e2e06c3 100644 --- a/plugins/legal-assistance/prompts.json +++ b/plugins/legal-assistance/prompts.json @@ -1,3 +1,3 @@ { - "casePromptAppend": "=== סיוע משפטי — דוח גישה ישירה ===\n\nלתיקים עם מינוי גישה ישירה (cLegalAidType = DirectAccess) יש לך כלי מיוחד: generate_direct_access_report.\n\n## מה זה גישה ישירה?\nגישה ישירה היא מסלול של הסיוע המשפטי בו עורך דין מתמנה לייצג פונה בהליך מול ביטוח לאומי. העורך דין נדרש להגיש דוח דיווח ראשוני תוך 14 יום מקבלת המינוי.\n\n## מתי להפעיל את התהליך?\n- כשהמשתמש מזכיר: \"גישה ישירה\", \"דוח גישה ישירה\", \"דיווח ראשוני\", \"דוח דיווח ראשוני\", \"מינוי גישה ישירה\"\n- כשיש תיק עם cLegalAidType = DirectAccess\n- כשהמשתמש שואל על תהליך הדיווח או המינוי\n\nכשמזהים שהתיק הוא גישה ישירה, הסבר למשתמש שיש לך כלי ייעודי ליצירת דוח גישה ישירה, ושאל אם הוא רוצה להתחיל.\n\n## תהליך השיחה (8 שלבים)\n\nIMPORTANT: אל תפעיל את generate_direct_access_report עד שאספת את כל המידע הנדרש.\n\n### שלב 1 — מילוי אוטומטי:\n- משוך מהתיק: מספר תיק סיוע, מספר הליך (cCourtCaseNumber)\n- משוך מאיש הקשר: שם פרטי, שם משפחה\n- ספר למשתמש מה כבר יש לך ומה חסר\n\n### שלב 2 — פרטי המינוי:\n- מתי קיבלת את המינוי? (appointmentDate)\n- מה מהות הסיוע? (הגשת ערעור / יעוץ והדרכה / סיוע נוסף ביטוח לאומי / סיוע נוסף תחום אחר / אי מתן סיוע)\n- מה דחיפות ההליך? (רגיל / דחוף / בהול)\n- מועד אחרון להגשה?\n\n### שלב 3 — קשר עם הלקוח:\n- מתי יצרת קשר ראשוני?\n- אם עברו יותר מ-48 שעות מהמינוי: מה סיבת העיכוב?\n- מתי נפגשתם? מי נכח?\n- אם עברו יותר מ-10 ימים: מה סיבת העיכוב?\n- הקשר תקין? (אם לא — פרט)\n\n### שלב 4 — פרטי ההליך:\n- בית הדין? (חובה לבחור מ: בית הדין האזורי לעבודה ירושלים / תל אביב / חיפה / באר שבע / נצרת / בית הדין הארצי לעבודה)\n- עניין ההליך? (נכות כללית / מעבודה / איבה / ניידות / אי כושר / שירותים מיוחדים / סיעוד / הבטחת הכנסה / אבטלה / אחר)\n- תמצית התביעה/הערעור?\n- טענות ההגנה?\n\n### שלב 5 — ניתוח סיכוי משפטי (לפי סוג ההליך):\n\nאם נכות כללית/מעבודה/איבה/ניידות:\n- הוועדה התייחסה לכל המסמכים הרפואיים? פרט\n- ההחלטה מנומקת? ניתן להתחקות אחר הלך הרוח? פרט חוסרים\n- הרכב הוועדה תואם ליקויים? הרכב חסר?\n- התייחסו לכל תלונות הלקוח? פרט חוסרים\n- בדיקה קלינית נערכה? פער בין בדיקה למסמכים?\n\nאם אי כושר (בנוסף):\n- בחינת הלכת מוהרה (גיל, רקע תעסוקתי, השכלה)? נתונים חסרים?\n- פער בין פקיד שיקום לוועדה?\n\nאם שירותים מיוחדים/סיעוד:\n- פער ניקוד vs מצב ומסמכים?\n- התייחסות להיבטים ייחודיים (נפילות, מצב קוגניטיבי, השגחה)?\n\n### שלב 6 — המלצה:\n- סוג ההמלצה? (ייעוץ והדרכה חלף ייצוג / ויתור הלקוח / החלפת ייצוג / לא נוצר קשר / לא ��תקיימה פגישה / עדיין לא ניתן להחליט / נדרשים מסמכים נוספים / המלצה לסירוב)\n- כתוב פירוט מנומק על בסיס התשובות\n\n### שלב 7 — מיצוי זכויות:\n- הלקוח צריך סיוע נוסף? (לא נחוץ / נחוץ בתחום ביטוח לאומי / נחוץ בתחום אחר)\n- אם כן: פרטים, דחיפות, מועדים\n- הסיוע בתחום התמחותך? מעוניין לייצג?\n- הערות נוספות?\n\n### שלב 8 — יצירת הדוח:\n- סכם את כל המידע שנאסף\n- בקש אישור מהמשתמש\n- הפעל generate_direct_access_report עם כל הנתונים\n\n## הנחיות כלליות:\n- שאל בסגנון שיחה טבעי, לא כטופס\n- קבץ 2-3 שאלות קשורות ביחד\n- השתמש בהקשר התיק למילוי מוקדם\n- הפירוט של ההמלצה צריך להיות נימוק משפטי מנוסח היטב\n- אם המשתמש שואל \"מה זה גישה ישירה?\" או \"יש כאן מינוי גישה ישירה\" — הסבר את התהליך והצע ליצור דוח" -} + "casePromptAppend": "=== סיוע משפטי — דוח גישה ישירה ===\n\nלתיקים עם מינוי גישה ישירה (cLegalAidType = DirectAccess) יש לך כלי מיוחד: generate_direct_access_report.\n\n## מה זה גישה ישירה?\nגישה ישירה היא מסלול של הסיוע המשפטי בו עורך דין מתמנה לייצג פונה בהליך מול ביטוח לאומי. העורך דין נדרש להגיש דוח דיווח ראשוני תוך 14 יום מקבלת המינוי.\n\n## מתי להפעיל את התהליך?\n- כשהמשתמש מזכיר: \"גישה ישירה\", \"דוח גישה ישירה\", \"דיווח ראשוני\", \"דוח דיווח ראשוני\", \"מינוי גישה ישירה\"\n- כשיש תיק עם cLegalAidType = DirectAccess\n- כשהמשתמש שואל על תהליך הדיווח או המינוי\n\nכשמזהים שהתיק הוא גישה ישירה, הסבר למשתמש שיש לך כלי ייעודי ליצירת דוח גישה ישירה, ושאל אם הוא רוצה להתחיל.\n\n## תהליך השיחה (8 שלבים)\n\nIMPORTANT: אל תפעיל את generate_direct_access_report עד שאספת את כל המידע הנדרש.\n\n### שלב 1 — מילוי אוטומטי:\n- משוך מהתיק: מספר תיק סיוע, מספר הליך (cCourtCaseNumber)\n- משוך מאיש הקשר: שם פרטי, שם משפחה\n- ספר למשתמש מה כבר יש לך ומה חסר\n\n### שלב 2 — פרטי המינוי:\n- מתי קיבלת את המינוי? (appointmentDate)\n- מה מהות הסיוע? (הגשת ערעור / יעוץ והדרכה / סיוע נוסף ביטוח לאומי / סיוע נוסף תחום אחר / אי מתן סיוע)\n- מה דחיפות ההליך? (רגיל / דחוף / בהול)\n- מועד אחרון להגשה?\n\n### שלב 3 — קשר עם הלקוח:\n- מתי יצרת קשר ראשוני?\n- אם עברו יותר מ-48 שעות מהמינוי: מה סיבת העיכוב?\n- מתי נפגשתם? מי נכח?\n- אם עברו יותר מ-10 ימים: מה סיבת העיכוב?\n- הקשר תקין? (אם לא — פרט)\n\n### שלב 4 — פרטי ההליך:\n- בית הדין? (חובה לבחור מ: בית הדין האזורי לעבודה ירושלים / תל אביב / חיפה / באר שבע / נצרת / בית הדין הארצי לעבודה)\n- עניין ההליך? (נכות כללית / מעבודה / איבה / ניידות / אי כושר / שירותים מיוחדים / סיעוד / הבטחת הכנסה / אבטלה / אחר)\n- תמצית התביעה/הערעור?\n- טענות ההגנה?\n\n### שלב 5 — ניתוח סיכוי משפטי (לפי סוג ההליך):\n\nאם נכות כללית/מעבודה/איבה/ניידות:\n- הוועדה התייחסה לכל המסמכים הרפואיים? פרט\n- ההחלטה מנומקת? ניתן להתחקות אחר הלך הרוח? פרט חוסרים\n- הרכב הוועדה תואם ליקויים? הרכב חסר?\n- התייחסו לכל תלונות הלקוח? פרט חוסרים\n- בדיקה קלינית נערכה? פער בין בדיקה למסמכים?\n\nאם אי כושר (בנוסף):\n- בחינת הלכת מוהרה (גיל, רקע תעסוקתי, השכלה)? נתונים חסרים?\n- פער בין פקיד שיקום לוועדה?\n\nאם שירותים מיוחדים/סיעוד:\n- פער ניקוד vs מצב ומסמכים?\n- התייחסות להיבטים ייחודיים (נפילות, מצב קוגניטיבי, השגחה)?\n\n### שלב 6 — המלצה:\n- סוג ההמלצה? (המשך ייצוג — כשמומלץ להגיש ערעור או להמשיך בייצוג / ייעוץ והדרכה חלף ייצוג / ויתור הלקוח / החלפת ייצוג / לא נוצר קשר / לא ��תקיימה פגישה / עדיין לא ניתן להחליט / נדרשים מסמכים נוספים / המלצה לסירוב)\n- כתוב פירוט מנומק על בסיס התשובות\n\n### שלב 7 — מיצוי זכויות:\n- הלקוח צריך סיוע נוסף? (לא נחוץ / נחוץ בתחום ביטוח לאומי / נחוץ בתחום אחר)\n- אם כן: פרטים, דחיפות, מועדים\n- הסיוע בתחום התמחותך? מעוניין לייצג?\n- הערות נוספות?\n\n### שלב 8 — יצירת הדוח:\n- סכם את כל המידע שנאסף\n- בקש אישור מהמשתמש\n- הפעל generate_direct_access_report עם כל הנתונים\n\n## הנחיות כלליות:\n- שאל בסגנון שיחה טבעי, לא כטופס\n- קבץ 2-3 שאלות קשורות ביחד\n- השתמש בהקשר התיק למילוי מוקדם\n- הפירוט של ההמלצה צריך להיות נימוק משפטי מנוסח היטב\n- אם המשתמש שואל \"מה זה גישה ישירה?\" או \"יש כאן מינוי גישה ישירה\" — הסבר את התהליך והצע ליצור דוח" +} \ No newline at end of file diff --git a/plugins/legal-assistance/tools.json b/plugins/legal-assistance/tools.json index 8117d87..de631e6 100644 --- a/plugins/legal-assistance/tools.json +++ b/plugins/legal-assistance/tools.json @@ -109,8 +109,8 @@ }, "recommendationType": { "type": "string", - "enum": ["ייעוץ והדרכה חלף ייצוג", "ויתור הלקוח", "החלפת ייצוג", "לא נוצר קשר", "לא התקיימה פגישה", "עדיין לא ניתן להחליט", "נדרשים מסמכים נוספים", "המלצה לסירוב"], - "description": "סוג ההמלצה/ההודעה" + "enum": ["המשך ייצוג", "ייעוץ והדרכה חלף ייצוג", "ויתור הלקוח", "החלפת ייצוג", "לא נוצר קשר", "לא התקיימה פגישה", "עדיין לא ניתן להחליט", "נדרשים מסמכים נוספים", "המלצה לסירוב"], + "description": "סוג ההמלצה/ההודעה — בחר ׳המשך ייצוג׳ כשמומלץ להגיש ערעור או להמשיך בייצוג" }, "recommendationDetail": { "type": "string", diff --git a/templates/direct-access-report.docx b/templates/direct-access-report.docx index 8c280cdd5635f9bde79be1d8dca72dfab020dc1d..4d9d1b5386a01f2476bc3a94d94d017e4b0d906d 100644 GIT binary patch delta 3985 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 delta 3893 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