194 lines
4.4 KiB
PL/PgSQL
194 lines
4.4 KiB
PL/PgSQL
-- Time tracking workers table
|
|
CREATE TABLE IF NOT EXISTS time_tracking_workers (
|
|
id uuid DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
brand_id uuid NOT NULL REFERENCES brands(id) ON DELETE CASCADE,
|
|
name text NOT NULL,
|
|
role text DEFAULT 'worker',
|
|
lang text DEFAULT 'en',
|
|
pin text NOT NULL,
|
|
active boolean DEFAULT true,
|
|
last_used_at timestamptz,
|
|
created_at timestamptz DEFAULT now()
|
|
);
|
|
|
|
CREATE UNIQUE INDEX IF NOT EXISTS time_tracking_workers_pin_brand ON time_tracking_workers(brand_id, pin) WHERE active = true;
|
|
|
|
-- Time tracking tasks table
|
|
CREATE TABLE IF NOT EXISTS time_tracking_tasks (
|
|
id uuid DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
brand_id uuid NOT NULL REFERENCES brands(id) ON DELETE CASCADE,
|
|
name text NOT NULL,
|
|
name_es text,
|
|
unit text DEFAULT 'hours',
|
|
sort_order integer DEFAULT 0,
|
|
active boolean DEFAULT true,
|
|
created_at timestamptz DEFAULT now()
|
|
);
|
|
|
|
-- Workers RPCs
|
|
CREATE OR REPLACE FUNCTION create_time_worker(
|
|
p_brand_id uuid,
|
|
p_name text,
|
|
p_role text DEFAULT 'worker',
|
|
p_lang text DEFAULT 'en'
|
|
) RETURNS json
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
AS $$
|
|
DECLARE
|
|
v_pin text;
|
|
v_worker time_tracking_workers;
|
|
BEGIN
|
|
v_pin := lpad(floor(random() * 10000)::text, 4, '0');
|
|
|
|
INSERT INTO time_tracking_workers (brand_id, name, role, lang, pin)
|
|
VALUES (p_brand_id, p_name, p_role, p_lang, v_pin)
|
|
RETURNING * INTO v_worker;
|
|
|
|
RETURN json_build_object(
|
|
'success', true,
|
|
'worker', row_to_json(v_worker),
|
|
'pin', v_pin
|
|
);
|
|
END;
|
|
$$;
|
|
|
|
CREATE OR REPLACE FUNCTION get_time_tracking_workers(p_brand_id uuid)
|
|
RETURNS json
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
AS $$
|
|
BEGIN
|
|
RETURN json_build_object(
|
|
'workers', (
|
|
SELECT json_agg(row_to_json(t))
|
|
FROM (
|
|
SELECT id, name, role, lang, active, last_used_at, created_at
|
|
FROM time_tracking_workers
|
|
WHERE brand_id = p_brand_id
|
|
ORDER BY name
|
|
) t
|
|
)
|
|
);
|
|
END;
|
|
$$;
|
|
|
|
CREATE OR REPLACE FUNCTION update_time_worker(
|
|
p_worker_id uuid,
|
|
p_name text,
|
|
p_role text,
|
|
p_lang text,
|
|
p_active boolean
|
|
) RETURNS json
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
AS $$
|
|
BEGIN
|
|
UPDATE time_tracking_workers
|
|
SET name = p_name, role = p_role, lang = p_lang, active = p_active
|
|
WHERE id = p_worker_id;
|
|
|
|
RETURN json_build_object('success', true);
|
|
END;
|
|
$$;
|
|
|
|
CREATE OR REPLACE FUNCTION delete_time_worker(p_worker_id uuid)
|
|
RETURNS json
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
AS $$
|
|
BEGIN
|
|
DELETE FROM time_tracking_workers WHERE id = p_worker_id;
|
|
RETURN json_build_object('success', true);
|
|
END;
|
|
$$;
|
|
|
|
CREATE OR REPLACE FUNCTION reset_time_worker_pin(p_worker_id uuid)
|
|
RETURNS json
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
AS $$
|
|
DECLARE
|
|
v_pin text;
|
|
BEGIN
|
|
v_pin := lpad(floor(random() * 10000)::text, 4, '0');
|
|
UPDATE time_tracking_workers SET pin = v_pin WHERE id = p_worker_id;
|
|
RETURN json_build_object('success', true, 'pin', v_pin);
|
|
END;
|
|
$$;
|
|
|
|
-- Tasks RPCs
|
|
CREATE OR REPLACE FUNCTION get_time_tracking_tasks(p_brand_id uuid, p_active_only boolean DEFAULT false)
|
|
RETURNS json
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
AS $$
|
|
BEGIN
|
|
RETURN json_build_object(
|
|
'tasks', (
|
|
SELECT json_agg(row_to_json(t))
|
|
FROM (
|
|
SELECT id, name, name_es, unit, sort_order, active, created_at
|
|
FROM time_tracking_tasks
|
|
WHERE brand_id = p_brand_id
|
|
AND (NOT p_active_only OR active = true)
|
|
ORDER BY sort_order, name
|
|
) t
|
|
)
|
|
);
|
|
END;
|
|
$$;
|
|
|
|
CREATE OR REPLACE FUNCTION create_time_task(
|
|
p_brand_id uuid,
|
|
p_name text,
|
|
p_name_es text DEFAULT NULL,
|
|
p_unit text DEFAULT 'hours',
|
|
p_sort_order integer DEFAULT 0
|
|
) RETURNS json
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
AS $$
|
|
DECLARE
|
|
v_id uuid;
|
|
BEGIN
|
|
INSERT INTO time_tracking_tasks (brand_id, name, name_es, unit, sort_order)
|
|
VALUES (p_brand_id, p_name, p_name_es, p_unit, p_sort_order)
|
|
RETURNING id INTO v_id;
|
|
|
|
RETURN json_build_object('success', true, 'id', v_id);
|
|
END;
|
|
$$;
|
|
|
|
CREATE OR REPLACE FUNCTION update_time_task(
|
|
p_task_id uuid,
|
|
p_name text,
|
|
p_name_es text,
|
|
p_unit text,
|
|
p_active boolean,
|
|
p_sort_order integer
|
|
) RETURNS json
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
AS $$
|
|
BEGIN
|
|
UPDATE time_tracking_tasks
|
|
SET name = p_name, name_es = p_name_es, unit = p_unit,
|
|
active = p_active, sort_order = p_sort_order
|
|
WHERE id = p_task_id;
|
|
|
|
RETURN json_build_object('success', true);
|
|
END;
|
|
$$;
|
|
|
|
CREATE OR REPLACE FUNCTION delete_time_task(p_task_id uuid)
|
|
RETURNS json
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
AS $$
|
|
BEGIN
|
|
DELETE FROM time_tracking_tasks WHERE id = p_task_id;
|
|
RETURN json_build_object('success', true);
|
|
END;
|
|
$$;
|