-
-
Notifications
You must be signed in to change notification settings - Fork 635
Expand file tree
/
Copy pathOrganizerRepository.php
More file actions
112 lines (100 loc) · 4.54 KB
/
OrganizerRepository.php
File metadata and controls
112 lines (100 loc) · 4.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?php
declare(strict_types=1);
namespace HiEvents\Repository\Eloquent;
use HiEvents\DomainObjects\Generated\OrganizerDomainObjectAbstract;
use HiEvents\DomainObjects\Generated\OrganizerSettingDomainObjectAbstract;
use HiEvents\DomainObjects\OrganizerDomainObject;
use HiEvents\DomainObjects\Status\OrganizerStatus;
use HiEvents\Models\Organizer;
use HiEvents\Repository\DTO\Organizer\OrganizerStatsResponseDTO;
use HiEvents\Repository\Interfaces\OrganizerRepositoryInterface;
use Illuminate\Pagination\LengthAwarePaginator;
/**
* @extends BaseRepository<OrganizerDomainObject>
*/
class OrganizerRepository extends BaseRepository implements OrganizerRepositoryInterface
{
protected function getModel(): string
{
return Organizer::class;
}
public function getDomainObject(): string
{
return OrganizerDomainObject::class;
}
public function getSitemapOrganizers(int $page, int $perPage): LengthAwarePaginator
{
return $this->handleResults($this->model
->select([
'organizers.' . OrganizerDomainObjectAbstract::ID,
'organizers.' . OrganizerDomainObjectAbstract::NAME,
'organizers.' . OrganizerDomainObjectAbstract::UPDATED_AT,
])
->join('organizer_settings', 'organizers.id', '=', 'organizer_settings.organizer_id')
->where('organizers.' . OrganizerDomainObjectAbstract::STATUS, OrganizerStatus::LIVE->name)
->where('organizer_settings.' . OrganizerSettingDomainObjectAbstract::ALLOW_SEARCH_ENGINE_INDEXING, true)
->whereNull('organizers.' . OrganizerDomainObjectAbstract::DELETED_AT)
->orderBy('organizers.' . OrganizerDomainObjectAbstract::ID)
->paginate($perPage, ['*'], 'page', $page));
}
public function getSitemapOrganizerCount(): int
{
return $this->model
->newQuery()
->join('organizer_settings', 'organizers.id', '=', 'organizer_settings.organizer_id')
->where('organizers.' . OrganizerDomainObjectAbstract::STATUS, OrganizerStatus::LIVE->name)
->where('organizer_settings.' . OrganizerSettingDomainObjectAbstract::ALLOW_SEARCH_ENGINE_INDEXING, true)
->whereNull('organizers.' . OrganizerDomainObjectAbstract::DELETED_AT)
->count();
}
public function getOrganizerStats(int $organizerId, int $accountId, string $currencyCode): OrganizerStatsResponseDTO
{
$totalsQuery = <<<SQL
SELECT
SUM(es.products_sold) AS total_products_sold,
SUM(es.orders_created) AS total_orders,
SUM(es.sales_total_gross) AS total_gross_sales,
SUM(es.total_tax) AS total_tax,
SUM(es.total_fee) AS total_fees,
SUM(es.total_views) AS total_views,
SUM(es.total_refunded) AS total_refunded,
SUM(es.attendees_registered) AS attendees_registered
FROM event_statistics es
JOIN events e ON e.id = es.event_id
WHERE e.organizer_id = :organizerId
AND e.account_id = :accountId
AND e.currency = :currencyCode
AND es.deleted_at IS NULL;
SQL;
$totalsResult = $this->db->selectOne($totalsQuery, [
'organizerId' => $organizerId,
'accountId' => $accountId,
'currencyCode' => $currencyCode,
]);
$allOrganizersCurrenciesQuery = <<<SQL
SELECT DISTINCT e.currency FROM events e
WHERE e.organizer_id = :organizerId
AND e.account_id = :accountId
AND e.deleted_at IS NULL;
SQL;
$allOrganizersCurrencies = $this->db->select($allOrganizersCurrenciesQuery, [
'organizerId' => $organizerId,
'accountId' => $accountId,
]);
return new OrganizerStatsResponseDTO(
total_products_sold: (int)($totalsResult->total_products_sold ?? 0),
total_attendees_registered: (int)($totalsResult->attendees_registered ?? 0),
total_orders: (int)($totalsResult->total_orders ?? 0),
total_gross_sales: (float)($totalsResult->total_gross_sales ?? 0),
total_fees: (float)($totalsResult->total_fees ?? 0),
total_tax: (float)($totalsResult->total_tax ?? 0),
total_views: (int)($totalsResult->total_views ?? 0),
total_refunded: (float)($totalsResult->total_refunded ?? 0),
currency_code: $currencyCode,
all_organizers_currencies: array_map(
static fn($currency) => $currency->currency,
$allOrganizersCurrencies
),
);
}
}