Files
ladill-meet/app/Services/Meet/AttendanceService.php
T
isaaccladandCursor 965fb992e9
Deploy Ladill Meet / deploy (push) Failing after 7s
Initial Ladill Meet release.
Phases 0–18: core meetings, webinar, breakouts, team chat, live streaming, town hall, billing, and Ladill Mail calendar wiring.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-30 23:35:29 +00:00

47 lines
1.5 KiB
PHP

<?php
namespace App\Services\Meet;
use App\Models\Session;
use Illuminate\Support\Collection;
class AttendanceService
{
/**
* @return Collection<int, array<string, mixed>>
*/
public function forSession(Session $session): Collection
{
return $session->participants()
->orderBy('joined_at')
->get()
->map(fn ($p) => [
'display_name' => $p->display_name,
'email' => $p->email,
'role' => $p->role,
'joined_at' => $p->joined_at?->toIso8601String(),
'left_at' => $p->left_at?->toIso8601String(),
'duration_minutes' => ($p->joined_at && $p->left_at)
? (int) $p->joined_at->diffInMinutes($p->left_at)
: ($p->joined_at ? (int) $p->joined_at->diffInMinutes(now()) : 0),
]);
}
public function toCsv(Session $session): string
{
$rows = [['Name', 'Email', 'Role', 'Joined', 'Left', 'Duration (min)']];
foreach ($this->forSession($session) as $row) {
$rows[] = [
$row['display_name'],
$row['email'] ?? '',
$row['role'],
$row['joined_at'] ?? '',
$row['left_at'] ?? '',
(string) $row['duration_minutes'],
];
}
return collect($rows)->map(fn ($r) => implode(',', array_map(fn ($c) => '"'.str_replace('"', '""', $c).'"', $r)))->implode("\n");
}
}