PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.4.0
GiveWP – Donation Plugin and Fundraising Platform v4.4.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 1 year ago
DonorViewModel.php
253 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 if (isset($data[$propertyName])) {
82 switch ($propertyName) {
83 case 'additionalEmails':
84 case 'customFields':
85 $data[$propertyName] = [];
86 break;
87 default:
88 $data[$propertyName] = '';
89 break;
90 }
91 }
92 }
93 }
94
95
96 if (isset($this->anonymousMode) && $this->anonymousMode->isRedacted() && $this->donor->isAnonymous()) {
97 $anonymousDataRedacted = [
98 'id',
99 'name',
100 'firstName',
101 'lastName',
102 'prefix',
103 'avatarUrl',
104 'company',
105 'email',
106 'phone',
107 'additionalEmails',
108 'wpUserPermalink',
109 'customFields'
110 ];
111
112 foreach ($anonymousDataRedacted as $propertyName) {
113 switch ($propertyName) {
114 case 'id':
115 $data[$propertyName] = 0;
116 break;
117 case 'wpUserPermalink':
118 case 'avatarUrl':
119 $data[$propertyName] = '';
120 break;
121 case 'additionalEmails':
122 case 'customFields':
123 $data[$propertyName] = [];
124 break;
125 default:
126 $data[$propertyName] = __('anonymous', 'give');
127 break;
128 }
129 }
130 }
131
132 return $data;
133 }
134
135 /**
136 * Get avatar URL from avatar ID with fallback to Gravatar
137 *
138 * @since 4.4.0
139 */
140 private function getAvatarUrl(): ?string
141 {
142 $avatarId = $this->donor->avatarId;
143
144 if ($avatarId) {
145 return wp_get_attachment_image_url($avatarId, ['width' => '80', 'height' => '80']);
146 } else {
147 return give_validate_gravatar($this->donor->email) ? get_avatar_url($this->donor->email, ['size' => 80]) : null;
148 }
149 }
150
151 /**
152 * Get custom fields for the donor
153 *
154 * @since 4.4.0
155 */
156 private function getCustomFields(): array
157 {
158 $forms = $this->getUniqueDonationFormsForDonor();
159
160 if (empty($forms)) {
161 return [];
162 }
163
164 $allFields = [];
165 foreach ($forms as $form) {
166 $allFields = array_merge($allFields, $this->getDisplayedDonorMetaFieldsForForm($form));
167 }
168
169 $customFields = [];
170 foreach ($allFields as $field) {
171 $value = $this->getFieldValue($field);
172
173 if (empty($value)) {
174 continue;
175 }
176
177 $customFields[] = [
178 'label' => method_exists($field, 'getLabel') ? $field->getLabel() : $field->getName(),
179 'value' => $value,
180 ];
181 }
182
183 return $customFields;
184 }
185
186 /**
187 * Get unique donation forms for the donor
188 *
189 * @since 4.4.0
190 */
191 private function getUniqueDonationFormsForDonor(): array
192 {
193 $donations = $this->donor->donations()->getAll();
194
195 if (empty($donations)) {
196 return [];
197 }
198
199 $uniqueFormIds = [];
200 foreach ($donations as $donation) {
201 $formId = $donation->formId;
202
203 // Skip legacy forms and avoid duplicates
204 if (!give(DonationFormRepository::class)->isLegacyForm($formId) && !in_array($formId, $uniqueFormIds, true)) {
205 $uniqueFormIds[] = $formId;
206 }
207 }
208
209 $forms = [];
210 foreach ($uniqueFormIds as $formId) {
211 $form = DonationForm::find($formId);
212 if ($form !== null) {
213 $forms[] = $form;
214 }
215 }
216
217 return $forms;
218 }
219
220 /**
221 * Get displayed donor meta fields for a form
222 *
223 * @since 4.4.0
224 */
225 private function getDisplayedDonorMetaFieldsForForm(DonationForm $form): array
226 {
227 return array_filter($form->schema()->getFields(), static function (Field $field): bool {
228 return $field->shouldShowInAdmin() && $field->shouldStoreAsDonorMeta();
229 });
230 }
231
232 /**
233 * Get field value for a custom field
234 *
235 * @since 4.4.0
236 */
237 private function getFieldValue(Field $field): string
238 {
239 $metaValue = give()->donor_meta->get_meta($this->donor->id, $field->getName(), true);
240
241 if (empty($metaValue)) {
242 return '';
243 }
244
245 if ($field->getType() === Types::FILE) {
246 $attachmentLink = wp_get_attachment_link($metaValue);
247 return $attachmentLink ?: '';
248 }
249
250 return (string) $metaValue;
251 }
252 }
253