PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.0.0
GiveWP – Donation Plugin and Fundraising Platform v4.0.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.0.0
71 *
72 * Get revenue for campaign
73 *
74 * @param Campaign $campaign
75 *
76 * @return int
77 */
78 public function getRevenue(Campaign $campaign): int
79 {
80 $data = $campaign->goalType->isSubscriptions()
81 ? $this->subscriptionAmounts
82 : $this->amounts;
83
84 foreach ($data as $row) {
85 if (isset($row['campaign_id']) && $row['campaign_id'] == $campaign->id) {
86 return (int)$row['sum'];
87 }
88 }
89
90 return 0;
91 }
92
93 /**
94 * @since 4.0.0
95 *
96 * Get donations count for campaign
97 *
98 * @param Campaign $campaign
99 *
100 * @return int
101 */
102 public function getDonationsCount(Campaign $campaign): int
103 {
104 $data = $campaign->goalType->isSubscriptions()
105 ? $this->subscriptionDonationsCount
106 : $this->donationsCount;
107
108 foreach ($data as $row) {
109 if (isset($row['campaign_id']) && $row['campaign_id'] == $campaign->id) {
110 return (int)$row['count'];
111 }
112 }
113
114 return 0;
115 }
116
117 /**
118 * @since 4.0.0
119 *
120 * Get donors count for campaign
121 *
122 * @param Campaign $campaign
123 *
124 * @return int
125 */
126 public function getDonorsCount(Campaign $campaign): int
127 {
128 $data = $campaign->goalType->isSubscriptions()
129 ? $this->subscriptionDonorsCount
130 : $this->donorsCount;
131
132 foreach ($data as $row) {
133 if (isset($row['campaign_id']) && $row['campaign_id'] == $campaign->id) {
134 return (int)$row['count'];
135 }
136 }
137
138 return 0;
139 }
140
141
142 /**
143 * @since 4.0.0
144 *
145 * Get goal data for campaign
146 *
147 * @param Campaign $campaign
148 *
149 * @return array{actual: int, goal: int, actualFormatted: string, goalFormatted:string, percentage:float}
150 */
151 public function getGoalData(Campaign $campaign): array
152 {
153 $actual = $this->getActualGoal($campaign);
154 $percentage = $campaign->goal
155 ? $actual / $campaign->goal
156 : 0;
157
158 return [
159 'actual' => $actual,
160 'goal' => $campaign->goal,
161 'actualFormatted' => $campaign->goalType == CampaignGoalType::AMOUNT
162 ? give_currency_filter(give_format_amount($actual))
163 : $actual,
164 'goalFormatted' => $campaign->goalType == CampaignGoalType::AMOUNT
165 ? give_currency_filter(give_format_amount($campaign->goal))
166 : $campaign->goal,
167 'percentage' => round($percentage * 100, 2),
168 ];
169 }
170
171 /**
172 * @since 4.0.0
173 *
174 * @param Campaign $campaign
175 *
176 * @return int
177 */
178 private function getActualGoal(Campaign $campaign): int
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