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