init
This commit is contained in:
File diff suppressed because it is too large
Load Diff
402
worklenz-backend/database/2_dml.sql
Normal file
402
worklenz-backend/database/2_dml.sql
Normal file
@@ -0,0 +1,402 @@
|
||||
CREATE OR REPLACE FUNCTION sys_insert_task_priorities() RETURNS VOID AS
|
||||
$$
|
||||
BEGIN
|
||||
INSERT INTO task_priorities (name, value, color_code, color_code_dark) VALUES ('Medium', 1, '#fbc84c', '#FFC227');
|
||||
INSERT INTO task_priorities (name, value, color_code, color_code_dark) VALUES ('Low', 0, '#75c997', '#46D980');
|
||||
INSERT INTO task_priorities (name, value, color_code, color_code_dark) VALUES ('High', 2, '#f37070', '#FF4141');
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE OR REPLACE FUNCTION sys_insert_project_access_levels() RETURNS VOID AS
|
||||
$$
|
||||
BEGIN
|
||||
INSERT INTO project_access_levels (name, key)
|
||||
VALUES ('Admin', 'ADMIN');
|
||||
INSERT INTO project_access_levels (name, key)
|
||||
VALUES ('Member', 'MEMBER');
|
||||
INSERT INTO project_access_levels (name, key)
|
||||
VALUES ('Project Manager', 'PROJECT_MANAGER');
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE OR REPLACE FUNCTION sys_insert_task_status_categories() RETURNS VOID AS
|
||||
$$
|
||||
BEGIN
|
||||
INSERT INTO public.sys_task_status_categories (name, color_code, index, is_todo, is_doing, is_done, description,
|
||||
color_code_dark)
|
||||
VALUES ('To do', '#a9a9a9', 1, TRUE, FALSE, FALSE,
|
||||
'For tasks that have not been started.', '#989898');
|
||||
INSERT INTO public.sys_task_status_categories (name, color_code, index, is_todo, is_doing, is_done, description,
|
||||
color_code_dark)
|
||||
VALUES ('Doing', '#70a6f3', 2, FALSE, TRUE, FALSE,
|
||||
'For tasks that have been started.', '#4190FF');
|
||||
INSERT INTO public.sys_task_status_categories (name, color_code, index, is_todo, is_doing, is_done, description,
|
||||
color_code_dark)
|
||||
VALUES ('Done', '#75c997', 3, FALSE, FALSE, TRUE,
|
||||
'For tasks that have been completed.', '#46D980');
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE OR REPLACE FUNCTION sys_insert_project_statuses() RETURNS VOID AS
|
||||
$$
|
||||
BEGIN
|
||||
INSERT INTO public.sys_project_statuses (name, color_code, icon, sort_order, is_default)
|
||||
VALUES ('Cancelled', '#f37070', 'close-circle', 0, FALSE),
|
||||
('Blocked', '#cbc8a1', 'stop', 1, FALSE),
|
||||
('On Hold', '#cbc8a1', 'stop', 2, FALSE),
|
||||
('Proposed', '#cbc8a1', 'clock-circle', 3, TRUE),
|
||||
('In Planning', '#cbc8a1', 'clock-circle', 4, FALSE),
|
||||
('In Progress', '#80ca79', 'clock-circle', 5, FALSE),
|
||||
('Completed', '#80ca79', 'check-circle', 6, FALSE),
|
||||
('Continuous', '#80ca79', 'clock-circle', 7, FALSE);
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE OR REPLACE FUNCTION sys_insert_project_healths() RETURNS VOID AS
|
||||
$$
|
||||
BEGIN
|
||||
INSERT INTO sys_project_healths (name, color_code, sort_order, is_default)
|
||||
VALUES ('Not Set', '#a9a9a9', 0, TRUE);
|
||||
INSERT INTO sys_project_healths (name, color_code, sort_order, is_default)
|
||||
VALUES ('Needs Attention', '#fbc84c', 1, FALSE);
|
||||
INSERT INTO sys_project_healths (name, color_code, sort_order, is_default)
|
||||
VALUES ('At Risk', '#f37070', 2, FALSE);
|
||||
INSERT INTO sys_project_healths (name, color_code, sort_order, is_default)
|
||||
VALUES ('Good', '#75c997', 3, FALSE);
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE OR REPLACE FUNCTION sys_insert_project_templates() RETURNS VOID AS
|
||||
$$
|
||||
DECLARE
|
||||
medium_priority_id UUID;
|
||||
todo_category_id UUID;
|
||||
doing_category_id UUID;
|
||||
done_category_id UUID;
|
||||
BEGIN
|
||||
-- Fetch IDs to avoid repeated subqueries
|
||||
SELECT id INTO medium_priority_id FROM task_priorities WHERE name = 'Medium' LIMIT 1;
|
||||
SELECT id INTO todo_category_id FROM public.sys_task_status_categories WHERE name = 'To do' LIMIT 1;
|
||||
SELECT id INTO doing_category_id FROM public.sys_task_status_categories WHERE name = 'Doing' LIMIT 1;
|
||||
SELECT id INTO done_category_id FROM public.sys_task_status_categories WHERE name = 'Done' LIMIT 1;
|
||||
|
||||
INSERT INTO public.pt_project_templates (id, name, key, description, phase_label, image_url, color_code)
|
||||
VALUES ('0a769952-e9b8-4e48-b562-f4ebb0f5914e', 'Software Development', 'SD', 'The "Software Development" project template is a specialized and comprehensive template tailored to the unique needs of software development teams and companies. It offers a structured framework for planning, tracking, and executing software development projects, making it an essential resource for software development firms, tech startups, IT departments, and any business involved in software product development.', 'Phase', 'https://worklenz.s3.amazonaws.com/project-template-gifs/software-developement.gif', '#3b7ad4'),
|
||||
('c73b8eaf-9a07-4d89-a7e7-84cd2fd4e9f0', 'Design & Creative', 'DC', 'The "Design & Creative" project template is a versatile solution meticulously crafted to support and enhance the creative and design processes of businesses across various industries. It offers a structured and efficient approach to managing design and creative projects.\r\n', 'Phase', 'https://worklenz.s3.amazonaws.com/project-template-gifs/creative-and-designing.gif', '#3b7ad4'),
|
||||
('f25549d0-d5de-46aa-bbd5-eaab7a970799', 'HR & Recruiting', 'HR', 'The "HR & Recruiting" project template is a specialized tool designed to streamline and enhance human resources and talent acquisition processes. This template is essential for businesses and organizations of all sizes and industries that are involved in HR management and recruitment activities. It provides a structured approach to managing HR projects, making it suitable for a diverse range of businesses.', 'Phase', 'https://worklenz.s3.amazonaws.com/project-template-gifs/hr.gif', '#3b7ad4'),
|
||||
('22805d87-ba25-4b2a-8384-7a4eeedc3b63', 'Information Technology', 'IT', 'The "Information Technology" project template is a comprehensive framework tailored to meet the unique needs of businesses and organizations operating in the field of technology and IT services. This versatile template is designed to facilitate the management of IT-related projects, making it applicable to a wide range of businesses.', 'Phase', 'https://worklenz.s3.amazonaws.com/project-template-gifs/information-technology.gif', '#3b7ad4'),
|
||||
('a014fae0-1b70-4c05-96b4-1fa8c54591b0', 'Finance', 'FIN', 'The "Finance" project template is a strategic tool meticulously designed to guide businesses and financial professionals in managing critical financial processes, making it applicable to a wide range of industries and businesses. This template provides a structured approach to financial planning, decision-making, and review, making it valuable for various types of organizations.\r\n', 'Phase', 'https://worklenz.s3.amazonaws.com/project-template-gifs/finance.gif', '#3b7ad4'),
|
||||
('e71b3b9b-31a8-47ae-84d8-6dc2ae62e06a', 'Personal use', 'PU', 'The "Personal Use" project template is a versatile and user-centric template designed to help individuals manage their personal projects, tasks, and goals with efficiency and organization. This template is adaptable for a wide range of personal activities and can be utilized by anyone seeking a structured approach to planning, tracking, and completing their personal endeavors.', 'Phase', 'https://worklenz.s3.amazonaws.com/project-template-gifs/personal-use.gif', '#3b7ad4'),
|
||||
('0aa3f6fc-678f-4d17-8df2-9674ca81fad2', 'Legal', 'LEG', 'The "Legal" project template is a specialized framework meticulously designed to facilitate organized and efficient management of legal projects and matters. This versatile template is essential for businesses, legal departments, and law firms involved in legal activities, making it applicable to a wide range of industries and organizations', 'Phase', 'https://worklenz.s3.amazonaws.com/project-template-gifs/legal.gif', '#3b7ad4'),
|
||||
('5d1ffd21-a7b7-4a5a-9d19-f7fd3ee253e7', 'Nonprofit', 'NON', 'The "Nonprofit" project template is a purpose-built solution tailored to the unique needs and challenges faced by organizations dedicated to serving a greater social or community cause. It provides a structured framework for planning, executing, and monitoring nonprofit initiatives, making it an ideal template for nonprofit organizations, charities, foundations, and community groups.', 'Phase', 'https://worklenz.s3.amazonaws.com/project-template-gifs/non-profit.gif', '#3b7ad4'),
|
||||
('39db59be-1dba-448b-87f4-3b955ea699d2', 'Bug Tracking', 'BT', 'The "Bug Tracking" project template is a versatile solution meticulously designed to streamline and enhance the bug management processes of businesses across diverse industries. This template is especially valuable for organizations that rely on software development, IT services, or digital product management. It provides a structured and efficient approach to tracking, resolving, and improving software issues.', 'Phase', 'https://worklenz.s3.amazonaws.com/project-template-gifs/bug-tracking.gif', '#3b7ad4'),
|
||||
('d1baf96f-07f4-4468-bb4f-44cdedfad965', 'Manufacturing', 'MAN', 'The "Manufacturing" project template is a specialized and comprehensive template designed to facilitate the management of manufacturing processes and product development from conception to production. This template provides a structured framework for planning, prototyping, and manufacturing, making it essential for manufacturing companies, product design firms, startups, and organizations involved in the development and production of physical products.', 'Phase', 'https://worklenz.s3.amazonaws.com/project-template-gifs/maufacturing.gif', '#3b7ad4'),
|
||||
('d90f9194-200a-4afa-a896-ee5afda2cc8a', 'Construction', 'CON', 'The "Construction" project template is a comprehensive solution designed to facilitate efficient project execution for businesses operating in the construction industry. This template offers a structured approach to managing various aspects of construction projects.\r\n', 'Phase', 'https://worklenz.s3.amazonaws.com/project-template-gifs/construction.gif', '#3b7ad4'),
|
||||
('bdf32f36-e85b-434f-aeda-dde2e8ade8c7', 'Sales & CRM', 'SC', 'The "Sales & CRM" project template is a comprehensive solution designed to optimize sales processes and enhance customer relationship management for businesses across various industries. It provides a structured framework for tracking leads, opportunities, and customer interactions, making it an invaluable template for sales-driven organizations and businesses aiming to foster strong customer relationships.', 'Phase', 'https://worklenz.s3.amazonaws.com/project-template-gifs/sales.gif', '#3b7ad4'),
|
||||
('c86ed436-f9af-4332-8a2d-2afe9a6d66d4', 'Education', 'EDU', 'The "Education" project template is a dynamic tool designed to facilitate organized and effective management of educational initiatives and projects. This versatile template can be utilized by a variety of educational institutions and businesses involved in the field of education\r\n', 'Phase', 'https://worklenz.s3.amazonaws.com/project-template-gifs/education.gif', '#3b7ad4'),
|
||||
('c94c7306-73ab-4e17-bad4-0e7ff4a9da09', 'Services & Consulting', 'SCE', 'The "Services & Consulting" project template is a robust and versatile template designed to facilitate the efficient delivery of services, consulting engagements, and project-based work across various industries. This template offers a structured framework for managing projects from initiation to closure, making it an invaluable resource for service providers, consulting firms, and businesses engaged in project-driven activities.', 'Phase', 'https://worklenz.s3.amazonaws.com/project-template-gifs/services.gif', '#3b7ad4'),
|
||||
('c6917d57-f84a-40fc-aff0-70fd0aab951f', 'Marketing', 'MAR', 'The "Marketing" project template is a versatile and essential template designed to streamline and manage marketing initiatives and campaigns across various industries and business types. This template offers a structured framework for planning, executing, and evaluating marketing projects, making it invaluable for marketing agencies, in-house marketing teams, e-commerce businesses, startups, and organizations seeking to enhance their marketing efforts.', 'Phase', 'https://worklenz.s3.amazonaws.com/project-template-gifs/marketing.gif', '#3b7ad4');
|
||||
|
||||
INSERT INTO public.pt_statuses (id, name, template_id, category_id)
|
||||
VALUES ('c3242606-5a24-48aa-8320-cc90a05c2589', 'To Do', '39db59be-1dba-448b-87f4-3b955ea699d2', todo_category_id),
|
||||
('05ed8d04-92b1-4c44-bd06-abee29641f31', 'Doing', '39db59be-1dba-448b-87f4-3b955ea699d2', doing_category_id),
|
||||
('66e80bc8-6b29-4e72-a484-1593eb1fb44b', 'Done', '39db59be-1dba-448b-87f4-3b955ea699d2', done_category_id),
|
||||
('d8a7ac27-cdfb-48fe-b8cd-c87128269a93', 'To Do', 'd90f9194-200a-4afa-a896-ee5afda2cc8a', todo_category_id),
|
||||
('a83565f9-2c22-486a-8c10-59182bfe19c6', 'Doing', 'd90f9194-200a-4afa-a896-ee5afda2cc8a', doing_category_id),
|
||||
('78803d54-ee61-4389-a5c2-c676f1007d75', 'Done', 'd90f9194-200a-4afa-a896-ee5afda2cc8a', done_category_id),
|
||||
('70cbcea9-2b3c-453a-af0d-fb8a7f6270fd', 'To Do', 'c73b8eaf-9a07-4d89-a7e7-84cd2fd4e9f0', todo_category_id),
|
||||
('bf37bf58-c0d1-498f-b208-c9e80509a593', 'Doing', 'c73b8eaf-9a07-4d89-a7e7-84cd2fd4e9f0', doing_category_id),
|
||||
('c7384096-7008-4eb4-b95f-c0706b9647d6', 'Done', 'c73b8eaf-9a07-4d89-a7e7-84cd2fd4e9f0', done_category_id),
|
||||
('efdb40e7-78ae-4a5a-83ec-d372a5816ae5', 'To Do', 'c86ed436-f9af-4332-8a2d-2afe9a6d66d4', todo_category_id),
|
||||
('ca81d57d-b7d2-45fc-adcd-1c926fd93e6c', 'Doing', 'c86ed436-f9af-4332-8a2d-2afe9a6d66d4', doing_category_id),
|
||||
('e6dffb96-6879-4064-ab8f-73ca784b1964', 'Done', 'c86ed436-f9af-4332-8a2d-2afe9a6d66d4', done_category_id),
|
||||
('0010ae09-0dd6-4c08-b351-30124e0dc436', 'To Do', 'a014fae0-1b70-4c05-96b4-1fa8c54591b0', todo_category_id),
|
||||
('bde5228a-23b9-4f9d-87fe-1784311d68f6', 'Doing', 'a014fae0-1b70-4c05-96b4-1fa8c54591b0', doing_category_id),
|
||||
('5b01b5bd-f29e-477d-94a6-dc5b8101db37', 'Done', 'a014fae0-1b70-4c05-96b4-1fa8c54591b0', done_category_id),
|
||||
('35430ef9-040f-465f-b5e3-1f33b26124dd', 'To Do', 'f25549d0-d5de-46aa-bbd5-eaab7a970799', todo_category_id),
|
||||
('bac101f9-cec3-43aa-8bd8-354de42fdff2', 'Doing', 'f25549d0-d5de-46aa-bbd5-eaab7a970799', doing_category_id),
|
||||
('400b58bd-ad09-4cd1-b5bd-a9f7cb46cb47', 'Done', 'f25549d0-d5de-46aa-bbd5-eaab7a970799', done_category_id),
|
||||
('8e9cc873-d9a5-404f-9f38-8ca4fba91a0d', 'To Do', '22805d87-ba25-4b2a-8384-7a4eeedc3b63', todo_category_id),
|
||||
('856cd7b1-76b1-4182-b2c8-60c278839913', 'Doing', '22805d87-ba25-4b2a-8384-7a4eeedc3b63', doing_category_id),
|
||||
('cbf86a20-8b6d-43d0-99d7-523fb600cdac', 'Done', '22805d87-ba25-4b2a-8384-7a4eeedc3b63', done_category_id),
|
||||
('6f0f7261-7f1a-40f3-a771-04fbc5cd0059', 'To Do', '0aa3f6fc-678f-4d17-8df2-9674ca81fad2', todo_category_id),
|
||||
('54452070-d355-4fb2-b416-e57390d1b668', 'Doing', '0aa3f6fc-678f-4d17-8df2-9674ca81fad2', doing_category_id),
|
||||
('8aac89fc-cf0c-4a4e-889b-97ccd8e7af94', 'Done', '0aa3f6fc-678f-4d17-8df2-9674ca81fad2', done_category_id),
|
||||
('0c3c5259-70d2-407b-8a45-c9b81ac84a3a', 'To Do', 'd1baf96f-07f4-4468-bb4f-44cdedfad965', todo_category_id),
|
||||
('61cf7147-4416-4efb-bda7-4db1059f76a9', 'Doing', 'd1baf96f-07f4-4468-bb4f-44cdedfad965', doing_category_id),
|
||||
('65f4cbd7-bcbb-4a10-8014-fd3b9a3c9ed9', 'Done', 'd1baf96f-07f4-4468-bb4f-44cdedfad965', done_category_id),
|
||||
('1073754d-c498-4e6d-bcee-68bba526e572', 'To Do', 'c6917d57-f84a-40fc-aff0-70fd0aab951f', todo_category_id),
|
||||
('44d54c08-bce6-44e6-9cfc-23d1b4a9e011', 'Doing', 'c6917d57-f84a-40fc-aff0-70fd0aab951f', doing_category_id),
|
||||
('1ae23b11-5edf-485d-9217-f905dc33ddda', 'Done', 'c6917d57-f84a-40fc-aff0-70fd0aab951f', done_category_id),
|
||||
('da60606a-ced5-46bf-bf2f-4ee9d5627a9a', 'To Do', '5d1ffd21-a7b7-4a5a-9d19-f7fd3ee253e7', todo_category_id),
|
||||
('d2bff598-5135-4cac-92aa-641b69ae1dab', 'Doing', '5d1ffd21-a7b7-4a5a-9d19-f7fd3ee253e7', doing_category_id),
|
||||
('9ec60343-27fe-4af5-a35b-d356ebd61837', 'Done', '5d1ffd21-a7b7-4a5a-9d19-f7fd3ee253e7', done_category_id),
|
||||
('2e14a9e9-4c1a-4596-a0f2-574d2e7b2fa4', 'To Do', 'e71b3b9b-31a8-47ae-84d8-6dc2ae62e06a', todo_category_id),
|
||||
('1a403c75-5d8c-4752-bf96-e486b8042df6', 'Doing', 'e71b3b9b-31a8-47ae-84d8-6dc2ae62e06a', doing_category_id),
|
||||
('70fd7f98-b278-440a-8a33-d3453bfd4b70', 'Done', 'e71b3b9b-31a8-47ae-84d8-6dc2ae62e06a', done_category_id),
|
||||
('c20816ac-fe57-4471-91b0-61fa060663ca', 'To Do', 'bdf32f36-e85b-434f-aeda-dde2e8ade8c7', todo_category_id),
|
||||
('291095da-b3d9-40aa-bcd2-5cd6fb51b89f', 'Doing', 'bdf32f36-e85b-434f-aeda-dde2e8ade8c7', doing_category_id),
|
||||
('b450e432-63f4-46a9-bd4a-26b0bdd37507', 'Done', 'bdf32f36-e85b-434f-aeda-dde2e8ade8c7', done_category_id),
|
||||
('4da7cb15-9767-4522-9950-6a4b26e660a6', 'To Do', 'c94c7306-73ab-4e17-bad4-0e7ff4a9da09', todo_category_id),
|
||||
('b4a409f7-4009-4633-b147-f4f99c73f30b', 'Doing', 'c94c7306-73ab-4e17-bad4-0e7ff4a9da09', doing_category_id),
|
||||
('171e791d-6601-45e7-8c5e-80591a610ed8', 'Done', 'c94c7306-73ab-4e17-bad4-0e7ff4a9da09', done_category_id),
|
||||
('757e7655-22c1-4a40-8f3d-2754fbd564dc', 'To Do', '0a769952-e9b8-4e48-b562-f4ebb0f5914e', todo_category_id),
|
||||
('e22f483a-4c87-417c-8c3d-2673c44b1079', 'Doing', '0a769952-e9b8-4e48-b562-f4ebb0f5914e', doing_category_id),
|
||||
('7fae7fde-26a3-44aa-b694-b6d9228e9d6a', 'Done', '0a769952-e9b8-4e48-b562-f4ebb0f5914e', done_category_id);
|
||||
|
||||
INSERT INTO public.pt_tasks (id, name, description, total_minutes, sort_order, priority_id, template_id, parent_task_id, status_id)
|
||||
VALUES ('a75993d9-3fb3-4d0b-a5d4-cab53b60462c', 'Testing and Verification', NULL, 0, 0, medium_priority_id, '39db59be-1dba-448b-87f4-3b955ea699d2', NULL, 'c3242606-5a24-48aa-8320-cc90a05c2589'),
|
||||
('3fdb6801-bc09-4d71-8273-987cd3d1e0f6', 'Bug Prioritization', NULL, 0, 6, medium_priority_id, '39db59be-1dba-448b-87f4-3b955ea699d2', NULL, '05ed8d04-92b1-4c44-bd06-abee29641f31'),
|
||||
('ca64f247-a186-4edb-affd-738f1c2a4d60', 'Bug reporting', NULL, 0, 2, medium_priority_id, '39db59be-1dba-448b-87f4-3b955ea699d2', NULL, 'c3242606-5a24-48aa-8320-cc90a05c2589'),
|
||||
('1e493de8-38cf-4e6e-8f0b-5e1f6f3b07f4', 'Bug Assignment', NULL, 0, 5, medium_priority_id, '39db59be-1dba-448b-87f4-3b955ea699d2', NULL, '05ed8d04-92b1-4c44-bd06-abee29641f31'),
|
||||
('67b2ab3c-53e5-428c-bbad-8bdc19dc88de', 'Bug Closure', NULL, 0, 4, medium_priority_id, '39db59be-1dba-448b-87f4-3b955ea699d2', NULL, '66e80bc8-6b29-4e72-a484-1593eb1fb44b'),
|
||||
('9311ff84-1052-4989-8192-0fea20204fbe', 'Documentation', NULL, 0, 3, medium_priority_id, '39db59be-1dba-448b-87f4-3b955ea699d2', NULL, '66e80bc8-6b29-4e72-a484-1593eb1fb44b'),
|
||||
('7d0697cd-868c-4b41-9f4f-f9a8c1131b24', 'Reporting', NULL, 0, 1, medium_priority_id, '39db59be-1dba-448b-87f4-3b955ea699d2', NULL, '66e80bc8-6b29-4e72-a484-1593eb1fb44b'),
|
||||
('f994718d-3f1c-4880-99da-0b38ce90e0b4', 'Insulation and HVAC', NULL, 0, 4, medium_priority_id, 'd90f9194-200a-4afa-a896-ee5afda2cc8a', NULL, 'a83565f9-2c22-486a-8c10-59182bfe19c6'),
|
||||
('5c5fac9e-5016-4e36-b812-1a9c164adca6', 'Site Preparation', NULL, 0, 8, medium_priority_id, 'd90f9194-200a-4afa-a896-ee5afda2cc8a', NULL, 'a83565f9-2c22-486a-8c10-59182bfe19c6'),
|
||||
('9127f591-e532-4f88-b61e-2a02fd6a654a', 'Electrical and Plumbing', NULL, 0, 5, medium_priority_id, 'd90f9194-200a-4afa-a896-ee5afda2cc8a', NULL, 'a83565f9-2c22-486a-8c10-59182bfe19c6'),
|
||||
('41a6a358-e603-4bf9-9db5-6595f8f00e00', 'Project Planning', NULL, 0, 0, medium_priority_id, 'd90f9194-200a-4afa-a896-ee5afda2cc8a', NULL, 'd8a7ac27-cdfb-48fe-b8cd-c87128269a93'),
|
||||
('c37db3ea-0be7-453b-8588-3672fff523fe', 'Exterior Work', NULL, 0, 6, medium_priority_id, 'd90f9194-200a-4afa-a896-ee5afda2cc8a', NULL, '78803d54-ee61-4389-a5c2-c676f1007d75'),
|
||||
('6ecc497e-ce9a-4a5d-a2a6-a951f26223cf', 'Structural Framing', NULL, 0, 1, medium_priority_id, 'd90f9194-200a-4afa-a896-ee5afda2cc8a', NULL, 'd8a7ac27-cdfb-48fe-b8cd-c87128269a93'),
|
||||
('d53a405b-0bcf-4372-a7ea-d4bca9c13740', 'Foundation Work', NULL, 0, 9, medium_priority_id, 'd90f9194-200a-4afa-a896-ee5afda2cc8a', NULL, '78803d54-ee61-4389-a5c2-c676f1007d75'),
|
||||
('b73154b9-d335-4a3e-8593-84da85801720', 'Finishing and Finishing Work', NULL, 0, 7, medium_priority_id, 'd90f9194-200a-4afa-a896-ee5afda2cc8a', NULL, '78803d54-ee61-4389-a5c2-c676f1007d75'),
|
||||
('5caac736-3ccf-4b0d-ada4-e1cf4f6ef631', 'Quality Assurance and Inspections', NULL, 0, 2, medium_priority_id, 'd90f9194-200a-4afa-a896-ee5afda2cc8a', NULL, 'd8a7ac27-cdfb-48fe-b8cd-c87128269a93'),
|
||||
('44346d7f-fbbd-468a-8c37-e439c268c3e1', 'Utilities and Systems Integration', NULL, 0, 3, medium_priority_id, 'd90f9194-200a-4afa-a896-ee5afda2cc8a', NULL, 'd8a7ac27-cdfb-48fe-b8cd-c87128269a93'),
|
||||
('870daf76-fedb-4198-b13a-9ac453a73dee', 'Brainstorm creative ideas and concepts, and sketch initial designs.', NULL, 0, 0, medium_priority_id, 'c73b8eaf-9a07-4d89-a7e7-84cd2fd4e9f0', NULL, '70cbcea9-2b3c-453a-af0d-fb8a7f6270fd'),
|
||||
('0ebb388d-c7e5-49ce-bf25-e2ce7b9511a1', 'Create storyboards or wireframes to outline the structure and flow of the design.', NULL, 0, 1, medium_priority_id, 'c73b8eaf-9a07-4d89-a7e7-84cd2fd4e9f0', NULL, '70cbcea9-2b3c-453a-af0d-fb8a7f6270fd'),
|
||||
('5d09ae52-7e88-41d6-af82-4efdc55b4af0', 'Create user-friendly interfaces for digital products, ensuring a seamless user experience.', NULL, 0, 2, medium_priority_id, 'c73b8eaf-9a07-4d89-a7e7-84cd2fd4e9f0', NULL, '70cbcea9-2b3c-453a-af0d-fb8a7f6270fd'),
|
||||
('675a8efc-17f2-4c9b-bd06-227020ffa688', 'Develop high-quality visual design assets based on approved concepts.', NULL, 0, 3, medium_priority_id, 'c73b8eaf-9a07-4d89-a7e7-84cd2fd4e9f0', NULL, '70cbcea9-2b3c-453a-af0d-fb8a7f6270fd'),
|
||||
('5403584c-57c4-40f6-8ac5-7c0b89d10370', 'Prepare design files for final production, including optimizing for different platforms.', NULL, 0, 4, medium_priority_id, 'c73b8eaf-9a07-4d89-a7e7-84cd2fd4e9f0', NULL, '70cbcea9-2b3c-453a-af0d-fb8a7f6270fd'),
|
||||
('14de7fa7-e8ac-4d1d-8249-250c733f57c0', 'Collaborate with production teams to produce and deliver the final design assets.', NULL, 0, 5, medium_priority_id, 'c73b8eaf-9a07-4d89-a7e7-84cd2fd4e9f0', NULL, '70cbcea9-2b3c-453a-af0d-fb8a7f6270fd'),
|
||||
('188fcdab-ea71-4be3-96f1-cbe224b53310', 'Research and analyze the target market, including demographics and trends.', NULL, 0, 6, medium_priority_id, 'c73b8eaf-9a07-4d89-a7e7-84cd2fd4e9f0', NULL, '70cbcea9-2b3c-453a-af0d-fb8a7f6270fd'),
|
||||
('a67b4800-b35d-4448-90ba-e6aa1053ea3f', 'Study competitors'' design strategies and identify opportunities for differentiation.', NULL, 0, 7, medium_priority_id, 'c73b8eaf-9a07-4d89-a7e7-84cd2fd4e9f0', NULL, '70cbcea9-2b3c-453a-af0d-fb8a7f6270fd'),
|
||||
('1b5be3a3-ae6d-43f7-8a5a-fa48c96fd54a', 'Class Scheduling', NULL, 0, 8, medium_priority_id, 'c86ed436-f9af-4332-8a2d-2afe9a6d66d4', NULL, 'e6dffb96-6879-4064-ab8f-73ca784b1964'),
|
||||
('fbe32f14-a8e9-401b-8a39-ad53ebd520fa', 'Curriculum Development', NULL, 0, 5, medium_priority_id, 'c86ed436-f9af-4332-8a2d-2afe9a6d66d4', NULL, 'ca81d57d-b7d2-45fc-adcd-1c926fd93e6c'),
|
||||
('1a9bedd1-dbfb-4d25-9b16-ec1eeb773bac', 'Assignments and Homework', NULL, 0, 7, medium_priority_id, 'c86ed436-f9af-4332-8a2d-2afe9a6d66d4', NULL, 'ca81d57d-b7d2-45fc-adcd-1c926fd93e6c'),
|
||||
('3e7db894-b421-46dc-954e-5c38d6270483', 'Grading and Assessment', NULL, 0, 6, medium_priority_id, 'c86ed436-f9af-4332-8a2d-2afe9a6d66d4', NULL, 'e6dffb96-6879-4064-ab8f-73ca784b1964'),
|
||||
('744e8dff-76b0-4450-8ad3-1d38d137c4df', 'Student Progress Tracking', NULL, 0, 4, medium_priority_id, 'c86ed436-f9af-4332-8a2d-2afe9a6d66d4', NULL, 'ca81d57d-b7d2-45fc-adcd-1c926fd93e6c'),
|
||||
('f9b8c333-b8d2-45b8-aff1-d2686aecc23d', 'Resource Management', NULL, 0, 0, medium_priority_id, 'c86ed436-f9af-4332-8a2d-2afe9a6d66d4', NULL, 'efdb40e7-78ae-4a5a-83ec-d372a5816ae5'),
|
||||
('97619dc4-8879-45cc-b17b-bc34db6a658f', 'Research Projects', NULL, 0, 1, medium_priority_id, 'c86ed436-f9af-4332-8a2d-2afe9a6d66d4', NULL, 'efdb40e7-78ae-4a5a-83ec-d372a5816ae5'),
|
||||
('2e277e0f-b389-41de-8caf-c577245be524', 'Event Planning', NULL, 0, 2, medium_priority_id, 'c86ed436-f9af-4332-8a2d-2afe9a6d66d4', NULL, 'efdb40e7-78ae-4a5a-83ec-d372a5816ae5'),
|
||||
('c3bb796c-cfe2-47a8-935e-a9176652279d', 'Budget Management', NULL, 0, 3, medium_priority_id, 'c86ed436-f9af-4332-8a2d-2afe9a6d66d4', NULL, 'efdb40e7-78ae-4a5a-83ec-d372a5816ae5'),
|
||||
('c981c84d-bbe7-48a1-891b-8485b44ba6dc', 'Online Learning Management', NULL, 0, 9, medium_priority_id, 'c86ed436-f9af-4332-8a2d-2afe9a6d66d4', NULL, 'e6dffb96-6879-4064-ab8f-73ca784b1964'),
|
||||
('adbe95e7-a5df-4741-bf1d-79be33654d43', 'Budget Planning', NULL, 0, 0, medium_priority_id, 'a014fae0-1b70-4c05-96b4-1fa8c54591b0', NULL, '0010ae09-0dd6-4c08-b351-30124e0dc436'),
|
||||
('140792fb-d588-4928-8d8a-40641d8982f0', 'Financial Reporting', NULL, 0, 3, medium_priority_id, 'a014fae0-1b70-4c05-96b4-1fa8c54591b0', NULL, '0010ae09-0dd6-4c08-b351-30124e0dc436'),
|
||||
('ae43bf0c-32b9-42e7-8c2d-e13921734669', 'Vendor and Supplier Management', NULL, 0, 4, medium_priority_id, 'a014fae0-1b70-4c05-96b4-1fa8c54591b0', NULL, '0010ae09-0dd6-4c08-b351-30124e0dc436'),
|
||||
('c76b2ba9-a2f3-4acc-8b23-cbf89f9e858e', 'Invoice Management', NULL, 0, 5, medium_priority_id, 'a014fae0-1b70-4c05-96b4-1fa8c54591b0', NULL, '0010ae09-0dd6-4c08-b351-30124e0dc436'),
|
||||
('0079334e-6bbd-45df-8591-444d53df8195', 'Expense Approval Workflow', NULL, 0, 6, medium_priority_id, 'a014fae0-1b70-4c05-96b4-1fa8c54591b0', NULL, '0010ae09-0dd6-4c08-b351-30124e0dc436'),
|
||||
('a656409f-48a2-473c-b53f-9431701e9641', 'Tax Planning and Compliance', NULL, 0, 7, medium_priority_id, 'a014fae0-1b70-4c05-96b4-1fa8c54591b0', NULL, '0010ae09-0dd6-4c08-b351-30124e0dc436'),
|
||||
('5312ae9f-378d-4aff-ac79-55b401750f82', 'Budget Monitoring', NULL, 0, 1, medium_priority_id, 'a014fae0-1b70-4c05-96b4-1fa8c54591b0', NULL, '0010ae09-0dd6-4c08-b351-30124e0dc436'),
|
||||
('d884b9e0-189a-4a2f-9467-92c132295e40', 'Expense Tracking', NULL, 0, 2, medium_priority_id, 'a014fae0-1b70-4c05-96b4-1fa8c54591b0', NULL, '0010ae09-0dd6-4c08-b351-30124e0dc436'),
|
||||
('6e33e82f-ac08-4162-9b84-0f98f8153ec4', 'Identify and reach out to potential candidates through various channels', NULL, 0, 2, medium_priority_id, 'f25549d0-d5de-46aa-bbd5-eaab7a970799', NULL, '35430ef9-040f-465f-b5e3-1f33b26124dd'),
|
||||
('8f02befa-3671-4a18-bd01-817e2fb8f9c7', 'Define the job position, responsibilities, and requirements.', NULL, 0, 4, medium_priority_id, 'f25549d0-d5de-46aa-bbd5-eaab7a970799', NULL, '35430ef9-040f-465f-b5e3-1f33b26124dd'),
|
||||
('f96e15cf-4a99-4f62-a19d-649d890dc364', 'Schedule and conduct interviews with shortlisted candidates.', NULL, 0, 0, medium_priority_id, 'f25549d0-d5de-46aa-bbd5-eaab7a970799', NULL, 'bac101f9-cec3-43aa-8bd8-354de42fdff2'),
|
||||
('e1a78723-a98d-4fa9-ba11-3d5b1429796c', 'Contact provided references to validate candidates'' background and skills.', NULL, 0, 1, medium_priority_id, 'f25549d0-d5de-46aa-bbd5-eaab7a970799', NULL, 'bac101f9-cec3-43aa-8bd8-354de42fdff2'),
|
||||
('e7ca181d-d348-4745-a7d9-8e8f1abcda77', 'Collect feedback from interviewers and team members', NULL, 0, 5, medium_priority_id, 'f25549d0-d5de-46aa-bbd5-eaab7a970799', NULL, '400b58bd-ad09-4cd1-b5bd-a9f7cb46cb47'),
|
||||
('55a7db50-f37d-46b5-be2b-b9938b892ad7', 'Document feedback for future reference and improvement.', NULL, 0, 3, medium_priority_id, 'f25549d0-d5de-46aa-bbd5-eaab7a970799', NULL, '400b58bd-ad09-4cd1-b5bd-a9f7cb46cb47'),
|
||||
('52199ccf-bbea-465d-9e0a-192abd5b4ddf', 'Designing, coding, testing, and maintaining software applications and systems.', NULL, 0, 0, medium_priority_id, '22805d87-ba25-4b2a-8384-7a4eeedc3b63', NULL, '8e9cc873-d9a5-404f-9f38-8ca4fba91a0d'),
|
||||
('87005eaf-d51c-4876-92ea-5071973de1f6', 'Managing servers and computer systems, including installation, configuration, updates, and maintenance.', NULL, 0, 3, medium_priority_id, '22805d87-ba25-4b2a-8384-7a4eeedc3b63', NULL, '856cd7b1-76b1-4182-b2c8-60c278839913'),
|
||||
('64f5c488-7600-4d94-a85b-6fff17ffc746', 'Conducting security audits, vulnerability assessments, and risk management.', NULL, 0, 2, medium_priority_id, '22805d87-ba25-4b2a-8384-7a4eeedc3b63', NULL, 'cbf86a20-8b6d-43d0-99d7-523fb600cdac'),
|
||||
('ad7c0cf8-af9c-46e0-b717-492b29ce4411', 'Managing data integrity, security, and backups.', NULL, 0, 1, medium_priority_id, '22805d87-ba25-4b2a-8384-7a4eeedc3b63', NULL, '8e9cc873-d9a5-404f-9f38-8ca4fba91a0d'),
|
||||
('71f423c7-0de0-445b-b84f-a507c2a56398', 'Performance Optimization', NULL, 0, 4, medium_priority_id, '22805d87-ba25-4b2a-8384-7a4eeedc3b63', NULL, '8e9cc873-d9a5-404f-9f38-8ca4fba91a0d'),
|
||||
('e6a32779-9a8c-4e6c-bf25-0cc33de94f19', 'Privacy and Data Protection', NULL, 0, 6, medium_priority_id, '0aa3f6fc-678f-4d17-8df2-9674ca81fad2', NULL, '54452070-d355-4fb2-b416-e57390d1b668'),
|
||||
('43bec431-1290-420e-8dc6-906204a6d25f', 'Regulatory Filings', NULL, 0, 7, medium_priority_id, '0aa3f6fc-678f-4d17-8df2-9674ca81fad2', NULL, '8aac89fc-cf0c-4a4e-889b-97ccd8e7af94'),
|
||||
('59c54e42-163b-45ab-a3dc-ce0816f5ed9f', 'Litigation and Dispute Resolution', NULL, 0, 5, medium_priority_id, '0aa3f6fc-678f-4d17-8df2-9674ca81fad2', NULL, '8aac89fc-cf0c-4a4e-889b-97ccd8e7af94'),
|
||||
('d82d92a3-54a5-41ac-b77b-c72535bffeb6', 'Contract Management', NULL, 0, 0, medium_priority_id, '0aa3f6fc-678f-4d17-8df2-9674ca81fad2', NULL, '6f0f7261-7f1a-40f3-a771-04fbc5cd0059'),
|
||||
('20697a2d-6586-4ffb-901c-529f154c8b43', 'Contract Renewals and Expirations', NULL, 0, 1, medium_priority_id, '0aa3f6fc-678f-4d17-8df2-9674ca81fad2', NULL, '6f0f7261-7f1a-40f3-a771-04fbc5cd0059'),
|
||||
('1f8826ea-60a9-4d93-a7f8-96fbe72aef6c', 'Compliance Checks', NULL, 0, 4, medium_priority_id, '0aa3f6fc-678f-4d17-8df2-9674ca81fad2', NULL, '54452070-d355-4fb2-b416-e57390d1b668'),
|
||||
('ae28eba7-c9d8-480c-ab42-20e348f0355d', 'Legal Research', NULL, 0, 2, medium_priority_id, '0aa3f6fc-678f-4d17-8df2-9674ca81fad2', NULL, '6f0f7261-7f1a-40f3-a771-04fbc5cd0059'),
|
||||
('049681c1-5a04-4cf3-aaff-fdea575daeb6', 'Intellectual Property Management', NULL, 0, 3, medium_priority_id, '0aa3f6fc-678f-4d17-8df2-9674ca81fad2', NULL, '54452070-d355-4fb2-b416-e57390d1b668'),
|
||||
('bc5d795c-4d2b-4fe2-938a-5f7758e8c90f', 'Develop detailed product design specifications, including materials, dimensions, and functionality.', NULL, 0, 0, medium_priority_id, 'd1baf96f-07f4-4468-bb4f-44cdedfad965', NULL, '0c3c5259-70d2-407b-8a45-c9b81ac84a3a'),
|
||||
('2771231b-9b2d-46c0-ac2d-d34d71f16c09', 'Collaborate with the design and engineering teams to brainstorm innovative ideas for product features and improvements.', NULL, 0, 1, medium_priority_id, 'd1baf96f-07f4-4468-bb4f-44cdedfad965', NULL, '0c3c5259-70d2-407b-8a45-c9b81ac84a3a'),
|
||||
('bab7972e-5668-4fdd-9de2-11b6a6788703', 'Conduct market research to assess the viability of proposed product enhancements and innovations.', NULL, 0, 6, medium_priority_id, 'd1baf96f-07f4-4468-bb4f-44cdedfad965', NULL, '0c3c5259-70d2-407b-8a45-c9b81ac84a3a'),
|
||||
('75720af5-67cc-493d-88cf-4e373bc579e0', 'Develop detailed manufacturing processes, including workflow, quality control measures, and production schedules.', NULL, 0, 3, medium_priority_id, 'd1baf96f-07f4-4468-bb4f-44cdedfad965', NULL, '0c3c5259-70d2-407b-8a45-c9b81ac84a3a'),
|
||||
('3a57acd0-4c0a-4cc8-bf99-0c9f959eaed6', 'Plan and optimize the supply chain, including sourcing raw materials, logistics, and inventory management.', NULL, 0, 2, medium_priority_id, 'd1baf96f-07f4-4468-bb4f-44cdedfad965', NULL, '0c3c5259-70d2-407b-8a45-c9b81ac84a3a'),
|
||||
('fc721d7c-6a69-4241-8294-45122584b238', 'Create prototypes of the product to validate the design and manufacturing processes', NULL, 0, 4, medium_priority_id, 'd1baf96f-07f4-4468-bb4f-44cdedfad965', NULL, '0c3c5259-70d2-407b-8a45-c9b81ac84a3a'),
|
||||
('0264e8c3-d63f-40ba-906c-e3c090ce02ab', 'Create designs for the molds, tooling, and equipment needed in the manufacturing process.', NULL, 0, 7, medium_priority_id, 'd1baf96f-07f4-4468-bb4f-44cdedfad965', NULL, '0c3c5259-70d2-407b-8a45-c9b81ac84a3a'),
|
||||
('b17877ae-0ab0-4ffc-a4fb-49a8c80c0374', 'Perform rigorous testing and validation on prototypes to ensure they meet quality and performance standards.', NULL, 0, 5, medium_priority_id, 'd1baf96f-07f4-4468-bb4f-44cdedfad965', NULL, '0c3c5259-70d2-407b-8a45-c9b81ac84a3a'),
|
||||
('c2d154ca-4e56-4d88-9982-8e5587463b29', 'Delivering value to your customers and leads', NULL, 0, 6, medium_priority_id, 'c6917d57-f84a-40fc-aff0-70fd0aab951f', NULL, '1073754d-c498-4e6d-bcee-68bba526e572'),
|
||||
('5ccadffe-a860-49b2-be7c-73af5a6f81e9', 'Introducing new products or services', NULL, 0, 3, medium_priority_id, 'c6917d57-f84a-40fc-aff0-70fd0aab951f', NULL, '44d54c08-bce6-44e6-9cfc-23d1b4a9e011'),
|
||||
('6e563048-0891-418e-a5f5-28f228f0339b', 'Collecting feedback from customers', NULL, 0, 1, medium_priority_id, 'c6917d57-f84a-40fc-aff0-70fd0aab951f', NULL, '1ae23b11-5edf-485d-9217-f905dc33ddda'),
|
||||
('e83926a9-b618-4398-a4ec-9022314df3bd', 'Building marketing strategies and campaigns', NULL, 0, 2, medium_priority_id, 'c6917d57-f84a-40fc-aff0-70fd0aab951f', NULL, '1ae23b11-5edf-485d-9217-f905dc33ddda'),
|
||||
('08496b12-c259-49ad-9ceb-6669171c38c3', 'Tracking and monitoring marketing campaigns', NULL, 0, 4, medium_priority_id, 'c6917d57-f84a-40fc-aff0-70fd0aab951f', NULL, '1ae23b11-5edf-485d-9217-f905dc33ddda'),
|
||||
('eae2707f-4804-4691-80ba-4f86f71e7b32', 'Creating a strong and dependable brand', NULL, 0, 5, medium_priority_id, 'c6917d57-f84a-40fc-aff0-70fd0aab951f', NULL, '44d54c08-bce6-44e6-9cfc-23d1b4a9e011'),
|
||||
('709e726f-02d8-4549-b77a-c38d14054cf3', 'Boosting company sales', NULL, 0, 7, medium_priority_id, 'c6917d57-f84a-40fc-aff0-70fd0aab951f', NULL, '1073754d-c498-4e6d-bcee-68bba526e572'),
|
||||
('4f2eacd8-daaf-45f6-9986-de5a9c8e459d', 'Resource Management', NULL, 0, 5, medium_priority_id, '5d1ffd21-a7b7-4a5a-9d19-f7fd3ee253e7', NULL, 'd2bff598-5135-4cac-92aa-641b69ae1dab'),
|
||||
('483d6ba0-ce02-4f0f-8f27-d417289939a5', 'Budgeting and Fundraising', NULL, 0, 2, medium_priority_id, '5d1ffd21-a7b7-4a5a-9d19-f7fd3ee253e7', NULL, 'd2bff598-5135-4cac-92aa-641b69ae1dab'),
|
||||
('e70c332b-d0f6-403b-b3c0-cc7467487cae', 'Project Planning', NULL, 0, 3, medium_priority_id, '5d1ffd21-a7b7-4a5a-9d19-f7fd3ee253e7', NULL, 'da60606a-ced5-46bf-bf2f-4ee9d5627a9a'),
|
||||
('6686a09b-f767-466a-a355-fe8d9a16c28b', 'Task Management', NULL, 0, 4, medium_priority_id, '5d1ffd21-a7b7-4a5a-9d19-f7fd3ee253e7', NULL, '9ec60343-27fe-4af5-a35b-d356ebd61837'),
|
||||
('f819d4fc-d3d9-48a8-b06e-92e982686d25', 'Project Initiation', NULL, 0, 0, medium_priority_id, '5d1ffd21-a7b7-4a5a-9d19-f7fd3ee253e7', NULL, 'da60606a-ced5-46bf-bf2f-4ee9d5627a9a'),
|
||||
('a224c0dc-d86d-4fdb-9f69-bd59d26f9760', 'Communication and Collaboration', NULL, 0, 1, medium_priority_id, '5d1ffd21-a7b7-4a5a-9d19-f7fd3ee253e7', NULL, '9ec60343-27fe-4af5-a35b-d356ebd61837'),
|
||||
('b8766b9d-5ea3-4704-ad6e-88d5f94eb816', 'Home Renovation Project', NULL, 0, 0, medium_priority_id, 'e71b3b9b-31a8-47ae-84d8-6dc2ae62e06a', NULL, '2e14a9e9-4c1a-4596-a0f2-574d2e7b2fa4'),
|
||||
('f4a7de5a-7ffd-4ae3-8266-7fe12a75256f', 'Education and Self-Improvement', NULL, 0, 7, medium_priority_id, 'e71b3b9b-31a8-47ae-84d8-6dc2ae62e06a', NULL, '2e14a9e9-4c1a-4596-a0f2-574d2e7b2fa4'),
|
||||
('651c7ffe-58d4-4807-aef5-720e58d254d8', 'Event Planning', NULL, 0, 1, medium_priority_id, 'e71b3b9b-31a8-47ae-84d8-6dc2ae62e06a', NULL, '2e14a9e9-4c1a-4596-a0f2-574d2e7b2fa4'),
|
||||
('d3c78cb9-72b8-4277-ae12-094ce4be1bbc', 'Fitness and Health Goals', NULL, 0, 2, medium_priority_id, 'e71b3b9b-31a8-47ae-84d8-6dc2ae62e06a', NULL, '1a403c75-5d8c-4752-bf96-e486b8042df6'),
|
||||
('619f02b0-7639-42aa-ae39-2808289c713f', 'Vacation Planning', NULL, 0, 3, medium_priority_id, 'e71b3b9b-31a8-47ae-84d8-6dc2ae62e06a', NULL, '1a403c75-5d8c-4752-bf96-e486b8042df6'),
|
||||
('edc39164-215e-4a4c-9e91-a4ef1cc17709', 'Home Organization', NULL, 0, 4, medium_priority_id, 'e71b3b9b-31a8-47ae-84d8-6dc2ae62e06a', NULL, '70fd7f98-b278-440a-8a33-d3453bfd4b70'),
|
||||
('d7a2898a-887c-4832-af44-4c2bfa8c482f', 'Personal Blog', NULL, 0, 5, medium_priority_id, 'e71b3b9b-31a8-47ae-84d8-6dc2ae62e06a', NULL, '70fd7f98-b278-440a-8a33-d3453bfd4b70'),
|
||||
('1510b125-197d-4389-afa9-70d2ee2c610e', 'Financial Goals', NULL, 0, 6, medium_priority_id, 'e71b3b9b-31a8-47ae-84d8-6dc2ae62e06a', NULL, '70fd7f98-b278-440a-8a33-d3453bfd4b70'),
|
||||
('a2c8a7ca-8f5f-4fe0-ac47-a186dc8cea25', 'Integration with Existing Systems', NULL, 0, 5, medium_priority_id, 'bdf32f36-e85b-434f-aeda-dde2e8ade8c7', NULL, 'b450e432-63f4-46a9-bd4a-26b0bdd37507'),
|
||||
('fff9365e-e86f-46d4-8ac3-e90ac6c8f391', 'Initial Contact and Relationship Building', NULL, 0, 4, medium_priority_id, 'bdf32f36-e85b-434f-aeda-dde2e8ade8c7', NULL, '291095da-b3d9-40aa-bcd2-5cd6fb51b89f'),
|
||||
('8d3df58a-3b57-4269-9f23-a02d8630b001', 'Lead Qualification and Research', NULL, 0, 0, medium_priority_id, 'bdf32f36-e85b-434f-aeda-dde2e8ade8c7', NULL, 'c20816ac-fe57-4471-91b0-61fa060663ca'),
|
||||
('c1a6dc5c-e952-43e0-bd02-5505e4db72f0', 'Initial Outreach and Engagement', NULL, 0, 1, medium_priority_id, 'bdf32f36-e85b-434f-aeda-dde2e8ade8c7', NULL, 'c20816ac-fe57-4471-91b0-61fa060663ca'),
|
||||
('7b1ec3b2-5e72-4b4d-87f6-1b158e4b98a4', 'Lost Opportunity Analysis', NULL, 0, 2, medium_priority_id, 'bdf32f36-e85b-434f-aeda-dde2e8ade8c7', NULL, 'c20816ac-fe57-4471-91b0-61fa060663ca'),
|
||||
('2fd89257-98c7-4bae-9186-961259edd4fd', 'Competitor Analysis and Benchmarking', NULL, 0, 3, medium_priority_id, 'bdf32f36-e85b-434f-aeda-dde2e8ade8c7', NULL, '291095da-b3d9-40aa-bcd2-5cd6fb51b89f'),
|
||||
('d43541ae-bc9c-49ad-aa5f-097563ca3e2d', 'Post-Sale Follow-Up and Relationship Building', NULL, 0, 6, medium_priority_id, 'bdf32f36-e85b-434f-aeda-dde2e8ade8c7', NULL, 'b450e432-63f4-46a9-bd4a-26b0bdd37507'),
|
||||
('24ae6a1a-019d-4040-bacc-115be99f7982', 'Testing and Quality Assurance', NULL, 0, 7, medium_priority_id, 'bdf32f36-e85b-434f-aeda-dde2e8ade8c7', NULL, 'b450e432-63f4-46a9-bd4a-26b0bdd37507'),
|
||||
('1c78e9bd-e869-4486-a891-5dae020f35da', 'Client Onboarding', NULL, 0, 0, medium_priority_id, 'c94c7306-73ab-4e17-bad4-0e7ff4a9da09', NULL, '4da7cb15-9767-4522-9950-6a4b26e660a6'),
|
||||
('642b2621-16bb-4615-9b4c-4ea6cd32f7e9', 'Project Documentation', NULL, 0, 1, medium_priority_id, 'c94c7306-73ab-4e17-bad4-0e7ff4a9da09', NULL, '4da7cb15-9767-4522-9950-6a4b26e660a6'),
|
||||
('df901da9-9a6e-4d54-9fbd-e14065dadc40', 'Task Management', NULL, 0, 6, medium_priority_id, 'c94c7306-73ab-4e17-bad4-0e7ff4a9da09', NULL, '171e791d-6601-45e7-8c5e-80591a610ed8'),
|
||||
('643deb27-9521-4672-9ebc-9349e39607a4', 'Resource Allocation', NULL, 0, 8, medium_priority_id, 'c94c7306-73ab-4e17-bad4-0e7ff4a9da09', NULL, '4da7cb15-9767-4522-9950-6a4b26e660a6'),
|
||||
('77278afe-54fa-4174-b56f-bf2217aaa8d6', 'Risk Assessment and Management', NULL, 0, 9, medium_priority_id, 'c94c7306-73ab-4e17-bad4-0e7ff4a9da09', NULL, 'b4a409f7-4009-4633-b147-f4f99c73f30b'),
|
||||
('baa06fdf-495a-42ee-ba1c-026953301487', 'Time and Expense Tracking', NULL, 0, 2, medium_priority_id, 'c94c7306-73ab-4e17-bad4-0e7ff4a9da09', NULL, '4da7cb15-9767-4522-9950-6a4b26e660a6'),
|
||||
('f80ecf2c-4e52-4957-bb3a-3bd5f98b1017', 'Continuous Improvement', NULL, 0, 3, medium_priority_id, 'c94c7306-73ab-4e17-bad4-0e7ff4a9da09', NULL, '4da7cb15-9767-4522-9950-6a4b26e660a6'),
|
||||
('f3565c7f-39cd-46b4-bc44-2682d7b48cbc', 'Client Satisfaction and Feedback', NULL, 0, 5, medium_priority_id, 'c94c7306-73ab-4e17-bad4-0e7ff4a9da09', NULL, 'b4a409f7-4009-4633-b147-f4f99c73f30b'),
|
||||
('2080b4ac-4e00-4e24-9f93-05b54d72f2e9', 'Client Communication', NULL, 0, 4, medium_priority_id, 'c94c7306-73ab-4e17-bad4-0e7ff4a9da09', NULL, 'b4a409f7-4009-4633-b147-f4f99c73f30b'),
|
||||
('276bf24a-da04-4276-bbb8-206e9b276968', 'Project Planning', NULL, 0, 7, medium_priority_id, 'c94c7306-73ab-4e17-bad4-0e7ff4a9da09', NULL, '171e791d-6601-45e7-8c5e-80591a610ed8'),
|
||||
('5fd32a4a-4ab0-44ad-873d-459b9062ae6e', 'User Acceptance Testing', NULL, 0, 12, medium_priority_id, '0a769952-e9b8-4e48-b562-f4ebb0f5914e', NULL, '757e7655-22c1-4a40-8f3d-2754fbd564dc'),
|
||||
('8f54a3a2-38cc-48d6-85e1-d8fe47eea2f0', 'Requirement Gathering', NULL, 0, 11, medium_priority_id, '0a769952-e9b8-4e48-b562-f4ebb0f5914e', NULL, '757e7655-22c1-4a40-8f3d-2754fbd564dc'),
|
||||
('091b0fea-c089-499d-a9e4-8a0eba3bbe47', 'Coding', NULL, 0, 4, medium_priority_id, '0a769952-e9b8-4e48-b562-f4ebb0f5914e', NULL, '757e7655-22c1-4a40-8f3d-2754fbd564dc'),
|
||||
('a4b2ead5-9d73-4064-b261-35cfcd0e6f89', 'Unit Testing', NULL, 0, 6, medium_priority_id, '0a769952-e9b8-4e48-b562-f4ebb0f5914e', NULL, '7fae7fde-26a3-44aa-b694-b6d9228e9d6a'),
|
||||
('81cab85b-0272-40b2-9163-92973bc0fdfd', 'Continuous Integration/Continuous Deployment (CI/CD)', NULL, 0, 7, medium_priority_id, '0a769952-e9b8-4e48-b562-f4ebb0f5914e', NULL, 'e22f483a-4c87-417c-8c3d-2673c44b1079'),
|
||||
('c7b7ac95-5c5a-4dcd-8a59-c8060011f753', 'Code Review', NULL, 0, 10, medium_priority_id, '0a769952-e9b8-4e48-b562-f4ebb0f5914e', NULL, 'e22f483a-4c87-417c-8c3d-2673c44b1079'),
|
||||
('914b10d9-622a-4269-b6bc-07c1377fb512', 'Collaboration and Communication', NULL, 0, 9, medium_priority_id, '0a769952-e9b8-4e48-b562-f4ebb0f5914e', NULL, '7fae7fde-26a3-44aa-b694-b6d9228e9d6a');
|
||||
|
||||
INSERT INTO public.pt_task_phases (task_id, phase_id)
|
||||
VALUES ('a75993d9-3fb3-4d0b-a5d4-cab53b60462c', '4b4a8fe0-4f35-464a-a337-848e5b432ab5'),
|
||||
('3fdb6801-bc09-4d71-8273-987cd3d1e0f6', '557b58ca-3335-4b41-9880-fdd0f990deb9'),
|
||||
('ca64f247-a186-4edb-affd-738f1c2a4d60', '62097027-979f-4b00-afb8-f70fba533f80'),
|
||||
('1e493de8-38cf-4e6e-8f0b-5e1f6f3b07f4', 'e3128891-4873-4795-ad8a-880474280045'),
|
||||
('67b2ab3c-53e5-428c-bbad-8bdc19dc88de', '77204bf3-fcb3-4e39-a843-14458b2f659d'),
|
||||
('9311ff84-1052-4989-8192-0fea20204fbe', '62097027-979f-4b00-afb8-f70fba533f80'),
|
||||
('7d0697cd-868c-4b41-9f4f-f9a8c1131b24', '62097027-979f-4b00-afb8-f70fba533f80'),
|
||||
('f994718d-3f1c-4880-99da-0b38ce90e0b4', '76356365-e420-46b7-b7ff-1747589cb7c9'),
|
||||
('5c5fac9e-5016-4e36-b812-1a9c164adca6', 'a0cb92e9-1e44-4fd6-9522-a1ec5d50fd5c'),
|
||||
('9127f591-e532-4f88-b61e-2a02fd6a654a', '76356365-e420-46b7-b7ff-1747589cb7c9'),
|
||||
('41a6a358-e603-4bf9-9db5-6595f8f00e00', 'a0cb92e9-1e44-4fd6-9522-a1ec5d50fd5c'),
|
||||
('c37db3ea-0be7-453b-8588-3672fff523fe', '6872d742-8e8e-43fe-8d3b-031ff23ba32f'),
|
||||
('6ecc497e-ce9a-4a5d-a2a6-a951f26223cf', '1bea49a2-ba94-4c3a-acd3-973edfc182c8'),
|
||||
('d53a405b-0bcf-4372-a7ea-d4bca9c13740', 'a0cb92e9-1e44-4fd6-9522-a1ec5d50fd5c'),
|
||||
('b73154b9-d335-4a3e-8593-84da85801720', '6872d742-8e8e-43fe-8d3b-031ff23ba32f'),
|
||||
('5caac736-3ccf-4b0d-ada4-e1cf4f6ef631', '702c5891-85bf-4b11-ab70-4f84557b65be'),
|
||||
('44346d7f-fbbd-468a-8c37-e439c268c3e1', '702c5891-85bf-4b11-ab70-4f84557b65be'),
|
||||
('870daf76-fedb-4198-b13a-9ac453a73dee', 'a6db279b-61e9-4e3b-9521-dfae7bb1c0bb'),
|
||||
('0ebb388d-c7e5-49ce-bf25-e2ce7b9511a1', 'a6db279b-61e9-4e3b-9521-dfae7bb1c0bb'),
|
||||
('5d09ae52-7e88-41d6-af82-4efdc55b4af0', 'a6db279b-61e9-4e3b-9521-dfae7bb1c0bb'),
|
||||
('675a8efc-17f2-4c9b-bd06-227020ffa688', '8c3d49a2-6057-42fe-a458-f4596dc31eb4'),
|
||||
('5403584c-57c4-40f6-8ac5-7c0b89d10370', '42df6764-069f-45e6-8b74-4f1e82e8c1e6'),
|
||||
('14de7fa7-e8ac-4d1d-8249-250c733f57c0', '42df6764-069f-45e6-8b74-4f1e82e8c1e6'),
|
||||
('188fcdab-ea71-4be3-96f1-cbe224b53310', 'b871bc4f-aa95-4bec-b943-0a518d29019a'),
|
||||
('a67b4800-b35d-4448-90ba-e6aa1053ea3f', 'b871bc4f-aa95-4bec-b943-0a518d29019a'),
|
||||
('1b5be3a3-ae6d-43f7-8a5a-fa48c96fd54a', '05148a01-26f4-40ef-966d-f7ec601f08e4'),
|
||||
('fbe32f14-a8e9-401b-8a39-ad53ebd520fa', '97248076-3eda-434e-8e9d-4b15a9faefca'),
|
||||
('1a9bedd1-dbfb-4d25-9b16-ec1eeb773bac', '05148a01-26f4-40ef-966d-f7ec601f08e4'),
|
||||
('3e7db894-b421-46dc-954e-5c38d6270483', '97248076-3eda-434e-8e9d-4b15a9faefca'),
|
||||
('744e8dff-76b0-4450-8ad3-1d38d137c4df', '37eb54c4-d10c-428b-a2e8-1842de245b56'),
|
||||
('f9b8c333-b8d2-45b8-aff1-d2686aecc23d', '37eb54c4-d10c-428b-a2e8-1842de245b56'),
|
||||
('97619dc4-8879-45cc-b17b-bc34db6a658f', '8cfe36b7-3d19-45f4-bf2b-ec5ea16efb23'),
|
||||
('2e277e0f-b389-41de-8caf-c577245be524', '8cfe36b7-3d19-45f4-bf2b-ec5ea16efb23'),
|
||||
('c3bb796c-cfe2-47a8-935e-a9176652279d', 'd642aacb-85ee-4f23-a0af-c1e4ea9f3128'),
|
||||
('c981c84d-bbe7-48a1-891b-8485b44ba6dc', 'd642aacb-85ee-4f23-a0af-c1e4ea9f3128'),
|
||||
('adbe95e7-a5df-4741-bf1d-79be33654d43', '0d5e5593-76f6-4fd7-b979-40b0ae306ff3'),
|
||||
('140792fb-d588-4928-8d8a-40641d8982f0', '290fb77c-b727-43ba-a31d-06cd73ead1cc'),
|
||||
('ae43bf0c-32b9-42e7-8c2d-e13921734669', '641997aa-f850-41d9-bbe6-1901cb439c42'),
|
||||
('c76b2ba9-a2f3-4acc-8b23-cbf89f9e858e', '641997aa-f850-41d9-bbe6-1901cb439c42'),
|
||||
('0079334e-6bbd-45df-8591-444d53df8195', '726d1785-3686-4ff9-bd95-f2f409d915ff'),
|
||||
('a656409f-48a2-473c-b53f-9431701e9641', '726d1785-3686-4ff9-bd95-f2f409d915ff'),
|
||||
('5312ae9f-378d-4aff-ac79-55b401750f82', '290fb77c-b727-43ba-a31d-06cd73ead1cc'),
|
||||
('d884b9e0-189a-4a2f-9467-92c132295e40', '290fb77c-b727-43ba-a31d-06cd73ead1cc'),
|
||||
('6e33e82f-ac08-4162-9b84-0f98f8153ec4', '56af064d-df42-49c5-b5e6-438316ee25d7'),
|
||||
('8f02befa-3671-4a18-bd01-817e2fb8f9c7', 'aa1888cc-5bc3-4f71-b409-4b5edf4a1627'),
|
||||
('f96e15cf-4a99-4f62-a19d-649d890dc364', 'b052092d-d5e2-4ac2-979e-6add568a6781'),
|
||||
('e1a78723-a98d-4fa9-ba11-3d5b1429796c', '4b1619ef-d86d-4c18-b163-b959c732830f'),
|
||||
('e7ca181d-d348-4745-a7d9-8e8f1abcda77', 'b052092d-d5e2-4ac2-979e-6add568a6781'),
|
||||
('55a7db50-f37d-46b5-be2b-b9938b892ad7', '23c1c050-af67-45ef-8a1e-7d7da60a23b9'),
|
||||
('52199ccf-bbea-465d-9e0a-192abd5b4ddf', 'f543d067-beff-4c1f-a2b8-203ffe70d4b6'),
|
||||
('87005eaf-d51c-4876-92ea-5071973de1f6', '01062648-d3db-4f52-a0bf-970f663f8349'),
|
||||
('64f5c488-7600-4d94-a85b-6fff17ffc746', '90670cac-e0c4-4928-a8a3-bda0a55dd8e1'),
|
||||
('ad7c0cf8-af9c-46e0-b717-492b29ce4411', '28c1e81c-5169-4f1f-b1ce-f7da05a446a0'),
|
||||
('71f423c7-0de0-445b-b84f-a507c2a56398', '01062648-d3db-4f52-a0bf-970f663f8349'),
|
||||
('e6a32779-9a8c-4e6c-bf25-0cc33de94f19', 'a2a92231-fb9e-4285-aa8a-abd1f20eaad0'),
|
||||
('43bec431-1290-420e-8dc6-906204a6d25f', 'e8275563-8dba-4172-99b9-7c9ab5187e39'),
|
||||
('59c54e42-163b-45ab-a3dc-ce0816f5ed9f', '0a49c05e-c642-4235-8a36-03c6f29b7be4'),
|
||||
('d82d92a3-54a5-41ac-b77b-c72535bffeb6', 'a2a92231-fb9e-4285-aa8a-abd1f20eaad0'),
|
||||
('20697a2d-6586-4ffb-901c-529f154c8b43', 'c51e1c30-a4db-4419-8f65-9fa94496a773'),
|
||||
('1f8826ea-60a9-4d93-a7f8-96fbe72aef6c', '0a49c05e-c642-4235-8a36-03c6f29b7be4'),
|
||||
('ae28eba7-c9d8-480c-ab42-20e348f0355d', 'c51e1c30-a4db-4419-8f65-9fa94496a773'),
|
||||
('049681c1-5a04-4cf3-aaff-fdea575daeb6', '0a49c05e-c642-4235-8a36-03c6f29b7be4'),
|
||||
('bc5d795c-4d2b-4fe2-938a-5f7758e8c90f', '590f0b13-461e-43ca-bc10-136f1eeb340c'),
|
||||
('2771231b-9b2d-46c0-ac2d-d34d71f16c09', '6ad92c84-c953-4077-b652-39474a8e83c6'),
|
||||
('bab7972e-5668-4fdd-9de2-11b6a6788703', '590f0b13-461e-43ca-bc10-136f1eeb340c'),
|
||||
('75720af5-67cc-493d-88cf-4e373bc579e0', '912e172c-3a21-4b16-a0da-bf86a1e01719'),
|
||||
('3a57acd0-4c0a-4cc8-bf99-0c9f959eaed6', '912e172c-3a21-4b16-a0da-bf86a1e01719'),
|
||||
('fc721d7c-6a69-4241-8294-45122584b238', 'a1124508-f464-46e9-85c6-33590d37c913'),
|
||||
('0264e8c3-d63f-40ba-906c-e3c090ce02ab', '590f0b13-461e-43ca-bc10-136f1eeb340c'),
|
||||
('b17877ae-0ab0-4ffc-a4fb-49a8c80c0374', 'a1124508-f464-46e9-85c6-33590d37c913'),
|
||||
('c2d154ca-4e56-4d88-9982-8e5587463b29', 'e36f2219-46be-44ab-8699-0d4c70d5d6d0'),
|
||||
('5ccadffe-a860-49b2-be7c-73af5a6f81e9', '9766b4ca-5599-48cb-9b12-83210b49e152'),
|
||||
('6e563048-0891-418e-a5f5-28f228f0339b', '3bdc66df-dae8-472b-8820-94326307b6ec'),
|
||||
('e83926a9-b618-4398-a4ec-9022314df3bd', '3bdc66df-dae8-472b-8820-94326307b6ec'),
|
||||
('08496b12-c259-49ad-9ceb-6669171c38c3', '9766b4ca-5599-48cb-9b12-83210b49e152'),
|
||||
('eae2707f-4804-4691-80ba-4f86f71e7b32', '01394483-9074-4ae3-86bc-61fb9e1a0886'),
|
||||
('709e726f-02d8-4549-b77a-c38d14054cf3', 'e36f2219-46be-44ab-8699-0d4c70d5d6d0'),
|
||||
('4f2eacd8-daaf-45f6-9986-de5a9c8e459d', 'e4c0558b-f275-464d-a531-e56f6728fd4d'),
|
||||
('483d6ba0-ce02-4f0f-8f27-d417289939a5', '5110d5e4-f4e8-4f4b-86e4-b93b921cc76b'),
|
||||
('e70c332b-d0f6-403b-b3c0-cc7467487cae', '5110d5e4-f4e8-4f4b-86e4-b93b921cc76b'),
|
||||
('6686a09b-f767-466a-a355-fe8d9a16c28b', '82361471-13cb-4d55-a48e-ae72d4269dec'),
|
||||
('f819d4fc-d3d9-48a8-b06e-92e982686d25', 'eca3fd1f-2c80-4983-92eb-a4969e16c5ec'),
|
||||
('a224c0dc-d86d-4fdb-9f69-bd59d26f9760', '5110d5e4-f4e8-4f4b-86e4-b93b921cc76b'),
|
||||
('b8766b9d-5ea3-4704-ad6e-88d5f94eb816', '217d01b8-dc31-4ba9-a6f2-ce32369f7797'),
|
||||
('f4a7de5a-7ffd-4ae3-8266-7fe12a75256f', '217d01b8-dc31-4ba9-a6f2-ce32369f7797'),
|
||||
('651c7ffe-58d4-4807-aef5-720e58d254d8', 'aceff9cb-e679-46b0-b148-a4d15154ddfe'),
|
||||
('d3c78cb9-72b8-4277-ae12-094ce4be1bbc', '114a8e9d-a7a6-4445-854c-469208dd9c10'),
|
||||
('619f02b0-7639-42aa-ae39-2808289c713f', '114a8e9d-a7a6-4445-854c-469208dd9c10'),
|
||||
('edc39164-215e-4a4c-9e91-a4ef1cc17709', 'fa8437aa-2131-4bb8-9361-25d7bab6bde6'),
|
||||
('d7a2898a-887c-4832-af44-4c2bfa8c482f', 'aceff9cb-e679-46b0-b148-a4d15154ddfe'),
|
||||
('1510b125-197d-4389-afa9-70d2ee2c610e', 'fa8437aa-2131-4bb8-9361-25d7bab6bde6'),
|
||||
('a2c8a7ca-8f5f-4fe0-ac47-a186dc8cea25', '7cdafda5-30f1-42c0-8fe2-edcf7522724b'),
|
||||
('fff9365e-e86f-46d4-8ac3-e90ac6c8f391', '7cdafda5-30f1-42c0-8fe2-edcf7522724b'),
|
||||
('8d3df58a-3b57-4269-9f23-a02d8630b001', '6810f956-cb7e-4689-b717-917246f2ae25'),
|
||||
('c1a6dc5c-e952-43e0-bd02-5505e4db72f0', '36b7080d-2875-4dcb-ae8e-eb06468cf2b0'),
|
||||
('7b1ec3b2-5e72-4b4d-87f6-1b158e4b98a4', '36b7080d-2875-4dcb-ae8e-eb06468cf2b0'),
|
||||
('2fd89257-98c7-4bae-9186-961259edd4fd', '36b7080d-2875-4dcb-ae8e-eb06468cf2b0'),
|
||||
('d43541ae-bc9c-49ad-aa5f-097563ca3e2d', '9bf13d98-1393-4e56-87bd-72ff466e6521'),
|
||||
('24ae6a1a-019d-4040-bacc-115be99f7982', '9bf13d98-1393-4e56-87bd-72ff466e6521'),
|
||||
('1c78e9bd-e869-4486-a891-5dae020f35da', '6dc18765-0b64-4e8d-8ba7-b99c64a3bbc3'),
|
||||
('642b2621-16bb-4615-9b4c-4ea6cd32f7e9', '9b0ba3d3-e244-429e-b309-27d24fe5f484'),
|
||||
('df901da9-9a6e-4d54-9fbd-e14065dadc40', '9b0ba3d3-e244-429e-b309-27d24fe5f484'),
|
||||
('643deb27-9521-4672-9ebc-9349e39607a4', '6dc18765-0b64-4e8d-8ba7-b99c64a3bbc3'),
|
||||
('77278afe-54fa-4174-b56f-bf2217aaa8d6', '6dc18765-0b64-4e8d-8ba7-b99c64a3bbc3'),
|
||||
('baa06fdf-495a-42ee-ba1c-026953301487', 'bce4184c-1317-454d-badc-da2549493f01'),
|
||||
('f80ecf2c-4e52-4957-bb3a-3bd5f98b1017', '1966e857-54d2-4e1b-a22e-e120c96724e6'),
|
||||
('f3565c7f-39cd-46b4-bc44-2682d7b48cbc', '1966e857-54d2-4e1b-a22e-e120c96724e6'),
|
||||
('2080b4ac-4e00-4e24-9f93-05b54d72f2e9', 'bce4184c-1317-454d-badc-da2549493f01'),
|
||||
('276bf24a-da04-4276-bbb8-206e9b276968', 'd33b2210-3ef5-4e3b-9f0e-bf2e83e22fff'),
|
||||
('5fd32a4a-4ab0-44ad-873d-459b9062ae6e', '4a7831cc-5b26-470c-8966-4093f3fd9a8a'),
|
||||
('8f54a3a2-38cc-48d6-85e1-d8fe47eea2f0', '4a7831cc-5b26-470c-8966-4093f3fd9a8a'),
|
||||
('091b0fea-c089-499d-a9e4-8a0eba3bbe47', '039d221e-b71a-4f55-b4a0-ac80e7a382da'),
|
||||
('a4b2ead5-9d73-4064-b261-35cfcd0e6f89', '5fe3ea1e-c1c5-4739-8d4f-5595fe47554a'),
|
||||
('81cab85b-0272-40b2-9163-92973bc0fdfd', '039d221e-b71a-4f55-b4a0-ac80e7a382da'),
|
||||
('c7b7ac95-5c5a-4dcd-8a59-c8060011f753', '74bae823-b725-4523-94d2-bfbfba901586'),
|
||||
('914b10d9-622a-4269-b6bc-07c1377fb512', '74bae823-b725-4523-94d2-bfbfba901586');
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
|
||||
SELECT sys_insert_task_priorities();
|
||||
SELECT sys_insert_project_access_levels();
|
||||
SELECT sys_insert_task_status_categories();
|
||||
SELECT sys_insert_project_statuses();
|
||||
SELECT sys_insert_project_healths();
|
||||
SELECT sys_insert_project_templates();
|
||||
|
||||
DROP FUNCTION sys_insert_task_priorities();
|
||||
DROP FUNCTION sys_insert_project_access_levels();
|
||||
DROP FUNCTION sys_insert_task_status_categories();
|
||||
DROP FUNCTION sys_insert_project_statuses();
|
||||
DROP FUNCTION sys_insert_project_healths();
|
||||
DROP FUNCTION sys_insert_project_templates();
|
||||
|
||||
INSERT INTO timezones (name, abbrev, utc_offset)
|
||||
SELECT name, abbrev, utc_offset
|
||||
FROM pg_timezone_names;
|
||||
@@ -1,77 +0,0 @@
|
||||
CREATE OR REPLACE FUNCTION sys_insert_task_priorities() RETURNS VOID AS
|
||||
$$
|
||||
BEGIN
|
||||
INSERT INTO task_priorities (name, value, color_code) VALUES ('Low', 0, '#75c997');
|
||||
INSERT INTO task_priorities (name, value, color_code) VALUES ('Medium', 1, '#fbc84c');
|
||||
INSERT INTO task_priorities (name, value, color_code) VALUES ('High', 2, '#f37070');
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE OR REPLACE FUNCTION sys_insert_project_access_levels() RETURNS VOID AS
|
||||
$$
|
||||
BEGIN
|
||||
INSERT INTO project_access_levels (name, key)
|
||||
VALUES ('Admin', 'ADMIN');
|
||||
INSERT INTO project_access_levels (name, key)
|
||||
VALUES ('Member', 'MEMBER');
|
||||
INSERT INTO project_access_levels (name, key)
|
||||
VALUES ('Project Manager', 'PROJECT_MANAGER');
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE OR REPLACE FUNCTION sys_insert_task_status_categories() RETURNS VOID AS
|
||||
$$
|
||||
BEGIN
|
||||
INSERT INTO sys_task_status_categories (name, color_code, index, is_todo)
|
||||
VALUES ('To do', '#a9a9a9', 0, TRUE);
|
||||
INSERT INTO sys_task_status_categories (name, color_code, index, is_doing)
|
||||
VALUES ('Doing', '#70a6f3', 1, TRUE);
|
||||
INSERT INTO sys_task_status_categories (name, color_code, index, is_done)
|
||||
VALUES ('Done', '#75c997', 2, TRUE);
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE OR REPLACE FUNCTION sys_insert_project_statuses() RETURNS VOID AS
|
||||
$$
|
||||
BEGIN
|
||||
INSERT INTO sys_project_statuses (name, color_code, icon, sort_order, is_default)
|
||||
VALUES ('Cancelled', '#f37070', 'close-circle', 0, FALSE),
|
||||
('Blocked', '#cbc8a1', 'stop', 1, FALSE),
|
||||
('On Hold', '#cbc8a1', 'stop', 2, FALSE),
|
||||
('Proposed', '#cbc8a1', 'clock-circle', 3, TRUE),
|
||||
('In Planning', '#cbc8a1', 'clock-circle', 4, FALSE),
|
||||
('In Progress', '#80ca79', 'clock-circle', 5, FALSE),
|
||||
('Completed', '#80ca79', 'check-circle', 6, FALSE);
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE OR REPLACE FUNCTION sys_insert_project_healths() RETURNS VOID AS
|
||||
$$
|
||||
BEGIN
|
||||
INSERT INTO sys_project_healths (name, color_code, sort_order, is_default)
|
||||
VALUES ('Not Set', '#a9a9a9', 0, TRUE);
|
||||
INSERT INTO sys_project_healths (name, color_code, sort_order, is_default)
|
||||
VALUES ('Needs Attention', '#fbc84c', 1, FALSE);
|
||||
INSERT INTO sys_project_healths (name, color_code, sort_order, is_default)
|
||||
VALUES ('At Risk', '#f37070', 2, FALSE);
|
||||
INSERT INTO sys_project_healths (name, color_code, sort_order, is_default)
|
||||
VALUES ('Good', '#75c997', 3, FALSE);
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
|
||||
SELECT sys_insert_task_priorities();
|
||||
SELECT sys_insert_project_access_levels();
|
||||
SELECT sys_insert_task_status_categories();
|
||||
SELECT sys_insert_project_statuses();
|
||||
SELECT sys_insert_project_healths();
|
||||
|
||||
DROP FUNCTION sys_insert_task_priorities();
|
||||
DROP FUNCTION sys_insert_project_access_levels();
|
||||
DROP FUNCTION sys_insert_task_status_categories();
|
||||
DROP FUNCTION sys_insert_project_statuses();
|
||||
DROP FUNCTION sys_insert_project_healths();
|
||||
|
||||
INSERT INTO timezones (name, abbrev, utc_offset)
|
||||
SELECT name, abbrev, utc_offset
|
||||
FROM pg_timezone_names;
|
||||
@@ -1,4 +1,4 @@
|
||||
CREATE VIEW task_labels_view(name, task_id, label_id) AS
|
||||
CREATE OR REPLACE VIEW task_labels_view(name, task_id, label_id) AS
|
||||
SELECT (SELECT team_labels.name
|
||||
FROM team_labels
|
||||
WHERE team_labels.id = task_labels.label_id) AS name,
|
||||
@@ -6,7 +6,7 @@ SELECT (SELECT team_labels.name
|
||||
task_labels.label_id
|
||||
FROM task_labels;
|
||||
|
||||
CREATE VIEW tasks_with_status_view(task_id, parent_task_id, is_todo, is_doing, is_done) AS
|
||||
CREATE OR REPLACE VIEW tasks_with_status_view(task_id, parent_task_id, is_todo, is_doing, is_done) AS
|
||||
SELECT tasks.id AS task_id,
|
||||
tasks.parent_task_id,
|
||||
stsc.is_todo,
|
||||
@@ -17,7 +17,7 @@ FROM tasks
|
||||
JOIN sys_task_status_categories stsc ON ts.category_id = stsc.id
|
||||
WHERE tasks.archived IS FALSE;
|
||||
|
||||
CREATE VIEW team_member_info_view(avatar_url, email, name, user_id, team_member_id, team_id) AS
|
||||
CREATE OR REPLACE VIEW team_member_info_view(avatar_url, email, name, user_id, team_member_id, team_id, active) AS
|
||||
SELECT u.avatar_url,
|
||||
COALESCE(u.email, (SELECT email_invitations.email
|
||||
FROM email_invitations
|
||||
@@ -27,8 +27,8 @@ SELECT u.avatar_url,
|
||||
WHERE email_invitations.team_member_id = team_members.id)) AS name,
|
||||
u.id AS user_id,
|
||||
team_members.id AS team_member_id,
|
||||
team_members.team_id
|
||||
team_members.team_id,
|
||||
team_members.active
|
||||
FROM team_members
|
||||
LEFT JOIN users u ON team_members.user_id = u.id;
|
||||
|
||||
|
||||
@@ -165,6 +165,32 @@ BEGIN
|
||||
END;
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION bulk_assign_label(_body json) RETURNS json
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
DECLARE
|
||||
_task JSON;
|
||||
_label JSON;
|
||||
_output JSON;
|
||||
BEGIN
|
||||
FOR _task IN SELECT * FROM JSON_ARRAY_ELEMENTS((_body ->> 'tasks')::JSON)
|
||||
LOOP
|
||||
FOR _label IN SELECT * FROM JSON_ARRAY_ELEMENTS((_body ->> 'labels')::JSON)
|
||||
LOOP
|
||||
DELETE
|
||||
FROM task_labels
|
||||
WHERE task_id = (_task ->> 'id')::UUID
|
||||
AND label_id = (_label ->> 'id')::UUID;
|
||||
INSERT INTO task_labels (task_id, label_id)
|
||||
VALUES ((_task ->> 'id')::UUID, (_label ->> 'id')::UUID);
|
||||
END LOOP;
|
||||
END LOOP;
|
||||
|
||||
RETURN _output;
|
||||
END;
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION bulk_assign_or_create_label(_body json) RETURNS json
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
@@ -236,6 +262,23 @@ BEGIN
|
||||
END;
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION bulk_change_tasks_status(_body json) RETURNS json
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
DECLARE
|
||||
_task JSON;
|
||||
_output JSON;
|
||||
BEGIN
|
||||
FOR _task IN SELECT * FROM JSON_ARRAY_ELEMENTS((_body ->> 'tasks')::JSON)
|
||||
LOOP
|
||||
UPDATE tasks SET status_id = (_body ->> 'status_id')::UUID WHERE id = (_task ->> 'id')::UUID;
|
||||
END LOOP;
|
||||
|
||||
RETURN _output;
|
||||
END;
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION bulk_delete_pt_tasks(_body json) RETURNS json
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
@@ -452,6 +495,7 @@ $$
|
||||
DECLARE
|
||||
_owner_id UUID;
|
||||
_team_id UUID;
|
||||
_organization_id UUID;
|
||||
_admin_role_id UUID;
|
||||
_owner_role_id UUID;
|
||||
_trimmed_name TEXT;
|
||||
@@ -461,10 +505,11 @@ BEGIN
|
||||
_trimmed_team_name = TRIM(_name);
|
||||
-- get owner id
|
||||
SELECT user_id INTO _owner_id FROM teams WHERE id = (SELECT active_team FROM users WHERE id = _user_id);
|
||||
SELECT id INTO _organization_id FROM organizations WHERE user_id = _user_id;
|
||||
|
||||
-- insert team
|
||||
INSERT INTO teams (name, user_id)
|
||||
VALUES (_trimmed_team_name, _owner_id)
|
||||
INSERT INTO teams (name, user_id, organization_id)
|
||||
VALUES (_trimmed_team_name, _owner_id, _organization_id)
|
||||
RETURNING id INTO _team_id;
|
||||
|
||||
-- insert default roles
|
||||
@@ -490,6 +535,44 @@ BEGIN
|
||||
END;
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION create_new_team(_name text, _user_id uuid, _current_team_id uuid) RETURNS json
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
DECLARE
|
||||
_owner_id UUID;
|
||||
_team_id UUID;
|
||||
_role_id UUID;
|
||||
_trimmed_team_name TEXT;
|
||||
BEGIN
|
||||
|
||||
_trimmed_team_name = TRIM(_name);
|
||||
|
||||
-- get owner id
|
||||
SELECT user_id INTO _owner_id FROM teams WHERE id = (SELECT active_team FROM users WHERE id = _user_id);
|
||||
|
||||
-- insert team
|
||||
INSERT INTO teams (name, user_id, organization_id)
|
||||
VALUES (_trimmed_team_name, _owner_id, (SELECT id FROM organizations WHERE user_id = _owner_id)::UUID)
|
||||
RETURNING id INTO _team_id;
|
||||
|
||||
-- insert default roles
|
||||
INSERT INTO roles (name, team_id, default_role) VALUES ('Member', _team_id, TRUE);
|
||||
INSERT INTO roles (name, team_id, admin_role) VALUES ('Admin', _team_id, TRUE);
|
||||
INSERT INTO roles (name, team_id, owner) VALUES ('Owner', _team_id, TRUE) RETURNING id INTO _role_id;
|
||||
|
||||
-- insert team member
|
||||
INSERT INTO team_members (user_id, team_id, role_id)
|
||||
VALUES (_user_id, _team_id, _role_id);
|
||||
|
||||
RETURN JSON_BUILD_OBJECT(
|
||||
'id', _user_id,
|
||||
'name', _trimmed_team_name,
|
||||
'team_id', _team_id
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION create_notification(_user_id uuid, _team_id uuid, _task_id uuid, _project_id uuid, _message text) RETURNS json
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
@@ -515,12 +598,13 @@ CREATE OR REPLACE FUNCTION create_project(_body json) RETURNS json
|
||||
AS
|
||||
$$
|
||||
DECLARE
|
||||
_user_id UUID;
|
||||
_team_id UUID;
|
||||
_client_id UUID;
|
||||
_project_id UUID;
|
||||
_client_name TEXT;
|
||||
_project_name TEXT;
|
||||
_user_id UUID;
|
||||
_team_id UUID;
|
||||
_client_id UUID;
|
||||
_project_id UUID;
|
||||
_client_name TEXT;
|
||||
_project_name TEXT;
|
||||
_team_member_id UUID;
|
||||
BEGIN
|
||||
-- need a test, can be throw errors
|
||||
_client_name = TRIM((_body ->> 'client_name')::TEXT);
|
||||
@@ -532,6 +616,7 @@ BEGIN
|
||||
|
||||
-- cache exists client if exists
|
||||
SELECT id FROM clients WHERE LOWER(name) = LOWER(_client_name) AND team_id = _team_id INTO _client_id;
|
||||
SELECT id FROM team_members WHERE team_id = _team_id AND user_id = _user_id INTO _team_member_id;
|
||||
|
||||
-- check whether the project name is already in
|
||||
IF EXISTS(SELECT name
|
||||
@@ -566,6 +651,12 @@ BEGIN
|
||||
REPLACE((_body ->> 'project_created_log')::TEXT, '@user',
|
||||
(SELECT name FROM users WHERE id = _user_id)));
|
||||
|
||||
-- insert the project creator as a project member
|
||||
INSERT INTO project_members (team_member_id, project_access_level_id, project_id, role_id)
|
||||
VALUES (_team_member_id, (SELECT id FROM project_access_levels WHERE key = 'ADMIN'),
|
||||
_project_id,
|
||||
(SELECT id FROM roles WHERE team_id = _team_id AND default_role IS TRUE));
|
||||
|
||||
-- insert statuses
|
||||
INSERT INTO task_statuses (name, project_id, team_id, category_id, sort_order)
|
||||
VALUES ('To Do', _project_id, _team_id, (SELECT id FROM sys_task_status_categories WHERE is_todo IS TRUE), 0);
|
||||
@@ -577,22 +668,10 @@ BEGIN
|
||||
-- insert default columns for task list
|
||||
PERFORM insert_task_list_columns(_project_id);
|
||||
|
||||
-- insert user as default project manager(project owner)
|
||||
IF NOT (_body ->> 'project_manager_id' IS NULL)
|
||||
THEN
|
||||
PERFORM create_project_member(JSON_BUILD_OBJECT(
|
||||
'team_member_id', (_body ->> 'project_manager_id')::UUID,
|
||||
'team_id', _team_id,
|
||||
'project_id', _project_id,
|
||||
'user_id', _user_id,
|
||||
'access_level', 'PROJECT_MANAGER'::TEXT
|
||||
));
|
||||
END IF;
|
||||
|
||||
RETURN JSON_BUILD_OBJECT(
|
||||
'id', _project_id,
|
||||
'name', (_body ->> 'name')::TEXT
|
||||
);
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
|
||||
@@ -1052,6 +1131,16 @@ DECLARE
|
||||
_template_id UUID;
|
||||
_task JSON;
|
||||
BEGIN
|
||||
|
||||
-- check whether the project name is already in
|
||||
IF EXISTS(
|
||||
SELECT name FROM task_templates WHERE LOWER(name) = LOWER(_name)
|
||||
AND team_id = _team_id
|
||||
)
|
||||
THEN
|
||||
RAISE 'TASK_TEMPLATE_EXISTS_ERROR:%', _name;
|
||||
END IF;
|
||||
|
||||
INSERT INTO task_templates (name, team_id) VALUES (_name, _team_id) RETURNING id INTO _template_id;
|
||||
|
||||
-- insert tasks for task templates
|
||||
@@ -1157,7 +1246,7 @@ AS
|
||||
$$
|
||||
DECLARE
|
||||
BEGIN
|
||||
SET SESSION_REPLICATION_ROLE = replica;
|
||||
-- SET SESSION_REPLICATION_ROLE = replica;
|
||||
|
||||
UPDATE users SET active_team = NULL WHERE id = _id;
|
||||
DELETE FROM notification_settings WHERE user_id = _id;
|
||||
@@ -1181,7 +1270,7 @@ BEGIN
|
||||
UPDATE users SET active_team = NULL WHERE id = _id;
|
||||
DELETE FROM users WHERE id = _id;
|
||||
|
||||
SET SESSION_REPLICATION_ROLE = default;
|
||||
-- SET SESSION_REPLICATION_ROLE = default;
|
||||
END;
|
||||
$$;
|
||||
|
||||
@@ -1236,7 +1325,19 @@ BEGIN
|
||||
is_owner(users.id, users.active_team) AS owner,
|
||||
is_admin(users.id, users.active_team) AS is_admin,
|
||||
t.user_id AS owner_id,
|
||||
ud.subscription_status
|
||||
ud.subscription_status,
|
||||
(SELECT CASE
|
||||
WHEN (ud.subscription_status) = 'trialing'
|
||||
THEN (trial_expire_date)::DATE
|
||||
WHEN (EXISTS(SELECT id FROM licensing_custom_subs WHERE user_id = t.user_id))
|
||||
THEN (SELECT end_date FROM licensing_custom_subs lcs WHERE lcs.user_id = t.user_id)::DATE
|
||||
WHEN EXISTS (SELECT 1
|
||||
FROM licensing_user_subscriptions
|
||||
WHERE user_id = t.user_id AND active IS TRUE)
|
||||
THEN (SELECT (next_bill_date)::DATE - INTERVAL '1 day'
|
||||
FROM licensing_user_subscriptions
|
||||
WHERE user_id = t.user_id)::DATE
|
||||
END) AS valid_till_date
|
||||
FROM users
|
||||
INNER JOIN teams t
|
||||
ON t.id = COALESCE(users.active_team,
|
||||
@@ -1319,6 +1420,9 @@ BEGIN
|
||||
THEN (SELECT ROW_TO_JSON(rec)
|
||||
FROM (SELECT (SELECT name FROM task_statuses WHERE id = old_value::UUID),
|
||||
(SELECT color_code
|
||||
FROM sys_task_status_categories
|
||||
WHERE id = (SELECT category_id FROM task_statuses WHERE id = old_value::UUID)),
|
||||
(SELECT color_code_dark
|
||||
FROM sys_task_status_categories
|
||||
WHERE id = (SELECT category_id FROM task_statuses WHERE id = old_value::UUID))) rec)
|
||||
ELSE (NULL) END) AS previous_status,
|
||||
@@ -1329,6 +1433,9 @@ BEGIN
|
||||
THEN (SELECT ROW_TO_JSON(rec)
|
||||
FROM (SELECT (SELECT name FROM task_statuses WHERE id = new_value::UUID),
|
||||
(SELECT color_code
|
||||
FROM sys_task_status_categories
|
||||
WHERE id = (SELECT category_id FROM task_statuses WHERE id = new_value::UUID)),
|
||||
(SELECT color_code_dark
|
||||
FROM sys_task_status_categories
|
||||
WHERE id = (SELECT category_id FROM task_statuses WHERE id = new_value::UUID))) rec)
|
||||
ELSE (NULL) END) AS next_status,
|
||||
@@ -1378,6 +1485,62 @@ BEGIN
|
||||
END;
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION get_billing_info(_user_id uuid) RETURNS json
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
DECLARE
|
||||
_is_custom BOOLEAN := FALSE;
|
||||
_is_ltd BOOLEAN := FALSE;
|
||||
_result JSON;
|
||||
BEGIN
|
||||
SELECT EXISTS(SELECT id FROM licensing_custom_subs WHERE user_id = _user_id) INTO _is_custom;
|
||||
SELECT EXISTS(SELECT 1 FROM licensing_coupon_codes WHERE redeemed_by = _user_id) INTO _is_ltd;
|
||||
|
||||
SELECT ROW_TO_JSON(rec)
|
||||
INTO _result
|
||||
FROM (SELECT (SELECT name FROM users WHERE ud.user_id = users.id),
|
||||
(SELECT email FROM users WHERE ud.user_id = users.id),
|
||||
contact_number,
|
||||
contact_number_secondary,
|
||||
trial_in_progress,
|
||||
trial_expire_date,
|
||||
unit_price::NUMERIC,
|
||||
cancel_url,
|
||||
subscription_status AS status,
|
||||
lus.cancellation_effective_date,
|
||||
lus.paused_at,
|
||||
lus.paused_from::DATE,
|
||||
lus.paused_reason,
|
||||
_is_custom AS is_custom,
|
||||
_is_ltd AS is_ltd_user,
|
||||
(SELECT SUM(team_members_limit) FROM licensing_coupon_codes WHERE redeemed_by = _user_id) AS ltd_users,
|
||||
(CASE
|
||||
WHEN (_is_custom) THEN 'Custom Plan'
|
||||
WHEN (_is_ltd) THEN 'Life Time Deal'
|
||||
ELSE
|
||||
(SELECT name FROM licensing_pricing_plans WHERE id = lus.plan_id) END) AS plan_name,
|
||||
(SELECT key FROM sys_license_types WHERE id = ud.license_type_id) AS subscription_type,
|
||||
(SELECT id AS plan_id FROM licensing_pricing_plans WHERE id = lus.plan_id),
|
||||
(SELECT default_currency AS default_currency FROM licensing_pricing_plans WHERE id = lus.plan_id),
|
||||
(SELECT billing_type FROM licensing_pricing_plans WHERE id = lus.plan_id),
|
||||
(CASE
|
||||
WHEN ud.subscription_status = 'trialing' THEN ud.trial_expire_date::DATE
|
||||
WHEN EXISTS (SELECT 1 FROM licensing_custom_subs lcs WHERE lcs.user_id = ud.user_id) THEN
|
||||
(SELECT end_date FROM licensing_custom_subs lcs WHERE lcs.user_id = ud.user_id)::DATE
|
||||
WHEN EXISTS (SELECT 1 FROM licensing_user_subscriptions lus WHERE lus.user_id = ud.user_id) THEN
|
||||
(SELECT next_bill_date::DATE - INTERVAL '1 day'
|
||||
FROM licensing_user_subscriptions lus
|
||||
WHERE lus.user_id = ud.user_id)::DATE
|
||||
END) AS valid_till_date,
|
||||
is_lkr_billing
|
||||
FROM organizations ud
|
||||
LEFT JOIN licensing_user_subscriptions lus ON ud.user_id = lus.user_id
|
||||
WHERE ud.user_id = _user_id) rec;
|
||||
RETURN _result;
|
||||
END;
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION get_daily_digest() RETURNS json
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
@@ -3127,6 +3290,10 @@ BEGIN
|
||||
FROM sys_task_status_categories
|
||||
WHERE id = (SELECT category_id FROM task_statuses WHERE id = tasks.status_id)) AS status_color,
|
||||
|
||||
(SELECT color_code_dark
|
||||
FROM sys_task_status_categories
|
||||
WHERE id = (SELECT category_id FROM task_statuses WHERE id = tasks.status_id)) AS status_color_dark,
|
||||
|
||||
(SELECT get_task_assignees(tasks.id)) AS assignees,
|
||||
|
||||
(SELECT name
|
||||
@@ -3209,20 +3376,27 @@ CREATE OR REPLACE FUNCTION get_task_complete_info(_task_id uuid, _status_id uuid
|
||||
AS
|
||||
$$
|
||||
DECLARE
|
||||
_color_code TEXT;
|
||||
_members JSON;
|
||||
_color_code TEXT;
|
||||
_color_code_dark TEXT;
|
||||
_members JSON;
|
||||
BEGIN
|
||||
SELECT color_code
|
||||
FROM sys_task_status_categories
|
||||
WHERE id = (SELECT category_id FROM task_statuses WHERE id = _status_id)
|
||||
INTO _color_code;
|
||||
|
||||
SELECT color_code_dark
|
||||
FROM sys_task_status_categories
|
||||
WHERE id = (SELECT category_id FROM task_statuses WHERE id = _status_id)
|
||||
INTO _color_code_dark;
|
||||
|
||||
SELECT get_task_assignees(_task_id) INTO _members;
|
||||
|
||||
RETURN JSON_BUILD_OBJECT(
|
||||
'color_code', _color_code,
|
||||
'members', _members
|
||||
);
|
||||
'color_code', _color_code,
|
||||
'color_code_dark', _color_code_dark,
|
||||
'members', _members
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
|
||||
@@ -3254,7 +3428,8 @@ BEGIN
|
||||
INTO _sub_tasks_done;
|
||||
|
||||
_total_completed = _parent_task_done + _sub_tasks_done;
|
||||
_total_tasks = _sub_tasks_count + 1; -- +1 for the parent task
|
||||
-- _total_tasks = _sub_tasks_count + 1; -- +1 for the parent task
|
||||
_total_tasks = _sub_tasks_count; -- +1 for the parent task
|
||||
_ratio = (_total_completed / _total_tasks) * 100;
|
||||
|
||||
RETURN JSON_BUILD_OBJECT(
|
||||
@@ -3323,10 +3498,15 @@ BEGIN
|
||||
(SELECT color_code
|
||||
FROM sys_task_status_categories
|
||||
WHERE id = (SELECT category_id FROM task_statuses WHERE id = tasks.status_id)) AS status_color,
|
||||
(SELECT color_code_dark
|
||||
FROM sys_task_status_categories
|
||||
WHERE id = (SELECT category_id FROM task_statuses WHERE id = tasks.status_id)) AS status_color_dark,
|
||||
(SELECT COUNT(*) FROM tasks WHERE parent_task_id = _task_id) AS sub_tasks_count,
|
||||
(SELECT name FROM users WHERE id = tasks.reporter_id) AS reporter,
|
||||
(SELECT get_task_assignees(tasks.id)) AS assignees,
|
||||
(SELECT id FROM team_members WHERE user_id = _user_id AND team_id = _team_id) AS team_member_id
|
||||
(SELECT id FROM team_members WHERE user_id = _user_id AND team_id = _team_id) AS team_member_id,
|
||||
billable,
|
||||
schedule_id
|
||||
FROM tasks
|
||||
WHERE id = _task_id) rec;
|
||||
|
||||
@@ -3359,16 +3539,10 @@ BEGIN
|
||||
(SELECT email FROM team_member_info_view WHERE team_member_info_view.team_member_id = team_members.id),
|
||||
(SELECT avatar_url
|
||||
FROM team_member_info_view
|
||||
WHERE team_member_info_view.team_member_id = team_members.id),
|
||||
CASE WHEN EXISTS (
|
||||
SELECT 1 FROM email_invitations WHERE team_member_id = team_members.id
|
||||
) THEN TRUE
|
||||
ELSE FALSE
|
||||
END AS is_pending
|
||||
WHERE team_member_info_view.team_member_id = team_members.id)
|
||||
FROM team_members
|
||||
LEFT JOIN users u ON team_members.user_id = u.id
|
||||
WHERE team_id = _team_id
|
||||
AND team_members.active IS TRUE) rec;
|
||||
WHERE team_id = _team_id AND team_members.active IS TRUE) rec;
|
||||
|
||||
SELECT get_task_assignees(_task_id) INTO _assignees;
|
||||
|
||||
@@ -3501,26 +3675,9 @@ BEGIN
|
||||
THEN NOW()::DATE - end_date::DATE
|
||||
ELSE 0
|
||||
END END AS days_overdue,
|
||||
CASE
|
||||
WHEN (NOW()::DATE > end_date)
|
||||
AND status_id
|
||||
NOT IN (SELECT id
|
||||
FROM task_statuses
|
||||
WHERE project_id = _project_id
|
||||
AND category_id IN
|
||||
(SELECT id
|
||||
FROM sys_task_status_categories
|
||||
WHERE sys_task_status_categories.is_done IS FALSE))
|
||||
THEN 0
|
||||
ELSE COALESCE(CASE
|
||||
WHEN
|
||||
((SELECT SUM(time_spent) FROM task_work_log WHERE task_id = tasks.id) >
|
||||
(total_minutes * 60)) THEN
|
||||
(SELECT SUM(time_spent) * 60
|
||||
FROM task_work_log
|
||||
WHERE task_id = tasks.id) -
|
||||
(total_minutes * 60)
|
||||
ELSE 0 END, 0) END AS overlogged_time,
|
||||
|
||||
(SELECT SUM(time_spent) FROM task_work_log WHERE task_id = tasks.id) - (total_minutes * 60) AS overlogged_time,
|
||||
|
||||
COALESCE(completed_at::DATE - end_date::DATE, 0) AS late_days
|
||||
FROM tasks
|
||||
WHERE project_id = _project_id
|
||||
@@ -3648,17 +3805,17 @@ BEGIN
|
||||
WHERE project_id = _project_id
|
||||
AND project_members.team_member_id = team_members.id) AS exists_in_project,
|
||||
0 AS usage,
|
||||
CASE
|
||||
(CASE
|
||||
WHEN EXISTS (SELECT 1
|
||||
FROM email_invitations
|
||||
WHERE team_member_id = team_members.id) THEN TRUE
|
||||
ELSE FALSE
|
||||
END AS is_pending
|
||||
END) AS is_pending
|
||||
FROM team_members
|
||||
LEFT JOIN users u ON team_members.user_id = u.id
|
||||
LEFT JOIN team_member_info_view tmiv ON team_members.id = tmiv.team_member_id
|
||||
WHERE team_members.team_id = _team_id
|
||||
AND active IS TRUE
|
||||
AND team_members.active IS TRUE
|
||||
ORDER BY tmiv.name)
|
||||
SELECT id, name, user_id, email, avatar_url, usage, is_pending
|
||||
FROM mbers
|
||||
@@ -3906,6 +4063,7 @@ DECLARE
|
||||
_message TEXT;
|
||||
_task_info JSON;
|
||||
_status_category JSON;
|
||||
_schedule_id JSON;
|
||||
_task_completed_at TIMESTAMPTZ;
|
||||
BEGIN
|
||||
SELECT name FROM tasks WHERE id = _task_id INTO _task_name;
|
||||
@@ -3930,6 +4088,7 @@ BEGIN
|
||||
END IF;
|
||||
|
||||
SELECT completed_at FROM tasks WHERE id = _task_id INTO _task_completed_at;
|
||||
SELECT schedule_id FROM tasks WHERE id = _task_id INTO _schedule_id;
|
||||
|
||||
SELECT COALESCE(ROW_TO_JSON(r), '{}'::JSON)
|
||||
FROM (SELECT is_done, is_doing, is_todo
|
||||
@@ -3938,21 +4097,23 @@ BEGIN
|
||||
INTO _status_category;
|
||||
|
||||
RETURN JSON_BUILD_OBJECT(
|
||||
'message', _message,
|
||||
'project_id', (SELECT project_id FROM tasks WHERE id = _task_id),
|
||||
'parent_done', (CASE
|
||||
WHEN EXISTS(SELECT 1
|
||||
FROM tasks_with_status_view
|
||||
WHERE tasks_with_status_view.task_id = _task_id
|
||||
AND is_done IS TRUE) THEN 1
|
||||
ELSE 0 END),
|
||||
'color_code', (_task_info ->> 'color_code')::TEXT,
|
||||
'total_tasks', (_task_info ->> 'total_tasks')::INT,
|
||||
'total_completed', (_task_info ->> 'total_completed')::INT,
|
||||
'members', (_task_info ->> 'members')::JSON,
|
||||
'completed_at', _task_completed_at,
|
||||
'status_category', _status_category
|
||||
);
|
||||
'message', _message,
|
||||
'project_id', (SELECT project_id FROM tasks WHERE id = _task_id),
|
||||
'parent_done', (CASE
|
||||
WHEN EXISTS(SELECT 1
|
||||
FROM tasks_with_status_view
|
||||
WHERE tasks_with_status_view.task_id = _task_id
|
||||
AND is_done IS TRUE) THEN 1
|
||||
ELSE 0 END),
|
||||
'color_code', (_task_info ->> 'color_code')::TEXT,
|
||||
'color_code_dark', (_task_info ->> 'color_code_dark')::TEXT,
|
||||
'total_tasks', (_task_info ->> 'total_tasks')::INT,
|
||||
'total_completed', (_task_info ->> 'total_completed')::INT,
|
||||
'members', (_task_info ->> 'members')::JSON,
|
||||
'completed_at', _task_completed_at,
|
||||
'status_category', _status_category,
|
||||
'schedule_id', _schedule_id
|
||||
);
|
||||
END
|
||||
$$;
|
||||
|
||||
@@ -4321,6 +4482,7 @@ $$
|
||||
DECLARE
|
||||
_task JSON;
|
||||
_max_sort INT;
|
||||
_task_id_new UUID;
|
||||
BEGIN
|
||||
|
||||
SELECT COALESCE((SELECT MAX(sort_order) FROM tasks WHERE project_id = _project_id), 0) INTO _max_sort;
|
||||
@@ -4340,7 +4502,20 @@ BEGIN
|
||||
FROM task_statuses
|
||||
WHERE project_id = _project_id::UUID
|
||||
AND category_id IN (SELECT id FROM sys_task_status_categories WHERE is_todo IS TRUE)
|
||||
LIMIT 1), _max_sort, (_task ->> 'total_minutes')::NUMERIC);
|
||||
LIMIT 1), _max_sort, (_task ->> 'total_minutes')::NUMERIC) RETURNING id INTO _task_id_new;
|
||||
|
||||
INSERT INTO task_activity_logs (task_id, team_id, attribute_type, user_id, log_type, old_value, new_value, project_id)
|
||||
VALUES (
|
||||
_task_id_new,
|
||||
(SELECT team_id FROM projects WHERE id = _project_id),
|
||||
'status',
|
||||
_user_id,
|
||||
'update',
|
||||
NULL,
|
||||
(SELECT id FROM task_statuses WHERE project_id = _project_id::UUID AND category_id IN (SELECT id FROM sys_task_status_categories WHERE is_todo IS TRUE)LIMIT 1),
|
||||
_project_id
|
||||
);
|
||||
|
||||
END LOOP;
|
||||
|
||||
RETURN JSON_BUILD_OBJECT('id', _project_id);
|
||||
@@ -4351,12 +4526,14 @@ CREATE OR REPLACE FUNCTION in_organization(_team_id_in uuid, _team_id uuid) RETU
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
DECLARE
|
||||
BEGIN
|
||||
RETURN (SELECT _team_id_in IN (SELECT id
|
||||
FROM teams
|
||||
WHERE user_id = (SELECT user_id FROM teams WHERE id = _team_id)));
|
||||
END
|
||||
RETURN EXISTS (
|
||||
SELECT 1
|
||||
FROM teams t1
|
||||
JOIN teams t2 ON t1.user_id = t2.user_id
|
||||
WHERE t1.id = _team_id_in AND t2.id = _team_id
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION insert_job_title(_job_title text, _team_id uuid) RETURNS uuid
|
||||
@@ -4487,6 +4664,20 @@ BEGIN
|
||||
END;
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION is_overdue(_task_id uuid) RETURNS boolean
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
DECLARE
|
||||
BEGIN
|
||||
RETURN EXISTS(SELECT 1
|
||||
FROM tasks
|
||||
WHERE id = _task_id
|
||||
AND end_date < CURRENT_TIMESTAMP
|
||||
AND is_completed(tasks.status_id, tasks.project_id) IS FALSE);
|
||||
END
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION is_owner(_user_id uuid, _team_id uuid) RETURNS boolean
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
@@ -4684,9 +4875,9 @@ BEGIN
|
||||
|
||||
--insert organization data
|
||||
INSERT INTO organizations (user_id, organization_name, contact_number, contact_number_secondary, trial_in_progress,
|
||||
trial_expire_date, subscription_status)
|
||||
trial_expire_date, subscription_status, license_type_id)
|
||||
VALUES (_user_id, TRIM((_body ->> 'displayName')::TEXT), NULL, NULL, TRUE, CURRENT_DATE + INTERVAL '14 days',
|
||||
'trialing')
|
||||
'trialing', (SELECT id FROM sys_license_types WHERE key = 'TRIAL'))
|
||||
RETURNING id INTO _organization_id;
|
||||
|
||||
INSERT INTO teams (name, user_id, organization_id)
|
||||
@@ -4766,9 +4957,9 @@ BEGIN
|
||||
|
||||
--insert organization data
|
||||
INSERT INTO organizations (user_id, organization_name, contact_number, contact_number_secondary, trial_in_progress,
|
||||
trial_expire_date, subscription_status)
|
||||
trial_expire_date, subscription_status, license_type_id)
|
||||
VALUES (_user_id, TRIM((_body ->> 'team_name')::TEXT), NULL, NULL, TRUE, CURRENT_DATE + INTERVAL '14 days',
|
||||
'trialing')
|
||||
'trialing', (SELECT id FROM sys_license_types WHERE key = 'TRIAL'))
|
||||
RETURNING id INTO _organization_id;
|
||||
|
||||
-- insert team
|
||||
@@ -5578,41 +5769,6 @@ BEGIN
|
||||
END
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION bulk_change_tasks_status(_body json, _userid uuid) RETURNS json
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
DECLARE
|
||||
_task JSON;
|
||||
_output JSON;
|
||||
_previous_status UUID;
|
||||
BEGIN
|
||||
|
||||
FOR _task IN SELECT * FROM JSON_ARRAY_ELEMENTS((_body ->> 'tasks')::JSON)
|
||||
LOOP
|
||||
_previous_status = (SELECT status_id FROM tasks WHERE id = (_task ->> 'id')::UUID);
|
||||
|
||||
UPDATE tasks SET status_id = (_body ->> 'status_id')::UUID WHERE id = (_task ->> 'id')::UUID;
|
||||
|
||||
IF (_previous_status IS DISTINCT FROM (_body ->> 'status_id')::UUID)
|
||||
THEN
|
||||
INSERT INTO task_activity_logs (task_id, team_id, attribute_type, user_id, log_type, old_value, new_value, project_id)
|
||||
VALUES (
|
||||
(_task ->> 'id')::UUID,
|
||||
(SELECT team_id FROM projects WHERE id = (SELECT project_id FROM tasks WHERE id = (_task ->> 'id')::UUID)),
|
||||
'status',
|
||||
_userId,
|
||||
'update',
|
||||
_previous_status,
|
||||
(_body ->> 'status_id')::UUID,
|
||||
(SELECT project_id FROM tasks WHERE id = (_task ->> 'id')::UUID)
|
||||
);
|
||||
END IF;
|
||||
END LOOP;
|
||||
RETURN _output;
|
||||
END
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION bulk_change_tasks_priority(_body json, _userid uuid) RETURNS json
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
@@ -5756,7 +5912,28 @@ BEGIN
|
||||
END
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION is_overdue_for_date(_task_id UUID, _end_date DATE) RETURNS BOOL AS
|
||||
CREATE OR REPLACE FUNCTION mark_bulk_refunds(coupon_data jsonb[]) RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
DECLARE
|
||||
data_record JSONB;
|
||||
BEGIN
|
||||
FOREACH data_record IN ARRAY coupon_data
|
||||
LOOP
|
||||
UPDATE licensing_coupon_codes
|
||||
SET is_refunded = TRUE,
|
||||
reason = TRIM(data_record ->> 'reason'),
|
||||
feedback = TRIM(data_record ->> 'feedback'),
|
||||
refunded_at = (data_record ->> 'refund_date')::TIMESTAMPTZ
|
||||
WHERE coupon_code = (data_record ->> 'code')::TEXT;
|
||||
END LOOP;
|
||||
END;
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION is_overdue_for_date(_task_id uuid, _end_date date) RETURNS boolean
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
DECLARE
|
||||
BEGIN
|
||||
@@ -5766,26 +5943,207 @@ BEGIN
|
||||
AND end_date < _end_date
|
||||
AND is_completed(tasks.status_id, tasks.project_id) IS FALSE);
|
||||
END
|
||||
$$ LANGUAGE plpgsql;
|
||||
$$;
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION is_overdue(_task_id UUID) RETURNS BOOL AS
|
||||
$$
|
||||
DECLARE
|
||||
BEGIN
|
||||
RETURN EXISTS(SELECT 1
|
||||
FROM tasks
|
||||
WHERE id = _task_id
|
||||
AND end_date < CURRENT_TIMESTAMP
|
||||
AND is_completed(tasks.status_id, tasks.project_id) IS FALSE);
|
||||
END
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION is_completed_between(_task_id UUID, _start_date DATE, _end_date DATE) RETURNS BOOL AS
|
||||
CREATE OR REPLACE FUNCTION is_completed_between(_task_id uuid, _start_date date, _end_date date) RETURNS boolean
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
DECLARE
|
||||
BEGIN
|
||||
RETURN EXISTS ( SELECT 1 FROM tasks WHERE id = _task_id AND completed_at::DATE >= _start_date::DATE AND completed_at::DATE <= _end_date::DATE);
|
||||
END
|
||||
$$ LANGUAGE plpgsql;
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION update_task_template(_id uuid, _name text, _tasks json, _team_id uuid) RETURNS json
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
DECLARE
|
||||
_task JSON;
|
||||
|
||||
BEGIN
|
||||
|
||||
-- check whether the project name is already in
|
||||
IF EXISTS(
|
||||
SELECT name FROM task_templates WHERE LOWER(name) = LOWER(_name)
|
||||
AND team_id = _team_id AND id != _id
|
||||
)
|
||||
THEN
|
||||
RAISE 'TASK_TEMPLATE_EXISTS_ERROR:%', _name;
|
||||
END IF;
|
||||
|
||||
UPDATE task_templates SET name = _name, updated_at = NOW() WHERE id = _id;
|
||||
|
||||
-- delete all existing tasks for the selected template
|
||||
DELETE FROM task_templates_tasks WHERE template_id = _id;
|
||||
|
||||
-- insert tasks for task templates
|
||||
FOR _task IN SELECT * FROM JSON_ARRAY_ELEMENTS(_tasks)
|
||||
LOOP
|
||||
INSERT INTO task_templates_tasks (template_id, name) VALUES (_id, (_task ->> 'name')::TEXT);
|
||||
END LOOP;
|
||||
|
||||
RETURN JSON_BUILD_OBJECT(
|
||||
'id', _id,
|
||||
'template_name', _name
|
||||
);
|
||||
END
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION insert_task_dependency(_task_id uuid, _related_task_id uuid, _dependency_type dependency_type DEFAULT 'blocked_by'::dependency_type) RETURNS void
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
BEGIN
|
||||
-- Attempt to insert into task_dependencies
|
||||
INSERT INTO task_dependencies (task_id, related_task_id, dependency_type)
|
||||
VALUES (_task_id, _related_task_id, _dependency_type)
|
||||
ON CONFLICT (task_id, related_task_id, dependency_type)
|
||||
DO NOTHING;
|
||||
|
||||
-- Check if the insert was successful
|
||||
IF NOT FOUND THEN
|
||||
-- Raise an exception if a conflict was found
|
||||
RAISE EXCEPTION 'DEPENDENCY_EXISTS';
|
||||
END IF;
|
||||
END;
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION can_update_task(_task_id uuid, _status_id uuid) RETURNS boolean
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
DECLARE
|
||||
-- Declare a variable to store whether the update can continue
|
||||
can_continue BOOLEAN;
|
||||
BEGIN
|
||||
-- First, check if the status is not in the "done" category
|
||||
SELECT EXISTS (
|
||||
SELECT 1
|
||||
FROM task_statuses ts
|
||||
WHERE ts.id = _status_id
|
||||
AND ts.project_id = (SELECT project_id FROM tasks WHERE id = _task_id)
|
||||
AND ts.category_id IN (
|
||||
SELECT id FROM sys_task_status_categories WHERE is_done IS FALSE
|
||||
)
|
||||
) INTO can_continue;
|
||||
|
||||
-- If the status is not "done", continue the process
|
||||
IF can_continue THEN
|
||||
RETURN TRUE;
|
||||
END IF;
|
||||
|
||||
-- If the status is "done", check if any dependent tasks are not completed
|
||||
SELECT NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM task_dependencies td
|
||||
LEFT JOIN tasks t ON t.id = td.related_task_id
|
||||
WHERE td.task_id = _task_id
|
||||
AND t.status_id NOT IN (
|
||||
SELECT id
|
||||
FROM task_statuses ts
|
||||
WHERE t.project_id = ts.project_id
|
||||
AND ts.category_id IN (
|
||||
SELECT id FROM sys_task_status_categories WHERE is_done IS TRUE
|
||||
)
|
||||
)
|
||||
) INTO can_continue;
|
||||
|
||||
-- Return whether the update can continue based on the dependent task completion check
|
||||
RETURN can_continue;
|
||||
END;
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION bulk_change_tasks_status(_body json, _userid uuid) RETURNS uuid[]
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
DECLARE
|
||||
_task JSON;
|
||||
_output JSON;
|
||||
_previous_status UUID;
|
||||
_failed_tasks UUID[];
|
||||
BEGIN
|
||||
|
||||
FOR _task IN SELECT * FROM JSON_ARRAY_ELEMENTS((_body ->> 'tasks')::JSON)
|
||||
LOOP
|
||||
IF can_update_task((_task ->> 'id')::UUID, (_body ->> 'status_id')::UUID)
|
||||
THEN
|
||||
-- Proceed with the update if the task is eligible for update
|
||||
_previous_status = (SELECT status_id FROM tasks WHERE id = (_task ->> 'id')::UUID);
|
||||
|
||||
UPDATE tasks SET status_id = (_body ->> 'status_id')::UUID WHERE id = (_task ->> 'id')::UUID;
|
||||
|
||||
IF (_previous_status IS DISTINCT FROM (_body ->> 'status_id')::UUID)
|
||||
THEN
|
||||
INSERT INTO task_activity_logs (task_id, team_id, attribute_type, user_id, log_type, old_value,
|
||||
new_value, project_id)
|
||||
VALUES ((_task ->> 'id')::UUID,
|
||||
(SELECT team_id
|
||||
FROM projects
|
||||
WHERE id = (SELECT project_id FROM tasks WHERE id = (_task ->> 'id')::UUID)),
|
||||
'status',
|
||||
_userId,
|
||||
'update',
|
||||
_previous_status,
|
||||
(_body ->> 'status_id')::UUID,
|
||||
(SELECT project_id FROM tasks WHERE id = (_task ->> 'id')::UUID));
|
||||
END IF;
|
||||
ELSE
|
||||
-- Add failed task IDs to the array
|
||||
_failed_tasks := ARRAY_APPEND(_failed_tasks, (_task ->> 'id')::UUID);
|
||||
END IF;
|
||||
|
||||
END LOOP;
|
||||
RETURN _failed_tasks;
|
||||
END
|
||||
$$;
|
||||
|
||||
CREATE OR REPLACE FUNCTION create_recurring_task_template(p_task_id uuid, p_schedule_id uuid) RETURNS uuid
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
DECLARE
|
||||
v_new_id UUID;
|
||||
BEGIN
|
||||
INSERT INTO task_recurring_templates (
|
||||
id,
|
||||
task_id,
|
||||
schedule_id,
|
||||
name,
|
||||
description,
|
||||
end_date,
|
||||
priority_id,
|
||||
project_id,
|
||||
assignees,
|
||||
labels
|
||||
)
|
||||
SELECT
|
||||
uuid_generate_v4(),
|
||||
t.id AS task_id,
|
||||
p_schedule_id,
|
||||
t.name,
|
||||
t.description,
|
||||
t.end_date,
|
||||
t.priority_id,
|
||||
t.project_id,
|
||||
COALESCE(
|
||||
(SELECT JSONB_AGG(JSONB_BUILD_OBJECT('project_member_id', tas.project_member_id, 'team_member_id', tas.team_member_id))
|
||||
FROM tasks_assignees tas
|
||||
WHERE tas.task_id = t.id),
|
||||
'[]'::JSONB
|
||||
) AS assignees,
|
||||
COALESCE(
|
||||
(SELECT JSONB_AGG(JSONB_BUILD_OBJECT('label_id', tla.label_id))
|
||||
FROM task_labels tla
|
||||
WHERE tla.task_id = t.id),
|
||||
'[]'::JSONB
|
||||
) AS labels
|
||||
FROM tasks t
|
||||
WHERE t.id = p_task_id
|
||||
RETURNING id INTO v_new_id;
|
||||
|
||||
RETURN v_new_id;
|
||||
END;
|
||||
$$;
|
||||
@@ -1,11 +1,7 @@
|
||||
-- Default ROLE : worklenz_client
|
||||
-- Default USER : worklenz_backend
|
||||
-- Change DATABASE_NAME, ROLE, PASSWORD and USER as needed.
|
||||
|
||||
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
|
||||
CREATE ROLE worklenz_client;
|
||||
|
||||
GRANT CONNECT ON DATABASE 'DATABASE_NAME' TO worklenz_client;
|
||||
GRANT CONNECT ON DATABASE worklenz_db TO worklenz_client;
|
||||
GRANT INSERT, SELECT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO worklenz_client;
|
||||
|
||||
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO worklenz_client;
|
||||
@@ -31,5 +27,5 @@ GRANT SELECT ON sys_project_statuses TO worklenz_client;
|
||||
REVOKE ALL PRIVILEGES ON sys_project_healths FROM worklenz_client;
|
||||
GRANT SELECT ON sys_project_healths TO worklenz_client;
|
||||
|
||||
CREATE USER worklenz_backend WITH PASSWORD 'PASSWORD';
|
||||
CREATE USER worklenz_backend WITH PASSWORD 'n?&bb24=aWmnw+G@';
|
||||
GRANT worklenz_client TO worklenz_backend;
|
||||
115
worklenz-backend/database/indexes.sql
Normal file
115
worklenz-backend/database/indexes.sql
Normal file
@@ -0,0 +1,115 @@
|
||||
-- Indexes
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS permissions_name_uindex
|
||||
ON permissions (name);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS bounced_emails_email_uindex
|
||||
ON bounced_emails (email);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS clients_id_team_id_index
|
||||
ON clients (id, team_id);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS clients_name_team_id_uindex
|
||||
ON clients (name, team_id);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS cpt_phases_name_project_uindex
|
||||
ON cpt_phases (name, template_id);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS cpt_task_phase_cpt_task_phase_uindex
|
||||
ON cpt_task_phases (task_id, phase_id);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS cpt_task_phase_task_id_uindex
|
||||
ON cpt_task_phases (task_id);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS cpt_task_statuses_template_id_name_uindex
|
||||
ON cpt_task_statuses (template_id, name);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS custom_project_templates_name_team_id_uindex
|
||||
ON custom_project_templates (name, team_id);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS job_titles_name_team_id_uindex
|
||||
ON job_titles (name, team_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS job_titles_team_id_index
|
||||
ON job_titles (team_id);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS licensing_coupon_codes_coupon_code_uindex
|
||||
ON licensing_coupon_codes (coupon_code);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS licensing_coupon_codes_redeemed_by_index
|
||||
ON licensing_coupon_codes (redeemed_by);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS licensing_pricing_plans_uindex
|
||||
ON licensing_pricing_plans (id);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS licensing_user_plans_uindex
|
||||
ON licensing_user_subscriptions (id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS licensing_user_subscriptions_user_id_index
|
||||
ON licensing_user_subscriptions (user_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS notification_settings_team_user_id_index
|
||||
ON notification_settings (team_id, user_id);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS personal_todo_list_index_uindex
|
||||
ON personal_todo_list (user_id, index);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS project_categories_name_team_id_uindex
|
||||
ON project_categories (name, team_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS project_comments_project_id_index
|
||||
ON project_comments (project_id);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS project_folders_team_id_key_uindex
|
||||
ON project_folders (team_id, key);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS project_folders_team_id_name_uindex
|
||||
ON project_folders (team_id, name);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS project_members_project_id_index
|
||||
ON project_members (project_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS project_members_project_id_member_id_index
|
||||
ON project_members (project_id, team_member_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS project_members_team_member_id_index
|
||||
ON project_members (team_member_id);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS project_members_team_member_project_uindex
|
||||
ON project_members (team_member_id, project_id);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS project_phases_name_project_uindex
|
||||
ON project_phases (name, project_id);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS project_subscribers_user_task_team_member_uindex
|
||||
ON project_subscribers (user_id, project_id, team_member_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS project_task_list_cols_index
|
||||
ON project_task_list_cols (project_id, index);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS project_task_list_cols_key_project_uindex
|
||||
ON project_task_list_cols (key, project_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS projects_folder_id_index
|
||||
ON projects (folder_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS projects_id_team_id_index
|
||||
ON projects (id, team_id);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS projects_key_team_id_uindex
|
||||
ON projects (key, team_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS projects_name_index
|
||||
ON projects (name);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS projects_name_team_id_uindex
|
||||
ON projects (name, team_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS projects_team_id_folder_id_index
|
||||
ON projects (team_id, folder_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS projects_team_id_index
|
||||
ON projects (team_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS projects_team_id_name_index
|
||||
ON projects (team_id, name);
|
||||
|
||||
0
worklenz-backend/database/migrations/.gitkeep
Normal file
0
worklenz-backend/database/migrations/.gitkeep
Normal file
2
worklenz-backend/database/migrations/README.md
Normal file
2
worklenz-backend/database/migrations/README.md
Normal file
@@ -0,0 +1,2 @@
|
||||
Migrations should be executed out in the sequence specified by the filename. They should be removed once the migrations
|
||||
have been released to all databases.
|
||||
47
worklenz-backend/database/text_length_checks.sql
Normal file
47
worklenz-backend/database/text_length_checks.sql
Normal file
@@ -0,0 +1,47 @@
|
||||
ALTER TABLE teams
|
||||
ADD CONSTRAINT teams_name_check CHECK (CHAR_LENGTH(name) <= 55);
|
||||
|
||||
ALTER TABLE clients
|
||||
ADD CONSTRAINT clients_name_check CHECK (CHAR_LENGTH(name) <= 60);
|
||||
|
||||
ALTER TABLE job_titles
|
||||
ADD CONSTRAINT job_titles_name_check CHECK (CHAR_LENGTH(name) <= 55);
|
||||
|
||||
ALTER TABLE users
|
||||
ADD CONSTRAINT users_name_check CHECK (CHAR_LENGTH(name) <= 55);
|
||||
|
||||
ALTER TABLE users
|
||||
ADD CONSTRAINT users_email_check CHECK (CHAR_LENGTH(email) <= 255);
|
||||
|
||||
ALTER TABLE projects
|
||||
ADD CONSTRAINT projects_name_check CHECK (CHAR_LENGTH(name) <= 100);
|
||||
|
||||
ALTER TABLE projects
|
||||
ADD CONSTRAINT projects_notes_check CHECK (CHAR_LENGTH(notes) <= 500);
|
||||
|
||||
ALTER TABLE task_statuses
|
||||
ADD CONSTRAINT task_statuses_name_check CHECK (CHAR_LENGTH(name) <= 50);
|
||||
|
||||
ALTER TABLE tasks
|
||||
ADD CONSTRAINT tasks_name_check CHECK (CHAR_LENGTH(name) <= 500);
|
||||
|
||||
ALTER TABLE tasks
|
||||
ADD CONSTRAINT tasks_description_check CHECK (CHAR_LENGTH(description) <= 500000);
|
||||
|
||||
ALTER TABLE team_labels
|
||||
ADD CONSTRAINT team_labels_name_check CHECK (CHAR_LENGTH(name) <= 40);
|
||||
|
||||
ALTER TABLE personal_todo_list
|
||||
ADD CONSTRAINT personal_todo_list_name_check CHECK (CHAR_LENGTH(name) <= 100);
|
||||
|
||||
ALTER TABLE personal_todo_list
|
||||
ADD CONSTRAINT personal_todo_list_description_check CHECK (CHAR_LENGTH(description) <= 200);
|
||||
|
||||
ALTER TABLE task_work_log
|
||||
ADD CONSTRAINT task_work_log_description_check CHECK (CHAR_LENGTH(description) <= 500);
|
||||
|
||||
ALTER TABLE task_comment_contents
|
||||
ADD CONSTRAINT task_comment_contents_name_check CHECK (CHAR_LENGTH(text_content) <= 500);
|
||||
|
||||
ALTER TABLE task_attachments
|
||||
ADD CONSTRAINT task_attachments_name_check CHECK (CHAR_LENGTH(name) <= 110);
|
||||
75
worklenz-backend/database/truncate.sql
Normal file
75
worklenz-backend/database/truncate.sql
Normal file
@@ -0,0 +1,75 @@
|
||||
TRUNCATE TABLE public.pg_sessions RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.email_invitations RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.task_labels RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.team_labels RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.tasks_assignees RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.project_members RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.project_access_levels RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.role_permissions RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.permissions RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.project_logs RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.personal_todo_list RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.user_notifications RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.task_work_log RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.task_comment_contents RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.task_comments RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.team_members RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.job_titles RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.roles RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.task_attachments RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.worklenz_alerts RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.favorite_projects RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.archived_projects RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.shared_projects RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.task_templates_tasks RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.task_templates RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.notification_settings RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.task_updates RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.task_timers RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.tasks RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.task_priorities RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.task_statuses RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.sys_task_status_categories RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.project_task_list_cols RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.projects RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.clients RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.teams, public.users RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.timezones RESTART IDENTITY CASCADE;
|
||||
|
||||
TRUNCATE TABLE public.sys_project_statuses RESTART IDENTITY CASCADE;
|
||||
2533
worklenz-backend/database/worklenz_db_revision_1.svg
Normal file
2533
worklenz-backend/database/worklenz_db_revision_1.svg
Normal file
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 265 KiB |
7392
worklenz-backend/database/worklenz_db_revision_2.svg
Normal file
7392
worklenz-backend/database/worklenz_db_revision_2.svg
Normal file
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 737 KiB |
Reference in New Issue
Block a user