PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.13.0
GiveWP – Donation Plugin and Fundraising Platform v4.13.0
4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / Donors / ViewModels / DonorViewModel.php
give / src / Donors / ViewModels Last commit date
DonorViewModel.php 9 months ago
DonorViewModel.php
251 lines
1 <?php
2
3 namespace Give\Donors\ViewModels;
4
5 use Give\API\REST\V3\Routes\Donors\ValueObjects\DonorAnonymousMode;
6 use Give\DonationForms\Models\DonationForm;
7 use Give\DonationForms\Repositories\DonationFormRepository;
8 use Give\Donations\Models\Donation;
9 use Give\Donors\Models\Donor;
10 use Give\Framework\FieldsAPI\Field;
11 use Give\Framework\FieldsAPI\Types;
12
13 /**
14 * @since 4.4.0
15 */
16 class DonorViewModel
17 {
18 private Donor $donor;
19 private DonorAnonymousMode $anonymousMode;
20 private bool $includeSensitiveData = false;
21
22 /**
23 * @since 4.4.0
24 */
25 public function __construct(Donor $donor)
26 {
27 $this->donor = $donor;
28 }
29
30 /**
31 * @since 4.4.0
32 */
33 public function includeSensitiveData(bool $includeSensitiveData = true): DonorViewModel
34 {
35 $this->includeSensitiveData = $includeSensitiveData;
36
37 return $this;
38 }
39
40
41 /**
42 * @since 4.4.0
43 */
44 public function anonymousMode(DonorAnonymousMode $mode): DonorViewModel
45 {
46 $this->anonymousMode = $mode;
47
48 return $this;
49 }
50
51 /**
52 * @since 4.4.0
53 */
54 public function exports(): array
55 {
56 $data = array_merge(
57 $this->donor->toArray(),
58 [
59 'addresses' => array_map(function($address) { return $address->toArray(); }, $this->donor->addresses),
60 'avatarUrl' => $this->getAvatarUrl(),
61 'wpUserPermalink' => $this->donor->userId ? get_edit_user_link($this->donor->userId) : null,
62 'customFields' => $this->getCustomFields(),
63 ],
64 );
65
66 if ( ! $this->includeSensitiveData) {
67 $sensitiveDataExcluded = [
68 'userId',
69 'email',
70 'phone',
71 'additionalEmails',
72 'lastName',
73 'avatarUrl',
74 'company',
75 'addresses',
76 'wpUserPermalink',
77 'customFields'
78 ];
79
80 foreach ($sensitiveDataExcluded as $propertyName) {
81 switch ($propertyName) {
82 case 'additionalEmails':
83 case 'customFields':
84 $data[$propertyName] = [];
85 break;
86 default:
87 $data[$propertyName] = '';
88 break;
89 }
90 }
91 }
92
93
94 if (isset($this->anonymousMode) && $this->anonymousMode->isRedacted() && $this->donor->isAnonymous()) {
95 $anonymousDataRedacted = [
96 'id',
97 'name',
98 'firstName',
99 'lastName',
100 'prefix',
101 'avatarUrl',
102 'company',
103 'email',
104 'phone',
105 'additionalEmails',
106 'wpUserPermalink',
107 'customFields'
108 ];
109
110 foreach ($anonymousDataRedacted as $propertyName) {
111 switch ($propertyName) {
112 case 'id':
113 $data[$propertyName] = 0;
114 break;
115 case 'wpUserPermalink':
116 case 'avatarUrl':
117 $data[$propertyName] = '';
118 break;
119 case 'additionalEmails':
120 case 'customFields':
121 $data[$propertyName] = [];
122 break;
123 default:
124 $data[$propertyName] = __('anonymous', 'give');
125 break;
126 }
127 }
128 }
129
130 return $data;
131 }
132
133 /**
134 * Get avatar URL from avatar ID with fallback to Gravatar
135 *
136 * @since 4.4.0
137 */
138 private function getAvatarUrl(): ?string
139 {
140 $avatarId = $this->donor->avatarId;
141
142 if ($avatarId) {
143 return wp_get_attachment_image_url($avatarId, ['width' => '80', 'height' => '80']);
144 } else {
145 return give_validate_gravatar($this->donor->email) ? get_avatar_url($this->donor->email, ['size' => 80]) : null;
146 }
147 }
148
149 /**
150 * Get custom fields for the donor
151 *
152 * @since 4.4.0
153 */
154 private function getCustomFields(): array
155 {
156 $forms = $this->getUniqueDonationFormsForDonor();
157
158 if (empty($forms)) {
159 return [];
160 }
161
162 $allFields = [];
163 foreach ($forms as $form) {
164 $allFields = array_merge($allFields, $this->getDisplayedDonorMetaFieldsForForm($form));
165 }
166
167 $customFields = [];
168 foreach ($allFields as $field) {
169 $value = $this->getFieldValue($field);
170
171 if (empty($value)) {
172 continue;
173 }
174
175 $customFields[] = [
176 'label' => method_exists($field, 'getLabel') ? $field->getLabel() : $field->getName(),
177 'value' => $value,
178 ];
179 }
180
181 return $customFields;
182 }
183
184 /**
185 * Get unique donation forms for the donor
186 *
187 * @since 4.4.0
188 */
189 private function getUniqueDonationFormsForDonor(): array
190 {
191 $donations = $this->donor->donations()->getAll();
192
193 if (empty($donations)) {
194 return [];
195 }
196
197 $uniqueFormIds = [];
198 foreach ($donations as $donation) {
199 $formId = $donation->formId;
200
201 // Skip legacy forms and avoid duplicates
202 if (!give(DonationFormRepository::class)->isLegacyForm($formId) && !in_array($formId, $uniqueFormIds, true)) {
203 $uniqueFormIds[] = $formId;
204 }
205 }
206
207 $forms = [];
208 foreach ($uniqueFormIds as $formId) {
209 $form = DonationForm::find($formId);
210 if ($form !== null) {
211 $forms[] = $form;
212 }
213 }
214
215 return $forms;
216 }
217
218 /**
219 * Get displayed donor meta fields for a form
220 *
221 * @since 4.4.0
222 */
223 private function getDisplayedDonorMetaFieldsForForm(DonationForm $form): array
224 {
225 return array_filter($form->schema()->getFields(), static function (Field $field): bool {
226 return $field->shouldShowInAdmin() && $field->shouldStoreAsDonorMeta();
227 });
228 }
229
230 /**
231 * Get field value for a custom field
232 *
233 * @since 4.4.0
234 */
235 private function getFieldValue(Field $field): string
236 {
237 $metaValue = give()->donor_meta->get_meta($this->donor->id, $field->getName(), true);
238
239 if (empty($metaValue)) {
240 return '';
241 }
242
243 if ($field->getType() === Types::FILE) {
244 $attachmentLink = wp_get_attachment_link($metaValue);
245 return $attachmentLink ?: '';
246 }
247
248 return (string) $metaValue;
249 }
250 }
251