forlogic-core 2.4.12 → 2.4.14

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,198 @@
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_evaluation] [varchar](10) NULL,
28
+ [all_types_associated] [varchar](10) NULL,
29
+ [id_rule_prioritization] [char](8) NULL,
30
+ [id_company] [char](8) NOT NULL,
31
+ CONSTRAINT [pk_occurrences_categories_staging] PRIMARY KEY CLUSTERED
32
+ (
33
+ [id_batch] ASC,
34
+ [row_num] ASC
35
+ ) ON [PRIMARY]
36
+ ) ON [PRIMARY]
37
+ GO
38
+
39
+ CREATE OR ALTER PROCEDURE [import].[validate_occurrences_categories]
40
+ @id_batch UNIQUEIDENTIFIER
41
+ AS
42
+ BEGIN
43
+ SET NOCOUNT ON;
44
+
45
+ -- Validação 1: Nome duplicado no arquivo
46
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
47
+ SELECT @id_batch, s.row_num, 'Nome duplicado no arquivo'
48
+ FROM (
49
+ SELECT *, COUNT(*) OVER (PARTITION BY name) AS cnt
50
+ FROM import.occurrences_categories_staging WITH (NOLOCK)
51
+ WHERE id_batch = @id_batch
52
+ ) s
53
+ WHERE s.cnt > 1;
54
+
55
+ -- Validação 2: Nome já existente na produção
56
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
57
+ SELECT @id_batch, s.row_num, 'Categoria de ocorrência já existe na base para esta unidade'
58
+ FROM import.occurrences_categories_staging s WITH (NOLOCK)
59
+ INNER JOIN occurrences.categories t WITH (NOLOCK)
60
+ ON t.name = s.name COLLATE Latin1_General_CS_AS
61
+ AND t.removed = 0
62
+ AND t.id_company = s.id_company COLLATE Latin1_General_CS_AS
63
+ WHERE s.id_batch = @id_batch;
64
+
65
+ -- Validação 3: Situação (is_active) inválida
66
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
67
+ SELECT @id_batch, s.row_num, 'Situação inválida (selecione Ativo ou Inativo na planilha)'
68
+ FROM import.occurrences_categories_staging s WITH (NOLOCK)
69
+ WHERE s.id_batch = @id_batch
70
+ AND ISNULL(s.is_active, '') COLLATE Latin1_General_CS_AS NOT IN ('Ativo', 'Inativo');
71
+
72
+ -- Validação 4: Booleanos inválidos (Sim / Não)
73
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
74
+ 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)'
75
+ FROM import.occurrences_categories_staging s WITH (NOLOCK)
76
+ WHERE s.id_batch = @id_batch
77
+ AND (
78
+ (s.active_cause_analysis IS NOT NULL AND s.active_cause_analysis COLLATE Latin1_General_CS_AS NOT IN ('Sim','Não'))
79
+ OR (s.active_effectiveness_check IS NOT NULL AND s.active_effectiveness_check COLLATE Latin1_General_CS_AS NOT IN ('Sim','Não'))
80
+ OR (s.active_standardization IS NOT NULL AND s.active_standardization COLLATE Latin1_General_CS_AS NOT IN ('Sim','Não'))
81
+ OR (s.aprove_evaluation IS NOT NULL AND s.aprove_evaluation COLLATE Latin1_General_CS_AS NOT IN ('Sim','Não'))
82
+ OR (s.all_types_associated IS NOT NULL AND s.all_types_associated COLLATE Latin1_General_CS_AS NOT IN ('Sim','Não'))
83
+ );
84
+
85
+ -- Validação 5: Prazos (Dias) devem ser numéricos
86
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
87
+ SELECT @id_batch, s.row_num, 'Os valores de prazos/dias devem ser números inteiros'
88
+ FROM import.occurrences_categories_staging s WITH (NOLOCK)
89
+ WHERE s.id_batch = @id_batch
90
+ AND (
91
+ (s.days_causes_analysis IS NOT NULL AND TRY_CAST(s.days_causes_analysis AS INT) IS NULL)
92
+ OR (s.days_action_plan_elaboration IS NOT NULL AND TRY_CAST(s.days_action_plan_elaboration AS INT) IS NULL)
93
+ OR (s.days_action_plan_execution IS NOT NULL AND TRY_CAST(s.days_action_plan_execution AS INT) IS NULL)
94
+ OR (s.days_effectiveness_check IS NOT NULL AND TRY_CAST(s.days_effectiveness_check AS INT) IS NULL)
95
+ OR (s.days_standardization IS NOT NULL AND TRY_CAST(s.days_standardization AS INT) IS NULL)
96
+ OR (s.days_evaluation IS NOT NULL AND TRY_CAST(s.days_evaluation AS INT) IS NULL)
97
+ );
98
+
99
+ -- Validação 6: Prazo da Análise de causa é obrigatório quando a etapa está ativa
100
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
101
+ SELECT @id_batch, s.row_num, 'Prazo de Análise de causa é obrigatório quando a etapa está ativa'
102
+ FROM import.occurrences_categories_staging s WITH (NOLOCK)
103
+ WHERE s.id_batch = @id_batch
104
+ AND s.active_cause_analysis COLLATE Latin1_General_CS_AS = 'Sim'
105
+ AND (s.days_causes_analysis IS NULL OR LTRIM(RTRIM(s.days_causes_analysis)) = '');
106
+
107
+ -- Validação 7: Prazo da Verificação de eficácia é obrigatório quando a etapa está ativa
108
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
109
+ SELECT @id_batch, s.row_num, 'Prazo de Verificação de eficácia é obrigatório quando a etapa está ativa'
110
+ FROM import.occurrences_categories_staging s WITH (NOLOCK)
111
+ WHERE s.id_batch = @id_batch
112
+ AND s.active_effectiveness_check COLLATE Latin1_General_CS_AS = 'Sim'
113
+ AND (s.days_effectiveness_check IS NULL OR LTRIM(RTRIM(s.days_effectiveness_check)) = '');
114
+
115
+ -- Validação 8: Prazo da Padronização/Divulgação é obrigatório quando a etapa está ativa
116
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
117
+ SELECT @id_batch, s.row_num, 'Prazo de Padronização/Divulgação é obrigatório quando a etapa está ativa'
118
+ FROM import.occurrences_categories_staging s WITH (NOLOCK)
119
+ WHERE s.id_batch = @id_batch
120
+ AND s.active_standardization COLLATE Latin1_General_CS_AS = 'Sim'
121
+ AND (s.days_standardization IS NULL OR LTRIM(RTRIM(s.days_standardization)) = '');
122
+
123
+ -- Validação 9: Regra de priorização informada deve existir
124
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
125
+ SELECT @id_batch, s.row_num, 'Regra de priorização não encontrada'
126
+ FROM import.occurrences_categories_staging s WITH (NOLOCK)
127
+ WHERE s.id_batch = @id_batch
128
+ AND s.id_rule_prioritization IS NOT NULL
129
+ AND LTRIM(RTRIM(s.id_rule_prioritization)) <> ''
130
+ AND NOT EXISTS (
131
+ SELECT 1 FROM occurrences.rules_prioritization rp WITH (NOLOCK)
132
+ WHERE rp.id = s.id_rule_prioritization COLLATE Latin1_General_CS_AS
133
+ AND rp.id_company = s.id_company COLLATE Latin1_General_CS_AS
134
+ );
135
+
136
+ -- INSERÇÃO DOS DADOS VÁLIDOS
137
+ INSERT INTO occurrences.categories
138
+ (
139
+ id_company, id_method, name, description, icon, is_active, creation_date, last_modified, removed,
140
+ days_causes_analysis, days_action_plan_elaboration, days_action_plan_execution,
141
+ days_effectiveness_check, days_standardization, days_evaluation,
142
+ active_cause_analysis, active_effectiveness_check, active_standardization,
143
+ aprove_evaluation, all_types_associated, id_rule_prioritization
144
+ )
145
+ SELECT
146
+ s.id_company,
147
+ ISNULL(s.id_method, 1) AS id_method,
148
+ s.name,
149
+ NULLIF(s.description, '') AS description,
150
+ NULLIF(s.icon, '') AS icon,
151
+ CASE WHEN s.is_active COLLATE Latin1_General_CS_AS = 'Inativo' THEN 0 ELSE 1 END AS is_active,
152
+ SYSDATETIMEOFFSET() AS creation_date,
153
+ SYSDATETIMEOFFSET() AS last_modified,
154
+ 0 AS removed,
155
+ CASE WHEN s.active_cause_analysis COLLATE Latin1_General_CS_AS = 'Sim'
156
+ THEN TRY_CAST(s.days_causes_analysis AS INT) ELSE NULL END,
157
+ ISNULL(TRY_CAST(s.days_action_plan_elaboration AS INT), 0),
158
+ ISNULL(TRY_CAST(s.days_action_plan_execution AS INT), 0),
159
+ CASE WHEN s.active_effectiveness_check COLLATE Latin1_General_CS_AS = 'Sim'
160
+ THEN TRY_CAST(s.days_effectiveness_check AS INT) ELSE NULL END,
161
+ CASE WHEN s.active_standardization COLLATE Latin1_General_CS_AS = 'Sim'
162
+ THEN TRY_CAST(s.days_standardization AS INT) ELSE NULL END,
163
+ TRY_CAST(s.days_evaluation AS INT),
164
+ CASE WHEN s.active_cause_analysis COLLATE Latin1_General_CS_AS = 'Sim' THEN 1 ELSE 0 END,
165
+ CASE WHEN s.active_effectiveness_check COLLATE Latin1_General_CS_AS = 'Sim' THEN 1 ELSE 0 END,
166
+ CASE WHEN s.active_standardization COLLATE Latin1_General_CS_AS = 'Sim' THEN 1 ELSE 0 END,
167
+ CASE WHEN s.aprove_evaluation COLLATE Latin1_General_CS_AS = 'Sim' THEN 1 ELSE 0 END,
168
+ CASE WHEN s.all_types_associated COLLATE Latin1_General_CS_AS = 'Sim' THEN 1 ELSE 0 END,
169
+ NULLIF(LTRIM(RTRIM(s.id_rule_prioritization)), '')
170
+ FROM import.occurrences_categories_staging s WITH (NOLOCK)
171
+ WHERE s.id_batch = @id_batch
172
+ AND NOT EXISTS (SELECT 1 FROM import.errors e WHERE e.id_batch = s.id_batch AND e.row_num = s.row_num);
173
+
174
+ END
175
+ GO
176
+
177
+ CREATE OR ALTER PROCEDURE [import].[get_errors_occurrences_categories]
178
+ (
179
+ @id_batch UNIQUEIDENTIFIER
180
+ )
181
+ AS
182
+ BEGIN
183
+ SET NOCOUNT ON;
184
+
185
+ SELECT
186
+ STRING_AGG(CAST(e.error_msg AS NVARCHAR(MAX)), '; ') WITHIN GROUP (ORDER BY e.error_msg) AS error_msg,
187
+ e.row_num,
188
+ s.name
189
+ FROM import.errors e WITH (NOLOCK)
190
+ JOIN import.occurrences_categories_staging s WITH (NOLOCK) ON s.row_num = e.row_num AND s.id_batch = e.id_batch
191
+ WHERE e.id_batch = @id_batch
192
+ GROUP BY e.row_num, s.name
193
+ ORDER BY e.row_num;
194
+ END
195
+ GO
196
+
197
+ -- commit
198
+ -- rollback
@@ -0,0 +1,249 @@
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
+ [id_responsible_user] [char](8) 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
+ -- Validação 1: Código duplicado no arquivo
47
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
48
+ SELECT @id_batch, s.row_num, 'Código duplicado no arquivo'
49
+ FROM (
50
+ SELECT *, COUNT(*) OVER (PARTITION BY code) AS cnt
51
+ FROM import.risks_staging WITH (NOLOCK)
52
+ WHERE id_batch = @id_batch
53
+ AND NULLIF(RTRIM(LTRIM(code)), '') IS NOT NULL
54
+ ) s
55
+ WHERE s.cnt > 1;
56
+
57
+ -- Validação 2: Código já existente na produção
58
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
59
+ SELECT @id_batch, s.row_num, 'Código de risco já existe na base para esta unidade'
60
+ FROM import.risks_staging s WITH (NOLOCK)
61
+ INNER JOIN risks.risks t WITH (NOLOCK)
62
+ ON t.code COLLATE Latin1_General_CS_AS = s.code COLLATE Latin1_General_CS_AS
63
+ AND t.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
64
+ AND t.removed = 0
65
+ WHERE s.id_batch = @id_batch;
66
+
67
+ -- Validação 3: Nome duplicado no arquivo
68
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
69
+ SELECT @id_batch, s.row_num, 'Nome do risco duplicado no arquivo'
70
+ FROM (
71
+ SELECT *, COUNT(*) OVER (PARTITION BY name) AS cnt
72
+ FROM import.risks_staging WITH (NOLOCK)
73
+ WHERE id_batch = @id_batch
74
+ ) s
75
+ WHERE s.cnt > 1;
76
+
77
+ -- Validação 4: Nome já existente na produção
78
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
79
+ SELECT @id_batch, s.row_num, 'Nome do risco já existe na base para esta unidade'
80
+ FROM import.risks_staging s WITH (NOLOCK)
81
+ INNER JOIN risks.risks t WITH (NOLOCK)
82
+ ON t.name COLLATE Latin1_General_CS_AS = s.name COLLATE Latin1_General_CS_AS
83
+ AND t.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
84
+ AND t.removed = 0
85
+ WHERE s.id_batch = @id_batch;
86
+
87
+ -- Validação 5: Campos Obrigatórios Vazios
88
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
89
+ SELECT @id_batch, s.row_num, 'Código, Nome, Grupo e Responsável são obrigatórios'
90
+ FROM import.risks_staging s WITH (NOLOCK)
91
+ WHERE s.id_batch = @id_batch
92
+ AND (
93
+ NULLIF(RTRIM(LTRIM(s.code)), '') IS NULL OR
94
+ NULLIF(RTRIM(LTRIM(s.name)), '') IS NULL OR
95
+ NULLIF(RTRIM(LTRIM(s.group_name)), '') IS NULL OR
96
+ NULLIF(RTRIM(LTRIM(s.id_responsible_user)), '') IS NULL
97
+ );
98
+
99
+ -- Validação 6: Validação de Situação (Ativo / Inativo) com Regra Estrita
100
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
101
+ SELECT @id_batch, s.row_num, 'Situação inválida (selecione Ativo ou Inativo na planilha)'
102
+ FROM import.risks_staging s WITH (NOLOCK)
103
+ WHERE s.id_batch = @id_batch
104
+ AND ISNULL(s.is_active, '') COLLATE Latin1_General_CS_AS NOT IN ('Ativo', 'Inativo');
105
+
106
+ -- Validação 7: Grupo não encontrado
107
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
108
+ SELECT @id_batch, s.row_num, 'Grupo de risco não encontrado ou inativo'
109
+ FROM import.risks_staging s WITH (NOLOCK)
110
+ LEFT JOIN risks.groups g WITH (NOLOCK)
111
+ ON g.name COLLATE Latin1_General_CS_AS = s.group_name COLLATE Latin1_General_CS_AS
112
+ AND g.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
113
+ AND g.removed = 0
114
+ WHERE s.id_batch = @id_batch
115
+ AND NULLIF(RTRIM(LTRIM(s.group_name)), '') IS NOT NULL
116
+ AND g.id IS NULL;
117
+
118
+ -- Validação 8: Responsável não encontrado
119
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
120
+ SELECT @id_batch, s.row_num, 'Usuário responsável não encontrado'
121
+ FROM import.risks_staging s WITH (NOLOCK)
122
+ LEFT JOIN dbo.users u WITH (NOLOCK)
123
+ ON u.id COLLATE Latin1_General_CS_AS = s.id_responsible_user COLLATE Latin1_General_CS_AS
124
+ AND u.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
125
+ AND u.removed = 0
126
+ WHERE s.id_batch = @id_batch
127
+ AND NULLIF(RTRIM(LTRIM(s.id_responsible_user)), '') IS NOT NULL
128
+ AND u.id IS NULL;
129
+
130
+ -- Validação 9: Local (Place) não encontrado
131
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
132
+ SELECT @id_batch, s.row_num, 'Local não encontrado ou inativo'
133
+ FROM import.risks_staging s WITH (NOLOCK)
134
+ LEFT JOIN dbo.places p WITH (NOLOCK)
135
+ ON p.name COLLATE Latin1_General_CS_AS = s.place_name COLLATE Latin1_General_CS_AS
136
+ AND p.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
137
+ AND p.removed = 0
138
+ WHERE s.id_batch = @id_batch
139
+ AND NULLIF(RTRIM(LTRIM(s.place_name)), '') IS NOT NULL
140
+ AND p.id IS NULL;
141
+
142
+ -- Validação 10: Categoria não encontrada
143
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
144
+ SELECT @id_batch, s.row_num, 'Categoria não encontrada ou inativa'
145
+ FROM import.risks_staging s WITH (NOLOCK)
146
+ LEFT JOIN risks.risks_categories c WITH (NOLOCK)
147
+ ON c.title COLLATE Latin1_General_CS_AS = s.category_name COLLATE Latin1_General_CS_AS
148
+ AND c.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
149
+ AND c.removed = 0
150
+ WHERE s.id_batch = @id_batch
151
+ AND NULLIF(RTRIM(LTRIM(s.category_name)), '') IS NOT NULL
152
+ AND c.id IS NULL;
153
+
154
+ -- INSERÇÃO DOS DADOS VÁLIDOS
155
+ INSERT INTO risks.risks
156
+ (
157
+ id_company,
158
+ code,
159
+ name,
160
+ description,
161
+ description_text,
162
+ id_group,
163
+ id_place,
164
+ id_category,
165
+ id_creation_user,
166
+ id_responsible_user,
167
+ creation_date,
168
+ last_modified,
169
+ is_active,
170
+ removed
171
+ )
172
+ SELECT
173
+ s.id_company,
174
+ LTRIM(RTRIM(s.code)) AS code,
175
+ s.name,
176
+ NULLIF(s.description, '') AS description,
177
+ NULLIF(s.description, '') AS description_text,
178
+ g.id AS id_group,
179
+ p.id AS id_place,
180
+ c.id AS id_category,
181
+ s.id_creation_user,
182
+ u.id AS id_responsible_user,
183
+ SYSDATETIMEOFFSET() AS creation_date,
184
+ SYSDATETIMEOFFSET() AS last_modified,
185
+ CASE WHEN s.is_active COLLATE Latin1_General_CS_AS = 'Inativo' THEN 0 ELSE 1 END AS is_active,
186
+ 0 AS removed
187
+ FROM import.risks_staging s WITH (NOLOCK)
188
+ LEFT JOIN risks.groups g WITH (NOLOCK)
189
+ ON g.name COLLATE Latin1_General_CS_AS = s.group_name COLLATE Latin1_General_CS_AS
190
+ AND g.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
191
+ AND g.removed = 0
192
+ LEFT JOIN dbo.users u WITH (NOLOCK)
193
+ ON u.id COLLATE Latin1_General_CS_AS = s.id_responsible_user COLLATE Latin1_General_CS_AS
194
+ AND u.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
195
+ AND u.removed = 0
196
+ LEFT JOIN dbo.places p WITH (NOLOCK)
197
+ ON p.name COLLATE Latin1_General_CS_AS = s.place_name COLLATE Latin1_General_CS_AS
198
+ AND p.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
199
+ AND p.removed = 0
200
+ LEFT JOIN risks.risks_categories c WITH (NOLOCK)
201
+ ON c.title COLLATE Latin1_General_CS_AS = s.category_name COLLATE Latin1_General_CS_AS
202
+ AND c.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
203
+ AND c.removed = 0
204
+ WHERE s.id_batch = @id_batch
205
+ AND NOT EXISTS (
206
+ SELECT 1
207
+ FROM import.errors e
208
+ WHERE e.id_batch = s.id_batch
209
+ AND e.row_num = s.row_num
210
+ );
211
+
212
+ END
213
+ GO
214
+
215
+ CREATE OR ALTER PROCEDURE [import].[get_errors_risks]
216
+ (
217
+ @id_batch UNIQUEIDENTIFIER
218
+ )
219
+ AS
220
+ BEGIN
221
+ SET NOCOUNT ON;
222
+
223
+ SELECT
224
+ STRING_AGG(
225
+ CAST(e.error_msg AS NVARCHAR(MAX)),
226
+ '; '
227
+ ) WITHIN GROUP (ORDER BY e.error_msg) AS error_msg,
228
+
229
+ e.row_num,
230
+ s.code,
231
+ s.name,
232
+ s.id_creation_user
233
+
234
+ FROM import.errors e WITH (NOLOCK)
235
+ JOIN import.risks_staging s WITH (NOLOCK)
236
+ ON s.row_num = e.row_num
237
+ AND s.id_batch = e.id_batch
238
+ WHERE e.id_batch = @id_batch
239
+ GROUP BY
240
+ e.row_num,
241
+ s.code,
242
+ s.name,
243
+ s.id_creation_user
244
+ ORDER BY e.row_num;
245
+ END
246
+ GO
247
+
248
+ -- commit
249
+ -- 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