|
@@ -0,0 +1,78 @@
|
|
|
|
+CREATE TABLE public.project (
|
|
|
|
+ id bigint NOT NULL,
|
|
|
|
+ project text NOT NULL,
|
|
|
|
+ ggl_id bigint,
|
|
|
|
+ description text
|
|
|
|
+);
|
|
|
|
+ALTER TABLE public.project OWNER TO postgres;
|
|
|
|
+ALTER TABLE ONLY public.project
|
|
|
|
+ ADD CONSTRAINT description_uniq UNIQUE (description);
|
|
|
|
+ALTER TABLE ONLY public.project
|
|
|
|
+ ADD CONSTRAINT ggl_id_uniq UNIQUE (ggl_id);
|
|
|
|
+ALTER TABLE ONLY public.project
|
|
|
|
+ ADD CONSTRAINT project_pkey PRIMARY KEY (id);
|
|
|
|
+ALTER TABLE ONLY public.project
|
|
|
|
+ ADD CONSTRAINT project_uniq UNIQUE (project);
|
|
|
|
+
|
|
|
|
+CREATE TABLE public.items (
|
|
|
|
+ id bigint PRIMARY KEY,
|
|
|
|
+ project_id bigint NOT NULL,
|
|
|
|
+ description text,
|
|
|
|
+ start timestamp(0) without time zone,
|
|
|
|
+ "end" timestamp(0) without time zone,
|
|
|
|
+ duration interval,
|
|
|
|
+ CONSTRAINT start_end_duration_ck CHECK ((((start IS NOT NULL) AND ("end" IS NOT NULL) AND ((duration IS NULL) OR (duration = ("end" - start)))) OR ((duration IS NOT NULL) AND ((start IS NOT NULL) OR ("end" IS NOT NULL)) AND ((start IS NULL) OR ("end" IS NULL)))))
|
|
|
|
+);
|
|
|
|
+ALTER TABLE public.items OWNER TO postgres;
|
|
|
|
+ALTER TABLE ONLY public.items
|
|
|
|
+ ADD CONSTRAINT project_id_fk FOREIGN KEY (project_id) REFERENCES public.project(id);
|
|
|
|
+
|
|
|
|
+CREATE VIEW public.timesheet AS
|
|
|
|
+ SELECT min(((COALESCE("end", (start + duration)) AT TIME ZONE 'UTC'::text))::date) AS date,
|
|
|
|
+ project_id,
|
|
|
|
+ sum(COALESCE(duration, ("end" - start))) AS total,
|
|
|
|
+ round((EXTRACT(epoch FROM sum(COALESCE(duration, ("end" - start)))) / (3600)::numeric), 2) AS total_hours
|
|
|
|
+ FROM public.items
|
|
|
|
+ GROUP BY ROLLUP((((COALESCE("end", (start + duration)) AT TIME ZONE 'UTC'::text))::date), project_id)
|
|
|
|
+ ORDER BY (min(((COALESCE("end", (start + duration)) AT TIME ZONE 'UTC'::text))::date)) DESC, project_id;
|
|
|
|
+ALTER VIEW public.timesheet OWNER TO postgres;
|
|
|
|
+
|
|
|
|
+CREATE VIEW public.today AS
|
|
|
|
+ SELECT id,
|
|
|
|
+ project_id,
|
|
|
|
+ description,
|
|
|
|
+ COALESCE(duration, ("end" - start)) AS duration,
|
|
|
|
+ (COALESCE("end", (start + duration)) AT TIME ZONE 'UTC'::text) AS "end"
|
|
|
|
+ FROM public.items
|
|
|
|
+ WHERE (((COALESCE("end", (start + duration)) AT TIME ZONE 'UTC'::text))::date = CURRENT_DATE);
|
|
|
|
+ALTER VIEW public.today OWNER TO postgres;
|
|
|
|
+
|
|
|
|
+CREATE PROCEDURE public.add_item(IN p_project_id numeric, IN p_description text, IN p_start time with time zone, IN p_end time with time zone, IN p_duration interval)
|
|
|
|
+ LANGUAGE sql
|
|
|
|
+ AS $$
|
|
|
|
+INSERT INTO items(id, project_id, description, start, "end", duration)
|
|
|
|
+VALUES
|
|
|
|
+(COALESCE((SELECT max(id) FROM items) + 2, 1), p_project_id, p_description, CASE p_start IS NOT NULL
|
|
|
|
+ WHEN TRUE THEN ((current_date || ' ' || p_start)::timestamp with time zone) AT TIME ZONE 'UTC'
|
|
|
|
+ ELSE NULL END, CASE p_end IS NOT NULL
|
|
|
|
+ WHEN TRUE THEN ((current_date || ' ' || p_end)::timestamp with time zone) AT TIME ZONE 'UTC'
|
|
|
|
+ ELSE ((SELECT COALESCE("end", start + duration) FROM items ORDER BY id DESC LIMIT 1) AT TIME ZONE 'UTC' + p_duration) AT TIME ZONE 'UTC' END, CASE p_duration IS NULL
|
|
|
|
+ WHEN TRUE AND p_start IS NULL THEN ((current_date || ' ' || p_end)::timestamp with time zone) AT TIME ZONE 'UTC' - (SELECT COALESCE("end", start + duration) FROM items ORDER BY id DESC LIMIT 1)
|
|
|
|
+ ELSE p_duration END)
|
|
|
|
+$$;
|
|
|
|
+ALTER PROCEDURE public.add_item(IN p_project_id numeric, IN p_description text, IN p_start time with time zone, IN p_end time with time zone, IN p_duration interval) OWNER TO postgres;
|
|
|
|
+
|
|
|
|
+CREATE FUNCTION public.timesheet_day(p_ago interval DEFAULT '00:00:00'::interval) RETURNS SETOF public.timesheet
|
|
|
|
+ LANGUAGE sql
|
|
|
|
+ AS $$
|
|
|
|
+ SELECT
|
|
|
|
+ min((COALESCE("end", start + duration) AT TIME ZONE 'UTC'::text)::date) AS date,
|
|
|
|
+ project_id,
|
|
|
|
+ sum(COALESCE(duration, "end" - start)) AS total,
|
|
|
|
+ round(EXTRACT(epoch FROM sum(COALESCE(duration, "end" - start))) / 3600::numeric, 2) AS total_hours
|
|
|
|
+ FROM items
|
|
|
|
+ WHERE (COALESCE("end", start + duration) AT TIME ZONE 'UTC'::text)::date = CURRENT_DATE - p_ago
|
|
|
|
+GROUP BY ROLLUP (project_id)
|
|
|
|
+ORDER BY project_id
|
|
|
|
+$$;
|
|
|
|
+ALTER FUNCTION public.timesheet_day(p_ago interval) OWNER TO postgres;
|