DonorDetailsController.php
73 lines
| 1 | <?php |
| 2 | |
| 3 | namespace Give\Donors\CustomFields\Controllers; |
| 4 | |
| 5 | use Give\DonationForms\Models\DonationForm; |
| 6 | use Give\DonationForms\Repositories\DonationFormRepository; |
| 7 | use Give\Donations\Models\Donation; |
| 8 | use Give\Donors\CustomFields\Views\DonorDetailsView; |
| 9 | use Give\Donors\Models\Donor; |
| 10 | |
| 11 | use function array_reduce; |
| 12 | |
| 13 | /** |
| 14 | * TODO: move into donors domain |
| 15 | * @since 3.0.0 |
| 16 | */ |
| 17 | class DonorDetailsController |
| 18 | { |
| 19 | /** |
| 20 | * @since 3.0.0 |
| 21 | */ |
| 22 | public function show(Donor $donor): string |
| 23 | { |
| 24 | $forms = $this->getUniqueDonationFormsForDonor($donor); |
| 25 | |
| 26 | if (!$forms) { |
| 27 | return ''; |
| 28 | } |
| 29 | |
| 30 | $fields = array_reduce($forms, function ($fields, DonationForm $form) { |
| 31 | return $fields + $this->getDisplayedDonorMetaFieldsForForm($form); |
| 32 | }, []); |
| 33 | |
| 34 | return (new DonorDetailsView($donor, $fields))->render(); |
| 35 | } |
| 36 | |
| 37 | /** |
| 38 | * @since 3.0.0 |
| 39 | * |
| 40 | * @param Donor $donor |
| 41 | * |
| 42 | * @return DonationForm[] |
| 43 | */ |
| 44 | protected function getUniqueDonationFormsForDonor(Donor $donor): array |
| 45 | { |
| 46 | $formIds = array_map(static function (Donation $donation) { |
| 47 | return $donation->formId; |
| 48 | }, $donor->donations); |
| 49 | |
| 50 | $formIds = array_filter($formIds, static function ($formId) { |
| 51 | return !give(DonationFormRepository::class)->isLegacyForm($formId); |
| 52 | }); |
| 53 | |
| 54 | return array_map(static function ($formId) { |
| 55 | return DonationForm::find($formId); |
| 56 | }, array_unique($formIds)); |
| 57 | } |
| 58 | |
| 59 | /** |
| 60 | * @since 3.0.0 |
| 61 | * |
| 62 | * @param DonationForm $form |
| 63 | * |
| 64 | * @return array |
| 65 | */ |
| 66 | protected function getDisplayedDonorMetaFieldsForForm(DonationForm $form): array |
| 67 | { |
| 68 | return array_filter($form->schema()->getFields(), static function ($field) { |
| 69 | return $field->shouldShowInAdmin() && $field->shouldStoreAsDonorMeta(); |
| 70 | }); |
| 71 | } |
| 72 | } |
| 73 |