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 / Campaigns / CampaignRevenueController.php
give / src / API / REST / V3 / Routes / Campaigns Last commit date
Permissions 9 months ago ValueObjects 1 year ago ViewModels 7 months ago CampaignCommentsController.php 7 months ago CampaignController.php 7 months ago CampaignPageController.php 7 months ago CampaignRevenueController.php 7 months ago CampaignStatisticsController.php 7 months ago
CampaignRevenueController.php
255 lines
1 <?php
2
3 namespace Give\API\REST\V3\Routes\Campaigns;
4
5 use DateInterval;
6 use DatePeriod;
7 use DateTime;
8 use DateTimeInterface;
9 use Exception;
10 use Give\API\REST\V3\Routes\Campaigns\ValueObjects\CampaignRoute;
11 use Give\Campaigns\CampaignDonationQuery;
12 use Give\Campaigns\Models\Campaign;
13 use WP_Error;
14 use WP_REST_Controller;
15 use WP_REST_Response;
16 use WP_REST_Server;
17
18 /**
19 * @since 4.13.1
20 */
21 class CampaignRevenueController extends WP_REST_Controller
22 {
23 /**
24 * @var string
25 */
26 protected $namespace;
27
28 /**
29 * @since 4.13.1
30 */
31 public function __construct()
32 {
33 $this->namespace = CampaignRoute::NAMESPACE;
34 }
35
36 /**
37 * @since 4.13.1
38 */
39 public function register_routes()
40 {
41 register_rest_route(
42 $this->namespace,
43 '/' . CampaignRoute::CAMPAIGN . '/revenue',
44 [
45 [
46 'methods' => WP_REST_Server::READABLE,
47 'callback' => [$this, 'get_items'],
48 'permission_callback' => function () {
49 return current_user_can('manage_options');
50 },
51 'args' => [
52 'id' => [
53 'type' => 'integer',
54 'required' => true,
55 'sanitize_callback' => 'absint',
56 ],
57 ],
58 ],
59 'schema' => [$this, 'get_public_item_schema'],
60 ]
61 );
62 }
63
64 /**
65 * @since 4.13.1
66 * @throws Exception
67 */
68 public function get_items($request): WP_REST_Response
69 {
70 $campaign = Campaign::find((int)$request->get_param('id'));
71
72 if (!$campaign) {
73 $response = new WP_Error('campaign_not_found', __('Campaign not found', 'give'), ['status' => 404]);
74
75 return rest_ensure_response($response);
76 }
77
78 $query = new CampaignDonationQuery($campaign);
79
80 $oldestRevenueDate = $query->getOldestDonationDate();
81
82 if (!$oldestRevenueDate) {
83 $items = new WP_REST_Response([]);
84
85 return rest_ensure_response($items);
86 }
87
88 $firstResultDate = new DateTime($oldestRevenueDate, wp_timezone());
89
90 // the query start date is the earliest of the first result date and the campaign start date
91 $queryStartDate = ($firstResultDate < $campaign->startDate) ? $firstResultDate : $campaign->startDate;
92 $queryEndDate = $campaign->endDate ?: current_datetime();
93
94 $groupBy = $this->getGroupByFromDateRange($queryStartDate, $queryEndDate);
95
96 $results = $query->getDonationsByDate($groupBy);
97
98 if (empty($results)) {
99 $items = new WP_REST_Response([]);
100
101 return rest_ensure_response($items);
102 }
103
104 // Map the results by date
105 $resultMap = $this->mapResultsByDate($results, $groupBy);
106
107 // Get all dates between the start and end date based on the group by
108 $endTimestamp = strtotime($queryEndDate->format('Y-m-d H:i:s') . ' +1 day');
109 $queryEndDatePlusOne = new DateTime(date('Y-m-d H:i:s', $endTimestamp), wp_timezone());
110 $dates = $this->getDatesFromRange($queryStartDate, $queryEndDatePlusOne, $groupBy);
111
112 // Merge the results with the dates to ensure that all dates are included
113 $data = $this->mergeResultsWithDates($dates, $resultMap);
114
115 $items = new WP_REST_Response($data);
116
117 return rest_ensure_response($items);
118 }
119
120 /**
121 * @since 4.13.1
122 */
123 public function getDatesFromRange(DateTimeInterface $startDate, DateTimeInterface $endDate, string $groupBy): array
124 {
125 $startDateInterval = $startDate->diff($endDate);
126
127 // If the date range is less than 7 days, pad the start date to include the last 7 days
128 // This is to ensure that the chart always shows at least 7 days of data
129 $start = new DateTime($startDate->format('Y-m-d H:i:s'), wp_timezone());
130 if ($startDateInterval->days < 7) {
131 $defaultDays = 7 - $startDateInterval->days;
132 $start = new DateTime(date('Y-m-d H:i:s', strtotime($start->format('Y-m-d H:i:s') . " -$defaultDays days")), wp_timezone());
133 }
134
135 $differenceInMonths = ($startDateInterval->y * 12) + $startDateInterval->m;
136
137 $intervalTime = 'days';
138 if ($startDateInterval->y >= 5) {
139 // If the date range is more than 5 years, group by year
140 $intervalTime = 'years';
141 } elseif ($differenceInMonths >= 6) {
142 // If the date range is more than 6 months, group by month
143 $intervalTime = 'months';
144 }
145
146 $interval = DateInterval::createFromDateString("1 $intervalTime");
147 $dateRange = new DatePeriod($start, $interval, $endDate);
148
149 $dates = [];
150 foreach ($dateRange as $date) {
151 $dateFormatted = $this->getFormattedDateFromGroupBy($groupBy, $date);
152
153 $dates[] = $dateFormatted;
154 }
155
156 return $dates;
157 }
158
159 /**
160 * @since 4.13.1
161 */
162 public function getGroupByFromDateRange(DateTimeInterface $startDate, DateTimeInterface $endDate): string
163 {
164 $startDateInterval = $startDate->diff($endDate);
165 $differenceInMonths = ($startDateInterval->y * 12) + $startDateInterval->m;
166
167 // If the date range is more than 1 year, group by month
168 if ($startDateInterval->y >= 5) {
169 return 'YEAR';
170 }
171
172 if ($differenceInMonths >= 6) {
173 // If the date range is more than 90 days, group by week
174 return 'MONTH';
175 }
176
177 return 'DAY';
178 }
179
180 /**
181 * @since 4.13.1
182 */
183 public function getFormattedDateFromGroupBy(string $groupBy, DateTimeInterface $date): string
184 {
185 if ($groupBy === 'MONTH') {
186 return $date->format('Y-m');
187 }
188
189 if ($groupBy === 'YEAR') {
190 return $date->format('Y');
191 }
192
193 return $date->format('Y-m-d');
194 }
195
196 /**
197 * @since 4.13.1
198 */
199 public function mergeResultsWithDates(array $dates, array $resultMap): array
200 {
201 $data = [];
202 // Fill in the data with the results
203 foreach ($dates as $date) {
204 $data[] = [
205 'date' => $date,
206 'amount' => $resultMap[$date] ?? 0
207 ];
208 }
209
210 return $data;
211 }
212
213 /**
214 * @since 4.13.1
215 */
216 public function mapResultsByDate(array $results, string $groupBy): array
217 {
218 $resultMap = [];
219 foreach ($results as $result) {
220 $date = $this->getFormattedDateFromGroupBy($groupBy, date_create($result->date_created));
221
222 $resultMap[$date] = (float)$result->amount;
223 }
224
225 return $resultMap;
226 }
227
228 /**
229 * @since 4.13.1
230 */
231 public function get_item_schema(): array
232 {
233 return [
234 'title' => 'campaign-revenue',
235 'description' => esc_html__('Provides daily revenue data for a specific campaign.', 'give'),
236 'type' => 'array',
237 'readonly' => true,
238 'items' => [
239 'type' => 'object',
240 'properties' => [
241 'date' => [
242 'type' => 'string',
243 'format' => 'date',
244 'description' => esc_html__('The date for the revenue entry (YYYY-MM-DD).', 'give'),
245 ],
246 'amount' => [
247 'type' => ['integer', 'number'],
248 'description' => esc_html__('The amount of revenue received on the given date.', 'give'),
249 ],
250 ]
251 ]
252 ];
253 }
254 }
255