Initial commit - Route Commerce platform
This commit is contained in:
@@ -0,0 +1,193 @@
|
||||
-- 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;
|
||||
$$;
|
||||
Reference in New Issue
Block a user