PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.14.2
GiveWP – Donation Plugin and Fundraising Platform v4.14.2
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 / Exports / DonorsExport.php
give / src / Exports Last commit date
resources 4 years ago DonorsExport.php 1 year ago ServiceProvider.php 4 years ago
DonorsExport.php
226 lines
1 <?php
2
3 namespace Give\Exports;
4
5 use Give\Framework\Database\DB;
6 use Give\Framework\QueryBuilder\JoinQueryBuilder;
7 use Give_Batch_Export;
8
9 /**
10 * @since 2.21.2
11 */
12 class DonorsExport extends Give_Batch_Export
13 {
14 /** @inheritdoc */
15 public $export_type = 'donors';
16
17 /** @var array */
18 protected $postedData;
19
20 /** @var String */
21 protected $startDate;
22
23 /** @var String */
24 protected $endDate;
25
26 /** @var String */
27 protected $searchBy;
28
29 /**
30 * @var int
31 */
32 protected $donationFormId;
33
34 /**
35 * @inheritdoc
36 */
37 public function set_properties($request)
38 {
39 $this->postedData = $request;
40
41 if ($this->postedData['giveDonorExport-startDate']) {
42 $this->startDate = date('Y-m-d', strtotime($this->postedData['giveDonorExport-startDate']));
43 }
44
45 if ($this->postedData['giveDonorExport-endDate']) {
46 $this->endDate = date('Y-m-d', strtotime($this->postedData['giveDonorExport-endDate']));
47 }
48
49 if ($this->postedData['searchBy']) {
50 $this->searchBy = $this->postedData['searchBy'];
51 }
52
53 $this->donationFormId = (int)$this->postedData['forms'];
54 }
55
56 /**
57 * @since 3.12.1 Include donor phone.
58 * @since 2.29.0 Include donor created date
59 * @since 2.21.2
60 * @since 3.3.0 Filter donors by form ID
61 */
62 public function get_data(): array
63 {
64 $donorQuery = DB::table('give_donors', 'donors')
65 ->distinct()
66 ->select(
67 ['donors.name', 'full_name'],
68 ['donors.email', 'email'],
69 ['donors.user_id', 'userid'],
70 ['donors.date_created', 'donor_created_date'],
71 ['donors.phone', 'donor_phone_number'],
72 ['donors.purchase_count', 'donations'],
73 ['donors.purchase_value', 'donation_sum']
74 );
75
76 $donationQuery = DB::table('posts', 'donations')
77 ->select('donations.ID', ['meta.meta_value', 'donorId'])
78 ->join(function (JoinQueryBuilder $builder) {
79 $builder
80 ->leftJoin('give_donationmeta', 'meta')
81 ->on('donations.ID', 'meta.donation_id')
82 ->andOn('meta.meta_key', '_give_payment_donor_id', true);
83 })
84 ->where('donations.post_type', 'give_payment');
85
86 if ($this->searchBy === 'donor') {
87 if ($this->startDate && $this->endDate) {
88 $donorQuery->whereBetween('DATE(donors.date_created)', $this->startDate, $this->endDate);
89 } elseif ($this->startDate) {
90 $donorQuery->where('DATE(donors.date_created)', $this->startDate, '>=');
91 } elseif ($this->endDate) {
92 $donorQuery->where('DATE(donors.date_created)', $this->endDate, '<=');
93 }
94 } else {
95 if ($this->startDate && $this->endDate) {
96 $donationQuery->whereBetween('DATE(donations.post_date)', $this->startDate, $this->endDate);
97 } elseif ($this->startDate) {
98 $donationQuery->where('DATE(donations.post_date)', $this->startDate, '>=');
99 } elseif ($this->endDate) {
100 $donationQuery->where('DATE(donations.post_date)', $this->endDate, '<=');
101 }
102 }
103
104 if ($this->donationFormId) {
105 $donationQuery
106 ->join(function (JoinQueryBuilder $builder) {
107 $builder
108 ->leftJoin('give_donationmeta', 'form')
109 ->on('donations.ID', 'form.donation_id')
110 ->andOn('form.meta_key', '_give_payment_form_id', true);
111 })
112 ->where('form.meta_value', $this->donationFormId);
113 }
114
115 $donorQuery->joinRaw("JOIN ({$donationQuery->getSQL()}) AS sub ON donors.id = sub.donorId");
116
117 if ($this->shouldIncludeAddress()) {
118 $donorQuery->attachMeta(
119 'give_donormeta',
120 'donors.ID',
121 'donor_id',
122 ['_give_donor_address_billing_line1_0', 'address_line1'],
123 ['_give_donor_address_billing_line2_0', 'address_line2'],
124 ['_give_donor_address_billing_city_0', 'address_city'],
125 ['_give_donor_address_billing_state_0', 'address_state'],
126 ['_give_donor_address_billing_zip_0', 'address_zip'],
127 ['_give_donor_address_billing_country_0', 'address_country']
128 );
129 }
130
131 return $this->filterExportData(
132 array_map(function ($row) {
133 return array_intersect_key($row, $this->csv_cols());
134 }, $donorQuery->getAll(ARRAY_A))
135 );
136 }
137
138 /**
139 * @since 2.21.2
140 */
141 protected function shouldIncludeAddress(): bool
142 {
143 return isset($this->postedData['give_export_columns']['address']);
144 }
145
146 /**
147 * @since 2.21.2
148 */
149 protected function filterExportData(array $exportData): array
150 {
151 /**
152 * @since 2.21.2
153 *
154 * @param array $exportData
155 */
156 return apply_filters("give_export_get_data_{$this->export_type}", $exportData);
157 }
158
159 /**
160 * @since 3.14.0
161 */
162 protected function filterColumnData(array $defaultColumns): array
163 {
164 /**
165 * @since 3.14.0
166 *
167 * @param array $defaultColumns
168 */
169 return apply_filters('give_export_donors_get_default_columns', $defaultColumns );
170 }
171
172 /**
173 * @since 3.14.0 allow cols to be filtered.
174 * @since 3.12.1 Include donor_phone_number col.
175 * @since 2.29.0 Include donor created col
176 * @since 2.21.2
177 */
178 public function csv_cols(): array
179 {
180 $defaultColumns = [
181 'full_name' => __('Name', 'give'),
182 'email' => __('Email', 'give'),
183 'userid' => __('User ID', 'give'),
184 'donor_created_date' => __('Donor Created', 'give'),
185 'donor_phone_number' => __('Donor Phone Number', 'give'),
186 'donations' => __('Number of donations', 'give'),
187 'donation_sum' => __('Total Donated', 'give'),
188 'address' => [
189 'address_line1' => __('Address', 'give'),
190 'address_line2' => __('Address 2', 'give'),
191 'address_city' => __('City', 'give'),
192 'address_state' => __('State', 'give'),
193 'address_zip' => __('Zip', 'give'),
194 'address_country' => __('Country', 'give'),
195 ],
196 ];
197
198 $defaultColumns = $this->flattenAddressColumn(
199 array_intersect_key($defaultColumns, $this->postedData['give_export_columns'])
200 );
201
202 return $this->filterColumnData($defaultColumns);
203 }
204
205 /**
206 * @since 2.21.2
207 */
208 protected function flattenAddressColumn(array $columnarData): array
209 {
210 return $this->flattenColumn($columnarData, 'address');
211 }
212
213 /**
214 * @since 2.21.2
215 */
216 protected function flattenColumn(array $columnarData, string $columnName): array
217 {
218 if (isset($columnarData[$columnName])) {
219 $columnarData = array_merge($columnarData, $columnarData[$columnName]);
220 unset($columnarData[$columnName]);
221 }
222
223 return $columnarData;
224 }
225 }
226