PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.4.0
GiveWP – Donation Plugin and Fundraising Platform v4.4.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 / CampaignDonationQuery.php
give / src / Campaigns Last commit date
Actions 1 year ago Blocks 1 year ago Controllers 1 year ago DataTransferObjects 1 year ago Factories 1 year ago ListTable 1 year ago Migrations 1 year ago Models 1 year ago Repositories 1 year ago ValueObjects 1 year ago ViewModels 1 year ago resources 1 year ago CampaignDonationQuery.php 1 year ago CampaignSubscriptionQuery.php 1 year ago CampaignsAdminPage.php 1 year ago CampaignsDataQuery.php 1 year ago ServiceProvider.php 1 year ago
CampaignDonationQuery.php
156 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.0.0
54 *
55 * @return int|float
56 */
57 public function sumIntendedAmount()
58 {
59 $query = clone $this;
60 $query->joinDonationMeta(DonationMetaKeys::AMOUNT, 'amount');
61 $query->joinDonationMeta(DonationMetaKeys::FEE_AMOUNT_RECOVERED, 'feeAmountRecovered');
62 return $query->sum(
63 /**
64 * The intended amount meta and the amount meta could either be 0 or NULL.
65 * So we need to use the NULLIF function to treat the 0 values as NULL.
66 * Then we coalesce the values to select the first non-NULL value.
67 * @link https://github.com/impress-org/givewp/pull/7411
68 */
69 'IFNULL(amount.meta_value, 0) - IFNULL(feeAmountRecovered.meta_value, 0)'
70 );
71 }
72
73 /**
74 * @since 4.0.0
75 */
76 public function countDonations(): int
77 {
78 $query = clone $this;
79 return $query->count('donation.ID');
80 }
81
82 /**
83 * @since 4.0.0
84 */
85 public function countDonors(): int
86 {
87 $query = clone $this;
88 $query->joinDonationMeta(DonationMetaKeys::DONOR_ID, 'donorId');
89 return $query->count('DISTINCT donorId.meta_value');
90 }
91
92 /**
93 * @since 4.0.0
94 */
95 public function getOldestDonationDate()
96 {
97 $query = clone $this;
98 $query->select('DATE(donation.post_date) as date_created');
99 $query->orderBy('donation.post_date', 'ASC');
100 $query->limit(1);
101 $result = $query->get();
102
103 if (!$result) {
104 return null;
105 }
106
107 return $result->date_created;
108 }
109
110 /**
111 * @since 4.0.0
112 */
113 public function getDonationsByDate($groupBy = 'DATE'): array
114 {
115 $query = clone $this;
116
117 $query->joinDonationMeta(DonationMetaKeys::AMOUNT, 'amount');
118 $query->joinDonationMeta(DonationMetaKeys::FEE_AMOUNT_RECOVERED, 'feeAmountRecovered');
119 $query->select(
120 'SUM(IFNULL(amount.meta_value, 0) - IFNULL(feeAmountRecovered.meta_value, 0)) as amount'
121 );
122
123 $query->select('YEAR(donation.post_date) as year');
124 $query->select('MONTH(donation.post_date) as month');
125 $query->select('DAY(donation.post_date) as day');
126 $query->select("DATE(donation.post_date) as date_created");
127
128 if ($groupBy === 'DAY') {
129 $query->groupBy('DATE(date_created)');
130 } else if ($groupBy === 'MONTH') {
131 $query->groupBy('YEAR(donation.post_date), MONTH(donation.post_date)');
132 } elseif ($groupBy === 'YEAR') {
133 $query->groupBy('YEAR(donation.post_date)');
134 } else {
135 $query->groupBy("$groupBy(donation.post_date)");
136 }
137
138 return $query->getAll();
139 }
140
141 /**
142 * An opinionated join method for the donation meta table.
143 * @since 4.0.0
144 */
145 public function joinDonationMeta($key, $alias): self
146 {
147 $this->join(function (JoinQueryBuilder $builder) use ($key, $alias) {
148 $builder
149 ->leftJoin('give_donationmeta', $alias)
150 ->on('donation.ID', $alias . '.donation_id')
151 ->andOn($alias . '.meta_key', $key, true);
152 });
153 return $this;
154 }
155 }
156