fixed api and migrations

This commit is contained in:
2026-08-21 18:44:24 +02:00
parent a40e59c406
commit fe1e227db9
4 changed files with 141 additions and 0 deletions
@@ -0,0 +1,49 @@
<?php
declare(strict_types=1);
use Phinx\Migration\AbstractMigration;
/**
* Converte orderbook.quantityclass da varchar(20) a INT.
*
* quantityclass rappresenta il numero di ticket acquistati: viene usato in
* confronti e aritmetica (offset, LIMIT, conteggi). Tenerlo come stringa
* causa confronti errati ("10" < "9") e comportamenti imprevisti.
*
* PRIMA di cambiare il tipo, bonifica i valori esistenti: elimina spazi e
* azzera i valori non numerici / vuoti, altrimenti la conversione li
* troncherebbe in modo silenzioso.
*/
final class ConvertQuantityclassToInt extends AbstractMigration
{
public function up(): void
{
// 1) Bonifica: rimuovi spazi ai bordi
$this->execute("UPDATE orderbook SET quantityclass = TRIM(quantityclass) WHERE quantityclass IS NOT NULL");
// 2) Bonifica: i valori non interamente numerici o vuoti diventano 0
// (REGEXP '^[0-9]+$' = solo cifre). Rivedi manualmente eventuali 0
// risultanti dopo la migration se non te li aspetti.
$this->execute("UPDATE orderbook SET quantityclass = '0' WHERE quantityclass IS NULL OR quantityclass = '' OR quantityclass NOT REGEXP '^[0-9]+$'");
// 3) Cambia il tipo di colonna a INT
$table = $this->table('orderbook');
$table->changeColumn('quantityclass', 'integer', [
'null' => true,
'default' => null,
'signed' => true,
])->update();
}
public function down(): void
{
// Ripristina varchar(20). I valori numerici restano validi come stringa.
$table = $this->table('orderbook');
$table->changeColumn('quantityclass', 'string', [
'limit' => 20,
'null' => true,
'default' => null,
])->update();
}
}
@@ -0,0 +1,47 @@
<?php
declare(strict_types=1);
use Phinx\Migration\AbstractMigration;
/**
* Aggiunge orderbook.is_openflexy CHAR(1) DEFAULT 'N'.
*
* Marca esplicitamente un ordine come carnet OpenFlexy (biglietti liberi,
* nessuna propagazione). Sostituisce il riconoscimento fragile basato sul
* nome del servizio (service.servicename = 'OpenFlexy'), che si rompe se
* qualcuno rinomina il servizio dal pannello.
*
* Dopo questa migration puoi popolare il flag sugli ordini OpenFlexy già
* esistenti (vedi nota nel metodo up) e poi aggiornare propagatesingleorder.php
* per leggere il flag invece del nome.
*/
final class AddIsOpenflexyToOrderbook extends AbstractMigration
{
public function up(): void
{
$table = $this->table('orderbook');
$table->addColumn('is_openflexy', 'char', [
'limit' => 1,
'null' => false,
'default' => 'N',
'after' => 'idservice',
])->update();
// Popola il flag sugli ordini già collegati alla classe OpenFlexy
// esistente (riconosciuta per nome, una tantum). Usa lower() per
// sicurezza sul confronto.
$this->execute(
"UPDATE orderbook o
JOIN service s ON s.idservice = o.idservice
SET o.is_openflexy = 'Y'
WHERE LOWER(TRIM(s.servicename)) = 'openflexy'"
);
}
public function down(): void
{
$table = $this->table('orderbook');
$table->removeColumn('is_openflexy')->update();
}
}
@@ -0,0 +1,44 @@
<?php
declare(strict_types=1);
use Phinx\Migration\AbstractMigration;
/**
* Aggiunge la foreign key bookingclass.idorder -> orderbook.idorderbook.
*
* Con ON DELETE SET NULL: cancellare un ordine NON cancella le prenotazioni
* collegate, ma ne slega il riferimento (idorder = NULL). Questo preserva la
* storia delle prenotazioni ed evita errori di vincolo alla cancellazione.
*
* IMPORTANTE: se esistono righe in bookingclass con un idorder che non
* corrisponde a nessun orderbook (dati orfani), la creazione della FK
* fallisce. Il metodo up() bonifica prima questi orfani portandoli a NULL.
*/
final class AddForeignKeyBookingclassOrder extends AbstractMigration
{
public function up(): void
{
// 1) Bonifica orfani: idorder che non esiste in orderbook -> NULL
$this->execute(
"UPDATE bookingclass b
LEFT JOIN orderbook o ON o.idorderbook = b.idorder
SET b.idorder = NULL
WHERE b.idorder IS NOT NULL AND o.idorderbook IS NULL"
);
// 2) Crea la foreign key
$table = $this->table('bookingclass');
$table->addForeignKey('idorder', 'orderbook', 'idorderbook', [
'delete' => 'SET_NULL',
'update' => 'NO_ACTION',
'constraint' => 'fk_bookingclass_orderbook',
])->update();
}
public function down(): void
{
$table = $this->table('bookingclass');
$table->dropForeignKey('idorder', null, ['constraint' => 'fk_bookingclass_orderbook'])->update();
}
}