77use App \Actions \BackAction ;
88use App \Concerns \PreventMultipleSubmit ;
99use App \Concerns \PreventSubmitFormOnEnter ;
10- use App \Enums \AddressType ;
1110use App \Enums \Applicant ;
1211use App \Enums \Occupation ;
1312use App \Enums \RecommendationService ;
1615use App \Forms \Components \DatePicker ;
1716use App \Forms \Components \Select ;
1817use App \Models \Beneficiary ;
19- use App \Models \BeneficiaryPartner ;
2018use Filament \Facades \Filament ;
2119use Filament \Forms \Components \Checkbox ;
2220use 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 /**
0 commit comments