Compare commits

...

5 Commits

Author SHA1 Message Date
chaim f8022279ad fix: change date format from dd/mm/yyyy to dd.mm.yyyy
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 21:24:18 +00:00
chaim 763638abd5 fix: add non-breaking space after checkbox characters
PHPWord's TemplateProcessor loses regular spaces between placeholder
replacement values and adjacent text in RTL documents. Using NBSP
(\u00A0) after ☑/☐ ensures Word preserves the spacing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 21:21:44 +00:00
chaim 99bc442495 fix: handle stdClass legalAnalysis in DirectAccessReportGenerator
When legalAnalysis arrives as a stdClass (from JSON decode), cast it to
array before using array access. Prevents fatal error in PHP 8.x.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:59:14 +00:00
chaim 61fe16a0ea fix: enforce legal analysis step and correct recommendation selection
- Prompt: CRITICAL instruction — must complete all 7 steps before generating report
- Step 5 (legal analysis) is mandatory, cannot be skipped even if user asks
- Step 6: explicit instruction to use "המשך ייצוג" when user is filing/continuing
- Prevent AI from choosing "עדיין לא ניתן להחליט" when user has already decided

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 16:49:44 +00:00
chaim 14979dba4b fix: direct access report placeholder mismatches and missing recommendation option
- 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) <noreply@anthropic.com>
2026-04-09 16:30:19 +00:00
5 changed files with 43 additions and 12 deletions
@@ -58,9 +58,28 @@ class DirectAccessReportGenerator
? trim($contact->get('firstName') . ' ' . $contact->get('lastName')) ? trim($contact->get('firstName') . ' ' . $contact->get('lastName'))
: 'ללא איש קשר'; : 'ללא איש קשר';
// Get assigned user name // Get assigned user name — prefer case's assignedUser, then userId, then current user
$assignedUser = $userId ? $this->entityManager->getEntityById('User', $userId) : null; $assignedUserName = '';
$assignedUserName = $assignedUser ? $assignedUser->get('name') : ($this->user->get('name') ?? ''); $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 // Build placeholder data directly from params
$data = $this->buildPlaceholderData($params, $case, $contactName, $assignedUserName); $data = $this->buildPlaceholderData($params, $case, $contactName, $assignedUserName);
@@ -131,11 +150,22 @@ class DirectAccessReportGenerator
$legalAnalysis = $params['legalAnalysis'] ?? []; $legalAnalysis = $params['legalAnalysis'] ?? [];
if (is_string($legalAnalysis)) { if (is_string($legalAnalysis)) {
$legalAnalysis = json_decode($legalAnalysis, true) ?? []; $legalAnalysis = json_decode($legalAnalysis, true) ?? [];
} elseif (is_object($legalAnalysis)) {
$legalAnalysis = (array) $legalAnalysis;
}
// 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 [ return [
// Header // Header
'legalAidNumber' => $params['legalAidNumber'] ?? $case->get('cLegalAidNumber') ?? '', 'cLegalAidNumber' => $params['legalAidNumber'] ?? $case->get('cLegalAidNumber') ?? '',
'contactName' => $contactName, 'contactName' => $contactName,
'assignedUserName' => $assignedUserName, 'assignedUserName' => $assignedUserName,
'reportDate' => $this->formatDate(date('Y-m-d')), 'reportDate' => $this->formatDate(date('Y-m-d')),
@@ -186,8 +216,8 @@ class DirectAccessReportGenerator
private function addCheckboxData(array &$data, array $params): void private function addCheckboxData(array &$data, array $params): void
{ {
$CHK = '☑'; $CHK = "\u{00A0}";
$UNCHK = '☐'; $UNCHK = "\u{00A0}";
$urgency = $params['urgencyLevel'] ?? ''; $urgency = $params['urgencyLevel'] ?? '';
$data['chk_urgency_regular'] = ($urgency === 'רגיל') ? $CHK : $UNCHK; $data['chk_urgency_regular'] = ($urgency === 'רגיל') ? $CHK : $UNCHK;
@@ -211,6 +241,7 @@ class DirectAccessReportGenerator
$data['chk_contact_bad'] = ($contactStatus === 'לא תקין') ? $CHK : $UNCHK; $data['chk_contact_bad'] = ($contactStatus === 'לא תקין') ? $CHK : $UNCHK;
$rec = $params['recommendationType'] ?? ''; $rec = $params['recommendationType'] ?? '';
$data['chk_rec_proceed'] = ($rec === 'המשך ייצוג') ? $CHK : $UNCHK;
$data['chk_rec_consulting'] = ($rec === 'ייעוץ והדרכה חלף ייצוג') ? $CHK : $UNCHK; $data['chk_rec_consulting'] = ($rec === 'ייעוץ והדרכה חלף ייצוג') ? $CHK : $UNCHK;
$data['chk_rec_waiver'] = ($rec === 'ויתור הלקוח') ? $CHK : $UNCHK; $data['chk_rec_waiver'] = ($rec === 'ויתור הלקוח') ? $CHK : $UNCHK;
$data['chk_rec_replacement'] = ($rec === 'החלפת ייצוג') ? $CHK : $UNCHK; $data['chk_rec_replacement'] = ($rec === 'החלפת ייצוג') ? $CHK : $UNCHK;
@@ -361,7 +392,7 @@ class DirectAccessReportGenerator
{ {
if (!$date) return ''; if (!$date) return '';
if (preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $date, $m)) { if (preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $date, $m)) {
return "{$m[3]}/{$m[2]}/{$m[1]}"; return "{$m[3]}.{$m[2]}.{$m[1]}";
} }
return $date; return $date;
} }
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "LegalAssistance", "name": "LegalAssistance",
"version": "2.0.2", "version": "2.0.7",
"acceptableVersions": [">=8.0.0"], "acceptableVersions": [">=8.0.0"],
"php": [">=8.1"], "php": [">=8.1"],
"releaseDate": "2026-04-09", "releaseDate": "2026-04-09",
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -109,8 +109,8 @@
}, },
"recommendationType": { "recommendationType": {
"type": "string", "type": "string",
"enum": ["ייעוץ והדרכה חלף ייצוג", "ויתור הלקוח", "החלפת ייצוג", "לא נוצר קשר", "לא התקיימה פגישה", "עדיין לא ניתן להחליט", "נדרשים מסמכים נוספים", "המלצה לסירוב"], "enum": ["המשך ייצוג", "ייעוץ והדרכה חלף ייצוג", "ויתור הלקוח", "החלפת ייצוג", "לא נוצר קשר", "לא התקיימה פגישה", "עדיין לא ניתן להחליט", "נדרשים מסמכים נוספים", "המלצה לסירוב"],
"description": "סוג ההמלצה/ההודעה" "description": "סוג ההמלצה/ההודעה — בחר ׳המשך ייצוג׳ כשמומלץ להגיש ערעור או להמשיך בייצוג"
}, },
"recommendationDetail": { "recommendationDetail": {
"type": "string", "type": "string",
Binary file not shown.