PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.4.1
GiveWP – Donation Plugin and Fundraising Platform v3.4.1
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 / Exports / DonorsExport.php
give / src / Exports Last commit date
resources 4 years ago DonorsExport.php 2 years ago ServiceProvider.php 4 years ago
DonorsExport.php
204 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 2.29.0 Include donor created date
58 * @since 2.21.2
59 * @since 3.3.0 Filter donors by form ID
60 */
61 public function get_data(): array
62 {
63 $donorQuery = DB::table('give_donors', 'donors')
64 ->distinct()
65 ->select(
66 ['donors.name', 'full_name'],
67 ['donors.email', 'email'],
68 ['donors.user_id', 'userid'],
69 ['donors.date_created', 'donor_created_date'],
70 ['donors.purchase_count', 'donations'],
71 ['donors.purchase_value', 'donation_sum']
72 );
73
74 $donationQuery = DB::table('posts', 'donations')
75 ->select('donations.ID', ['meta.meta_value', 'donorId'])
76 ->join(function (JoinQueryBuilder $builder) {
77 $builder
78 ->leftJoin('give_donationmeta', 'meta')
79 ->on('donations.ID', 'meta.donation_id')
80 ->andOn('meta.meta_key', '_give_payment_donor_id', true);
81 })
82 ->where('donations.post_type', 'give_payment');
83
84 if ($this->searchBy === 'donor') {
85 if ($this->startDate && $this->endDate) {
86 $donorQuery->whereBetween('DATE(donors.date_created)', $this->startDate, $this->endDate);
87 } elseif ($this->startDate) {
88 $donorQuery->where('DATE(donors.date_created)', $this->startDate, '>=');
89 } elseif ($this->endDate) {
90 $donorQuery->where('DATE(donors.date_created)', $this->endDate, '<=');
91 }
92 } else {
93 if ($this->startDate && $this->endDate) {
94 $donationQuery->whereBetween('DATE(donations.post_date)', $this->startDate, $this->endDate);
95 } elseif ($this->startDate) {
96 $donationQuery->where('DATE(donations.post_date)', $this->startDate, '>=');
97 } elseif ($this->endDate) {
98 $donationQuery->where('DATE(donations.post_date)', $this->endDate, '<=');
99 }
100 }
101
102 if ($this->donationFormId) {
103 $donationQuery
104 ->join(function (JoinQueryBuilder $builder) {
105 $builder
106 ->leftJoin('give_donationmeta', 'form')
107 ->on('donations.ID', 'form.donation_id')
108 ->andOn('form.meta_key', '_give_payment_form_id', true);
109 })
110 ->where('form.meta_value', $this->donationFormId);
111 }
112
113 $donorQuery->joinRaw("JOIN ({$donationQuery->getSQL()}) AS sub ON donors.id = sub.donorId");
114
115 if ($this->shouldIncludeAddress()) {
116 $donorQuery->attachMeta(
117 'give_donormeta',
118 'donors.ID',
119 'donor_id',
120 ['_give_donor_address_billing_line1_0', 'address_line1'],
121 ['_give_donor_address_billing_line2_0', 'address_line2'],
122 ['_give_donor_address_billing_city_0', 'address_city'],
123 ['_give_donor_address_billing_state_0', 'address_state'],
124 ['_give_donor_address_billing_zip_0', 'address_zip'],
125 ['_give_donor_address_billing_country_0', 'address_country']
126 );
127 }
128
129 return $this->filterExportData(
130 array_map(function ($row) {
131 return array_intersect_key($row, $this->csv_cols());
132 }, $donorQuery->getAll(ARRAY_A))
133 );
134 }
135
136 /**
137 * @since 2.21.2
138 */
139 protected function shouldIncludeAddress(): bool
140 {
141 return isset($this->postedData['give_export_columns']['address']);
142 }
143
144 /**
145 * @since 2.21.2
146 */
147 protected function filterExportData(array $exportData): array
148 {
149 /**
150 * @since 2.21.2
151 *
152 * @param array $exportData
153 */
154 return apply_filters("give_export_get_data_{$this->export_type}", $exportData);
155 }
156
157 /**
158 * @since 2.29.0 Include donor created col
159 * @since 2.21.2
160 */
161 public function csv_cols(): array
162 {
163 return $this->flattenAddressColumn(
164 array_intersect_key([
165 'full_name' => __('Name', 'give'),
166 'email' => __('Email', 'give'),
167 'address' => [
168 'address_line1' => __('Address', 'give'),
169 'address_line2' => __('Address 2', 'give'),
170 'address_city' => __('City', 'give'),
171 'address_state' => __('State', 'give'),
172 'address_zip' => __('Zip', 'give'),
173 'address_country' => __('Country', 'give'),
174 ],
175 'userid' => __('User ID', 'give'),
176 'donor_created_date' => __('Donor Created', 'give'),
177 'donations' => __('Number of donations', 'give'),
178 'donation_sum' => __('Total Donated', 'give'),
179 ], $this->postedData['give_export_columns'])
180 );
181 }
182
183 /**
184 * @since 2.21.2
185 */
186 protected function flattenAddressColumn(array $columnarData): array
187 {
188 return $this->flattenColumn($columnarData, 'address');
189 }
190
191 /**
192 * @since 2.21.2
193 */
194 protected function flattenColumn(array $columnarData, string $columnName): array
195 {
196 if (isset($columnarData[$columnName])) {
197 $columnarData = array_merge($columnarData, $columnarData[$columnName]);
198 unset($columnarData[$columnName]);
199 }
200
201 return $columnarData;
202 }
203 }
204