Skip to content

Commit 55b64bf

Browse files
wip
1 parent 8074422 commit 55b64bf

14 files changed

+806
-158
lines changed

app/Filament/Organizations/Resources/Cases/CaseResource.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66

77
use App\Filament\Organizations\Resources\Cases\Pages\CreateCase;
88
use App\Filament\Organizations\Resources\Cases\Pages\DetailedEvaluation\CreateCaseDetailedEvaluation;
9+
use App\Filament\Organizations\Resources\Cases\Pages\DetailedEvaluation\EditCaseDetailedEvaluationDetails;
10+
use App\Filament\Organizations\Resources\Cases\Pages\DetailedEvaluation\EditCaseDetailedEvaluationMultidisciplinary;
11+
use App\Filament\Organizations\Resources\Cases\Pages\DetailedEvaluation\EditCaseDetailedEvaluationPartner;
12+
use App\Filament\Organizations\Resources\Cases\Pages\DetailedEvaluation\EditCaseDetailedEvaluationResults;
913
use App\Filament\Organizations\Resources\Cases\Pages\DetailedEvaluation\ViewCaseDetailedEvaluation;
1014
use App\Filament\Organizations\Resources\Cases\Pages\EditCaseAggressor;
1115
use App\Filament\Organizations\Resources\Cases\Pages\EditCaseAntecedents;
@@ -168,6 +172,10 @@ public static function getPages(): array
168172
'view_detailed_evaluation' => ViewCaseDetailedEvaluation::route('/{record}/detailed-evaluation'),
169173
'create_detailed_evaluation' => CreateCaseDetailedEvaluation::route('/{record}/detailed-evaluation/create'),
170174
'edit_detailed_evaluation' => CreateCaseDetailedEvaluation::route('/{record}/detailed-evaluation/edit'),
175+
'edit_detailed_evaluation_details' => EditCaseDetailedEvaluationDetails::route('/{record}/detailed-evaluation/details/edit'),
176+
'edit_detailed_evaluation_partner' => EditCaseDetailedEvaluationPartner::route('/{record}/detailed-evaluation/partner/edit'),
177+
'edit_detailed_evaluation_multidisciplinary' => EditCaseDetailedEvaluationMultidisciplinary::route('/{record}/detailed-evaluation/multidisciplinary/edit'),
178+
'edit_detailed_evaluation_results' => EditCaseDetailedEvaluationResults::route('/{record}/detailed-evaluation/results/edit'),
171179
'create_intervention_plan' => CreateCaseInterventionPlan::route('/{record}/intervention-plan/create'),
172180
'view_intervention_plan' => ViewCaseInterventionPlan::route('/{record}/intervention-plan'),
173181
'view_intervention_service' => ViewCaseInterventionService::route('/{record}/intervention-plan/services/{interventionService}'),

app/Filament/Organizations/Resources/Cases/Pages/DetailedEvaluation/CreateCaseDetailedEvaluation.php

Lines changed: 4 additions & 151 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
use App\Actions\BackAction;
88
use App\Concerns\PreventMultipleSubmit;
99
use App\Concerns\PreventSubmitFormOnEnter;
10-
use App\Enums\AddressType;
1110
use App\Enums\Applicant;
1211
use App\Enums\Occupation;
1312
use App\Enums\RecommendationService;
@@ -16,7 +15,6 @@
1615
use App\Forms\Components\DatePicker;
1716
use App\Forms\Components\Select;
1817
use App\Models\Beneficiary;
19-
use App\Models\BeneficiaryPartner;
2018
use Filament\Facades\Filament;
2119
use Filament\Forms\Components\Checkbox;
2220
use Filament\Forms\Components\CheckboxList;
@@ -38,16 +36,10 @@ class CreateCaseDetailedEvaluation extends EditRecord
3836
use HasWizard;
3937
use PreventMultipleSubmit;
4038
use PreventSubmitFormOnEnter;
39+
use SavesPartnerAddresses;
4140

