forlogic-core 2.4.12 → 2.4.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,172 @@
1
+ USE [qualiex_common]
2
+ GO
3
+
4
+ begin tran
5
+
6
+ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[import].[occurrences_categories_staging]') AND type IN (N'U'))
7
+ DROP TABLE [import].[occurrences_categories_staging]
8
+ GO
9
+
10
+ CREATE TABLE [import].[occurrences_categories_staging](
11
+ [id_batch] [uniqueidentifier] NOT NULL,
12
+ [row_num] [int] NOT NULL,
13
+ [name] [nvarchar](150) NOT NULL,
14
+ [description] [nvarchar](1000) NULL,
15
+ [is_active] [varchar](20) NULL,
16
+ [id_method] [int] NOT NULL,
17
+ [icon] [varchar](30) NULL,
18
+ [days_causes_analysis] [varchar](10) NULL,
19
+ [days_action_plan_elaboration] [varchar](10) NULL,
20
+ [days_action_plan_execution] [varchar](10) NULL,
21
+ [days_effectiveness_check] [varchar](10) NULL,
22
+ [days_standardization] [varchar](10) NULL,
23
+ [days_evaluation] [varchar](10) NULL,
24
+ [active_cause_analysis] [varchar](10) NULL,
25
+ [active_effectiveness_check] [varchar](10) NULL,
26
+ [active_standardization] [varchar](10) NULL,
27
+ [aprove_cause_analysis] [varchar](10) NULL,
28
+ [aprove_action_plan_elaboration] [varchar](10) NULL,
29
+ [aprove_action_plan_execution] [varchar](10) NULL,
30
+ [aprove_effectiveness_check] [varchar](10) NULL,
31
+ [aprove_standardization] [varchar](10) NULL,
32
+ [aprove_evaluation] [varchar](10) NULL,
33
+ [all_types_associated] [varchar](10) NULL,
34
+ [id_company] [char](8) NOT NULL,
35
+ CONSTRAINT [pk_occurrences_categories_staging] PRIMARY KEY CLUSTERED
36
+ (
37
+ [id_batch] ASC,
38
+ [row_num] ASC
39
+ ) ON [PRIMARY]
40
+ ) ON [PRIMARY]
41
+ GO
42
+
43
+ CREATE OR ALTER PROCEDURE [import].[validate_occurrences_categories]
44
+ @id_batch UNIQUEIDENTIFIER
45
+ AS
46
+ BEGIN
47
+ SET NOCOUNT ON;
48
+
49
+ -- Validação 1: Nome duplicado no arquivo
50
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
51
+ SELECT @id_batch, s.row_num, 'Nome duplicado no arquivo'
52
+ FROM (
53
+ SELECT *, COUNT(*) OVER (PARTITION BY name) AS cnt
54
+ FROM import.occurrences_categories_staging WITH (NOLOCK)
55
+ WHERE id_batch = @id_batch
56
+ ) s
57
+ WHERE s.cnt > 1;
58
+
59
+ -- Validação 2: Nome já existente na produção
60
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
61
+ SELECT @id_batch, s.row_num, 'Categoria de ocorrência já existe na base para esta unidade'
62
+ FROM import.occurrences_categories_staging s WITH (NOLOCK)
63
+ INNER JOIN occurrences.categories t WITH (NOLOCK)
64
+ ON t.name = s.name COLLATE Latin1_General_CS_AS
65
+ AND t.removed = 0
66
+ AND t.id_company = s.id_company COLLATE Latin1_General_CS_AS
67
+ WHERE s.id_batch = @id_batch;
68
+
69
+ -- Validação 3: Situação (is_active) inválida
70
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
71
+ SELECT @id_batch, s.row_num, 'Situação inválida (selecione Ativo ou Inativo na planilha)'
72
+ FROM import.occurrences_categories_staging s WITH (NOLOCK)
73
+ WHERE s.id_batch = @id_batch
74
+ AND ISNULL(s.is_active, '') COLLATE Latin1_General_CS_AS NOT IN ('Ativo', 'Inativo');
75
+
76
+ -- Validação 4: Booleanos inválidos (Sim / Não)
77
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
78
+ SELECT @id_batch, s.row_num, 'Valor inválido para campos de Sim/Não (Certifique-se de escolher Sim ou Não na planilha)'
79
+ FROM import.occurrences_categories_staging s WITH (NOLOCK)
80
+ WHERE s.id_batch = @id_batch
81
+ AND (
82
+ (s.active_cause_analysis IS NOT NULL AND s.active_cause_analysis COLLATE Latin1_General_CS_AS NOT IN ('Sim','Não'))
83
+ OR (s.active_effectiveness_check IS NOT NULL AND s.active_effectiveness_check COLLATE Latin1_General_CS_AS NOT IN ('Sim','Não'))
84
+ OR (s.active_standardization IS NOT NULL AND s.active_standardization COLLATE Latin1_General_CS_AS NOT IN ('Sim','Não'))
85
+ OR (s.aprove_cause_analysis IS NOT NULL AND s.aprove_cause_analysis COLLATE Latin1_General_CS_AS NOT IN ('Sim','Não'))
86
+ OR (s.aprove_action_plan_elaboration IS NOT NULL AND s.aprove_action_plan_elaboration COLLATE Latin1_General_CS_AS NOT IN ('Sim','Não'))
87
+ OR (s.aprove_action_plan_execution IS NOT NULL AND s.aprove_action_plan_execution COLLATE Latin1_General_CS_AS NOT IN ('Sim','Não'))
88
+ OR (s.aprove_effectiveness_check IS NOT NULL AND s.aprove_effectiveness_check COLLATE Latin1_General_CS_AS NOT IN ('Sim','Não'))
89
+ OR (s.aprove_standardization IS NOT NULL AND s.aprove_standardization COLLATE Latin1_General_CS_AS NOT IN ('Sim','Não'))
90
+ OR (s.aprove_evaluation IS NOT NULL AND s.aprove_evaluation COLLATE Latin1_General_CS_AS NOT IN ('Sim','Não'))
91
+ OR (s.all_types_associated IS NOT NULL AND s.all_types_associated COLLATE Latin1_General_CS_AS NOT IN ('Sim','Não'))
92
+ );
93
+
94
+ -- Validação 5: Prazos (Dias) devem ser numéricos
95
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
96
+ SELECT @id_batch, s.row_num, 'Os valores de prazos/dias devem ser números inteiros'
97
+ FROM import.occurrences_categories_staging s WITH (NOLOCK)
98
+ WHERE s.id_batch = @id_batch
99
+ AND (
100
+ (s.days_causes_analysis IS NOT NULL AND TRY_CAST(s.days_causes_analysis AS INT) IS NULL)
101
+ OR (s.days_action_plan_elaboration IS NOT NULL AND TRY_CAST(s.days_action_plan_elaboration AS INT) IS NULL)
102
+ OR (s.days_action_plan_execution IS NOT NULL AND TRY_CAST(s.days_action_plan_execution AS INT) IS NULL)
103
+ OR (s.days_effectiveness_check IS NOT NULL AND TRY_CAST(s.days_effectiveness_check AS INT) IS NULL)
104
+ OR (s.days_standardization IS NOT NULL AND TRY_CAST(s.days_standardization AS INT) IS NULL)
105
+ OR (s.days_evaluation IS NOT NULL AND TRY_CAST(s.days_evaluation AS INT) IS NULL)
106
+ );
107
+
108
+ -- INSERÇÃO DOS DADOS VÁLIDOS
109
+ INSERT INTO occurrences.categories
110
+ (
111
+ id_company, id_method, name, description, icon, is_active, creation_date, last_modified, removed,
112
+ days_causes_analysis, days_action_plan_elaboration, days_action_plan_execution,
113
+ days_effectiveness_check, days_standardization, days_evaluation,
114
+ active_cause_analysis, active_effectiveness_check, active_standardization,
115
+ aprove_cause_analysis, aprove_action_plan_elaboration, aprove_action_plan_execution,
116
+ aprove_effectiveness_check, aprove_standardization, aprove_evaluation, all_types_associated
117
+ )
118
+ SELECT
119
+ s.id_company,
120
+ ISNULL(s.id_method, 1) AS id_method,
121
+ s.name,
122
+ NULLIF(s.description, '') AS description,
123
+ NULLIF(s.icon, '') AS icon,
124
+ CASE WHEN s.is_active COLLATE Latin1_General_CS_AS = 'Inativo' THEN 0 ELSE 1 END AS is_active,
125
+ SYSDATETIMEOFFSET() AS creation_date,
126
+ SYSDATETIMEOFFSET() AS last_modified,
127
+ 0 AS removed,
128
+ TRY_CAST(s.days_causes_analysis AS INT),
129
+ ISNULL(TRY_CAST(s.days_action_plan_elaboration AS INT), 0),
130
+ ISNULL(TRY_CAST(s.days_action_plan_execution AS INT), 0),
131
+ TRY_CAST(s.days_effectiveness_check AS INT),
132
+ TRY_CAST(s.days_standardization AS INT),
133
+ TRY_CAST(s.days_evaluation AS INT),
134
+ CASE WHEN s.active_cause_analysis COLLATE Latin1_General_CS_AS = 'Sim' THEN 1 ELSE 0 END,
135
+ CASE WHEN s.active_effectiveness_check COLLATE Latin1_General_CS_AS = 'Sim' THEN 1 ELSE 0 END,
136
+ CASE WHEN s.active_standardization COLLATE Latin1_General_CS_AS = 'Sim' THEN 1 ELSE 0 END,
137
+ CASE WHEN s.aprove_cause_analysis COLLATE Latin1_General_CS_AS = 'Sim' THEN 1 ELSE 0 END,
138
+ CASE WHEN s.aprove_action_plan_elaboration COLLATE Latin1_General_CS_AS = 'Sim' THEN 1 ELSE 0 END,
139
+ CASE WHEN s.aprove_action_plan_execution COLLATE Latin1_General_CS_AS = 'Sim' THEN 1 ELSE 0 END,
140
+ CASE WHEN s.aprove_effectiveness_check COLLATE Latin1_General_CS_AS = 'Sim' THEN 1 ELSE 0 END,
141
+ CASE WHEN s.aprove_standardization COLLATE Latin1_General_CS_AS = 'Sim' THEN 1 ELSE 0 END,
142
+ CASE WHEN s.aprove_evaluation COLLATE Latin1_General_CS_AS = 'Sim' THEN 1 ELSE 0 END,
143
+ CASE WHEN s.all_types_associated COLLATE Latin1_General_CS_AS = 'Sim' THEN 1 ELSE 0 END
144
+ FROM import.occurrences_categories_staging s WITH (NOLOCK)
145
+ WHERE s.id_batch = @id_batch
146
+ AND NOT EXISTS (SELECT 1 FROM import.errors e WHERE e.id_batch = s.id_batch AND e.row_num = s.row_num);
147
+
148
+ END
149
+ GO
150
+
151
+ CREATE OR ALTER PROCEDURE [import].[get_errors_occurrences_categories]
152
+ (
153
+ @id_batch UNIQUEIDENTIFIER
154
+ )
155
+ AS
156
+ BEGIN
157
+ SET NOCOUNT ON;
158
+
159
+ SELECT
160
+ STRING_AGG(CAST(e.error_msg AS NVARCHAR(MAX)), '; ') WITHIN GROUP (ORDER BY e.error_msg) AS error_msg,
161
+ e.row_num,
162
+ s.name
163
+ FROM import.errors e WITH (NOLOCK)
164
+ JOIN import.occurrences_categories_staging s WITH (NOLOCK) ON s.row_num = e.row_num AND s.id_batch = e.id_batch
165
+ WHERE e.id_batch = @id_batch
166
+ GROUP BY e.row_num, s.name
167
+ ORDER BY e.row_num;
168
+ END
169
+ GO
170
+
171
+ -- commit
172
+ -- rollback
@@ -0,0 +1,236 @@
1
+ USE [qualiex_common]
2
+ GO
3
+
4
+ begin tran
5
+
6
+ IF EXISTS (SELECT * FROM sys.objects
7
+ WHERE object_id = OBJECT_ID(N'[import].[risks_staging]')
8
+ AND type IN (N'U'))
9
+ DROP TABLE [import].[risks_staging]
10
+ GO
11
+
12
+ SET ANSI_NULLS ON
13
+ GO
14
+ SET QUOTED_IDENTIFIER ON
15
+ GO
16
+
17
+ CREATE TABLE [import].[risks_staging](
18
+ [id_batch] [uniqueidentifier] NOT NULL,
19
+ [row_num] [int] NOT NULL,
20
+ [code] [nvarchar](10) NOT NULL,
21
+ [name] [nvarchar](200) NOT NULL,
22
+ [description] [nvarchar](max) NULL,
23
+ [group_name] [nvarchar](200) NOT NULL,
24
+ [responsible_email] [varchar](150) NOT NULL,
25
+ [place_name] [nvarchar](200) NULL,
26
+ [category_name] [nvarchar](200) NULL,
27
+ [is_active] [varchar](20) NULL,
28
+ [id_creation_user] [char](8) NOT NULL,
29
+ [id_company] [char](8) NOT NULL,
30
+ CONSTRAINT [pk_risks_staging] PRIMARY KEY CLUSTERED
31
+ (
32
+ [id_batch] ASC,
33
+ [row_num] ASC
34
+ ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
35
+ ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON,
36
+ OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
37
+ ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
38
+ GO
39
+
40
+ CREATE OR ALTER PROCEDURE [import].[validate_risks]
41
+ @id_batch UNIQUEIDENTIFIER
42
+ AS
43
+ BEGIN
44
+ SET NOCOUNT ON;
45
+
46
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
47
+ SELECT @id_batch, s.row_num, 'Código duplicado no arquivo'
48
+ FROM (
49
+ SELECT *, COUNT(*) OVER (PARTITION BY code) AS cnt
50
+ FROM import.risks_staging WITH (NOLOCK)
51
+ WHERE id_batch = @id_batch
52
+ AND NULLIF(RTRIM(LTRIM(code)), '') IS NOT NULL
53
+ ) s
54
+ WHERE s.cnt > 1;
55
+
56
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
57
+ SELECT @id_batch, s.row_num, 'Código de risco já existe na base para esta unidade'
58
+ FROM import.risks_staging s WITH (NOLOCK)
59
+ INNER JOIN risks.risks t WITH (NOLOCK)
60
+ ON t.code COLLATE Latin1_General_CS_AS = s.code COLLATE Latin1_General_CS_AS
61
+ AND t.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
62
+ AND t.removed = 0
63
+ WHERE s.id_batch = @id_batch;
64
+
65
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
66
+ SELECT @id_batch, s.row_num, 'Nome do risco duplicado no arquivo'
67
+ FROM (
68
+ SELECT *, COUNT(*) OVER (PARTITION BY name) AS cnt
69
+ FROM import.risks_staging WITH (NOLOCK)
70
+ WHERE id_batch = @id_batch
71
+ ) s
72
+ WHERE s.cnt > 1;
73
+
74
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
75
+ SELECT @id_batch, s.row_num, 'Nome do risco já existe na base para esta unidade'
76
+ FROM import.risks_staging s WITH (NOLOCK)
77
+ INNER JOIN risks.risks t WITH (NOLOCK)
78
+ ON t.name COLLATE Latin1_General_CS_AS = s.name COLLATE Latin1_General_CS_AS
79
+ AND t.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
80
+ AND t.removed = 0
81
+ WHERE s.id_batch = @id_batch;
82
+
83
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
84
+ SELECT @id_batch, s.row_num, 'Código, Nome, Grupo e Responsável são obrigatórios'
85
+ FROM import.risks_staging s WITH (NOLOCK)
86
+ WHERE s.id_batch = @id_batch
87
+ AND (
88
+ NULLIF(RTRIM(LTRIM(s.code)), '') IS NULL OR
89
+ NULLIF(RTRIM(LTRIM(s.name)), '') IS NULL OR
90
+ NULLIF(RTRIM(LTRIM(s.group_name)), '') IS NULL OR
91
+ NULLIF(RTRIM(LTRIM(s.responsible_email)), '') IS NULL
92
+ );
93
+
94
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
95
+ SELECT @id_batch, s.row_num, 'Situação inválida (selecione Ativo ou Inativo na planilha)'
96
+ FROM import.risks_staging s WITH (NOLOCK)
97
+ WHERE s.id_batch = @id_batch
98
+ AND ISNULL(s.is_active, '') COLLATE Latin1_General_CS_AS NOT IN ('Ativo', 'Inativo');
99
+
100
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
101
+ SELECT @id_batch, s.row_num, 'Grupo de risco não encontrado ou inativo'
102
+ FROM import.risks_staging s WITH (NOLOCK)
103
+ LEFT JOIN risks.groups g WITH (NOLOCK)
104
+ ON g.name COLLATE Latin1_General_CS_AS = s.group_name COLLATE Latin1_General_CS_AS
105
+ AND g.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
106
+ AND g.removed = 0
107
+ WHERE s.id_batch = @id_batch
108
+ AND NULLIF(RTRIM(LTRIM(s.group_name)), '') IS NOT NULL
109
+ AND g.id IS NULL;
110
+
111
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
112
+ SELECT @id_batch, s.row_num, 'Usuário responsável não encontrado'
113
+ FROM import.risks_staging s WITH (NOLOCK)
114
+ LEFT JOIN dbo.users u WITH (NOLOCK)
115
+ ON u.email COLLATE Latin1_General_CS_AS = s.responsible_email COLLATE Latin1_General_CS_AS
116
+ AND u.removed = 0
117
+ WHERE s.id_batch = @id_batch
118
+ AND NULLIF(RTRIM(LTRIM(s.responsible_email)), '') IS NOT NULL
119
+ AND u.id IS NULL;
120
+
121
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
122
+ SELECT @id_batch, s.row_num, 'Local não encontrado ou inativo'
123
+ FROM import.risks_staging s WITH (NOLOCK)
124
+ LEFT JOIN common.places p WITH (NOLOCK)
125
+ ON p.title COLLATE Latin1_General_CS_AS = s.place_name COLLATE Latin1_General_CS_AS
126
+ AND p.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
127
+ AND p.removed = 0
128
+ WHERE s.id_batch = @id_batch
129
+ AND NULLIF(RTRIM(LTRIM(s.place_name)), '') IS NOT NULL
130
+ AND p.id IS NULL;
131
+
132
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
133
+ SELECT @id_batch, s.row_num, 'Categoria não encontrada ou inativa'
134
+ FROM import.risks_staging s WITH (NOLOCK)
135
+ LEFT JOIN risks.categories c WITH (NOLOCK)
136
+ ON c.title COLLATE Latin1_General_CS_AS = s.category_name COLLATE Latin1_General_CS_AS
137
+ AND c.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
138
+ AND c.removed = 0
139
+ WHERE s.id_batch = @id_batch
140
+ AND NULLIF(RTRIM(LTRIM(s.category_name)), '') IS NOT NULL
141
+ AND c.id IS NULL;
142
+
143
+ INSERT INTO risks.risks
144
+ (
145
+ id_company,
146
+ code,
147
+ name,
148
+ description,
149
+ description_text,
150
+ id_group,
151
+ id_place,
152
+ id_category,
153
+ id_creation_user,
154
+ id_responsible_user,
155
+ creation_date,
156
+ last_modified,
157
+ is_active,
158
+ removed
159
+ )
160
+ SELECT
161
+ s.id_company,
162
+ LTRIM(RTRIM(s.code)) AS code,
163
+ s.name,
164
+ NULLIF(s.description, '') AS description,
165
+ NULLIF(s.description, '') AS description_text,
166
+ g.id AS id_group,
167
+ p.id AS id_place,
168
+ c.id AS id_category,
169
+ s.id_creation_user,
170
+ u.id AS id_responsible_user,
171
+ SYSDATETIMEOFFSET() AS creation_date,
172
+ SYSDATETIMEOFFSET() AS last_modified,
173
+ CASE WHEN s.is_active COLLATE Latin1_General_CS_AS = 'Inativo' THEN 0 ELSE 1 END AS is_active,
174
+ 0 AS removed
175
+ FROM import.risks_staging s WITH (NOLOCK)
176
+ LEFT JOIN risks.groups g WITH (NOLOCK)
177
+ ON g.name COLLATE Latin1_General_CS_AS = s.group_name COLLATE Latin1_General_CS_AS
178
+ AND g.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
179
+ AND g.removed = 0
180
+ LEFT JOIN dbo.users u WITH (NOLOCK)
181
+ ON u.email COLLATE Latin1_General_CS_AS = s.responsible_email COLLATE Latin1_General_CS_AS
182
+ AND u.removed = 0
183
+ LEFT JOIN common.places p WITH (NOLOCK)
184
+ ON p.title COLLATE Latin1_General_CS_AS = s.place_name COLLATE Latin1_General_CS_AS
185
+ AND p.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
186
+ AND p.removed = 0
187
+ LEFT JOIN risks.categories c WITH (NOLOCK)
188
+ ON c.title COLLATE Latin1_General_CS_AS = s.category_name COLLATE Latin1_General_CS_AS
189
+ AND c.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
190
+ AND c.removed = 0
191
+ WHERE s.id_batch = @id_batch
192
+ AND NOT EXISTS (
193
+ SELECT 1
194
+ FROM import.errors e
195
+ WHERE e.id_batch = s.id_batch
196
+ AND e.row_num = s.row_num
197
+ );
198
+
199
+ END
200
+ GO
201
+
202
+ CREATE OR ALTER PROCEDURE [import].[get_errors_risks]
203
+ (
204
+ @id_batch UNIQUEIDENTIFIER
205
+ )
206
+ AS
207
+ BEGIN
208
+ SET NOCOUNT ON;
209
+
210
+ SELECT
211
+ STRING_AGG(
212
+ CAST(e.error_msg AS NVARCHAR(MAX)),
213
+ '; '
214
+ ) WITHIN GROUP (ORDER BY e.error_msg) AS error_msg,
215
+
216
+ e.row_num,
217
+ s.code,
218
+ s.name,
219
+ s.id_creation_user
220
+
221
+ FROM import.errors e WITH (NOLOCK)
222
+ JOIN import.risks_staging s WITH (NOLOCK)
223
+ ON s.row_num = e.row_num
224
+ AND s.id_batch = e.id_batch
225
+ WHERE e.id_batch = @id_batch
226
+ GROUP BY
227
+ e.row_num,
228
+ s.code,
229
+ s.name,
230
+ s.id_creation_user
231
+ ORDER BY e.row_num;
232
+ END
233
+ GO
234
+
235
+ -- commit
236
+ -- rollback
@@ -0,0 +1,221 @@
1
+ USE [qualiex_common]
2
+ GO
3
+
4
+ begin tran
5
+
6
+ IF EXISTS (SELECT * FROM sys.objects
7
+ WHERE object_id = OBJECT_ID(N'[import].[risks_categories_staging]')
8
+ AND type IN (N'U'))
9
+ DROP TABLE [import].[risks_categories_staging]
10
+ GO
11
+
12
+ CREATE TABLE [import].[risks_categories_staging](
13
+ [id_batch] [uniqueidentifier] NOT NULL,
14
+ [row_num] [int] NOT NULL,
15
+ [title] [varchar](200) NOT NULL,
16
+ [icon] [varchar](30) NULL,
17
+ [color] [nvarchar](20) NULL,
18
+ [description] [nvarchar](max) NULL,
19
+ [is_active] [varchar](20) NULL,
20
+ [has_risks_reduction] [varchar](20) NULL,
21
+ [periodicity_value] [varchar](20) NULL,
22
+ [id_category_periodicity_type] [int] NULL,
23
+ [id_category_periodicity_unit_type] [int] NULL,
24
+ [id_creation_user] [char](8) NOT NULL,
25
+ [id_company] [char](8) NOT NULL,
26
+ CONSTRAINT [pk_risks_categories_staging] PRIMARY KEY CLUSTERED
27
+ (
28
+ [id_batch] ASC,
29
+ [row_num] ASC
30
+ ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
31
+ ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON,
32
+ OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
33
+ ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
34
+ GO
35
+
36
+ CREATE OR ALTER PROCEDURE [import].[validate_risks_categories]
37
+ @id_batch UNIQUEIDENTIFIER
38
+ AS
39
+ BEGIN
40
+ SET NOCOUNT ON;
41
+
42
+ -- Validação 1: Título duplicado no arquivo
43
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
44
+ SELECT @id_batch, s.row_num, 'Título duplicado no arquivo'
45
+ FROM (
46
+ SELECT *, COUNT(*) OVER (PARTITION BY title) AS cnt
47
+ FROM import.risks_categories_staging WITH (NOLOCK)
48
+ WHERE id_batch = @id_batch
49
+ ) s
50
+ WHERE s.cnt > 1;
51
+
52
+ -- Validação 2: Título já existente na produção (mesma unidade)
53
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
54
+ SELECT @id_batch, s.row_num, 'Categoria já existe na base para esta unidade'
55
+ FROM import.risks_categories_staging s WITH (NOLOCK)
56
+ INNER JOIN risks.risks_categories t WITH (NOLOCK)
57
+ ON t.title = s.title COLLATE Latin1_General_CS_AS
58
+ AND t.removed = 0
59
+ AND t.id_company = s.id_company COLLATE Latin1_General_CS_AS
60
+ WHERE s.id_batch = @id_batch;
61
+
62
+ -- Validação 3: Situação (is_active) inválida - Validação Estrita
63
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
64
+ SELECT @id_batch, s.row_num, 'Situação inválida (selecione Ativo ou Inativo na planilha)'
65
+ FROM import.risks_categories_staging s WITH (NOLOCK)
66
+ WHERE s.id_batch = @id_batch
67
+ AND ISNULL(s.is_active, '') COLLATE Latin1_General_CS_AS NOT IN ('Ativo', 'Inativo', '');
68
+
69
+ -- Validação 4: Redução de riscos (has_risks_reduction) inválida - Validação Estrita
70
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
71
+ SELECT @id_batch, s.row_num, 'Valor inválido para redução de riscos (selecione Sim ou Não na planilha)'
72
+ FROM import.risks_categories_staging s WITH (NOLOCK)
73
+ WHERE s.id_batch = @id_batch
74
+ AND s.has_risks_reduction IS NOT NULL
75
+ AND s.has_risks_reduction COLLATE Latin1_General_CS_AS NOT IN ('Sim', 'Não');
76
+
77
+ -- Validação 5: Valor de periodicidade (periodicity_value) deve ser um número inteiro
78
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
79
+ SELECT @id_batch, s.row_num, 'O valor da periodicidade deve ser um número inteiro válido'
80
+ FROM import.risks_categories_staging s WITH (NOLOCK)
81
+ WHERE s.id_batch = @id_batch
82
+ AND s.periodicity_value IS NOT NULL
83
+ AND TRY_CAST(s.periodicity_value AS INT) IS NULL;
84
+
85
+ -- Validação 6: Tipo de periodicidade (id_category_periodicity_type) obrigatório e válido
86
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
87
+ SELECT @id_batch, s.row_num, 'Tipo de periodicidade é obrigatório (Sem periodicidade, Padrão ou Definido pela análise anterior)'
88
+ FROM import.risks_categories_staging s WITH (NOLOCK)
89
+ WHERE s.id_batch = @id_batch
90
+ AND (s.id_category_periodicity_type IS NULL
91
+ OR s.id_category_periodicity_type NOT IN (1, 2, 3));
92
+
93
+ -- Validação 7: Se Tipo = 2 (Padrão), Valor da periodicidade é obrigatório e > 0
94
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
95
+ SELECT @id_batch, s.row_num, 'Valor da periodicidade é obrigatório e deve ser maior que zero quando o Tipo é "Padrão"'
96
+ FROM import.risks_categories_staging s WITH (NOLOCK)
97
+ WHERE s.id_batch = @id_batch
98
+ AND s.id_category_periodicity_type = 2
99
+ AND (s.periodicity_value IS NULL
100
+ OR TRY_CAST(s.periodicity_value AS INT) IS NULL
101
+ OR TRY_CAST(s.periodicity_value AS INT) <= 0);
102
+
103
+ -- Validação 8: Se Tipo = 2 (Padrão), Unidade de tempo é obrigatória
104
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
105
+ SELECT @id_batch, s.row_num, 'Unidade de tempo é obrigatória quando o Tipo é "Padrão" (Dia, Semana, Mês ou Ano)'
106
+ FROM import.risks_categories_staging s WITH (NOLOCK)
107
+ WHERE s.id_batch = @id_batch
108
+ AND s.id_category_periodicity_type = 2
109
+ AND (s.id_category_periodicity_unit_type IS NULL
110
+ OR s.id_category_periodicity_unit_type NOT IN (1, 2, 3, 4));
111
+
112
+ -- Validação 9: Unidade de tempo, se preenchida, deve estar no intervalo 1..4
113
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
114
+ SELECT @id_batch, s.row_num, 'Unidade de tempo inválida (selecione Dia, Semana, Mês ou Ano na planilha)'
115
+ FROM import.risks_categories_staging s WITH (NOLOCK)
116
+ WHERE s.id_batch = @id_batch
117
+ AND s.id_category_periodicity_unit_type IS NOT NULL
118
+ AND s.id_category_periodicity_unit_type NOT IN (1, 2, 3, 4);
119
+
120
+
121
+ -- INSERÇÃO DOS DADOS VÁLIDOS
122
+ INSERT INTO risks.risks_categories
123
+ (
124
+ id_company,
125
+ title,
126
+ icon,
127
+ color,
128
+ is_active,
129
+ description,
130
+ description_text,
131
+ has_risks_reduction,
132
+ periodicity_value,
133
+ id_category_periodicity_type,
134
+ id_category_periodicity_unit_type,
135
+ id_creation_user,
136
+ id_last_modified_user,
137
+ creation_date,
138
+ last_modified,
139
+ removed
140
+ )
141
+ SELECT
142
+ s.id_company,
143
+ s.title,
144
+ NULLIF(s.icon, '') AS icon,
145
+ COALESCE(NULLIF(s.color, ''), '#000000ff') AS color,
146
+
147
+ CASE
148
+ WHEN s.is_active COLLATE Latin1_General_CS_AS = 'Inativo' THEN 0
149
+ ELSE 1
150
+ END AS is_active,
151
+
152
+ NULLIF(s.description, '') AS description,
153
+ NULLIF(s.description, '') AS description_text,
154
+
155
+ CASE
156
+ WHEN s.has_risks_reduction COLLATE Latin1_General_CS_AS = 'Sim' THEN 1
157
+ WHEN s.has_risks_reduction IS NOT NULL THEN 0
158
+ ELSE NULL
159
+ END AS has_risks_reduction,
160
+
161
+ CASE
162
+ WHEN s.id_category_periodicity_type = 2 THEN TRY_CAST(s.periodicity_value AS INT)
163
+ ELSE NULL
164
+ END AS periodicity_value,
165
+
166
+ s.id_category_periodicity_type,
167
+ CASE
168
+ WHEN s.id_category_periodicity_type = 2 THEN s.id_category_periodicity_unit_type
169
+ ELSE NULL
170
+ END AS id_category_periodicity_unit_type,
171
+
172
+ s.id_creation_user,
173
+ s.id_creation_user AS id_last_modified_user,
174
+ SYSDATETIMEOFFSET() AS creation_date,
175
+ SYSDATETIMEOFFSET() AS last_modified,
176
+ 0 AS removed
177
+ FROM import.risks_categories_staging s WITH (NOLOCK)
178
+ WHERE s.id_batch = @id_batch
179
+ AND NOT EXISTS (
180
+ SELECT 1
181
+ FROM import.errors e
182
+ WHERE e.id_batch = s.id_batch
183
+ AND e.row_num = s.row_num
184
+ );
185
+
186
+ END
187
+ GO
188
+
189
+ CREATE OR ALTER PROCEDURE [import].[get_errors_risks_categories]
190
+ (
191
+ @id_batch UNIQUEIDENTIFIER
192
+ )
193
+ AS
194
+ BEGIN
195
+ SET NOCOUNT ON;
196
+
197
+ SELECT
198
+ STRING_AGG(
199
+ CAST(e.error_msg AS NVARCHAR(MAX)),
200
+ '; '
201
+ ) WITHIN GROUP (ORDER BY e.error_msg) AS error_msg,
202
+
203
+ e.row_num,
204
+ s.title,
205
+ s.id_creation_user
206
+
207
+ FROM import.errors e WITH (NOLOCK)
208
+ JOIN import.risks_categories_staging s WITH (NOLOCK)
209
+ ON s.row_num = e.row_num
210
+ AND s.id_batch = e.id_batch
211
+ WHERE e.id_batch = @id_batch
212
+ GROUP BY
213
+ e.row_num,
214
+ s.title,
215
+ s.id_creation_user
216
+ ORDER BY e.row_num;
217
+ END
218
+ GO
219
+
220
+ -- commit
221
+ -- rollback