PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.16.3
GiveWP – Donation Plugin and Fundraising Platform v4.16.3
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 / API / REST / V3 / Routes / Donations / ViewModels / DonationViewModel.php
give / src / API / REST / V3 / Routes / Donations / ViewModels Last commit date
DonationViewModel.php 5 months ago
DonationViewModel.php
238 lines
1 <?php
2
3 namespace Give\API\REST\V3\Routes\Donations\ViewModels;
4
5 use Give\API\REST\V3\Routes\Donations\ValueObjects\DonationAnonymousMode;
6 use Give\DonationForms\Models\DonationForm;
7 use Give\DonationForms\Repositories\DonationFormRepository;
8 use Give\Donations\Models\Donation;
9 use Give\EventTickets\Repositories\EventTicketRepository;
10 use Give\Framework\FieldsAPI\Field;
11 use Give\Framework\FieldsAPI\Types;
12 use Give\Framework\PaymentGateways\PaymentGatewayRegister;
13 use Give\Framework\Support\Facades\Str;
14
15 /**
16 * @since 4.6.0
17 */
18 class DonationViewModel
19 {
20 private Donation $donation;
21 private DonationAnonymousMode $anonymousMode;
22 private bool $includeSensitiveData = false;
23
24 /**
25 * @since 4.6.0
26 */
27 public function __construct(Donation $donation)
28 {
29 $this->donation = $donation;
30 }
31
32 /**
33 * @since 4.6.0
34 */
35 public function includeSensitiveData(bool $includeSensitiveData = true): DonationViewModel
36 {
37 $this->includeSensitiveData = $includeSensitiveData;
38
39 return $this;
40 }
41
42 /**
43 * @since 4.6.0
44 */
45 public function anonymousMode(DonationAnonymousMode $mode): DonationViewModel
46 {
47 $this->anonymousMode = $mode;
48
49 return $this;
50 }
51
52 /**
53 * @since 4.14.0 Add gatewayTransactionId to the sensitive data excluded list, lastName should return only the first letter when sensitive data is not included
54 * @since 4.6.0
55 */
56 public function exports(): array
57 {
58 $data = array_merge(
59 $this->donation->toArray(),
60 [
61 'customFields' => $this->getCustomFields(),
62 'eventTicketsAmount' => $this->donation->eventTicketsAmount(),
63 'eventTickets' => $this->getEventTickets(),
64 'gateway' => $this->getGatewayDetails(),
65 ]
66 );
67
68 if (!$this->includeSensitiveData) {
69 $sensitiveDataExcluded = [
70 'donorIp',
71 'email',
72 'phone',
73 'billingAddress',
74 'purchaseKey',
75 'customFields',
76 'gatewayTransactionId',
77 'lastName',
78 ];
79
80 foreach ($sensitiveDataExcluded as $propertyName) {
81 switch ($propertyName) {
82 case 'lastName':
83 $data[$propertyName] = Str::substr($data[$propertyName], 0, 1);
84 break;
85 case 'billingAddress':
86 $data[$propertyName] = null;
87 break;
88 case 'customFields':
89 $data[$propertyName] = [];
90 break;
91 default:
92 $data[$propertyName] = '';
93 break;
94 }
95 }
96 }
97
98 if (isset($this->anonymousMode) && $this->anonymousMode->isRedacted() && $this->donation->anonymous) {
99 $anonymousDataRedacted = [
100 'donorId',
101 'honorific',
102 'firstName',
103 'lastName',
104 'company',
105 'customFields'
106 ];
107
108 foreach ($anonymousDataRedacted as $propertyName) {
109 switch ($propertyName) {
110 case 'donorId':
111 $data[$propertyName] = 0;
112 break;
113 case 'customFields':
114 $data[$propertyName] = [];
115 break;
116 default:
117 $data[$propertyName] = __('anonymous', 'give');
118 break;
119 }
120 }
121 }
122
123 return $data;
124 }
125
126 /**
127 * Get custom fields for the donation
128 *
129 * @since 4.6.0
130 */
131 private function getCustomFields(): array
132 {
133 $customFields = [];
134
135 // get custom fields from v3 forms
136 $v3Form = $this->getDonationForm();
137
138 if ($v3Form) {
139 $displayedFields = $this->getDisplayedDonationMetaFieldsForForm($v3Form);
140
141 foreach ($displayedFields as $field) {
142 $value = $this->getFieldValue($field);
143
144 if (empty($value)) {
145 continue;
146 }
147
148 $customFields[] = [
149 'label' => method_exists($field, 'getLabel') ? $field->getLabel() : $field->getName(),
150 'value' => $value,
151 ];
152 }
153 }
154
155 return apply_filters('givewp_donation_details_custom_fields', $customFields, $this->donation->id);
156 }
157
158 /**
159 * Get donation form for the donation
160 *
161 * @since 4.6.0
162 */
163 private function getDonationForm(): ?DonationForm
164 {
165 $formId = $this->donation->formId;
166
167 if (!$formId || give(DonationFormRepository::class)->isLegacyForm($formId)) {
168 return null;
169 }
170
171 return DonationForm::find($formId);
172 }
173
174 /**
175 * Get displayed donation meta fields for a form
176 *
177 * @since 4.6.0
178 */
179 private function getDisplayedDonationMetaFieldsForForm(DonationForm $form): array
180 {
181 return array_filter($form->schema()->getFields(), static function (Field $field): bool {
182 return $field->shouldShowInAdmin() && !$field->shouldStoreAsDonorMeta();
183 });
184 }
185
186 /**
187 * Get field value for a custom field
188 *
189 * @since 4.6.0
190 */
191 private function getFieldValue(Field $field): string
192 {
193 $metaValue = give()->payment_meta->get_meta($this->donation->id, $field->getName(), true);
194
195 if (empty($metaValue)) {
196 return '';
197 }
198
199 if ($field->getType() === Types::FILE) {
200 $attachmentLink = wp_get_attachment_link($metaValue);
201 return $attachmentLink ?: '';
202 }
203
204 return (string) $metaValue;
205 }
206
207 /**
208 * @since 4.6.0
209 */
210 private function getEventTickets(): array
211 {
212 return give(EventTicketRepository::class)->getEventTicketDetails($this->donation);
213 }
214
215 /**
216 * @since 4.14.0 Return gateway details without transactionUrl when sensitive data is not included
217 * @since 4.8.0 Return empty array if gateway is not registered
218 * @since 4.6.0
219 */
220 private function getGatewayDetails(): array
221 {
222 if (!give(PaymentGatewayRegister::class)->hasPaymentGateway($this->donation->gatewayId)) {
223 return [];
224 }
225
226 if (!$this->includeSensitiveData) {
227 return $this->donation->gateway()->toArray();
228 }
229
230 return array_merge(
231 $this->donation->gateway()->toArray(),
232 [
233 'transactionUrl' => $this->donation->gateway()->getTransactionUrl($this->donation),
234 ]
235 );
236 }
237 }
238