From bf7941b0fd7788a2a53a8861418bc9f61b567327 Mon Sep 17 00:00:00 2001 From: dadaloop82 Date: Thu, 12 Mar 2026 18:39:09 +0000 Subject: [PATCH] Fix: allow 'waste' transaction type for thrown-out items (CHECK constraint) --- api/database.php | 24 +++++++++++++++++++++++- data/dispensa.db | Bin 114688 -> 126976 bytes 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/api/database.php b/api/database.php index 9bb0819..662d136 100644 --- a/api/database.php +++ b/api/database.php @@ -53,7 +53,7 @@ function initializeDB(PDO $db): void { CREATE TABLE IF NOT EXISTS transactions ( id INTEGER PRIMARY KEY AUTOINCREMENT, product_id INTEGER NOT NULL, - type TEXT NOT NULL CHECK(type IN ('in', 'out')), + type TEXT NOT NULL CHECK(type IN ('in', 'out', 'waste')), quantity REAL NOT NULL, location TEXT NOT NULL DEFAULT 'dispensa', notes TEXT DEFAULT '', @@ -77,6 +77,28 @@ function migrateDB(PDO $db): void { $db->exec("ALTER TABLE products ADD COLUMN package_unit TEXT DEFAULT ''"); } + // Migrate transactions CHECK constraint to allow 'waste' type + $sql = $db->query("SELECT sql FROM sqlite_master WHERE type='table' AND name='transactions'")->fetchColumn(); + if ($sql && strpos($sql, "'waste'") === false) { + $db->exec("ALTER TABLE transactions RENAME TO transactions_old"); + $db->exec(" + CREATE TABLE transactions ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + product_id INTEGER NOT NULL, + type TEXT NOT NULL CHECK(type IN ('in', 'out', 'waste')), + quantity REAL NOT NULL, + location TEXT NOT NULL DEFAULT 'dispensa', + notes TEXT DEFAULT '', + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE + ) + "); + $db->exec("INSERT INTO transactions SELECT * FROM transactions_old"); + $db->exec("DROP TABLE transactions_old"); + $db->exec("CREATE INDEX IF NOT EXISTS idx_transactions_product ON transactions(product_id)"); + $db->exec("CREATE INDEX IF NOT EXISTS idx_transactions_date ON transactions(created_at)"); + } + // --- New shared tables --- // app_settings: key-value store shared across all devices $tables = $db->query("SELECT name FROM sqlite_master WHERE type='table' AND name='app_settings'")->fetchAll(); diff --git a/data/dispensa.db b/data/dispensa.db index c21fdc07c01bc4d22a1e11bb5ca7d45743556bb0..e5d06e06044e3802c4af4694c129085061e48ffc 100644 GIT binary patch delta 2533 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 yAmrXESXhqT_H3M#4zCSxV($~zI7XJ