PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.2.0
GiveWP – Donation Plugin and Fundraising Platform v4.2.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 / Campaigns / Repositories / CampaignsDataRepository.php
give / src / Campaigns / Repositories Last commit date
CampaignPageRepository.php 1 year ago CampaignRepository.php 1 year ago CampaignsDataRepository.php 1 year ago
CampaignsDataRepository.php
192 lines
1 <?php
2
3 namespace Give\Campaigns\Repositories;
4
5 use Give\Campaigns\CampaignsDataQuery;
6 use Give\Campaigns\Models\Campaign;
7 use Give\Campaigns\ValueObjects\CampaignGoalType;
8
9 /**
10 * Used to optimize the campaigns list table performance and to avoid n+1 problems.
11 * Instead of doing expensive queries in multiple columns in each row, this class loads everything upfront for multiple campaigns.
12 *
13 * @since 4.0.0
14 */
15 class CampaignsDataRepository
16 {
17 /**
18 * @var array
19 */
20 private $amounts;
21 /**
22 * @var array
23 */
24 private $subscriptionAmounts = [];
25 /**
26 * @var array
27 */
28 private $donationsCount;
29 /**
30 * @var array
31 */
32 private $subscriptionDonationsCount = [];
33 /**
34 * @var array
35 */
36 private $donorsCount;
37 /**
38 * @var array
39 */
40 private $subscriptionDonorsCount = [];
41
42 /**
43 * @param int[] $ids
44 *
45 * @return CampaignsDataRepository
46 */
47 public static function campaigns(array $ids): CampaignsDataRepository
48 {
49 $self = new self();
50
51 $donations = CampaignsDataQuery::donations($ids);
52
53 $self->amounts = $donations->collectIntendedAmounts();
54 $self->donationsCount = $donations->collectDonations();
55 $self->donorsCount = $donations->collectDonors();
56
57 // Set subscriptions data
58 if (defined('GIVE_RECURRING_VERSION')) {
59 $subscriptions = CampaignsDataQuery::subscriptions($ids);
60
61 $self->subscriptionAmounts = $subscriptions->collectInitialAmounts();
62 $self->subscriptionDonationsCount = $subscriptions->collectDonations();
63 $self->subscriptionDonorsCount = $subscriptions->collectDonors();
64 }
65
66 return $self;
67 }
68
69 /**
70 * @since 4.2.0 return type of float
71 * @since 4.0.0
72 *
73 * Get revenue for campaign
74 *
75 * @param Campaign $campaign
76 */
77 public function getRevenue(Campaign $campaign): float
78 {
79 $data = $campaign->goalType->isSubscriptions()
80 ? $this->subscriptionAmounts
81 : $this->amounts;
82
83 foreach ($data as $row) {
84 if (isset($row['campaign_id']) && $row['campaign_id'] == $campaign->id) {
85 return $row['sum'];
86 }
87 }
88
89 return 0;
90 }
91
92 /**
93 * @since 4.0.0
94 *
95 * Get donations count for campaign
96 *
97 * @param Campaign $campaign
98 *
99 * @return int
100 */
101 public function getDonationsCount(Campaign $campaign): int
102 {
103 $data = $campaign->goalType->isSubscriptions()
104 ? $this->subscriptionDonationsCount
105 : $this->donationsCount;
106
107 foreach ($data as $row) {
108 if (isset($row['campaign_id']) && $row['campaign_id'] == $campaign->id) {
109 return (int)$row['count'];
110 }
111 }
112
113 return 0;
114 }
115
116 /**
117 * @since 4.0.0
118 *
119 * Get donors count for campaign
120 *
121 * @param Campaign $campaign
122 *
123 * @return int
124 */
125 public function getDonorsCount(Campaign $campaign): int
126 {
127 $data = $campaign->goalType->isSubscriptions()
128 ? $this->subscriptionDonorsCount
129 : $this->donorsCount;
130
131 foreach ($data as $row) {
132 if (isset($row['campaign_id']) && $row['campaign_id'] == $campaign->id) {
133 return (int)$row['count'];
134 }
135 }
136
137 return 0;
138 }
139
140
141 /**
142 * @since 4.0.0
143 *
144 * Get goal data for campaign
145 *
146 * @param Campaign $campaign
147 *
148 * @return array{actual: int, goal: int, actualFormatted: string, goalFormatted:string, percentage:float}
149 */
150 public function getGoalData(Campaign $campaign): array
151 {
152 $actual = $this->getActualGoal($campaign);
153 $percentage = $campaign->goal
154 ? $actual / $campaign->goal
155 : 0;
156
157 return [
158 'actual' => $actual,
159 'goal' => $campaign->goal,
160 'actualFormatted' => $campaign->goalType == CampaignGoalType::AMOUNT
161 ? give_currency_filter(give_format_amount($actual))
162 : $actual,
163 'goalFormatted' => $campaign->goalType == CampaignGoalType::AMOUNT
164 ? give_currency_filter(give_format_amount($campaign->goal))
165 : $campaign->goal,
166 'percentage' => round($percentage * 100, 2),
167 ];
168 }
169
170 /**
171 * @since 4.2.0 return union type int|float
172 * @since 4.0.0
173 *
174 * @param Campaign $campaign
175 *
176 * @return int|float
177 */
178 private function getActualGoal(Campaign $campaign)
179 {
180 switch ($campaign->goalType->getValue()) {
181 case CampaignGoalType::DONATIONS():
182 case CampaignGoalType::SUBSCRIPTIONS():
183 return $this->getDonationsCount($campaign);
184 case CampaignGoalType::DONORS():
185 case CampaignGoalType::DONORS_FROM_SUBSCRIPTIONS():
186 return $this->getDonorsCount($campaign);
187 default:
188 return $this->getRevenue($campaign);
189 }
190 }
191 }
192