4241
protected static string $resource = CaseResource::class;
4342

44-
/**
45-
* Partner address data captured before save (form state is cleared of these after save).
46-
*
47-
* @var array{legal_residence?: array, effective_residence?: array, same_as_legal_residence?: bool}|null
48-
*/
49-
protected ?array $pendingPartnerAddressData = null;
50-
5143
public function getTitle(): string|Htmlable
5244
{
5345
return __('beneficiary.page.create_detailed_evaluation.title');
@@ -104,35 +96,7 @@ public function getSteps(): array
10496
*/
10597
protected function mutateFormDataBeforeFill(array $data): array
10698
{
107-
$record = $this->getRecord();
108-
if (! $record instanceof Beneficiary) {
109-
return $data;
110-
}
111-
112-
$partner = $record->partner;
113-
if (! $partner) {
114-
return $data;
115-
}
116-
117-
$partner->loadMissing(['legal_residence', 'effective_residence']);
118-
$partnerData = $data['partner'] ?? [];
119-
120-
if ($partner->legal_residence) {
121-
$partnerData['legal_residence'] = array_merge(
122-
$partnerData['legal_residence'] ?? [],
123-
$partner->legal_residence->only(['county_id', 'city_id', 'address'])
124-
);
125-
}
126-
if ($partner->effective_residence) {
127-
$partnerData['effective_residence'] = array_merge(
128-
$partnerData['effective_residence'] ?? [],
129-
$partner->effective_residence->only(['county_id', 'city_id', 'address'])
130-
);
131-
}
132-
133-
$data['partner'] = $partnerData;
134-
135-
return $data;
99+
return $this->mutateFormDataBeforeFillPartner($data);
136100
}
137101

138102
/**
@@ -141,123 +105,12 @@ protected function mutateFormDataBeforeFill(array $data): array
141105
*/
142106
protected function mutateFormDataBeforeSave(array $data): array
143107
{
144-
$partnerData = $data['partner'] ?? [];
145-
146-
$rawState = method_exists($this->form, 'getRawState') ? $this->form->getRawState() : (array) $this->data;
147-
$partnerFromState = $data['partner'] ?? $rawState['partner'] ?? [];
148-
$partnerFromLivewire = $rawState['partner'] ?? $this->data['partner'] ?? [];
149-
$legal = $partnerFromState['legal_residence'] ?? $partnerFromLivewire['legal_residence'] ?? [];
150-
$effective = $partnerFromState['effective_residence'] ?? $partnerFromLivewire['effective_residence'] ?? [];
151-
$this->pendingPartnerAddressData = [
152-
'legal_residence' => is_array($legal) ? $legal : [],
153-
'effective_residence' => is_array($effective) ? $effective : [],
154-
'same_as_legal_residence' => (bool) ($partnerFromState['same_as_legal_residence'] ?? $partnerFromLivewire['same_as_legal_residence'] ?? false),
155-
];
156-
157-
unset($partnerData['legal_residence'], $partnerData['effective_residence']);
158-
$data['partner'] = $partnerData;
159-
160-
return $data;
108+
return $this->capturePartnerAddressDataBeforeSave($data);
161109
}
162110

163111
public function afterSave(): void
164112
{
165-
$record = $this->getRecord();
166-
if (! $record instanceof Beneficiary) {
167-
return;
168-
}
169-
170-
$partnerRecord = $record->partner;
171-
if ($partnerRecord && $partnerRecord->same_as_legal_residence) {
172-
$partnerRecord->loadMissing(['legal_residence', 'effective_residence']);
173-
BeneficiaryPartner::copyLegalResidenceToEffectiveResidence($partnerRecord);
174-
}
175-
176-
$this->savePartnerAddressesFromFormState();
177-
}
178-
179-
private function savePartnerAddressesFromFormState(): void
180-
{
181-
$record = $this->getRecord();
182-
if (! $record instanceof Beneficiary) {
183-
return;
184-
}
185-
186-
$partner = $record->partner;
187-
if (! $partner) {
188-
return;
189-
}
190-
191-
$partnerState = $this->pendingPartnerAddressData ?? [];
192-
$this->pendingPartnerAddressData = null;
193-
194-
$legalData = $partnerState['legal_residence'] ?? [];
195-
$effectiveData = $partnerState['effective_residence'] ?? [];
196-
$sameAsLegal = (bool) ($partnerState['same_as_legal_residence'] ?? false);
197-
198-
if ($this->hasPartnerAddressData($legalData)) {
199-
$attrs = array_merge(
200-
$this->buildPartnerAddressAttributes($legalData, AddressType::LEGAL_RESIDENCE),
201-
[
202-
'address_type' => AddressType::LEGAL_RESIDENCE,
203-
'addressable_id' => $partner->getKey(),
204-
'addressable_type' => $partner->getMorphClass(),
205-
]
206-
);
207-
$partner->legal_residence()->updateOrCreate(
208-
['addressable_id' => $partner->getKey(), 'addressable_type' => $partner->getMorphClass()],
209-
$attrs
210-
);
211-
} else {
212-
$partner->legal_residence?->delete();
213-
}
214-
215-
$effectivePayload = $sameAsLegal ? $legalData : $effectiveData;
216-
if ($this->hasPartnerAddressData($effectivePayload)) {
217-
$attrs = array_merge(
218-
$this->buildPartnerAddressAttributes($effectivePayload, AddressType::EFFECTIVE_RESIDENCE),
219-
[
220-
'address_type' => AddressType::EFFECTIVE_RESIDENCE,
221-
'addressable_id' => $partner->getKey(),
222-
'addressable_type' => $partner->getMorphClass(),
223-
]
224-
);
225-
$partner->effective_residence()->updateOrCreate(
226-
['addressable_id' => $partner->getKey(), 'addressable_type' => $partner->getMorphClass()],
227-
$attrs
228-
);
229-
} else {
230-
$partner->effective_residence?->delete();
231-
}
232-
}
233-
234-
/**
235-
* @param array<string, mixed> $data
236-
*/
237-
private function hasPartnerAddressData(array $data): bool
238-
{
239-
$countyId = $data['county_id'] ?? null;
240-
$cityId = $data['city_id'] ?? null;
241-
$address = $data['address'] ?? null;
242-
243-
return $countyId !== null || $cityId !== null || filled($address);
244-
}
245-
246-
/**
247-
* @param array<string, mixed> $data
248-
* @return array<string, mixed>
249-
*/
250-
private function buildPartnerAddressAttributes(array $data, AddressType $type): array
251-
{
252-
$attrs = [
253-
'country_id' => $data['country_id'] ?? null,
254-
'county_id' => $data['county_id'] ?? null,
255-
'city_id' => $data['city_id'] ?? null,
256-
'address' => $data['address'] ?? null,
257-
'environment' => $data['environment'] ?? null,
258-
];
259-
260-
return array_filter($attrs, fn ($v) => $v !== null && $v !== '');
113+
$this->afterSavePartnerAddresses();
261114
}
262115

263116
/**
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Filament\Organizations\Resources\Cases\Pages\DetailedEvaluation;
6+
7+
use App\Actions\BackAction;
8+
use App\Concerns\PreventSubmitFormOnEnter;
9+
use App\Filament\Organizations\Resources\Cases\CaseResource;
10+
use App\Forms\Components\DatePicker;
11+
use Filament\Forms\Components\Repeater;
12+
use Filament\Forms\Components\TextInput;
13+
use Filament\Resources\Pages\EditRecord;
14+
use Filament\Schemas\Components\Section;
15+
use Filament\Schemas\Schema;
16+
use Illuminate\Contracts\Support\Htmlable;
17+
18+
class EditCaseDetailedEvaluationDetails extends EditRecord
19+
{
20+
use PreventSubmitFormOnEnter;
21+
22+
protected static string $resource = CaseResource::class;
23+
24+
public function getTitle(): string|Htmlable
25+
{
26+
return __('beneficiary.wizard.details.label');
27+
}
28+
29+
public function getBreadcrumbs(): array
30+
{
31+
$record = $this->getRecord();
32+
33+
return [
34+
CaseResource::getUrl('index') => __('case.view.breadcrumb_all'),
35+
CaseResource::getUrl('view', ['record' => $record]) => $record->getBreadcrumb(),
36+
CaseResource::getUrl('view_detailed_evaluation', ['record' => $record]) => __('beneficiary.breadcrumb.wizard_detailed_evaluation'),
37+
'' => __('beneficiary.wizard.details.label'),
38+
];
39+
}
40+
41+
protected function getHeaderActions(): array
42+
{
43+
return [
44+
BackAction::make()
45+
->url(CaseResource::getUrl('view_detailed_evaluation', ['record' => $this->getRecord()])),
46+
];
47+
}
48+
49+
protected function getRedirectUrl(): string
50+
{
51+
return CaseResource::getUrl('view_detailed_evaluation', ['record' => $this->getRecord()]).'?tab='.\Illuminate\Support\Str::slug(__('beneficiary.wizard.details.label'));
52+
}
53+
54+
public function form(Schema $schema): Schema
55+
{
56+
return $schema
57+
->columns(1)
58+
->components([
59+
Section::make()
60+
->maxWidth('3xl')
61+
->schema([
62+
Repeater::make('detailedEvaluationSpecialists')
63+
->relationship('detailedEvaluationSpecialists')
64+
->label(__('beneficiary.section.detailed_evaluation.labels.specialists'))
65+
->addActionLabel(__('beneficiary.action.add_row'))
66+
->deletable()
67+
->columns(4)
68+
->itemLabel(fn (array $state): ?string => $state['full_name'] ?? null)
69+
->schema([
70+
TextInput::make('full_name')
71+
->label(__('beneficiary.section.detailed_evaluation.labels.full_name'))
72+
->maxLength(50),
73+
TextInput::make('institution')
74+
->label(__('beneficiary.section.detailed_evaluation.labels.institution'))
75+
->maxLength(50)
76+
->default(fn () => \Filament\Facades\Filament::getTenant()?->institution?->name),
77+
TextInput::make('relationship')
78+
->label(__('beneficiary.section.detailed_evaluation.labels.relationship'))
79+
->maxLength(50),
80+
DatePicker::make('date')
81+
->label(__('beneficiary.section.detailed_evaluation.labels.contact_date')),
82+
]),
83+
Repeater::make('meetings')
84+
->relationship('meetings')
85+
->columns()
86+
->addActionLabel(__('beneficiary.action.add_meet_row'))
87+
->label(__('beneficiary.section.detailed_evaluation.labels.meetings'))
88+
->schema([
89+
TextInput::make('specialist')
90+
->label(__('beneficiary.section.detailed_evaluation.labels.specialist'))
91+
->placeholder(__('beneficiary.placeholder.full_name'))
92+
->maxLength(50)
93+
->required(),
94+
DatePicker::make('date')
95+
->label(__('beneficiary.section.detailed_evaluation.labels.date'))
96+
->placeholder(__('beneficiary.placeholder.date'))
97+
->required(),
98+
TextInput::make('location')
99+
->label(__('beneficiary.section.detailed_evaluation.labels.location'))
100+
->placeholder(__('beneficiary.placeholder.meet_location'))
101+
->maxLength(50),
102+
TextInput::make('observations')
103+
->label(__('beneficiary.section.detailed_evaluation.labels.observations'))
104+
->placeholder(__('beneficiary.placeholder.relevant_details'))
105+
->maxLength(200),
106+
]),
107+
]),
108+
]);
109+
}
110+
}

0 commit comments

Comments
 (0)