@php
$monthNames = [
1 => 'Январь', 2 => 'Февраль', 3 => 'Март', 4 => 'Апрель',
5 => 'Май', 6 => 'Июнь', 7 => 'Июль', 8 => 'Август',
9 => 'Сентябрь', 10 => 'Октябрь', 11 => 'Ноябрь', 12 => 'Декабрь',
];
// Найти минимальную и максимальную дату среди всех записей
$allDates = [];
foreach ($items as $item) {
foreach ($item['daily'] ?? [] as $record) {
$allDates[] = $record['date'];
}
}
sort($allDates);
$minDate = \Carbon\Carbon::parse(first($allDates));
$maxDate = \Carbon\Carbon::parse(last($allDates));
// Полный диапазон дат от min до max
$dateRange = [];
for ($d = $minDate->copy(); $d <= $maxDate; $d->addDay()) {
$dateRange[] = $d->copy();
}
// Группировка дат по месяцам для шапки
$months = [];
foreach ($dateRange as $date) {
$key = $date->format('Y-m');
if (!isset($months[$key])) {
$months[$key] = ['label' => $monthNames[(int)$date->format('n')], 'count' => 0];
}
$months[$key]['count']++;
}
@endphp
<table>
<!-- Первый уровень шапки -->
<tr>
<td rowspan="3" style="background-color: #DDEBF7">№ п/п</td>
<td rowspan="3" style="background-color: #DDEBF7">ФИО</td>
<td rowspan="3" style="background-color: #DDEBF7">Подразделение</td>
<td rowspan="3" style="background-color: #DDEBF7">Доп. инфо</td>
<td rowspan="3" style="background-color: #DDEBF7">imei</td>
<td colspan="{{ count($dateRange) }}" style="background-color: #DDEBF7">
Пройденное расстояние по дням месяца, км
</td>
<td rowspan="3" style="background-color: #DDEBF7">Сумма, км</td>
</tr>
<!-- Второй уровень шапки: названия месяцев -->
<tr>
@foreach ($months as $month)
<td colspan="{{ $month['count'] }}" style="background-color: #DDEBF7">{{ $month['label'] }}</td>
@endforeach
</tr>
<!-- Третий уровень шапки: числа -->
<tr>
@foreach ($dateRange as $date)
<td style="background-color: #DDEBF7">{{ $date->format('j') }}</td>
@endforeach
</tr>
<!-- Данные -->
@foreach ($items as $item)
<tr>
<td>{{ $loop->iteration }}</td>
<td>{{ $item['w_fio'] }}</td>
<td>{{ $item['department'] ? $item['department']['d_name'] : '' }}</td>
<td>
{{ $item['asup'] && $item['asup']['lk43'] ? 'уволен ' . date('d.m.Y', strtotime($item['asup']['lk43'])) : '' }}
{{ $item['w_closedate'] ? 'закрыт ' . date('d.m.Y', strtotime($item['w_closedate'])) : '' }}
</td>
<td>
{{ $item['trackers'] ? array_reduce($item['trackers'], function ($carry, $tracker) { return $carry . $tracker['t_imei'] . ' '; }, '') : '' }}
</td>
<!-- Пройденное расстояние по дням -->
@foreach ($dateRange as $date)
@php
$record = collect($item['daily'] ?? [])->firstWhere('date', $date->format('Y-m-d'));
@endphp
<td>{{ $record ? $record['d_distance'] : '' }}</td>
@endforeach
<!-- Сумма по всем дням -->
<td style="font-weight: bold;">
{{ number_format(collect($item['daily'] ?? [])->sum('d_distance'), 3, '.', ' ') }}
</td>
</tr>
@endforeach
</table>