*/ class TimeEntriesDetailedExport implements FromQuery, WithCustomCsvSettings, WithHeadings, WithMapping { use Exportable; /** * @var Builder */ private Builder $builder; /** * @param Builder $builder */ public function __construct(Builder $builder) { $this->builder = $builder; } /** * @return Builder */ public function query(): Builder { return $this->builder; } /** * @return array */ public function getCsvSettings(): array { return [ 'delimiter' => ',', 'use_bom' => false, 'output_encoding' => 'ISO-8859-1', ]; } /** * @return string[] */ public function headings(): array { return [ 'Description', 'Task', 'Project', 'Client', 'User', 'Start date', 'Start time', 'End date', 'End time', 'Duration', 'Duration (decimal)', 'Billable', 'Tags', ]; } /** * @param TimeEntry $model * @return array */ public function map($model): array { $duration = $model->getDuration(); return [ $model->description, $model->task?->name, $model->project?->name, $model->project?->client?->name, $model->user->name, $model->start->format('Y-m-d'), $model->start->format('H:i:s'), $model->end?->format('Y-m-d'), $model->end?->format('H:i:s'), $duration !== null ? (int) floor($duration->totalHours).':'.$duration->format('%I:%S') : null, $duration?->totalHours, $model->billable ? 'Yes' : 'No', $model->tagsRelation->pluck('name')->implode(', '), ]; } }