++ fix e controlli

This commit is contained in:
2026-07-30 17:05:39 +02:00
parent 712336d652
commit 440d63a6b9
54 changed files with 4921 additions and 1322 deletions

View File

@@ -3,23 +3,45 @@
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
/**
* La conversione si fa in PHP e non in SQL.
*
* La versione originale usava GREATEST(1, CEIL(h / 720)), che e' sintassi
* MySQL: SQLite non conosce GREATEST e la migrazione moriva con "no such
* function", rendendo impossibile costruire lo schema per la suite di test
* (che gira su SQLite in memoria — vedi phpunit.xml).
*
* Il risultato e' identico a quello dell'espressione SQL, e la migrazione e'
* gia' applicata ovunque, quindi la riscrittura non tocca nessun database
* esistente: vale solo per le installazioni nuove e per i test. `settings`
* contiene una riga sola, quindi il giro in PHP non costa niente.
*/
return new class extends Migration
{
private const ORE_PER_MESE = 720;
public function up(): void
{
DB::table('settings')
->whereNotNull('assignment_link_ttl_hours')
->update([
'assignment_link_ttl_hours' => DB::raw('GREATEST(1, CEIL(assignment_link_ttl_hours / 720))'),
]);
$this->converti(fn (int $ore) => max(1, (int) ceil($ore / self::ORE_PER_MESE)));
}
public function down(): void
{
DB::table('settings')
->whereNotNull('assignment_link_ttl_hours')
->update([
'assignment_link_ttl_hours' => DB::raw('assignment_link_ttl_hours * 720'),
]);
$this->converti(fn (int $mesi) => $mesi * self::ORE_PER_MESE);
}
};
private function converti(callable $conversione): void
{
$righe = DB::table('settings')
->whereNotNull('assignment_link_ttl_hours')
->get(['id', 'assignment_link_ttl_hours']);
foreach ($righe as $riga) {
DB::table('settings')
->where('id', $riga->id)
->update([
'assignment_link_ttl_hours' => $conversione((int) $riga->assignment_link_ttl_hours),
]);
}
}
};