labfy-investigation/database/schema_v15.sql

78 lines
3.4 KiB
SQL

/* Migration V15 — OCR contrôlé des documents d'identité. */
CREATE TABLE IF NOT EXISTS identity_ocr_runs (
id TEXT PRIMARY KEY,
evidence_id TEXT NOT NULL,
expected_sha256 TEXT NOT NULL CHECK(length(expected_sha256)=64),
page_number INTEGER NOT NULL CHECK(page_number > 0),
document_type TEXT NOT NULL CHECK(document_type IN
('identity_card','passport','driving_licence','residence_permit','other')),
document_side TEXT NOT NULL CHECK(document_side IN
('front','back','identity_page','other_page')),
engine TEXT NOT NULL,
engine_version TEXT,
requested_languages TEXT NOT NULL,
available_languages TEXT NOT NULL,
parameters TEXT NOT NULL,
preprocessing_profile TEXT NOT NULL CHECK(preprocessing_profile IN
('none','orientation','grayscale','upscale')),
executed_at TEXT NOT NULL CHECK(length(executed_at)=20),
status TEXT NOT NULL CHECK(status IN ('success','partial','error','cancelled')),
error_message TEXT,
text_relative_path TEXT NOT NULL,
text_sha256 TEXT NOT NULL CHECK(length(text_sha256)=64),
tsv_relative_path TEXT NOT NULL,
tsv_sha256 TEXT NOT NULL CHECK(length(tsv_sha256)=64),
work_image_relative_path TEXT,
work_image_sha256 TEXT,
FOREIGN KEY(evidence_id) REFERENCES preuves(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS idx_identity_ocr_runs_evidence ON identity_ocr_runs(evidence_id);
CREATE TABLE IF NOT EXISTS identity_document_observations (
id TEXT PRIMARY KEY,
person_id TEXT NOT NULL,
evidence_id TEXT NOT NULL,
ocr_run_id TEXT NOT NULL UNIQUE,
document_type TEXT NOT NULL,
issuing_country_declared TEXT,
document_side TEXT NOT NULL,
page_number INTEGER NOT NULL CHECK(page_number > 0),
review_state TEXT NOT NULL CHECK(review_state IN
('proposed','accepted','modified','rejected','conflict')),
observed_at TEXT NOT NULL CHECK(length(observed_at)=20),
factual_notes TEXT,
FOREIGN KEY(person_id) REFERENCES entites(id) ON DELETE CASCADE,
FOREIGN KEY(evidence_id) REFERENCES preuves(id) ON DELETE CASCADE,
FOREIGN KEY(ocr_run_id) REFERENCES identity_ocr_runs(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS identity_field_observations (
id TEXT PRIMARY KEY,
observation_id TEXT NOT NULL,
field_code TEXT NOT NULL,
raw_value TEXT NOT NULL,
corrected_value TEXT,
normalized_value TEXT,
confidence REAL CHECK(confidence IS NULL OR confidence BETWEEN 0 AND 100),
review_status TEXT NOT NULL CHECK(review_status IN
('accepted','modified')),
origin TEXT NOT NULL CHECK(origin IN ('ocr','mrz','manual_override')),
evidence_id TEXT NOT NULL,
ocr_run_id TEXT NOT NULL,
page_number INTEGER NOT NULL CHECK(page_number > 0),
source_x INTEGER,
source_y INTEGER,
source_width INTEGER,
source_height INTEGER,
source_image_width INTEGER,
source_image_height INTEGER,
display_order INTEGER NOT NULL CHECK(display_order >= 0),
reviewed_at TEXT NOT NULL CHECK(length(reviewed_at)=20),
review_note TEXT,
FOREIGN KEY(observation_id) REFERENCES identity_document_observations(id)
ON DELETE CASCADE,
FOREIGN KEY(evidence_id) REFERENCES preuves(id) ON DELETE CASCADE,
FOREIGN KEY(ocr_run_id) REFERENCES identity_ocr_runs(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS idx_identity_fields_observation
ON identity_field_observations(observation_id,display_order);