fixed api and migrations
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user