Загрузка данных


@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>