-- ============================================================================ -- RAPPORT — Default-Stammdaten pro neuem Studio -- ============================================================================ -- Wenn ein neues Studio angelegt wird (INSERT INTO studios), bekommt es -- automatisch: -- - eine studio_settings-Zeile (alle Defaults aus CREATE TABLE) -- - 4 studio_roles (PL, TS, BL, AS) -- - 3 dashboard_templates (admin, projektleiter, mitarbeiter) -- - 3 app_roles (r-admin, r-projektleiter, r-mitarbeiter) -- - 7 absence_types (Krankheit, Unfall, …) -- - 2 letter_templates (Offerte, Zahlungserinnerung) -- -- Quelle der Werte: src/constants.js (`defaultData`) + DEFAULT_ABSENZ_TYPES. -- Wenn dort etwas geändert wird, hier nachziehen — und umgekehrt. -- -- SECURITY DEFINER: Funktion läuft mit Postgres-Owner-Rechten, umgeht damit -- die RLS-Policies (der gerade anlegende User ist noch nicht studio_member, -- könnte sonst nichts einfügen). -- ============================================================================ create or replace function seed_studio_defaults(s_id uuid) returns void language plpgsql security definer as $$ begin -- 1. studio_settings (1 Zeile, alle Defaults aus CREATE TABLE) insert into studio_settings (studio_id) values (s_id); -- 2. studio_roles (Rate-Profile) insert into studio_roles (studio_id, id, label, rate, sort) values (s_id, 'PL', 'Projektleiter/in', 140, 1), (s_id, 'TS', 'Technischer Support', 120, 2), (s_id, 'BL', 'Bauleiter/in', 135, 3), (s_id, 'AS', 'Administrativer Support', 120, 4); -- 3. dashboard_templates (vor app_roles wegen FK) insert into dashboard_templates (studio_id, id, name, is_public, layout) values (s_id, 'tpl-admin', 'Administrator', true, $j$[ {"id":"dw-a1","cols":4,"minH":0,"widgets":["kpi-projekte","kpi-stunden","kpi-ausstehend","kpi-umsatz"]}, {"id":"dw-a2","cols":1,"minH":0,"widgets":["warnungen"]}, {"id":"dw-a3","cols":2,"minH":0,"widgets":["aktive-projekte","unverrechnete-stunden"]}, {"id":"dw-a4","cols":2,"minH":0,"widgets":["umsatz-sparkline","offene-offerten"]}, {"id":"dw-a5","cols":1,"minH":0,"widgets":["letzte-zeiteintraege"]} ]$j$::jsonb), (s_id, 'tpl-projektleiter', 'Projektleiter', true, $j$[ {"id":"dw-p1","cols":2,"minH":0,"widgets":["kpi-projekte","kpi-stunden"]}, {"id":"dw-p2","cols":1,"minH":0,"widgets":["warnungen"]}, {"id":"dw-p3","cols":3,"minH":0,"widgets":["meine-projekte","team-auslastung","offene-offerten"]}, {"id":"dw-p4","cols":1,"minH":0,"widgets":["letzte-zeiteintraege"]} ]$j$::jsonb), (s_id, 'tpl-mitarbeiter', 'Mitarbeiter', true, $j$[ {"id":"dw-m1","cols":3,"minH":0,"widgets":["kpi-stunden","ueberstunden","meine-ferien"]}, {"id":"dw-m2","cols":2,"minH":0,"widgets":["meine-projekte","stunden-woche"]}, {"id":"dw-m3","cols":1,"minH":0,"widgets":["meine-zeiteintraege"]} ]$j$::jsonb); -- 4. app_roles (permissions=NULL bedeutet "alle erlaubt") insert into app_roles (studio_id, id, name, permissions, dashboard_template_id) values (s_id, 'r-admin', 'Administrator', null, 'tpl-admin'), (s_id, 'r-projektleiter', 'Projektleiter', array['dashboard','projects','time','quotes','personen','mitarbeiter','settings'], 'tpl-projektleiter'), (s_id, 'r-mitarbeiter', 'Mitarbeiter', array['dashboard','projects','time','personen','settings'], 'tpl-mitarbeiter'); -- 5. absence_types (aus DEFAULT_ABSENZ_TYPES in constants.js) insert into absence_types (studio_id, id, label, color) values (s_id, 'krankheit', 'Krankheit', '#8a1a1a'), (s_id, 'unfall', 'Unfall', '#b5621e'), (s_id, 'intern', 'Intern', '#1a4e8a'), (s_id, 'informatik', 'Informatik', '#555'), (s_id, 'rechnungswesen', 'Rechnungswesen', '#7a6a00'), (s_id, 'weiterbildung', 'Weiterbildung', '#2d6a4f'), (s_id, 'militaer', 'Militär / Zivildienst', '#3d3d38'); -- 6. letter_templates insert into letter_templates (studio_id, id, name, body) values (s_id, 'offer', 'Offerte', $b$Sehr geehrte/r {{client}} Gerne unterbreiten wir Ihnen die Offerte für das Projekt «{{project}}». [Leistungsumfang] Honorar: CHF [Betrag] Wir freuen uns auf die Zusammenarbeit. Freundliche Grüsse$b$), (s_id, 'reminder', 'Zahlungserinnerung', $b$Sehr geehrte/r {{client}} Bei einer Überprüfung unserer Buchhaltung stellen wir fest, dass die Rechnung [Nr.] vom [Datum] über CHF [Betrag] noch nicht beglichen ist. Wir bitten Sie höflich, den offenen Betrag innert 10 Tagen zu überweisen. Freundliche Grüsse$b$); end$$; -- ─── Trigger: bei jedem Studio-Insert die Defaults reinkippen ────────────── create or replace function trg_studios_seed_defaults() returns trigger language plpgsql as $$ begin perform seed_studio_defaults(new.id); return new; end$$; create trigger studios_seed_defaults after insert on studios for each row execute function trg_studios_seed_defaults();