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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -199,6 +199,7 @@ foreach ($rows as $r) {
|
|||||||
|
|
||||||
$lessons[] = [
|
$lessons[] = [
|
||||||
'booking_id' => (int) $r['idbookingclass'],
|
'booking_id' => (int) $r['idbookingclass'],
|
||||||
|
'service_id' => (int) ($r['idservice'] ?? 0),
|
||||||
'datetime' => $classDt->format('Y-m-d H:i:s'),
|
'datetime' => $classDt->format('Y-m-d H:i:s'),
|
||||||
'date' => $classDt->format('Y-m-d'),
|
'date' => $classDt->format('Y-m-d'),
|
||||||
'time' => $classDt->format('H:i'),
|
'time' => $classDt->format('H:i'),
|
||||||
|
|||||||
Reference in New Issue
Block a user