PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.5.0
GiveWP – Donation Plugin and Fundraising Platform v4.5.0
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 / EventTickets / Repositories / EventTicketRepository.php
give / src / EventTickets / Repositories Last commit date
EventRepository.php 2 years ago EventTicketRepository.php 1 year ago EventTicketTypeRepository.php 2 years ago
EventTicketRepository.php
251 lines
1 <?php
2
3 namespace Give\EventTickets\Repositories;
4
5 use Give\Donations\Models\Donation;
6 use Give\EventTickets\Models\EventTicket;
7 use Give\Framework\Database\DB;
8 use Give\Framework\Exceptions\Primitives\Exception;
9 use Give\Framework\Exceptions\Primitives\InvalidArgumentException;
10 use Give\Framework\Models\ModelQueryBuilder;
11 use Give\Framework\Support\Facades\DateTime\Temporal;
12 use Give\Framework\Support\ValueObjects\Money;
13 use Give\Helpers\Hooks;
14 use Give\Log\Log;
15
16 /**
17 * @since 3.6.0
18 */
19 class EventTicketRepository
20 {
21
22 /**
23 * @since 3.20.0 Add "amount" column to the properties array
24 * @since 3.6.0
25 *
26 * @var string[]
27 */
28 private $requiredProperties = [
29 'eventId',
30 'ticketTypeId',
31 'donationId',
32 'amount',
33 ];
34
35 /**
36 * @since 3.6.0
37 */
38 public function getById(int $id): ?EventTicket
39 {
40 return $this->prepareQuery()
41 ->where('id', $id)
42 ->get();
43 }
44
45 /**
46 * @since 3.6.0
47 */
48 public function queryById(int $id): ModelQueryBuilder
49 {
50 return $this->prepareQuery()
51 ->where('id', $id);
52 }
53
54 /**
55 * @since 3.20.0 Add "amount" column to the insert statement
56 * @since 3.6.0
57 *
58 * @throws Exception|InvalidArgumentException
59 */
60 public function insert(EventTicket $eventTicket)
61 {
62 $this->validate($eventTicket);
63
64 Hooks::doAction('givewp_events_event_ticket_creating', $eventTicket);
65
66 $createdDateTime = Temporal::withoutMicroseconds($eventTicket->createdAt ?: Temporal::getCurrentDateTime());
67
68 DB::query('START TRANSACTION');
69
70 try {
71 DB::table('give_event_tickets')
72 ->insert([
73 'event_id' => $eventTicket->eventId,
74 'ticket_type_id' => $eventTicket->ticketTypeId,
75 'donation_id' => $eventTicket->donationId,
76 'amount' => $eventTicket->amount->formatToMinorAmount(),
77 'created_at' => $createdDateTime->format('Y-m-d H:i:s'),
78 'updated_at' => $createdDateTime->format('Y-m-d H:i:s'),
79 ]);
80
81 $eventTicketId = DB::last_insert_id();
82 } catch (Exception $exception) {
83 DB::query('ROLLBACK');
84
85 Log::error('Failed creating an event ticket', compact('eventTicket'));
86
87 throw new $exception('Failed creating an event ticket');
88 }
89
90 $eventTicket->id = $eventTicketId;
91 $eventTicket->createdAt = $createdDateTime;
92 $eventTicket->updatedAt = $createdDateTime;
93
94 DB::query('COMMIT');
95
96 Hooks::doAction('givewp_events_event_ticket_created', $eventTicket);
97 }
98
99 /**
100 * @since 3.20.0 Add "amount" column to the update statement
101 * @since 3.6.0
102 *
103 * @throws Exception|InvalidArgumentException
104 */
105 public function update(EventTicket $eventTicket)
106 {
107 $this->validate($eventTicket);
108
109 Hooks::doAction('givewp_events_event_ticket_updating', $eventTicket);
110
111 $updatedDateTime = Temporal::withoutMicroseconds(Temporal::getCurrentDateTime());
112
113 DB::query('START TRANSACTION');
114
115 try {
116
117 DB::table('give_event_tickets')
118 ->where('id', $eventTicket->id)
119 ->update([
120 'event_id' => $eventTicket->eventId,
121 'ticket_type_id' => $eventTicket->ticketTypeId,
122 'donation_id' => $eventTicket->donationId,
123 'amount' => $eventTicket->amount->formatToMinorAmount(),
124 'updated_at' => $updatedDateTime->format('Y-m-d H:i:s'),
125 ]);
126 } catch (Exception $exception) {
127 DB::query('ROLLBACK');
128
129 Log::error('Failed updating an event ticket', compact('eventTicket'));
130
131 throw new $exception('Failed updating an event ticket');
132 }
133
134 $eventTicket->updatedAt = $updatedDateTime;
135
136 DB::query('COMMIT');
137
138 Hooks::doAction('givewp_events_event_ticket_updated', $eventTicket);
139 }
140
141 /**
142 * @since 3.6.0
143 *
144 * @throws Exception
145 */
146 public function delete(EventTicket $eventTicket): bool
147 {
148 DB::query('START TRANSACTION');
149
150 Hooks::doAction('givewp_events_event_ticket_deleting', $eventTicket);
151
152 try {
153 DB::table('give_event_tickets')
154 ->where('id', $eventTicket->id)
155 ->delete();
156 } catch (Exception $exception) {
157 DB::query('ROLLBACK');
158
159 Log::error('Failed deleting an event ticket', compact('eventTicket'));
160
161 throw new $exception('Failed deleting an event ticket');
162 }
163
164 DB::query('COMMIT');
165
166 Hooks::doAction('givewp_events_event_ticket_deleted', $eventTicket);
167
168 return true;
169 }
170
171 /**
172 * @since 3.6.0
173 */
174 private function validate(EventTicket $eventTicket): void
175 {
176 foreach ($this->requiredProperties as $key) {
177 if (!isset($eventTicket->$key)) {
178 throw new InvalidArgumentException("'$key' is required.");
179 }
180 }
181 }
182
183 /**
184 * @since 3.20.0 Add "amount" column to the select statement
185 * @since 3.6.0
186 * @return ModelQueryBuilder<EventTicket>
187 */
188 public function prepareQuery(): ModelQueryBuilder
189 {
190 $builder = new ModelQueryBuilder(EventTicket::class);
191
192 return $builder->from('give_event_tickets')
193 ->select(
194 'id',
195 'event_id',
196 'ticket_type_id',
197 'donation_id',
198 'amount',
199 'created_at',
200 'updated_at'
201 );
202 }
203
204 /**
205 * @since 3.6.0
206 */
207 public function queryByEventId(int $eventId): ModelQueryBuilder
208 {
209 return $this->prepareQuery()
210 ->where('event_id', $eventId);
211 }
212
213 /**
214 * @since 3.6.0
215 */
216 public function queryByTicketTypeId(int $ticketTypeId): ModelQueryBuilder
217 {
218 return $this->prepareQuery()
219 ->where('ticket_type_id', $ticketTypeId);
220 }
221
222 /**
223 * @since 3.6.0
224 *
225 * @param int $donationId
226 *
227 * @return ModelQueryBuilder
228 */
229 public function queryByDonationId(int $donationId): ModelQueryBuilder
230 {
231 return $this->prepareQuery()
232 ->where('donation_id', $donationId);
233 }
234
235 /**
236 * @since 3.20.0 Refactored to use event ticket amount instead of ticket type price
237 * @since 3.6.0
238 */
239 public function getTotalByDonation(Donation $donation): Money
240 {
241 $eventTickets = $this->queryByDonationId($donation->id)->getAll() ?? [];
242 $currency = $donation->amount->getCurrency();
243
244 return array_reduce($eventTickets, static function (Money $carry, EventTicket $eventTicket) {
245 return $carry->add(
246 $eventTicket->amount
247 );
248 }, new Money(0, $currency));
249 }
250 }
251