PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.22.3
GiveWP – Donation Plugin and Fundraising Platform v2.22.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 / Exports / DonorsExport.php
give / src / Exports Last commit date
resources 4 years ago DonorsExport.php 4 years ago ServiceProvider.php 4 years ago
DonorsExport.php
179 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 * @inheritdoc
31 */
32 public function set_properties($request)
33 {
34 $this->postedData = $request;
35
36 if ($this->postedData['giveDonorExport-startDate']) {
37 $this->startDate = date('Y-m-d', strtotime($this->postedData['giveDonorExport-startDate']));
38 }
39
40 if ($this->postedData['giveDonorExport-endDate']) {
41 $this->endDate = date('Y-m-d', strtotime($this->postedData['giveDonorExport-endDate']));
42 }
43
44 if ($this->postedData['searchBy']) {
45 $this->searchBy = $this->postedData['searchBy'];
46 }
47 }
48
49 /**
50 * @since 2.21.2
51 */
52 public function csv_cols(): array
53 {
54 return $this->flattenAddressColumn(
55 array_intersect_key([
56 'full_name' => __('Name', 'give'),
57 'email' => __('Email', 'give'),
58 'address' => [
59 'address_line1' => __('Address', 'give'),
60 'address_line2' => __('Address 2', 'give'),
61 'address_city' => __('City', 'give'),
62 'address_state' => __('State', 'give'),
63 'address_zip' => __('Zip', 'give'),
64 'address_country' => __('Country', 'give'),
65 ],
66 'userid' => __('User ID', 'give'),
67 'donations' => __('Number of donations', 'give'),
68 'donation_sum' => __('Total Donated', 'give'),
69 ], $this->postedData['give_export_columns'])
70 );
71 }
72
73 /**
74 * @since 2.21.2
75 */
76 public function get_data(): array
77 {
78 $donorQuery = DB::table('give_donors', 'donors')
79 ->distinct()
80 ->select(
81 ['donors.name', 'full_name'],
82 ['donors.email', 'email'],
83 ['donors.user_id', 'userid'],
84 ['donors.purchase_count', 'donations'],
85 ['donors.purchase_value', 'donation_sum']
86 );
87
88 $donationQuery = DB::table('posts', 'donations')
89 ->select('donations.ID', ['meta.meta_value', 'donorId'])
90 ->join(function (JoinQueryBuilder $builder) {
91 $builder
92 ->leftJoin('give_donationmeta', 'meta')
93 ->on('donations.ID', 'meta.donation_id')
94 ->andOn('meta.meta_key', '_give_payment_donor_id', true);
95 })
96 ->where('donations.post_type', 'give_payment');
97
98 if($this->searchBy === 'donor') {
99 if( $this->startDate && $this->endDate ) {
100 $donorQuery->whereBetween('DATE(donors.date_created)', $this->startDate, $this->endDate);
101 } elseif( $this->startDate ) {
102 $donorQuery->where('DATE(donors.date_created)', $this->startDate, '>=');
103 } elseif( $this->endDate ) {
104 $donorQuery->where('DATE(donors.date_created)', $this->endDate, '<=');
105 }
106 }
107 else {
108 if( $this->startDate && $this->endDate ) {
109 $donationQuery->whereBetween('DATE(donations.post_date)', $this->startDate, $this->endDate);
110 } elseif( $this->startDate ) {
111 $donationQuery->where('DATE(donations.post_date)', $this->startDate, '>=');
112 } elseif( $this->endDate ) {
113 $donationQuery->where('DATE(donations.post_date)', $this->endDate, '<=');
114 }
115 }
116
117 $donorQuery->joinRaw( "JOIN ({$donationQuery->getSQL()}) AS sub ON donors.id = sub.donorId" );
118
119 if( $this->shouldIncludeAddress() ) {
120 $donorQuery->attachMeta('give_donormeta',
121 'donors.ID',
122 'donor_id',
123 [ '_give_donor_address_billing_line1_0', 'address_line1' ],
124 [ '_give_donor_address_billing_line2_0', 'address_line2' ],
125 [ '_give_donor_address_billing_city_0', 'address_city' ],
126 [ '_give_donor_address_billing_state_0', 'address_state' ],
127 [ '_give_donor_address_billing_country_0', 'address_country' ],
128 [ '_give_donor_address_billing_zip_0', 'address_zip' ]
129 );
130 }
131
132 return $this->filterExportData(
133 array_map(function( $row ) {
134 return array_intersect_key( $row, $this->csv_cols() );
135 }, $donorQuery->getAll(ARRAY_A) )
136 );
137 }
138
139 /**
140 * @since 2.21.2
141 */
142 protected function shouldIncludeAddress(): bool
143 {
144 return isset($this->postedData['give_export_columns']['address']);
145 }
146
147 /**
148 * @since 2.21.2
149 */
150 protected function flattenAddressColumn(array $columnarData): array
151 {
152 return $this->flattenColumn($columnarData, 'address');
153 }
154
155 /**
156 * @since 2.21.2
157 */
158 protected function flattenColumn(array $columnarData, string $columnName): array
159 {
160 if (isset($columnarData[$columnName])) {
161 $columnarData = array_merge($columnarData, $columnarData[$columnName]);
162 unset($columnarData[$columnName]);
163 }
164 return $columnarData;
165 }
166
167 /**
168 * @since 2.21.2
169 */
170 protected function filterExportData(array $exportData): array
171 {
172 /**
173 * @since 2.21.2
174 * @param $exportData
175 */
176 return apply_filters("give_export_get_data_{$this->export_type}", $exportData);
177 }
178 }
179