Events
3 months ago
EngagementScore.php
6 months ago
JourneyStatisticsJob.php
5 months ago
Timeline.php
5 months ago
Timeline.php
69 lines
| 1 | <?php |
| 2 | |
| 3 | namespace IAWP\Journey; |
| 4 | |
| 5 | use IAWP\Journey\Events\Click; |
| 6 | use IAWP\Journey\Events\Event; |
| 7 | use IAWP\Journey\Events\Order; |
| 8 | use IAWP\Journey\Events\Origin; |
| 9 | use IAWP\Journey\Events\Submission; |
| 10 | use IAWP\Journey\Events\View; |
| 11 | use IAWP\Utils\Format; |
| 12 | use IAWP\Utils\Timezone; |
| 13 | use IAWPSCOPED\Illuminate\Support\Collection; |
| 14 | /** @internal */ |
| 15 | class Timeline |
| 16 | { |
| 17 | private Origin $origin; |
| 18 | /** @var Event[] */ |
| 19 | private array $events; |
| 20 | public function __construct(int $session_id) |
| 21 | { |
| 22 | $this->origin = Origin::from_session($session_id); |
| 23 | $this->events = [$this->origin, ...$this->fetch_events($session_id)]; |
| 24 | } |
| 25 | public function origin() : Origin |
| 26 | { |
| 27 | return $this->origin; |
| 28 | } |
| 29 | public function visitor_url() : string |
| 30 | { |
| 31 | return \admin_url('admin.php?page=independent-analytics-visitor&visitor=' . $this->origin->visitor_id()); |
| 32 | } |
| 33 | public function session_count_message() : string |
| 34 | { |
| 35 | $sessions = $this->origin()->session_count(); |
| 36 | if ($sessions === 1) { |
| 37 | return \__('No other sessions for this visitor', 'independent-analytics'); |
| 38 | } else { |
| 39 | return \sprintf(\__('View all %d sessions for this visitor', 'independent-analytics'), $sessions); |
| 40 | } |
| 41 | } |
| 42 | public function created_at_for_humans() : string |
| 43 | { |
| 44 | return $this->origin->created_at()->timezone(Timezone::site_timezone())->format(Format::date()); |
| 45 | } |
| 46 | public function events() |
| 47 | { |
| 48 | return $this->events; |
| 49 | } |
| 50 | public function conversion_events() |
| 51 | { |
| 52 | $types = ['order', 'click', 'submission']; |
| 53 | return Collection::make($this->events)->filter(fn(Event $event) => \in_array($event->type(), $types))->values()->all(); |
| 54 | } |
| 55 | private function fetch_events(int $session_id) : array |
| 56 | { |
| 57 | $views = Collection::make(View::from_session($session_id)); |
| 58 | $first_view = $views->shift(); |
| 59 | $events = Collection::make($views)->merge(Order::from_session($session_id))->merge(Submission::from_session($session_id))->merge(Click::from_session($session_id))->sortBy(function (Event $event) { |
| 60 | $priorities = ['click' => 0, 'submission' => 1, 'order' => 2, 'view' => 3]; |
| 61 | return [$event->created_at()->timestamp, $priorities[$event->type()] ?? 4]; |
| 62 | }); |
| 63 | if ($first_view) { |
| 64 | $events->prepend($first_view); |
| 65 | } |
| 66 | return $events->all(); |
| 67 | } |
| 68 | } |
| 69 |