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