forked from portabilis/i-educar
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCanChangeExitDate.php
90 lines (75 loc) · 3.01 KB
/
CanChangeExitDate.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php
namespace App\Rules;
use App\Models\LegacyDiscipline;
use App\Support\ExternalServices\iDiario;
use Illuminate\Contracts\Validation\Rule;
class CanChangeExitDate implements Rule
{
use iDiario;
protected $msg;
private const ACTIVITY_TYPE_DESCRIPTION = [
'daily_note' => 'Diário de avaliações',
'conceptual_exam' => 'Diário de avaliações conceituais',
'avaliation_exemption' => 'Dispensa de avaliações',
'transfer_note' => 'Notas de transferência',
'complementary_exam' => 'Recuperação de avaliações',
'recovery_diary_record_student' => 'Recuperação de etapas',
'school_term_recovery_diary_record' => 'Diário de avaliações complementares',
'observation_diary_record' => 'Diário de observações',
];
private const IGNORED_ACTIVITY_TYPES = ['descriptive_exam', 'general_descriptive_exam'];
public function passes($attribute, $value)
{
$iDiarioService = $this->getIdiarioService();
if ($iDiarioService) {
$studentActivity = $iDiarioService->getStudentActivity($value['student_id'], $value['exit_date']);
$studentActivity = $this->removeIgnoredTypes($studentActivity);
$hasActivity = count($studentActivity['student_activity']) > 0;
if ($hasActivity) {
$this->msg = $this->buildHtmlMessage($studentActivity);
return false;
}
}
return true;
}
private function buildHtmlMessage(array $studentActivity)
{
$html = '';
foreach ($studentActivity['student_activity'] as $activityType) {
$html .= '<b>' . self::ACTIVITY_TYPE_DESCRIPTION[$activityType->type] . '</b>';
if (isset($activityType->disciplines)) {
$html .= ': (';
$disciplinesName = [];
$contDisciplines = count($activityType->disciplines);
for ($i = 0; $i < $contDisciplines; $i++) {
$disciplinesName[] = $this->getDisciplineNameById($activityType->disciplines[$i]);
if ($i === 4) {
break;
}
}
$html .= implode(', ', $disciplinesName);
$html .= $contDisciplines > 5 ? ' e outras) <br><br>' : ')<br><br>';
} else {
$html .= ': Sim <br><br>';
}
}
return $html;
}
private function getDisciplineNameById($disciplinaId)
{
return LegacyDiscipline::find($disciplinaId)->nome;
}
private function removeIgnoredTypes(array $studentActivity)
{
foreach ($studentActivity['student_activity'] as $key => $item) {
if (in_array($item->type, ['descriptive_exam', 'general_descriptive_exam'])) {
unset($studentActivity['student_activity'][$key]);
}
}
return $studentActivity;
}
public function message()
{
return 'Existem lançamentos no i-Diário: <br><br>'.$this->msg;
}
}