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