PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / trunk
GiveWP – Donation Plugin and Fundraising Platform vtrunk
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 / CampaignDonationQuery.php
give / src / Campaigns Last commit date
Actions 1 month ago Blocks 3 days ago DataTransferObjects 1 year ago Factories 1 year ago ListTable 5 months ago Migrations 8 months ago Models 7 months ago Repositories 7 months ago Shortcodes 3 days ago ValueObjects 5 months ago resources 7 months ago CampaignDonationQuery.php 11 months ago CampaignSubscriptionQuery.php 1 year ago CampaignsAdminPage.php 5 months ago CampaignsDataQuery.php 11 months ago ServiceProvider.php 5 months ago
CampaignDonationQuery.php
160 lines
1 <?php
2
3 namespace Give\Campaigns;
4
5 use DateTimeInterface;
6 use Give\Campaigns\Models\Campaign;
7 use Give\Donations\ValueObjects\DonationMetaKeys;
8 use Give\Framework\QueryBuilder\JoinQueryBuilder;
9 use Give\Framework\QueryBuilder\QueryBuilder;
10
11 /**
12 * @since 4.0.0
13 */
14 class CampaignDonationQuery extends QueryBuilder
15 {
16 /**
17 * @since 4.0.0
18 */
19 public function __construct(Campaign $campaign)
20 {
21 $this->from('posts', 'donation');
22 $this->where('post_type', 'give_payment');
23
24 // Include only valid statuses
25 $this->whereIn('donation.post_status', ['publish', 'give_subscription']);
26
27 // Include only current payment "mode"
28 $this->joinDonationMeta(DonationMetaKeys::MODE, 'paymentMode');
29 $this->where('paymentMode.meta_value', give_is_test_mode() ? 'test' : 'live');
30
31 // Include only forms associated with the Campaign.
32 $this->joinDonationMeta(DonationMetaKeys::CAMPAIGN_ID, 'campaignId');
33 $this->where('campaignId.meta_value', $campaign->id);
34 }
35
36 /**
37 * @since 4.0.0
38 */
39 public function between(DateTimeInterface $startDate, DateTimeInterface $endDate): self
40 {
41 $query = clone $this;
42 $query->whereBetween(
43 'donation.post_date',
44 $startDate->format('Y-m-d H:i:s'),
45 $endDate->format('Y-m-d H:i:s')
46 );
47 return $query;
48 }
49
50 /**
51 * Returns a calculated sum of the intended amounts (without recovered fees) for the donations.
52 *
53 * @since 4.5.0 update to account for exchange rate
54 * @since 4.0.0
55 *
56 * @return int|float
57 */
58 public function sumIntendedAmount()
59 {
60 $query = clone $this;
61 $query->joinDonationMeta(DonationMetaKeys::AMOUNT, 'amount');
62 $query->joinDonationMeta(DonationMetaKeys::FEE_AMOUNT_RECOVERED, 'feeAmountRecovered');
63 $query->joinDonationMeta(DonationMetaKeys::EXCHANGE_RATE, 'exchangeRate');
64 return $query->sum(
65 /**
66 * The intended amount meta and the amount meta could either be 0 or NULL.
67 * So we need to use the NULLIF function to treat the 0 values as NULL.
68 * Then we coalesce the values to select the first non-NULL value.
69 * @link https://github.com/impress-org/givewp/pull/7411
70 */
71 '(IFNULL(amount.meta_value, 0) - IFNULL(feeAmountRecovered.meta_value, 0)) / IFNULL(exchangeRate.meta_value, 1)'
72 );
73 }
74
75 /**
76 * @since 4.0.0
77 */
78 public function countDonations(): int
79 {
80 $query = clone $this;
81 return $query->count('donation.ID');
82 }
83
84 /**
85 * @since 4.0.0
86 */
87 public function countDonors(): int
88 {
89 $query = clone $this;
90 $query->joinDonationMeta(DonationMetaKeys::DONOR_ID, 'donorId');
91 return $query->count('DISTINCT donorId.meta_value');
92 }
93
94 /**
95 * @since 4.0.0
96 */
97 public function getOldestDonationDate()
98 {
99 $query = clone $this;
100 $query->select('DATE(donation.post_date) as date_created');
101 $query->orderBy('donation.post_date', 'ASC');
102 $query->limit(1);
103 $result = $query->get();
104
105 if (!$result) {
106 return null;
107 }
108
109 return $result->date_created;
110 }
111
112 /**
113 * @since 4.5.0 update to account for exchange rate
114 * @since 4.0.0
115 */
116 public function getDonationsByDate($groupBy = 'DATE'): array
117 {
118 $query = clone $this;
119
120 $query->joinDonationMeta(DonationMetaKeys::AMOUNT, 'amount');
121 $query->joinDonationMeta(DonationMetaKeys::FEE_AMOUNT_RECOVERED, 'feeAmountRecovered');
122 $query->joinDonationMeta(DonationMetaKeys::EXCHANGE_RATE, 'exchangeRate');
123 $query->select(
124 'SUM((IFNULL(amount.meta_value, 0) - IFNULL(feeAmountRecovered.meta_value, 0)) / IFNULL(exchangeRate.meta_value, 1)) as amount'
125 );
126
127 $query->select('YEAR(donation.post_date) as year');
128 $query->select('MONTH(donation.post_date) as month');
129 $query->select('DAY(donation.post_date) as day');
130 $query->select("DATE(donation.post_date) as date_created");
131
132 if ($groupBy === 'DAY') {
133 $query->groupBy('DATE(date_created)');
134 } else if ($groupBy === 'MONTH') {
135 $query->groupBy('YEAR(donation.post_date), MONTH(donation.post_date)');
136 } elseif ($groupBy === 'YEAR') {
137 $query->groupBy('YEAR(donation.post_date)');
138 } else {
139 $query->groupBy("$groupBy(donation.post_date)");
140 }
141
142 return $query->getAll();
143 }
144
145 /**
146 * An opinionated join method for the donation meta table.
147 * @since 4.0.0
148 */
149 public function joinDonationMeta($key, $alias): self
150 {
151 $this->join(function (JoinQueryBuilder $builder) use ($key, $alias) {
152 $builder
153 ->leftJoin('give_donationmeta', $alias)
154 ->on('donation.ID', $alias . '.donation_id')
155 ->andOn($alias . '.meta_key', $key, true);
156 });
157 return $this;
158 }
159 }
160