-- Platform tables for submissions + voting BEGIN; CREATE SCHEMA IF NOT EXISTS platform; -- Ideas/submissions — anyone can propose CREATE TABLE platform.ideas ( id BIGSERIAL PRIMARY KEY, title TEXT NOT NULL, problem TEXT NOT NULL, -- "Ce te deranjează?" solution TEXT, -- "Cum ar trebui să fie?" category TEXT DEFAULT 'general', -- transparenta, cereri, ai, educatie, sanatate, etc author_name TEXT, -- optional author_email TEXT, -- optional, for follow-up author_city TEXT, -- optional status TEXT DEFAULT 'nou', -- nou, în discuție, în lucru, mvp, live, respins votes INTEGER DEFAULT 0, created_at TIMESTAMPTZ DEFAULT now(), updated_at TIMESTAMPTZ DEFAULT now() ); CREATE INDEX idx_ideas_votes ON platform.ideas(votes DESC); CREATE INDEX idx_ideas_status ON platform.ideas(status); CREATE INDEX idx_ideas_created ON platform.ideas(created_at DESC); CREATE INDEX idx_ideas_category ON platform.ideas(category); -- Votes — fingerprint-based (no accounts) CREATE TABLE platform.votes ( id BIGSERIAL PRIMARY KEY, idea_id BIGINT REFERENCES platform.ideas(id) ON DELETE CASCADE, fingerprint TEXT NOT NULL, -- hash of IP + user-agent created_at TIMESTAMPTZ DEFAULT now(), UNIQUE(idea_id, fingerprint) ); -- Comments on ideas — simple, no accounts CREATE TABLE platform.comments ( id BIGSERIAL PRIMARY KEY, idea_id BIGINT REFERENCES platform.ideas(id) ON DELETE CASCADE, author_name TEXT DEFAULT 'Anonim', content TEXT NOT NULL, created_at TIMESTAMPTZ DEFAULT now() ); CREATE INDEX idx_comments_idea ON platform.comments(idea_id, created_at); -- Seed some initial ideas to get things started INSERT INTO platform.ideas (title, problem, solution, category, author_name, status, votes) VALUES ( 'Verificare status dosar la orice instituție', 'Trebuie să mergi fizic sau să suni repetat ca să afli ce se întâmplă cu dosarul tău. Fiecare instituție are alt sistem, unele nu au deloc.', 'O platformă unificată unde introduci numărul de dosar și vezi statusul instant, indiferent de instituție.', 'cereri', 'Comunitate', 'nou', 42 ), ( 'Extras Carte Funciară online, instant', 'Durează 3-5 zile și necesită deplasare la OCPI. În 2026, un document public ar trebui disponibil online.', 'Introduci număr cadastral → primești PDF cu extrasul CF. Fără deplasare, fără așteptare.', 'cereri', 'Comunitate', 'nou', 38 ), ( 'Certificat fiscal în 30 de secunde', 'Stai la coadă la primărie, plătești timbru, aștepți 1-3 zile. De 3 ori pe an minim, dacă ai firmă.', 'CNP sau CUI → certificat fiscal digital, semnat electronic, valid legal.', 'cereri', 'Comunitate', 'nou', 35 ), ( 'Programare buletin/pașaport care chiar funcționează', 'Sistemul MAI e permanent supraîncărcat, cade, nu găsești slot-uri. Ajungi la 4 dimineața la coadă.', 'Calendar cu disponibilitate reală, notificare când se eliberează slot, programare în 3 click-uri.', 'cereri', 'Comunitate', 'nou', 50 ), ( 'Calculator taxe și impozite locale', 'Nu știi cât datorezi, trebuie să mergi la primărie să afli. Fiecare primărie calculează diferit.', 'Introdu adresa sau nr. cadastral → vezi toate taxele datorate, cu deadline-uri și posibilitate de plată.', 'transparenta', 'Comunitate', 'nou', 30 ), ( 'Monitor licitații publice cu alerte', 'Informația e dispersată, greu de urmărit. Firmele mici pierd oportunități pentru că nu știu de ele.', 'Feed cu licitații filtrat pe domeniu/județ/valoare. Alerte pe email când apare ceva relevant.', 'transparenta', 'Comunitate', 'în lucru', 25 ), ( 'Profil digital per primărie', 'Nu existe un loc centralizat unde să vezi cum performează primăria ta: buget, licitații, servicii digitale.', 'Pagina per primărie cu: buget, top cheltuieli, licitații, nivel digitalizare, comparație cu altele.', 'transparenta', 'Comunitate', 'în lucru', 22 ), ( 'Generator cereri și petiții cu AI', 'Oamenii nu știu cum să formuleze o cerere oficială. Limbajul birocratic intimidează.', 'Descrii în cuvintele tale ce vrei → AI generează cererea completă, cu referințe legale corecte.', 'ai', 'Comunitate', 'nou', 28 ); COMMIT;