From 72438556cd7d4771d7484046d5865ff42cebae65 Mon Sep 17 00:00:00 2001 From: oversu <95a7002b-481b-4ef3-b578-f9c421550aa4@localhost> Date: Fri, 4 Sep 2026 12:06:23 +0200 Subject: [PATCH] =?UTF-8?q?R=C3=A9parer=20l=E2=80=99ouverture=20des=20fich?= =?UTF-8?q?es=20animales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Controllers/AnimalBrowseActions.php | 2 +- app/Services/Migrations.php | 18 ++++++++++ .../090_medication_administration_routes.sql | 33 +++++++++++++++++++ tests/run.php | 18 ++++++++++ 4 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 migrations/090_medication_administration_routes.sql diff --git a/app/Controllers/AnimalBrowseActions.php b/app/Controllers/AnimalBrowseActions.php index 251a7a4..4085328 100644 --- a/app/Controllers/AnimalBrowseActions.php +++ b/app/Controllers/AnimalBrowseActions.php @@ -601,7 +601,7 @@ trait AnimalBrowseActions $ref_med_administration = $db ->query('SELECT id, name, accro FROM ref_med_administration ORDER BY id') ->fetchAll(); - $vaccines = $db->query('SELECT id, name, code FROM ref_vaccines ORDER BY id')->fetchAll(); + $vaccines = $db->query('SELECT id, name FROM ref_vaccines ORDER BY id')->fetchAll(); $inventoryBatches = $db ->query( 'SELECT b.id,b.batch_number,b.expires_on,b.quantity,p.name,p.unit,p.category,p.reference_id FROM inventory_batches b JOIN inventory_products p ON p.id=b.product_id WHERE b.quantity>0 AND p.active=1 ORDER BY p.category,p.name COLLATE NOCASE,date(b.expires_on)', diff --git a/app/Services/Migrations.php b/app/Services/Migrations.php index b026bc1..a2ceb6a 100644 --- a/app/Services/Migrations.php +++ b/app/Services/Migrations.php @@ -47,6 +47,24 @@ final class Migrations } } + // Les anciennes bases possédaient déjà le nouvel historique alors + // que les installations neuves recevaient encore son premier schéma. + if ($name === '090_medication_administration_routes.sql') { + $columns = array_column( + $db->query('PRAGMA table_info(animal_history)')->fetchAll(PDO::FETCH_ASSOC), + 'name', + ); + if (!in_array('type', $columns, true)) { + $db->exec("ALTER TABLE animal_history ADD COLUMN type TEXT NOT NULL DEFAULT 'history'"); + } + if (!in_array('label', $columns, true)) { + $db->exec("ALTER TABLE animal_history ADD COLUMN label TEXT NOT NULL DEFAULT ''"); + } + if (!in_array('details', $columns, true)) { + $db->exec('ALTER TABLE animal_history ADD COLUMN details TEXT'); + } + } + $db->beginTransaction(); try { $db->exec($sql); diff --git a/migrations/090_medication_administration_routes.sql b/migrations/090_medication_administration_routes.sql new file mode 100644 index 0000000..6aa4358 --- /dev/null +++ b/migrations/090_medication_administration_routes.sql @@ -0,0 +1,33 @@ +CREATE TABLE IF NOT EXISTS ref_med_administration ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL UNIQUE, + accro TEXT, + notes TEXT +); + +INSERT OR IGNORE INTO ref_med_administration (name, accro) VALUES + ('Prise orale', 'PO'), + ('Sous-cutané', 'SC'), + ('Intramusculaire', 'IM'), + ('Intraveineux', 'IV'), + ('Intra-péritonéal', 'IP'), + ('Intradermique', 'ID'), + ('Topique', 'TOP'), + ('Oculaire', 'OC'), + ('Auriculaire', 'AUR'), + ('Intra-nasal', 'IN'), + ('Rectale', 'PR'), + ('Sublinguale', 'SL'), + ('Transdermique', 'TD'), + ('Inhalation', 'INH'); + +CREATE TABLE IF NOT EXISTS icad_cache ( + animal_id INTEGER PRIMARY KEY, + chip_id TEXT, + data_json TEXT, + fetched_at TEXT, + status TEXT, + error_msg TEXT +); + +CREATE INDEX IF NOT EXISTS idx_icad_cache_chip ON icad_cache(chip_id); diff --git a/tests/run.php b/tests/run.php index 8567e4c..2d88135 100644 --- a/tests/run.php +++ b/tests/run.php @@ -63,6 +63,24 @@ try { $actual = (int) $db->query('SELECT COUNT(*) FROM _migrations')->fetchColumn(); $assert($actual === $expected, "$actual/$expected migrations"); }); + $test("Les voies d’administration des médicaments sont initialisées", function () use ($db, $assert): void { + $routes = $db + ->query('SELECT accro FROM ref_med_administration ORDER BY id') + ->fetchAll(PDO::FETCH_COLUMN); + $assert(count($routes) === 14, 'Référentiel des voies incomplet'); + $assert(in_array('PO', $routes, true) && in_array('SC', $routes, true) && in_array('IV', $routes, true)); + $historyColumns = array_column( + $db->query('PRAGMA table_info(animal_history)')->fetchAll(PDO::FETCH_ASSOC), + 'name', + ); + foreach (['type', 'label', 'details'] as $column) { + $assert(in_array($column, $historyColumns, true), 'Colonne historique absente : ' . $column); + } + $assert( + (int) $db->query("SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='icad_cache'")->fetchColumn() === 1, + 'Cache i-CAD absent', + ); + }); $test('Une installation vierge initialise les médias privés', function () use ($db, $assert): void { $columns = array_column($db->query('PRAGMA table_info(animal_photos)')->fetchAll(PDO::FETCH_ASSOC), 'name'); $assert(in_array('is_public', $columns, true), 'Colonne is_public absente');