76 lines
3.9 KiB
SQL
76 lines
3.9 KiB
SQL
PRAGMA foreign_keys = ON;
|
|
|
|
CREATE TABLE IF NOT EXISTS directory_contacts (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
kind TEXT NOT NULL DEFAULT 'person' CHECK(kind IN ('person','organization')),
|
|
name TEXT NOT NULL,
|
|
phone TEXT,
|
|
email TEXT,
|
|
address TEXT,
|
|
postal_code TEXT,
|
|
city TEXT,
|
|
country TEXT NOT NULL DEFAULT 'France',
|
|
organization_id INTEGER,
|
|
notes TEXT,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
deleted_at TEXT,
|
|
FOREIGN KEY(organization_id) REFERENCES directory_contacts(id) ON DELETE SET NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS directory_contact_roles (
|
|
contact_id INTEGER NOT NULL,
|
|
role TEXT NOT NULL CHECK(role IN ('fa','benevole','dirigeant','veterinaire','cabinet','crematorium','adoptant')),
|
|
PRIMARY KEY(contact_id, role),
|
|
FOREIGN KEY(contact_id) REFERENCES directory_contacts(id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_directory_name ON directory_contacts(name);
|
|
CREATE INDEX IF NOT EXISTS idx_directory_role ON directory_contact_roles(role, contact_id);
|
|
|
|
ALTER TABLE medical_notes ADD COLUMN vet_contact_id INTEGER REFERENCES directory_contacts(id) ON DELETE SET NULL;
|
|
ALTER TABLE medical_notes ADD COLUMN clinic_contact_id INTEGER REFERENCES directory_contacts(id) ON DELETE SET NULL;
|
|
ALTER TABLE treatments ADD COLUMN vet_contact_id INTEGER REFERENCES directory_contacts(id) ON DELETE SET NULL;
|
|
ALTER TABLE treatments ADD COLUMN clinic_contact_id INTEGER REFERENCES directory_contacts(id) ON DELETE SET NULL;
|
|
ALTER TABLE vaccinations ADD COLUMN vet_contact_id INTEGER REFERENCES directory_contacts(id) ON DELETE SET NULL;
|
|
ALTER TABLE vaccinations ADD COLUMN clinic_contact_id INTEGER REFERENCES directory_contacts(id) ON DELETE SET NULL;
|
|
ALTER TABLE adoptions ADD COLUMN adopter_contact_id INTEGER REFERENCES directory_contacts(id) ON DELETE SET NULL;
|
|
|
|
INSERT INTO directory_contacts(kind, name)
|
|
SELECT 'organization', c.name FROM clinics c
|
|
WHERE NOT EXISTS (SELECT 1 FROM directory_contacts dc WHERE dc.kind='organization' AND lower(dc.name)=lower(c.name));
|
|
INSERT OR IGNORE INTO directory_contact_roles(contact_id, role)
|
|
SELECT dc.id, 'cabinet' FROM directory_contacts dc JOIN clinics c ON lower(c.name)=lower(dc.name);
|
|
|
|
INSERT INTO directory_contacts(kind, name, phone, email, address, postal_code, city)
|
|
SELECT 'person', a.adopter_name, MAX(a.adopter_phone), MAX(a.adopter_email), MAX(a.adopter_address), MAX(a.adopter_postal_code), MAX(a.adopter_city)
|
|
FROM adoptions a
|
|
WHERE NOT EXISTS (
|
|
SELECT 1 FROM directory_contacts dc
|
|
WHERE dc.kind='person' AND lower(dc.name)=lower(a.adopter_name)
|
|
AND lower(COALESCE(dc.email,''))=lower(COALESCE(a.adopter_email,''))
|
|
)
|
|
GROUP BY lower(a.adopter_name), lower(COALESCE(a.adopter_email,''));
|
|
INSERT OR IGNORE INTO directory_contact_roles(contact_id, role)
|
|
SELECT DISTINCT dc.id, 'adoptant' FROM directory_contacts dc JOIN adoptions a
|
|
ON dc.kind='person' AND lower(dc.name)=lower(a.adopter_name)
|
|
AND lower(COALESCE(dc.email,''))=lower(COALESCE(a.adopter_email,''));
|
|
UPDATE adoptions SET adopter_contact_id = (
|
|
SELECT dc.id FROM directory_contacts dc
|
|
WHERE dc.kind='person' AND lower(dc.name)=lower(adoptions.adopter_name)
|
|
AND lower(COALESCE(dc.email,''))=lower(COALESCE(adoptions.adopter_email,'')) LIMIT 1
|
|
) WHERE adopter_contact_id IS NULL;
|
|
|
|
INSERT INTO directory_contacts(kind, name)
|
|
SELECT 'person', vet_name FROM (
|
|
SELECT vet_name FROM medical_notes UNION SELECT vet_name FROM treatments UNION SELECT vet_name FROM vaccinations
|
|
) vets
|
|
WHERE vet_name IS NOT NULL AND trim(vet_name)!=''
|
|
AND NOT EXISTS (SELECT 1 FROM directory_contacts dc WHERE dc.kind='person' AND lower(dc.name)=lower(vets.vet_name));
|
|
INSERT OR IGNORE INTO directory_contact_roles(contact_id, role)
|
|
SELECT dc.id, 'veterinaire' FROM directory_contacts dc
|
|
WHERE EXISTS (
|
|
SELECT 1 FROM medical_notes WHERE lower(vet_name)=lower(dc.name)
|
|
UNION SELECT 1 FROM treatments WHERE lower(vet_name)=lower(dc.name)
|
|
UNION SELECT 1 FROM vaccinations WHERE lower(vet_name)=lower(dc.name)
|
|
);
|