Partendo da riga 293 noto che in teoria dovrebbero già essere ordinati per 'orario_inizio', però poi non va...
// Sessioni di lavoro dei tecnici
$sessioni = $documento->sessioni->sortBy('orario_inizio');
foreach ($sessioni as $i => $sessione) {
echo '
<tr>';
// Nome tecnico
echo '
<td>
'.$sessione->anagrafica->ragione_sociale.'
('.$sessione->tipo->descrizione.')
</td>';
$inizio = new Carbon($sessione['orario_inizio']);
$fine = new Carbon($sessione['orario_fine']);
if ($inizio->isSameDay($fine)) {
$orario = timestampFormat($inizio).' - '.timeFormat($fine);
} else {
$orario = timestampFormat($inizio).' - '.timestampFormat($fine);
}
// Orario
echo '
<td class="text-center" colspan="3">
'.$orario.'
</td>';
// Spazio aggiuntivo
if ($i == 0) {
echo '
<td class="text-center" style="font-size:6pt;">
'.tr('Si dichiara che i lavori sono stati eseguiti ed i materiali installati nel rispetto delle vigenti normative tecniche').'
</td>';
} else {
echo '
<td class="text-center" style="border-bottom:0px;border-top:0px;"></td>';
}
echo '
</tr>';
}
Confermo però che l'ordine visualizzato è quello che esce da una query senza ordinamento (da phpMyAdmin):

Se può essere utile, ho notato che in questa attività (4 Ottobre) c'è un accavallamento di interventi. Non so se questo possa far fare confusione... (nei prossimi ScreenShot ho attivato un sort in phpMyAdmin)

Ma ne dubito, essendo un'altra attività con ID differente (2078 vs 2080), e considerando che il 18 Agosto questa cosa non c'era:
