Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4c0586cce8 | |||
| b3c219aa57 | |||
| 31e6359df4 | |||
| d4008569ca | |||
| 836594a863 | |||
| 19db7c1093 | |||
| ee55f1ecef | |||
| 0cca55da0c | |||
| ca3d5e7890 | |||
| be4de13618 | |||
| 682f13543e |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Espo\Modules\LegalAssistance\Controllers;
|
||||
|
||||
use Espo\Core\Controllers\Record;
|
||||
|
||||
class LegalAid extends Record
|
||||
{
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Espo\Modules\LegalAssistance\Hooks\Case;
|
||||
|
||||
use Espo\ORM\Entity;
|
||||
use Espo\ORM\EntityManager;
|
||||
use Espo\Core\Utils\Log;
|
||||
|
||||
class CreateDirectAccessTasks
|
||||
{
|
||||
public function __construct(
|
||||
private EntityManager $entityManager,
|
||||
private Log $log
|
||||
) {}
|
||||
|
||||
public function afterSave(Entity $entity, array $options): void
|
||||
{
|
||||
if (!empty($options['skipHooks'])) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$entity->isAttributeChanged('cLegalAidType')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$newValue = $entity->get('cLegalAidType');
|
||||
$oldValue = $entity->getFetched('cLegalAidType');
|
||||
|
||||
if ($newValue !== 'DirectAccess' || $oldValue === 'DirectAccess') {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->log->info("LegalAssistance: Creating direct access tasks for case {$entity->getId()}");
|
||||
|
||||
$assignedUserId = $entity->get('assignedUserId');
|
||||
$now = new \DateTime('now', new \DateTimeZone('Asia/Jerusalem'));
|
||||
|
||||
$tasks = [
|
||||
[
|
||||
'name' => 'שיחת טלפון ראשונה עם הלקוח',
|
||||
'dateEnd' => (clone $now)->modify('+2 days')->format('Y-m-d'),
|
||||
'priority' => 'High',
|
||||
'description' => 'יש ליצור קשר ראשוני עם הלקוח תוך 48 שעות ממועד קבלת המינוי.',
|
||||
],
|
||||
[
|
||||
'name' => 'פגישה עם הלקוח',
|
||||
'dateEnd' => (clone $now)->modify('+7 days')->format('Y-m-d'),
|
||||
'priority' => 'Normal',
|
||||
'description' => 'לקבוע ולקיים פגישה ראשונה עם הלקוח. לתעד נוכחים ותוכן הפגישה.',
|
||||
],
|
||||
[
|
||||
'name' => 'שליחת דוח גישה ישירה',
|
||||
'dateEnd' => (clone $now)->modify('+14 days')->format('Y-m-d'),
|
||||
'priority' => 'High',
|
||||
'description' => 'למלא ולשלוח דוח דיווח ראשוני לסיוע המשפטי. ניתן לבקש משירה: "תיצרי דוח גישה ישירה".',
|
||||
],
|
||||
];
|
||||
|
||||
foreach ($tasks as $taskData) {
|
||||
$task = $this->entityManager->getNewEntity('Task');
|
||||
$task->set([
|
||||
'name' => $taskData['name'],
|
||||
'status' => 'Not Started',
|
||||
'priority' => $taskData['priority'],
|
||||
'dateEnd' => $taskData['dateEnd'],
|
||||
'description' => $taskData['description'],
|
||||
'parentType' => 'Case',
|
||||
'parentId' => $entity->getId(),
|
||||
'assignedUserId' => $assignedUserId,
|
||||
]);
|
||||
$this->entityManager->saveEntity($task, ['skipHooks' => false]);
|
||||
}
|
||||
|
||||
$this->log->info("LegalAssistance: Created 3 direct access tasks for case {$entity->getId()}");
|
||||
}
|
||||
}
|
||||
@@ -1,34 +1,11 @@
|
||||
{
|
||||
"fields": {
|
||||
"cLegalAidType": "Legal Aid Type",
|
||||
"cAppointmentDate": "Appointment Date",
|
||||
"cAidType": "Aid Type",
|
||||
"cUrgencyLevel": "Urgency Level",
|
||||
"cFilingDeadline": "Filing Deadline"
|
||||
"labels": {
|
||||
"LegalAssistance": "Legal Assistance"
|
||||
},
|
||||
"options": {
|
||||
"cLegalAidType": {
|
||||
"": "",
|
||||
"DirectAccess": "Direct Access",
|
||||
"Regular": "Regular",
|
||||
"Duty": "Duty"
|
||||
},
|
||||
"cAidType": {
|
||||
"": "",
|
||||
"הגשת ערעור": "Filing Appeal",
|
||||
"יעוץ והדרכה": "Counseling & Guidance",
|
||||
"סיוע נוסף ביטוח לאומי": "Additional NI Aid",
|
||||
"סיוע נוסף תחום אחר": "Additional Aid Other",
|
||||
"אי מתן סיוע": "No Aid Provided"
|
||||
},
|
||||
"cUrgencyLevel": {
|
||||
"": "",
|
||||
"רגיל": "Normal",
|
||||
"דחוף": "Urgent",
|
||||
"בהול": "Critical"
|
||||
}
|
||||
"tabs": {
|
||||
"LegalAssistance": "Legal Assistance"
|
||||
},
|
||||
"links": {
|
||||
"directAccessReports": "Direct Access Reports"
|
||||
"legalAids": "Legal Aid"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"scopeNames": {
|
||||
"DirectAccessReport": "Direct Access Report"
|
||||
"LegalAid": "Legal Aid"
|
||||
},
|
||||
"scopeNamesPlural": {
|
||||
"DirectAccessReport": "Direct Access Reports"
|
||||
"LegalAid": "Legal Aid Records"
|
||||
}
|
||||
}
|
||||
|
||||
+40
-29
@@ -1,20 +1,25 @@
|
||||
{
|
||||
"scopeName": "Direct Access Report",
|
||||
"scopeNamesPlural": "Direct Access Reports",
|
||||
"scopeName": "Legal Aid",
|
||||
"scopeNamesPlural": "Legal Aid Records",
|
||||
"labels": {
|
||||
"Create DirectAccessReport": "Create Direct Access Report"
|
||||
"Create LegalAid": "Create Legal Aid Record"
|
||||
},
|
||||
"fields": {
|
||||
"name": "Report Name",
|
||||
"name": "Name",
|
||||
"number": "Number",
|
||||
"status": "Status",
|
||||
"legalAidNumber": "Legal Aid Number",
|
||||
"legalAidType": "Legal Aid Type",
|
||||
"reportDate": "Report Date",
|
||||
"case": "Case",
|
||||
"contact": "Contact",
|
||||
"contactName": "Client Name",
|
||||
"aidType": "Aid Type",
|
||||
"urgencyLevel": "Urgency Level",
|
||||
"appointmentDate": "Appointment Date",
|
||||
"filingDeadline": "Filing Deadline",
|
||||
"additionalUrgency": "Additional Urgency",
|
||||
"additionalDeadline": "Additional Deadline",
|
||||
"additionalDeadline": "Additional Deadlines",
|
||||
"firstContactDate": "First Contact Date",
|
||||
"contactDelayReason": "Contact Delay Reason",
|
||||
"meetingDate": "Meeting Date",
|
||||
@@ -27,34 +32,34 @@
|
||||
"proceedingSubject": "Proceeding Subject",
|
||||
"claimSummary": "Claim Summary",
|
||||
"defenseClaims": "Defense Claims",
|
||||
"q1DocsReviewed": "Committee Reviewed All Documents?",
|
||||
"q1DocsReviewed": "Committee reviewed all documents?",
|
||||
"q1DocsDetail": "Documents Detail",
|
||||
"q2Reasoned": "Decision Reasoned?",
|
||||
"q2Reasoned": "Decision is reasoned?",
|
||||
"q2ReasonDetail": "Missing Reasoning Detail",
|
||||
"q3PanelMatch": "Panel Matches Impairments?",
|
||||
"q3PanelMatch": "Panel matches impairments?",
|
||||
"q4PanelComposition": "Panel Composition",
|
||||
"q5ComplaintsAddressed": "All Complaints Addressed?",
|
||||
"q5ComplaintsAddressed": "All complaints addressed?",
|
||||
"q6ComplaintsDetail": "Missing Complaints Detail",
|
||||
"q7ClinicalExam": "Clinical Exam Performed?",
|
||||
"q8ClinicalGap": "Clinical vs Documents Gap",
|
||||
"q9MoharaApplied": "Mohara Doctrine Applied?",
|
||||
"q7ClinicalExam": "Clinical exam performed?",
|
||||
"q8ClinicalGap": "Clinical Exam vs Documents Gap",
|
||||
"q9MoharaApplied": "Mohara doctrine applied?",
|
||||
"q9MoharaDetail": "Missing Mohara Data",
|
||||
"q10RehabGap": "Rehab Officer vs Committee Gap?",
|
||||
"q10RehabGap": "Rehab Officer vs Committee gap?",
|
||||
"q10RehabDetail": "Gap Detail",
|
||||
"q11ScoreGap": "Score vs Condition Gap?",
|
||||
"q11ScoreGap": "Score vs condition gap?",
|
||||
"q11ScoreDetail": "Score Gap Detail",
|
||||
"q12UniqueAspects": "Unique Aspects Addressed?",
|
||||
"q12UniqueAspects": "Unique aspects addressed?",
|
||||
"q12UniqueDetail": "Unique Aspects Detail",
|
||||
"recommendationType": "Recommendation Type",
|
||||
"recommendationDetail": "Recommendation Detail",
|
||||
"additionalAidNeeded": "Additional Aid Needed",
|
||||
"additionalAidNIDetail": "Additional NI Aid Detail",
|
||||
"additionalAidOtherDetail": "Additional Other Aid Detail",
|
||||
"additionalAidNIDetail": "Additional Aid Detail (NI)",
|
||||
"additionalAidOtherDetail": "Additional Aid Detail (Other)",
|
||||
"additionalAidUrgency": "Additional Aid Urgency",
|
||||
"additionalAidDeadlines": "Additional Aid Deadlines",
|
||||
"willingToRepresent": "Willing to Represent?",
|
||||
"notes": "General Notes",
|
||||
"assignedUser": "Assigned User",
|
||||
"assignedUser": "Assigned Lawyer",
|
||||
"teams": "Teams",
|
||||
"createdAt": "Created At",
|
||||
"modifiedAt": "Modified At",
|
||||
@@ -64,16 +69,21 @@
|
||||
"options": {
|
||||
"status": {
|
||||
"Draft": "Draft",
|
||||
"Submitted": "Submitted",
|
||||
"Approved": "Approved",
|
||||
"Rejected": "Rejected"
|
||||
"Active": "Active",
|
||||
"Closed": "Closed"
|
||||
},
|
||||
"legalAidType": {
|
||||
"": "",
|
||||
"DirectAccess": "Direct Access",
|
||||
"Regular": "Regular",
|
||||
"Duty": "Duty"
|
||||
},
|
||||
"aidType": {
|
||||
"": "",
|
||||
"הגשת ערעור": "Filing Appeal",
|
||||
"יעוץ והדרכה": "Counseling & Guidance",
|
||||
"סיוע נוסף ביטוח לאומי": "Additional NI Aid",
|
||||
"סיוע נוסף תחום אחר": "Additional Aid Other",
|
||||
"סיוע נוסף תחום אחר": "Additional Aid (Other)",
|
||||
"אי מתן סיוע": "No Aid Provided"
|
||||
},
|
||||
"urgencyLevel": {
|
||||
@@ -91,7 +101,7 @@
|
||||
"contactStatus": {
|
||||
"": "",
|
||||
"תקין": "Normal",
|
||||
"לא תקין": "Not Normal"
|
||||
"לא תקין": "Abnormal"
|
||||
},
|
||||
"courtName": {
|
||||
"": "",
|
||||
@@ -129,8 +139,8 @@
|
||||
"additionalAidNeeded": {
|
||||
"": "",
|
||||
"לא נחוץ": "Not Needed",
|
||||
"נחוץ בתחום ביטוח לאומי": "Needed - NI Field",
|
||||
"נחוץ בתחום אחר": "Needed - Other Field"
|
||||
"נחוץ בתחום ביטוח לאומי": "Needed (NI Field)",
|
||||
"נחוץ בתחום אחר": "Needed (Other Field)"
|
||||
},
|
||||
"additionalAidUrgency": {
|
||||
"": "",
|
||||
@@ -140,11 +150,12 @@
|
||||
}
|
||||
},
|
||||
"links": {
|
||||
"case": "Case"
|
||||
"case": "Case",
|
||||
"contact": "Contact"
|
||||
},
|
||||
"presetFilters": {
|
||||
"draft": "Draft",
|
||||
"submitted": "Submitted",
|
||||
"approved": "Approved"
|
||||
"draft": "Drafts",
|
||||
"active": "Active",
|
||||
"closed": "Closed"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"labels": {
|
||||
"LegalAssistance": "סיוע משפטי"
|
||||
},
|
||||
"tabs": {
|
||||
"LegalAssistance": "סיוע משפטי"
|
||||
},
|
||||
"links": {
|
||||
"legalAids": "סיוע משפטי"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"scopeNames": {
|
||||
"LegalAid": "סיוע משפטי"
|
||||
},
|
||||
"scopeNamesPlural": {
|
||||
"LegalAid": "סיוע משפטי"
|
||||
}
|
||||
}
|
||||
+22
-11
@@ -1,14 +1,19 @@
|
||||
{
|
||||
"scopeName": "דוח גישה ישירה",
|
||||
"scopeNamesPlural": "דוחות גישה ישירה",
|
||||
"scopeName": "סיוע משפטי",
|
||||
"scopeNamesPlural": "סיוע משפטי",
|
||||
"labels": {
|
||||
"Create DirectAccessReport": "צור דוח גישה ישירה"
|
||||
"Create LegalAid": "צור רשומת סיוע משפטי"
|
||||
},
|
||||
"fields": {
|
||||
"name": "שם הדוח",
|
||||
"name": "שם",
|
||||
"number": "מספר",
|
||||
"status": "סטטוס",
|
||||
"legalAidNumber": "מספר תיק סיוע משפטי",
|
||||
"legalAidType": "סוג מינוי",
|
||||
"reportDate": "תאריך הדוח",
|
||||
"case": "תיק",
|
||||
"contact": "איש קשר",
|
||||
"contactName": "שם הלקוח",
|
||||
"aidType": "מהות הסיוע",
|
||||
"urgencyLevel": "דחיפות הליך",
|
||||
"appointmentDate": "מועד קבלת המינוי",
|
||||
@@ -54,7 +59,7 @@
|
||||
"additionalAidDeadlines": "מועדים (סיוע נוסף)",
|
||||
"willingToRepresent": "בתחום התמחות + מעוניין לייצג?",
|
||||
"notes": "הערות כלליות",
|
||||
"assignedUser": "אחראי",
|
||||
"assignedUser": "עורך דין אחראי",
|
||||
"teams": "צוותים",
|
||||
"createdAt": "נוצר ב",
|
||||
"modifiedAt": "עודכן ב",
|
||||
@@ -64,9 +69,14 @@
|
||||
"options": {
|
||||
"status": {
|
||||
"Draft": "טיוטה",
|
||||
"Submitted": "נשלח",
|
||||
"Approved": "אושר",
|
||||
"Rejected": "נדחה"
|
||||
"Active": "פעיל",
|
||||
"Closed": "סגור"
|
||||
},
|
||||
"legalAidType": {
|
||||
"": "",
|
||||
"DirectAccess": "גישה ישירה",
|
||||
"Regular": "מינוי רגיל",
|
||||
"Duty": "תורנות"
|
||||
},
|
||||
"aidType": {
|
||||
"": "",
|
||||
@@ -140,11 +150,12 @@
|
||||
}
|
||||
},
|
||||
"links": {
|
||||
"case": "תיק"
|
||||
"case": "תיק",
|
||||
"contact": "איש קשר"
|
||||
},
|
||||
"presetFilters": {
|
||||
"draft": "טיוטות",
|
||||
"submitted": "נשלחו",
|
||||
"approved": "אושרו"
|
||||
"active": "פעילים",
|
||||
"closed": "סגורים"
|
||||
}
|
||||
}
|
||||
@@ -1,20 +1,11 @@
|
||||
{
|
||||
"fields": {
|
||||
"cLegalAidType": "סוג מינוי סיוע משפטי",
|
||||
"cAppointmentDate": "מועד קבלת המינוי",
|
||||
"cAidType": "מהות הסיוע",
|
||||
"cUrgencyLevel": "דחיפות",
|
||||
"cFilingDeadline": "מועד אחרון להגשה"
|
||||
"labels": {
|
||||
"LegalAssistance": "סיוע משפטי"
|
||||
},
|
||||
"options": {
|
||||
"cLegalAidType": {
|
||||
"": "",
|
||||
"DirectAccess": "גישה ישירה",
|
||||
"Regular": "מינוי רגיל",
|
||||
"Duty": "תורנות"
|
||||
}
|
||||
"tabs": {
|
||||
"LegalAssistance": "סיוע משפטי"
|
||||
},
|
||||
"links": {
|
||||
"directAccessReports": "דוחות גישה ישירה"
|
||||
"legalAids": "סיוע משפטי"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"scopeNames": {
|
||||
"DirectAccessReport": "דוח גישה ישירה"
|
||||
"LegalAid": "סיוע משפטי"
|
||||
},
|
||||
"scopeNamesPlural": {
|
||||
"DirectAccessReport": "דוחות גישה ישירה"
|
||||
"LegalAid": "סיוע משפטי"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,161 @@
|
||||
{
|
||||
"scopeName": "סיוע משפטי",
|
||||
"scopeNamesPlural": "סיוע משפטי",
|
||||
"labels": {
|
||||
"Create LegalAid": "צור רשומת סיוע משפטי"
|
||||
},
|
||||
"fields": {
|
||||
"name": "שם",
|
||||
"number": "מספר",
|
||||
"status": "סטטוס",
|
||||
"legalAidNumber": "מספר תיק סיוע משפטי",
|
||||
"legalAidType": "סוג מינוי",
|
||||
"reportDate": "תאריך הדוח",
|
||||
"case": "תיק",
|
||||
"contact": "איש קשר",
|
||||
"contactName": "שם הלקוח",
|
||||
"aidType": "מהות הסיוע",
|
||||
"urgencyLevel": "דחיפות הליך",
|
||||
"appointmentDate": "מועד קבלת המינוי",
|
||||
"filingDeadline": "מועד אחרון להגשה",
|
||||
"additionalUrgency": "דחיפות הליך נוסף",
|
||||
"additionalDeadline": "מועדים להליך נוסף",
|
||||
"firstContactDate": "תאריך יצירת קשר ראשוני",
|
||||
"contactDelayReason": "סיבת עיכוב (אם לא תוך 48 שעות)",
|
||||
"meetingDate": "תאריך פגישה עם הלקוח",
|
||||
"meetingDelayReason": "סיבת עיכוב פגישה",
|
||||
"meetingAttendees": "נוכחים בפגישה",
|
||||
"contactStatus": "מצב קשר עם הלקוח",
|
||||
"contactStatusDetail": "פירוט מצב קשר",
|
||||
"proceedingNumber": "מספר הליך",
|
||||
"courtName": "בית הדין",
|
||||
"proceedingSubject": "עניין ההליך",
|
||||
"claimSummary": "תמצית התביעה/הערעור",
|
||||
"defenseClaims": "טענות ההגנה",
|
||||
"q1DocsReviewed": "הוועדה התייחסה לכל המסמכים?",
|
||||
"q1DocsDetail": "פירוט מסמכים",
|
||||
"q2Reasoned": "ההחלטה מנומקת?",
|
||||
"q2ReasonDetail": "פירוט הנמקה חסרה",
|
||||
"q3PanelMatch": "הרכב תואם ליקויים?",
|
||||
"q4PanelComposition": "הרכב הוועדה / הרכב חסר",
|
||||
"q5ComplaintsAddressed": "התייחסו לכל התלונות?",
|
||||
"q6ComplaintsDetail": "פירוט תלונות חסרות",
|
||||
"q7ClinicalExam": "בדיקה קלינית נערכה?",
|
||||
"q8ClinicalGap": "פער בדיקה קלינית vs מסמכים",
|
||||
"q9MoharaApplied": "בחינת הלכת מוהרה (גיל, רקע, השכלה)?",
|
||||
"q9MoharaDetail": "נתונים חסרים (מוהרה)",
|
||||
"q10RehabGap": "פער פקיד שיקום vs ועדה?",
|
||||
"q10RehabDetail": "פירוט הפער",
|
||||
"q11ScoreGap": "פער ניקוד vs מצב ומסמכים?",
|
||||
"q11ScoreDetail": "פירוט פער הניקוד",
|
||||
"q12UniqueAspects": "התייחסות להיבטים ייחודיים?",
|
||||
"q12UniqueDetail": "פירוט היבטים ייחודיים",
|
||||
"recommendationType": "סוג ההמלצה",
|
||||
"recommendationDetail": "פירוט ההמלצה",
|
||||
"additionalAidNeeded": "צורך בסיוע נוסף",
|
||||
"additionalAidNIDetail": "פירוט סיוע נוסף (ביטוח לאומי)",
|
||||
"additionalAidOtherDetail": "פירוט סיוע נוסף (תחום אחר)",
|
||||
"additionalAidUrgency": "דחיפות הסיוע הנוסף",
|
||||
"additionalAidDeadlines": "מועדים (סיוע נוסף)",
|
||||
"willingToRepresent": "בתחום התמחות + מעוניין לייצג?",
|
||||
"notes": "הערות כלליות",
|
||||
"assignedUser": "עורך דין אחראי",
|
||||
"teams": "צוותים",
|
||||
"createdAt": "נוצר ב",
|
||||
"modifiedAt": "עודכן ב",
|
||||
"createdBy": "נוצר על ידי",
|
||||
"modifiedBy": "עודכן על ידי"
|
||||
},
|
||||
"options": {
|
||||
"status": {
|
||||
"Draft": "טיוטה",
|
||||
"Active": "פעיל",
|
||||
"Closed": "סגור"
|
||||
},
|
||||
"legalAidType": {
|
||||
"": "",
|
||||
"DirectAccess": "גישה ישירה",
|
||||
"Regular": "מינוי רגיל",
|
||||
"Duty": "תורנות"
|
||||
},
|
||||
"aidType": {
|
||||
"": "",
|
||||
"הגשת ערעור": "הגשת ערעור",
|
||||
"יעוץ והדרכה": "יעוץ והדרכה",
|
||||
"סיוע נוסף ביטוח לאומי": "סיוע נוסף ביטוח לאומי",
|
||||
"סיוע נוסף תחום אחר": "סיוע נוסף תחום אחר",
|
||||
"אי מתן סיוע": "אי מתן סיוע"
|
||||
},
|
||||
"urgencyLevel": {
|
||||
"": "",
|
||||
"רגיל": "רגיל",
|
||||
"דחוף": "דחוף",
|
||||
"בהול": "בהול"
|
||||
},
|
||||
"additionalUrgency": {
|
||||
"": "",
|
||||
"רגיל": "רגיל",
|
||||
"דחוף": "דחוף",
|
||||
"בהול": "בהול"
|
||||
},
|
||||
"contactStatus": {
|
||||
"": "",
|
||||
"תקין": "תקין",
|
||||
"לא תקין": "לא תקין"
|
||||
},
|
||||
"courtName": {
|
||||
"": "",
|
||||
"בית הדין האזורי לעבודה ירושלים": "בית הדין האזורי לעבודה ירושלים",
|
||||
"בית הדין האזורי לעבודה תל אביב": "בית הדין האזורי לעבודה תל אביב",
|
||||
"בית הדין האזורי לעבודה חיפה": "בית הדין האזורי לעבודה חיפה",
|
||||
"בית הדין האזורי לעבודה באר שבע": "בית הדין האזורי לעבודה באר שבע",
|
||||
"בית הדין האזורי לעבודה נצרת": "בית הדין האזורי לעבודה נצרת",
|
||||
"בית הדין הארצי לעבודה": "בית הדין הארצי לעבודה"
|
||||
},
|
||||
"proceedingSubject": {
|
||||
"": "",
|
||||
"נכות כללית": "נכות כללית",
|
||||
"נכות מעבודה": "נכות מעבודה",
|
||||
"נכות איבה": "נכות איבה",
|
||||
"ניידות": "ניידות",
|
||||
"אי כושר": "אי כושר",
|
||||
"שירותים מיוחדים": "שירותים מיוחדים",
|
||||
"סיעוד": "סיעוד",
|
||||
"גמלת הבטחת הכנסה": "גמלת הבטחת הכנסה",
|
||||
"דמי אבטלה": "דמי אבטלה",
|
||||
"אחר": "אחר"
|
||||
},
|
||||
"recommendationType": {
|
||||
"": "",
|
||||
"ייעוץ והדרכה חלף ייצוג": "ייעוץ והדרכה חלף ייצוג",
|
||||
"ויתור הלקוח": "ויתור הלקוח",
|
||||
"החלפת ייצוג": "החלפת ייצוג",
|
||||
"לא נוצר קשר": "לא נוצר קשר",
|
||||
"לא התקיימה פגישה": "לא התקיימה פגישה",
|
||||
"עדיין לא ניתן להחליט": "עדיין לא ניתן להחליט",
|
||||
"נדרשים מסמכים נוספים": "נדרשים מסמכים נוספים",
|
||||
"המלצה לסירוב": "המלצה לסירוב"
|
||||
},
|
||||
"additionalAidNeeded": {
|
||||
"": "",
|
||||
"לא נחוץ": "לא נחוץ",
|
||||
"נחוץ בתחום ביטוח לאומי": "נחוץ בתחום ביטוח לאומי",
|
||||
"נחוץ בתחום אחר": "נחוץ בתחום אחר"
|
||||
},
|
||||
"additionalAidUrgency": {
|
||||
"": "",
|
||||
"רגיל": "רגיל",
|
||||
"דחוף": "דחוף",
|
||||
"בהול": "בהול"
|
||||
}
|
||||
},
|
||||
"links": {
|
||||
"case": "תיק",
|
||||
"contact": "איש קשר"
|
||||
},
|
||||
"presetFilters": {
|
||||
"draft": "טיוטות",
|
||||
"active": "פעילים",
|
||||
"closed": "סגורים"
|
||||
}
|
||||
}
|
||||
+3
@@ -4,6 +4,9 @@
|
||||
"rows": [
|
||||
[{"name": "name"}, {"name": "number"}],
|
||||
[{"name": "case"}, {"name": "status"}],
|
||||
[{"name": "legalAidNumber"}, {"name": "legalAidType"}],
|
||||
[{"name": "reportDate"}, false],
|
||||
[{"name": "contact"}, {"name": "contactName"}],
|
||||
[{"name": "assignedUser"}, {"name": "teams"}]
|
||||
]
|
||||
},
|
||||
@@ -0,0 +1,11 @@
|
||||
[
|
||||
{"name": "number", "width": 8},
|
||||
{"name": "name", "link": true},
|
||||
{"name": "legalAidNumber", "width": 12},
|
||||
{"name": "case", "width": 15},
|
||||
{"name": "contact", "width": 15},
|
||||
{"name": "status", "width": 10},
|
||||
{"name": "aidType", "width": 12},
|
||||
{"name": "urgencyLevel", "width": 8},
|
||||
{"name": "assignedUser", "width": 12}
|
||||
]
|
||||
+6
-6
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"controller": "controllers/record",
|
||||
"boolFilterList": ["onlyMy"],
|
||||
"iconClass": "fas fa-file-alt",
|
||||
"color": "#6C3483",
|
||||
"iconClass": "fas fa-balance-scale",
|
||||
"color": "#2E86C1",
|
||||
"kanbanViewMode": true,
|
||||
"statusField": "status",
|
||||
"filterList": [
|
||||
@@ -11,12 +11,12 @@
|
||||
"style": "default"
|
||||
},
|
||||
{
|
||||
"name": "submitted",
|
||||
"style": "warning"
|
||||
"name": "active",
|
||||
"style": "success"
|
||||
},
|
||||
{
|
||||
"name": "approved",
|
||||
"style": "success"
|
||||
"name": "closed",
|
||||
"style": "info"
|
||||
}
|
||||
],
|
||||
"menu": {
|
||||
@@ -1,41 +1,8 @@
|
||||
{
|
||||
"fields": {
|
||||
"cLegalAidType": {
|
||||
"type": "enum",
|
||||
"options": ["", "DirectAccess", "Regular", "Duty"],
|
||||
"audited": true,
|
||||
"displayAsLabel": true,
|
||||
"style": {
|
||||
"DirectAccess": "primary",
|
||||
"Regular": "default",
|
||||
"Duty": "info"
|
||||
}
|
||||
},
|
||||
"cAppointmentDate": {
|
||||
"type": "date"
|
||||
},
|
||||
"cAidType": {
|
||||
"type": "enum",
|
||||
"options": ["", "הגשת ערעור", "יעוץ והדרכה", "סיוע נוסף ביטוח לאומי", "סיוע נוסף תחום א��ר", "אי מתן סיוע"]
|
||||
},
|
||||
"cUrgencyLevel": {
|
||||
"type": "enum",
|
||||
"options": ["", "רגיל", "דחוף", "��הול"],
|
||||
"displayAsLabel": true,
|
||||
"style": {
|
||||
"רגיל": "default",
|
||||
"דחוף": "warning",
|
||||
"בהול": "danger"
|
||||
}
|
||||
},
|
||||
"cFilingDeadline": {
|
||||
"type": "date"
|
||||
}
|
||||
},
|
||||
"links": {
|
||||
"directAccessReports": {
|
||||
"legalAids": {
|
||||
"type": "hasMany",
|
||||
"entity": "DirectAccessReport",
|
||||
"entity": "LegalAid",
|
||||
"foreign": "case",
|
||||
"layoutRelationshipsDisabled": false
|
||||
}
|
||||
|
||||
+37
-6
@@ -11,21 +11,45 @@
|
||||
},
|
||||
"status": {
|
||||
"type": "enum",
|
||||
"options": ["Draft", "Submitted", "Approved", "Rejected"],
|
||||
"options": ["Draft", "Active", "Closed"],
|
||||
"default": "Draft",
|
||||
"audited": true,
|
||||
"displayAsLabel": true,
|
||||
"style": {
|
||||
"Draft": "default",
|
||||
"Submitted": "warning",
|
||||
"Approved": "success",
|
||||
"Rejected": "danger"
|
||||
"Active": "success",
|
||||
"Closed": "info"
|
||||
}
|
||||
},
|
||||
"legalAidNumber": {
|
||||
"type": "varchar",
|
||||
"maxLength": 50
|
||||
},
|
||||
"legalAidType": {
|
||||
"type": "enum",
|
||||
"options": ["", "DirectAccess", "Regular", "Duty"],
|
||||
"audited": true,
|
||||
"displayAsLabel": true,
|
||||
"style": {
|
||||
"DirectAccess": "primary",
|
||||
"Regular": "default",
|
||||
"Duty": "info"
|
||||
}
|
||||
},
|
||||
"reportDate": {
|
||||
"type": "date"
|
||||
},
|
||||
"case": {
|
||||
"type": "link",
|
||||
"required": true
|
||||
},
|
||||
"contact": {
|
||||
"type": "link"
|
||||
},
|
||||
"contactName": {
|
||||
"type": "varchar",
|
||||
"maxLength": 150
|
||||
},
|
||||
|
||||
"aidType": {
|
||||
"type": "enum",
|
||||
@@ -232,7 +256,11 @@
|
||||
"case": {
|
||||
"type": "belongsTo",
|
||||
"entity": "Case",
|
||||
"foreign": "directAccessReports"
|
||||
"foreign": "legalAids"
|
||||
},
|
||||
"contact": {
|
||||
"type": "belongsTo",
|
||||
"entity": "Contact"
|
||||
},
|
||||
"createdBy": {
|
||||
"type": "belongsTo",
|
||||
@@ -256,12 +284,15 @@
|
||||
"collection": {
|
||||
"orderBy": "createdAt",
|
||||
"order": "desc",
|
||||
"textFilterFields": ["name", "number"]
|
||||
"textFilterFields": ["name", "number", "legalAidNumber"]
|
||||
},
|
||||
"indexes": {
|
||||
"status": {
|
||||
"columns": ["status", "deleted"]
|
||||
},
|
||||
"legalAidNumber": {
|
||||
"columns": ["legalAidNumber", "deleted"]
|
||||
},
|
||||
"createdAt": {
|
||||
"columns": ["createdAt"]
|
||||
}
|
||||
-11
@@ -1,11 +0,0 @@
|
||||
[
|
||||
{
|
||||
"rows": [
|
||||
[{"name": "name"}],
|
||||
[{"name": "case"}],
|
||||
[{"name": "status"}],
|
||||
[{"name": "aidType"}],
|
||||
[{"name": "recommendationType"}]
|
||||
]
|
||||
}
|
||||
]
|
||||
-10
@@ -1,10 +0,0 @@
|
||||
[
|
||||
{"name": "number", "width": 8},
|
||||
{"name": "name", "link": true},
|
||||
{"name": "case", "width": 20},
|
||||
{"name": "status", "width": 12},
|
||||
{"name": "aidType", "width": 15},
|
||||
{"name": "recommendationType", "width": 15},
|
||||
{"name": "createdAt", "width": 15},
|
||||
{"name": "assignedUser", "width": 15}
|
||||
]
|
||||
+4
-3
@@ -2,14 +2,15 @@
|
||||
"entity": true,
|
||||
"object": true,
|
||||
"stream": true,
|
||||
"tab": false,
|
||||
"tab": true,
|
||||
"acl": true,
|
||||
"aclPortal": false,
|
||||
"disabled": false,
|
||||
"module": "LegalAssistance",
|
||||
"isCustom": false,
|
||||
"isCustom": true,
|
||||
"layouts": true,
|
||||
"notifications": true,
|
||||
"calendar": false,
|
||||
"activity": false,
|
||||
"kanbanStatusIgnoreList": ["Approved", "Rejected"]
|
||||
"kanbanStatusIgnoreList": ["Closed"]
|
||||
}
|
||||
@@ -1,214 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Espo\Modules\LegalAssistance\Services;
|
||||
|
||||
use Espo\Core\Exceptions\Error;
|
||||
use Espo\Core\InjectableFactory;
|
||||
use Espo\ORM\EntityManager;
|
||||
use Espo\Core\Utils\Log;
|
||||
use Espo\Core\Utils\DateTime as DateTimeUtil;
|
||||
use Espo\Entities\User;
|
||||
|
||||
class DirectAccessReportService
|
||||
{
|
||||
public function __construct(
|
||||
private EntityManager $entityManager,
|
||||
private InjectableFactory $injectableFactory,
|
||||
private Log $log,
|
||||
private User $user,
|
||||
private DateTimeUtil $dateTimeUtil
|
||||
) {}
|
||||
|
||||
public function generateReport(string $caseId, string $userId, array $params): array
|
||||
{
|
||||
$case = $this->entityManager->getEntityById('Case', $caseId);
|
||||
if (!$case) {
|
||||
throw new Error("Case {$caseId} not found.");
|
||||
}
|
||||
|
||||
$contact = null;
|
||||
$contactId = $case->get('contactId');
|
||||
if ($contactId) {
|
||||
$contact = $this->entityManager->getEntityById('Contact', $contactId);
|
||||
}
|
||||
|
||||
// Build report name
|
||||
$contactName = $contact
|
||||
? ($contact->get('firstName') . ' ' . $contact->get('lastName'))
|
||||
: 'ללא איש קשר';
|
||||
$reportName = "דוח גישה ישיר�� — {$contactName}";
|
||||
|
||||
// Extract legal analysis from nested object
|
||||
$legalAnalysis = $params['legalAnalysis'] ?? [];
|
||||
if (is_string($legalAnalysis)) {
|
||||
$legalAnalysis = json_decode($legalAnalysis, true) ?? [];
|
||||
}
|
||||
|
||||
// Create DirectAccessReport entity
|
||||
$report = $this->entityManager->getNewEntity('DirectAccessReport');
|
||||
$report->set([
|
||||
'name' => $reportName,
|
||||
'status' => 'Draft',
|
||||
'caseId' => $caseId,
|
||||
'assignedUserId' => $userId,
|
||||
|
||||
// Section ב' �� מהות הסיוע
|
||||
'aidType' => $params['aidType'] ?? null,
|
||||
'urgencyLevel' => $params['urgencyLevel'] ?? null,
|
||||
'appointmentDate' => $this->normalizeDate($params['appointmentDate'] ?? null),
|
||||
'filingDeadline' => $this->normalizeDate($params['filingDeadline'] ?? null),
|
||||
'additionalUrgency' => $params['additionalUrgency'] ?? null,
|
||||
'additionalDeadline' => $params['additionalDeadline'] ?? null,
|
||||
|
||||
// Section ג' — קשר עם הלקוח
|
||||
'firstContactDate' => $this->normalizeDate($params['firstContactDate'] ?? null),
|
||||
'contactDelayReason' => $params['contactDelayReason'] ?? null,
|
||||
'meetingDate' => $this->normalizeDate($params['meetingDate'] ?? null),
|
||||
'meetingDelayReason' => $params['meetingDelayReason'] ?? null,
|
||||
'meetingAttendees' => $params['meetingAttendees'] ?? null,
|
||||
'contactStatus' => $params['contactStatus'] ?? null,
|
||||
'contactStatusDetail' => $params['contactStatusDetail'] ?? null,
|
||||
|
||||
// Section ד' — פרטי ההליך
|
||||
'proceedingNumber' => $params['proceedingNumber'] ?? $case->get('cCourtCaseNumber'),
|
||||
'courtName' => $params['courtName'] ?? null,
|
||||
'proceedingSubject' => $params['proceedingSubject'] ?? null,
|
||||
'claimSummary' => $params['claimSummary'] ?? null,
|
||||
'defenseClaims' => $params['defenseClaims'] ?? null,
|
||||
|
||||
// Section ה'-ז' — בחינת סיכוי משפטי
|
||||
'q1DocsReviewed' => $legalAnalysis['q1DocsReviewed'] ?? false,
|
||||
'q1DocsDetail' => $legalAnalysis['q1DocsDetail'] ?? null,
|
||||
'q2Reasoned' => $legalAnalysis['q2Reasoned'] ?? false,
|
||||
'q2ReasonDetail' => $legalAnalysis['q2ReasonDetail'] ?? null,
|
||||
'q3PanelMatch' => $legalAnalysis['q3PanelMatch'] ?? false,
|
||||
'q4PanelComposition' => $legalAnalysis['q4PanelComposition'] ?? null,
|
||||
'q5ComplaintsAddressed' => $legalAnalysis['q5ComplaintsAddressed'] ?? false,
|
||||
'q6ComplaintsDetail' => $legalAnalysis['q6ComplaintsDetail'] ?? null,
|
||||
'q7ClinicalExam' => $legalAnalysis['q7ClinicalExam'] ?? false,
|
||||
'q8ClinicalGap' => $legalAnalysis['q8ClinicalGap'] ?? null,
|
||||
'q9MoharaApplied' => $legalAnalysis['q9MoharaApplied'] ?? false,
|
||||
'q9MoharaDetail' => $legalAnalysis['q9MoharaDetail'] ?? null,
|
||||
'q10RehabGap' => $legalAnalysis['q10RehabGap'] ?? false,
|
||||
'q10RehabDetail' => $legalAnalysis['q10RehabDetail'] ?? null,
|
||||
'q11ScoreGap' => $legalAnalysis['q11ScoreGap'] ?? false,
|
||||
'q11ScoreDetail' => $legalAnalysis['q11ScoreDetail'] ?? null,
|
||||
'q12UniqueAspects' => $legalAnalysis['q12UniqueAspects'] ?? false,
|
||||
'q12UniqueDetail' => $legalAnalysis['q12UniqueDetail'] ?? null,
|
||||
|
||||
// Section ח' — המלצה
|
||||
'recommendationType' => $params['recommendationType'] ?? null,
|
||||
'recommendationDetail' => $params['recommendationDetail'] ?? null,
|
||||
|
||||
// Section ט' — מיצוי זכויות
|
||||
'additionalAidNeeded' => $params['additionalAidNeeded'] ?? null,
|
||||
'additionalAidNIDetail' => $params['additionalAidNIDetail'] ?? null,
|
||||
'additionalAidOtherDetail' => $params['additionalAidOtherDetail'] ?? null,
|
||||
'additionalAidUrgency' => $params['additionalAidUrgency'] ?? null,
|
||||
'additionalAidDeadlines' => $params['additionalAidDeadlines'] ?? null,
|
||||
'willingToRepresent' => $params['willingToRepresent'] ?? false,
|
||||
|
||||
// Section י' — הערות
|
||||
'notes' => $params['notes'] ?? null,
|
||||
]);
|
||||
|
||||
$this->entityManager->saveEntity($report);
|
||||
|
||||
$this->log->info("LegalAssistance: Created DirectAccessReport {$report->getId()} for case {$caseId}");
|
||||
|
||||
// Also update Case fields if provided
|
||||
$caseUpdated = false;
|
||||
if (!empty($params['appointmentDate']) && !$case->get('cAppointmentDate')) {
|
||||
$case->set('cAppointmentDate', $this->normalizeDate($params['appointmentDate']));
|
||||
$caseUpdated = true;
|
||||
}
|
||||
if (!empty($params['aidType']) && !$case->get('cAidType')) {
|
||||
$case->set('cAidType', $params['aidType']);
|
||||
$caseUpdated = true;
|
||||
}
|
||||
if (!empty($params['urgencyLevel']) && !$case->get('cUrgencyLevel')) {
|
||||
$case->set('cUrgencyLevel', $params['urgencyLevel']);
|
||||
$caseUpdated = true;
|
||||
}
|
||||
if (!empty($params['filingDeadline']) && !$case->get('cFilingDeadline')) {
|
||||
$case->set('cFilingDeadline', $this->normalizeDate($params['filingDeadline']));
|
||||
$caseUpdated = true;
|
||||
}
|
||||
if ($caseUpdated) {
|
||||
$this->entityManager->saveEntity($case, ['skipHooks' => true]);
|
||||
}
|
||||
|
||||
// Generate DOCX using template
|
||||
$docxResult = $this->generateDocx($report, $case, $contact, $userId);
|
||||
|
||||
$msg = "✅ דוח גישה ישירה נוצר בהצלחה: \"{$reportName}\"";
|
||||
if (!empty($docxResult['fileName'])) {
|
||||
$msg .= "\n📄 מסמך DOCX נוצר: {$docxResult['fileName']}";
|
||||
}
|
||||
|
||||
return [
|
||||
'success' => true,
|
||||
'message' => $msg,
|
||||
'entityType' => 'DirectAccessReport',
|
||||
'entityId' => $report->getId(),
|
||||
];
|
||||
}
|
||||
|
||||
private function generateDocx($report, $case, $contact, string $userId): array
|
||||
{
|
||||
// Try to use LocalDocumentTemplateService if available
|
||||
try {
|
||||
$templateServiceClass = 'Espo\\Modules\\LocalDocuments\\Services\\LocalDocumentTemplateService';
|
||||
if (!class_exists($templateServiceClass)) {
|
||||
$templateServiceClass = 'Espo\\Modules\\NetworkStorageIntegration\\Services\\DocumentTemplateService';
|
||||
}
|
||||
|
||||
if (!class_exists($templateServiceClass)) {
|
||||
$this->log->warning("LegalAssistance: No template service available for DOCX generation");
|
||||
return ['success' => false, 'error' => 'No template service'];
|
||||
}
|
||||
|
||||
// Find the template
|
||||
$template = $this->entityManager
|
||||
->getRDBRepository('DocumentTemplate')
|
||||
->where(['name' => 'דוח גישה ישירה'])
|
||||
->findOne();
|
||||
|
||||
if (!$template) {
|
||||
$this->log->warning("LegalAssistance: Template 'דוח גישה ישירה' not found");
|
||||
return ['success' => false, 'error' => 'Template not found'];
|
||||
}
|
||||
|
||||
$templateService = $this->injectableFactory->create($templateServiceClass);
|
||||
|
||||
$result = $templateService->createFromTemplate(
|
||||
$template->getId(),
|
||||
'Case',
|
||||
$case->getId(),
|
||||
$report->get('name')
|
||||
);
|
||||
|
||||
return $result;
|
||||
} catch (\Throwable $e) {
|
||||
$this->log->error("LegalAssistance: DOCX generation failed: " . $e->getMessage());
|
||||
return ['success' => false, 'error' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
private function normalizeDate(?string $value): ?string
|
||||
{
|
||||
if (!$value) return null;
|
||||
|
||||
// Handle DD/MM/YYYY format
|
||||
if (preg_match('/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/', $value, $m)) {
|
||||
return "{$m[3]}-{$m[2]}-{$m[1]}";
|
||||
}
|
||||
|
||||
// Handle YYYY-MM-DD format (already correct)
|
||||
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $value)) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
}
|
||||
+121
-4
@@ -6,7 +6,6 @@ use Espo\Core\Exceptions\Error;
|
||||
use Espo\Core\InjectableFactory;
|
||||
use Espo\ORM\EntityManager;
|
||||
use Espo\Core\Utils\Log;
|
||||
use Espo\Modules\LegalAssistance\Services\DirectAccessReportService;
|
||||
|
||||
class GenerateInitialReport
|
||||
{
|
||||
@@ -24,10 +23,128 @@ class GenerateInitialReport
|
||||
|
||||
$this->log->info("LegalAssistance: Generating initial report for case {$caseId}");
|
||||
|
||||
$service = $this->injectableFactory->create(DirectAccessReportService::class);
|
||||
$case = $this->entityManager->getEntityById('Case', $caseId);
|
||||
if (!$case) {
|
||||
throw new Error("Case {$caseId} not found.");
|
||||
}
|
||||
|
||||
$result = $service->generateReport($caseId, $userId, $params);
|
||||
// Get contact
|
||||
$contact = null;
|
||||
$contactId = $case->get('contactId');
|
||||
if (!$contactId) {
|
||||
$contactsIds = $case->getLinkMultipleIdList('contacts');
|
||||
if (!empty($contactsIds)) {
|
||||
$contactId = $contactsIds[0];
|
||||
}
|
||||
}
|
||||
if ($contactId) {
|
||||
$contact = $this->entityManager->getEntityById('Contact', $contactId);
|
||||
}
|
||||
|
||||
return $result;
|
||||
$contactName = $contact
|
||||
? trim($contact->get('firstName') . ' ' . $contact->get('lastName'))
|
||||
: 'ללא איש קשר';
|
||||
|
||||
// Extract legal analysis from nested object
|
||||
$legalAnalysis = $params['legalAnalysis'] ?? [];
|
||||
if (is_string($legalAnalysis)) {
|
||||
$legalAnalysis = json_decode($legalAnalysis, true) ?? [];
|
||||
}
|
||||
|
||||
// Find or create LegalAid
|
||||
$legalAid = $this->entityManager
|
||||
->getRDBRepository('LegalAid')
|
||||
->where(['caseId' => $caseId])
|
||||
->findOne();
|
||||
|
||||
if (!$legalAid) {
|
||||
$legalAid = $this->entityManager->getNewEntity('LegalAid');
|
||||
}
|
||||
|
||||
$legalAid->set([
|
||||
'name' => "סיוע משפטי — {$contactName}",
|
||||
'status' => 'Active',
|
||||
'caseId' => $caseId,
|
||||
'contactId' => $contactId,
|
||||
'contactName' => $contactName,
|
||||
'assignedUserId' => $userId,
|
||||
'legalAidNumber' => $case->get('cLegalAidNumber') ?? '',
|
||||
'reportDate' => date('Y-m-d'),
|
||||
|
||||
'aidType' => $params['aidType'] ?? $legalAid->get('aidType'),
|
||||
'urgencyLevel' => $params['urgencyLevel'] ?? $legalAid->get('urgencyLevel'),
|
||||
'appointmentDate' => $this->normalizeDate($params['appointmentDate'] ?? null) ?? $legalAid->get('appointmentDate'),
|
||||
'filingDeadline' => $this->normalizeDate($params['filingDeadline'] ?? null) ?? $legalAid->get('filingDeadline'),
|
||||
'additionalUrgency' => $params['additionalUrgency'] ?? $legalAid->get('additionalUrgency'),
|
||||
'additionalDeadline' => $params['additionalDeadline'] ?? $legalAid->get('additionalDeadline'),
|
||||
|
||||
'firstContactDate' => $this->normalizeDate($params['firstContactDate'] ?? null) ?? $legalAid->get('firstContactDate'),
|
||||
'contactDelayReason' => $params['contactDelayReason'] ?? $legalAid->get('contactDelayReason'),
|
||||
'meetingDate' => $this->normalizeDate($params['meetingDate'] ?? null) ?? $legalAid->get('meetingDate'),
|
||||
'meetingDelayReason' => $params['meetingDelayReason'] ?? $legalAid->get('meetingDelayReason'),
|
||||
'meetingAttendees' => $params['meetingAttendees'] ?? $legalAid->get('meetingAttendees'),
|
||||
'contactStatus' => $params['contactStatus'] ?? $legalAid->get('contactStatus'),
|
||||
'contactStatusDetail' => $params['contactStatusDetail'] ?? $legalAid->get('contactStatusDetail'),
|
||||
|
||||
'proceedingNumber' => $params['proceedingNumber'] ?? $legalAid->get('proceedingNumber') ?? $case->get('cCourtCaseNumber'),
|
||||
'courtName' => $params['courtName'] ?? $legalAid->get('courtName'),
|
||||
'proceedingSubject' => $params['proceedingSubject'] ?? $legalAid->get('proceedingSubject'),
|
||||
'claimSummary' => $params['claimSummary'] ?? $legalAid->get('claimSummary'),
|
||||
'defenseClaims' => $params['defenseClaims'] ?? $legalAid->get('defenseClaims'),
|
||||
|
||||
'q1DocsReviewed' => $legalAnalysis['q1DocsReviewed'] ?? $legalAid->get('q1DocsReviewed') ?? false,
|
||||
'q1DocsDetail' => $legalAnalysis['q1DocsDetail'] ?? $legalAid->get('q1DocsDetail'),
|
||||
'q2Reasoned' => $legalAnalysis['q2Reasoned'] ?? $legalAid->get('q2Reasoned') ?? false,
|
||||
'q2ReasonDetail' => $legalAnalysis['q2ReasonDetail'] ?? $legalAid->get('q2ReasonDetail'),
|
||||
'q3PanelMatch' => $legalAnalysis['q3PanelMatch'] ?? $legalAid->get('q3PanelMatch') ?? false,
|
||||
'q4PanelComposition' => $legalAnalysis['q4PanelComposition'] ?? $legalAid->get('q4PanelComposition'),
|
||||
'q5ComplaintsAddressed' => $legalAnalysis['q5ComplaintsAddressed'] ?? $legalAid->get('q5ComplaintsAddressed') ?? false,
|
||||
'q6ComplaintsDetail' => $legalAnalysis['q6ComplaintsDetail'] ?? $legalAid->get('q6ComplaintsDetail'),
|
||||
'q7ClinicalExam' => $legalAnalysis['q7ClinicalExam'] ?? $legalAid->get('q7ClinicalExam') ?? false,
|
||||
'q8ClinicalGap' => $legalAnalysis['q8ClinicalGap'] ?? $legalAid->get('q8ClinicalGap'),
|
||||
'q9MoharaApplied' => $legalAnalysis['q9MoharaApplied'] ?? $legalAid->get('q9MoharaApplied') ?? false,
|
||||
'q9MoharaDetail' => $legalAnalysis['q9MoharaDetail'] ?? $legalAid->get('q9MoharaDetail'),
|
||||
'q10RehabGap' => $legalAnalysis['q10RehabGap'] ?? $legalAid->get('q10RehabGap') ?? false,
|
||||
'q10RehabDetail' => $legalAnalysis['q10RehabDetail'] ?? $legalAid->get('q10RehabDetail'),
|
||||
'q11ScoreGap' => $legalAnalysis['q11ScoreGap'] ?? $legalAid->get('q11ScoreGap') ?? false,
|
||||
'q11ScoreDetail' => $legalAnalysis['q11ScoreDetail'] ?? $legalAid->get('q11ScoreDetail'),
|
||||
'q12UniqueAspects' => $legalAnalysis['q12UniqueAspects'] ?? $legalAid->get('q12UniqueAspects') ?? false,
|
||||
'q12UniqueDetail' => $legalAnalysis['q12UniqueDetail'] ?? $legalAid->get('q12UniqueDetail'),
|
||||
|
||||
'recommendationType' => $params['recommendationType'] ?? $legalAid->get('recommendationType'),
|
||||
'recommendationDetail' => $params['recommendationDetail'] ?? $legalAid->get('recommendationDetail'),
|
||||
|
||||
'additionalAidNeeded' => $params['additionalAidNeeded'] ?? $legalAid->get('additionalAidNeeded'),
|
||||
'additionalAidNIDetail' => $params['additionalAidNIDetail'] ?? $legalAid->get('additionalAidNIDetail'),
|
||||
'additionalAidOtherDetail' => $params['additionalAidOtherDetail'] ?? $legalAid->get('additionalAidOtherDetail'),
|
||||
'additionalAidUrgency' => $params['additionalAidUrgency'] ?? $legalAid->get('additionalAidUrgency'),
|
||||
'additionalAidDeadlines' => $params['additionalAidDeadlines'] ?? $legalAid->get('additionalAidDeadlines'),
|
||||
'willingToRepresent' => $params['willingToRepresent'] ?? $legalAid->get('willingToRepresent') ?? false,
|
||||
|
||||
'notes' => $params['notes'] ?? $legalAid->get('notes'),
|
||||
]);
|
||||
|
||||
$this->entityManager->saveEntity($legalAid);
|
||||
|
||||
$this->log->info("LegalAssistance: Saved LegalAid {$legalAid->getId()} for case {$caseId}");
|
||||
|
||||
return [
|
||||
'success' => true,
|
||||
'message' => "✅ רשומת סיוע משפטי נוצרה/עודכנה: \"{$contactName}\"",
|
||||
'entityType' => 'LegalAid',
|
||||
'entityId' => $legalAid->getId(),
|
||||
];
|
||||
}
|
||||
|
||||
private function normalizeDate(?string $value): ?string
|
||||
{
|
||||
if (!$value) return null;
|
||||
if (preg_match('/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/', $value, $m)) {
|
||||
return "{$m[3]}-{$m[2]}-{$m[1]}";
|
||||
}
|
||||
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $value)) {
|
||||
return $value;
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"name": "LegalAssistance",
|
||||
"version": "1.1.0",
|
||||
"version": "1.5.0",
|
||||
"acceptableVersions": [">=8.0.0"],
|
||||
"php": [">=8.1"],
|
||||
"releaseDate": "2026-04-06",
|
||||
"releaseDate": "2026-04-07",
|
||||
"author": "Marcus-Law",
|
||||
"description": "סיוע משפטי — דוח גישה ישירה, משימות אוטומטיות, אינטגרציה עם שירה",
|
||||
"description": "סיוע משפטי — ישות LegalAid מרכזית, דוח גישה ישירה, משימות אוטומטיות, אינטגרציה עם שירה",
|
||||
"scripts": {
|
||||
"afterInstall": "scripts/AfterInstall.php",
|
||||
"afterUninstall": "scripts/AfterUninstall.php"
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
{
|
||||
"casePromptAppend": "=== DIRECT ACCESS REPORT (דוח גישה ישירה) ===\nWhen the user asks to create a direct access report (\"דוח גישה ישירה\", \"דיווח ראשוני\", \"דוח דיווח ראשוני\"), follow this structured conversation flow:\n\nIMPORTANT: Do NOT call generate_initial_report until you have collected ALL required information through conversation.\n\nStep 1 — AUTO-FILL from context:\n- Pull from case: מספר תיק סיוע (cLegalAidNumber), בית הדין (cCourt), מספר הליך (cCourtCaseNumber)\n- Pull from contact: שם פרטי, שם משפחה\n- Tell the user what you already have and what's missing\n\nStep 2 — ASK about the appointment:\n- מתי קיבלת את המינוי? (appointmentDate)\n- מה מהות הסיוע? (הגשת ערעור / יעוץ / סיוע נוסף / אי מתן סיוע)\n- מה דחיפות ההליך? (רגיל / דחוף / בהול)\n- מועד אחרון להגשה?\n\nStep 3 — ASK about client contact:\n- מתי יצרת קשר ראשוני עם הלקוח?\n- If > 48 hours from appointment: מה סיבת העיכוב?\n- מתי נפגשתם? מי נכח בפגישה?\n- If > 10 days from appointment: מה סיבת העיכוב?\n- הקשר עם הלקוח תקין? (if not, ask for details)\n\nStep 4 — ASK about the proceeding:\n- עניין ההליך? (נכות כללית/מעבודה/איבה/ניידות/אי כושר/שירותים מיוחדים/סיעוד/etc.)\n- תמצית התביעה/הערעור?\n- טענות ההגנה (אם הוגשו)?\n\nStep 5 — ASK legal evaluation questions (BASED ON SUBJECT TYPE):\n\nIf נכות כללית/מעבודה/איבה/ניידות:\n- הוועדה התייחסה לכל המסמכים הרפואיים? פרט\n- ההחלטה מנומקת? ניתן להתחקות אחר הלך הרוח? פרט חוסרים\n- הרכב הוועדה תואם ליקויים? הרכב חסר?\n- התייחסו לכל תלונות הלקוח? פרט חוסרים\n- בדיקה קלינית נערכה? פער בין בדיקה למסמכים?\n\nIf אי כושר (in addition):\n- בחינת הלכת מוהרה (גיל, רקע תעסוקתי, השכלה)? נתונים חסרים?\n- פער בין פקיד שיקום לוועדה?\n\nIf שירותים מיוחדים/סיעוד:\n- פער ניקוד vs מצב ומסמכים?\n- התייחסות להיבטים ייחודיים (נפילות, מצב קוגנטיבי, השגחה)?\n\nStep 6 — ASK for recommendation:\n- מה ההמלצה? (ייעוץ חלף ייצוג / ויתור / החלפת ייצוג / לא נוצר קשר / לא התקיימה פגישה / עוד לא ניתן להחליט / נדרשים מסמכים / המלצה לסירוב)\n- Generate detailed justification based on the answers\n\nStep 7 — ASK about additional rights:\n- הלקוח צריך סיוע נוסף? (לא / בביטוח לאומי / תחום אחר)\n- If yes: פרטים, דחיפות, מועדים\n- הסיוע בתחום התמחותך? מעוניין לייצג?\n- הערות נוספות?\n\nStep 8 — GENERATE:\n- Summarize all collected data to the user\n- Ask for confirmation\n- Call generate_initial_report with ALL collected data\n\nNOTES:\n- Ask questions in natural conversation style, not as a form\n- Group related questions together (2-3 per message)\n- Use the case context to pre-fill what you can\n- For the legal analysis, formulate the answers based on the lawyer's explanations\n- The recommendationDetail should be a well-written legal justification\n"
|
||||
"casePromptAppend": "=== סיוע משפטי — דוח גישה ישירה ===\n\nלתיקים עם מינוי גישה ישירה (cLegalAidType = DirectAccess) יש לך כלי מיוחד: generate_initial_report.\n\n## מה זה גישה ישירה?\nגישה ישירה היא מסלול של הסיוע המשפטי בו עורך דין מתמנה לייצג פונה בהליך מול ביטוח לאומי. העורך דין נדרש להגיש דוח דיווח ראשוני תוך 14 יום מקבלת המינוי.\n\n## מתי להפעיל את התהליך?\n- כשהמשתמש מזכיר: \"גישה ישירה\", \"דוח גישה ישירה\", \"דיווח ראשוני\", \"דוח דיווח ראשוני\", \"מינוי גישה ישירה\"\n- כשיש תיק עם cLegalAidType = DirectAccess\n- כשהמשתמש שואל על תהליך הדיווח או המינוי\n\nכשמזהים שהתיק הוא גישה ישירה, הסבר למשתמש שיש לך כלי ייעודי ליצירת דוח גישה ישירה, ושאל אם הוא רוצה להתחיל.\n\n## תהליך השיחה (8 שלבים)\n\nIMPORTANT: אל תפעיל את generate_initial_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_initial_report עם כל הנתונים\n\n## הנחיות כלליות:\n- שאל בסגנון שיחה טבעי, לא כטופס\n- קבץ 2-3 שאלות קשורות ביחד\n- השתמש בהקשר התיק למילוי מוקדם\n- הפירוט של ההמלצה צריך להיות נימוק משפטי מנוסח היטב\n- אם המשתמש שואל \"מה זה גישה ישירה?\" או \"יש כאן מינוי גישה ישירה\" — הסבר את התהליך והצע ליצור דוח"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"tools": {
|
||||
"generate_initial_report": {
|
||||
"description": "Generate Direct Access initial report (דוח דיווח ראשוני — גישה ישירה). Call ONLY after collecting ALL required data through conversation with the lawyer. This tool creates a DirectAccessReport entity and generates a DOCX document.",
|
||||
"description": "Generate Direct Access initial report (דוח דיווח ראשוני — גישה ישירה). Call ONLY after collecting ALL required data through conversation with the lawyer. This tool creates/updates a LegalAid entity and generates a DOCX document from it.",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -67,6 +67,7 @@
|
||||
},
|
||||
"courtName": {
|
||||
"type": "string",
|
||||
"enum": ["בית הדין האזורי לעבודה ירושלים", "בית הדין האזורי לעבודה תל אביב", "בית הדין האזורי לעבודה חיפה", "בית הדין האזורי לעבודה באר שבע", "בית הדין האזורי לעבודה נצרת", "בית הדין הארצי לעבודה"],
|
||||
"description": "בית הדין"
|
||||
},
|
||||
"proceedingSubject": {
|
||||
@@ -147,6 +148,39 @@
|
||||
},
|
||||
"required": ["aidType", "proceedingSubject", "recommendationType"]
|
||||
}
|
||||
},
|
||||
"update_legal_aid": {
|
||||
"description": "Update fields on an existing LegalAid entity. Use this to fill or modify any field on the legal aid record. Pass only the fields you want to update — existing values are preserved for unspecified fields. You can update any combination of fields.",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"legalAidId": {
|
||||
"type": "string",
|
||||
"description": "ID of the LegalAid entity to update"
|
||||
},
|
||||
"fields": {
|
||||
"type": "object",
|
||||
"description": "Key-value pairs of fields to update. Any field from the LegalAid entity is valid: aidType, urgencyLevel, appointmentDate, filingDeadline, firstContactDate, contactDelayReason, meetingDate, meetingDelayReason, meetingAttendees, contactStatus, contactStatusDetail, proceedingNumber, courtName, proceedingSubject, claimSummary, defenseClaims, q1DocsReviewed, q1DocsDetail, q2Reasoned, q2ReasonDetail, q3PanelMatch, q4PanelComposition, q5ComplaintsAddressed, q6ComplaintsDetail, q7ClinicalExam, q8ClinicalGap, q9MoharaApplied, q9MoharaDetail, q10RehabGap, q10RehabDetail, q11ScoreGap, q11ScoreDetail, q12UniqueAspects, q12UniqueDetail, recommendationType, recommendationDetail, additionalAidNeeded, additionalAidNIDetail, additionalAidOtherDetail, additionalAidUrgency, additionalAidDeadlines, willingToRepresent, notes, status, contactName, legalAidNumber, reportDate, additionalUrgency, additionalDeadline"
|
||||
}
|
||||
},
|
||||
"required": ["legalAidId", "fields"]
|
||||
}
|
||||
},
|
||||
"get_legal_aid": {
|
||||
"description": "Read an existing LegalAid entity and return all its field values. Use this to check what data has already been filled before updating.",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"legalAidId": {
|
||||
"type": "string",
|
||||
"description": "ID of the LegalAid entity to read"
|
||||
},
|
||||
"caseId": {
|
||||
"type": "string",
|
||||
"description": "Alternatively, find the LegalAid by Case ID"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,10 @@ class AfterInstall
|
||||
|
||||
$log->info('LegalAssistance: Running AfterInstall...');
|
||||
|
||||
// 0. Ensure custom i18n directories exist for all supported locales
|
||||
$config = $container->getByClass(Config::class);
|
||||
$this->ensureI18nDirectories($config, $log);
|
||||
|
||||
// 1. Deploy ai-gateway plugin files
|
||||
$this->deployPluginFiles($log);
|
||||
|
||||
@@ -42,6 +46,27 @@ class AfterInstall
|
||||
$log->info('LegalAssistance: AfterInstall completed.');
|
||||
}
|
||||
|
||||
private function ensureI18nDirectories(Config $config, Log $log): void
|
||||
{
|
||||
$basePath = 'custom/Espo/Custom/Resources/i18n';
|
||||
|
||||
$language = $config->get('language', 'en_US');
|
||||
|
||||
$locales = array_unique(['en_US', 'fa_IR', 'he_IL', $language]);
|
||||
|
||||
foreach ($locales as $locale) {
|
||||
$dir = $basePath . '/' . $locale;
|
||||
|
||||
if (!is_dir($dir)) {
|
||||
if (mkdir($dir, 0775, true)) {
|
||||
$log->info("LegalAssistance: Created i18n directory: {$dir}");
|
||||
} else {
|
||||
$log->warning("LegalAssistance: Failed to create i18n directory: {$dir}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function deployPluginFiles(Log $log): void
|
||||
{
|
||||
// Source: extension's plugins/ directory (relative to EspoCRM root after install)
|
||||
@@ -128,7 +153,7 @@ class AfterInstall
|
||||
$template = $entityManager->getNewEntity('DocumentTemplate');
|
||||
$template->set([
|
||||
'name' => 'דוח גישה ישירה',
|
||||
'entityType' => 'Case',
|
||||
'entityType' => 'LegalAid',
|
||||
'fileId' => $attachment->getId(),
|
||||
]);
|
||||
$entityManager->saveEntity($template);
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user