forlogic-core 2.5.1 → 2.5.2

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.
@@ -1,32 +1,33 @@
1
+ -- =============================================================================
2
+ -- Importação: Riscos
3
+ -- Banco: qualiex_common (SQL Server)
4
+ -- Objetos: import.risks_staging, import.validate_risks, import.get_errors_risks
5
+ -- Destino: risks.risks
6
+ -- Aplicação no banco é MANUAL. Este arquivo é a fonte documentada.
7
+ -- =============================================================================
8
+
1
9
  USE [qualiex_common]
2
10
  GO
3
11
 
4
- begin tran
5
-
6
12
  IF EXISTS (SELECT * FROM sys.objects
7
13
  WHERE object_id = OBJECT_ID(N'[import].[risks_staging]')
8
14
  AND type IN (N'U'))
9
15
  DROP TABLE [import].[risks_staging]
10
16
  GO
11
17
 
12
- SET ANSI_NULLS ON
13
- GO
14
- SET QUOTED_IDENTIFIER ON
15
- GO
16
-
17
18
  CREATE TABLE [import].[risks_staging](
18
19
  [id_batch] [uniqueidentifier] NOT NULL,
19
20
  [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,
21
+ [code] [nvarchar](10) COLLATE Latin1_General_CS_AS NOT NULL,
22
+ [name] [nvarchar](200) COLLATE Latin1_General_CS_AS NOT NULL,
23
+ [description] [nvarchar](max) COLLATE Latin1_General_CS_AS NULL,
24
+ [group_name] [nvarchar](200) COLLATE Latin1_General_CS_AS NOT NULL,
25
+ [id_responsible_user] [char](8) COLLATE Latin1_General_CS_AS NOT NULL,
26
+ [place_name] [nvarchar](200) COLLATE Latin1_General_CS_AS NULL,
27
+ [category_name] [nvarchar](200) COLLATE Latin1_General_CS_AS NULL,
28
+ [is_active] [varchar](20) COLLATE Latin1_General_CS_AS NULL,
29
+ [id_creation_user] [char](8) COLLATE Latin1_General_CS_AS NOT NULL,
30
+ [id_company] [char](8) COLLATE Latin1_General_CS_AS NOT NULL,
30
31
  CONSTRAINT [pk_risks_staging] PRIMARY KEY CLUSTERED
31
32
  (
32
33
  [id_batch] ASC,
@@ -37,6 +38,9 @@ CREATE TABLE [import].[risks_staging](
37
38
  ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
38
39
  GO
39
40
 
41
+ USE [qualiex_common]
42
+ GO
43
+
40
44
  CREATE OR ALTER PROCEDURE [import].[validate_risks]
41
45
  @id_batch UNIQUEIDENTIFIER
42
46
  AS
@@ -45,173 +49,153 @@ BEGIN
45
49
 
46
50
  -- Validação 1: Código duplicado no arquivo
47
51
  INSERT INTO import.errors (id_batch, row_num, error_msg)
48
- SELECT @id_batch, s.row_num, 'Código duplicado no arquivo'
52
+ SELECT @id_batch, sub.row_num, 'Código duplicado no arquivo'
49
53
  FROM (
50
54
  SELECT *, COUNT(*) OVER (PARTITION BY code) AS cnt
51
55
  FROM import.risks_staging WITH (NOLOCK)
52
56
  WHERE id_batch = @id_batch
53
57
  AND NULLIF(RTRIM(LTRIM(code)), '') IS NOT NULL
54
- ) s
55
- WHERE s.cnt > 1;
58
+ ) sub
59
+ WHERE sub.cnt > 1;
56
60
 
57
61
  -- Validação 2: Código já existente na produção
58
62
  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;
63
+ SELECT @id_batch, rs.row_num, 'Código de risco já existe na base para esta unidade'
64
+ FROM import.risks_staging rs WITH (NOLOCK)
65
+ INNER JOIN risks.risks r WITH (NOLOCK)
66
+ ON r.code COLLATE Latin1_General_CS_AS = rs.code
67
+ AND r.id_company COLLATE Latin1_General_CS_AS = rs.id_company
68
+ AND r.removed = 0
69
+ WHERE rs.id_batch = @id_batch;
66
70
 
67
71
  -- Validação 3: Nome duplicado no arquivo
68
72
  INSERT INTO import.errors (id_batch, row_num, error_msg)
69
- SELECT @id_batch, s.row_num, 'Nome do risco duplicado no arquivo'
73
+ SELECT @id_batch, sub.row_num, 'Nome do risco duplicado no arquivo'
70
74
  FROM (
71
75
  SELECT *, COUNT(*) OVER (PARTITION BY name) AS cnt
72
76
  FROM import.risks_staging WITH (NOLOCK)
73
77
  WHERE id_batch = @id_batch
74
- ) s
75
- WHERE s.cnt > 1;
78
+ ) sub
79
+ WHERE sub.cnt > 1;
76
80
 
77
81
  -- Validação 4: Nome já existente na produção
78
82
  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;
83
+ SELECT @id_batch, rs.row_num, 'Nome do risco já existe na base para esta unidade'
84
+ FROM import.risks_staging rs WITH (NOLOCK)
85
+ INNER JOIN risks.risks r WITH (NOLOCK)
86
+ ON r.name COLLATE Latin1_General_CS_AS = rs.name
87
+ AND r.id_company COLLATE Latin1_General_CS_AS = rs.id_company
88
+ AND r.removed = 0
89
+ WHERE rs.id_batch = @id_batch;
86
90
 
87
91
  -- Validação 5: Campos Obrigatórios Vazios
88
92
  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
93
+ SELECT @id_batch, rs.row_num, 'Código, Nome, Grupo e Responsável são obrigatórios'
94
+ FROM import.risks_staging rs WITH (NOLOCK)
95
+ WHERE rs.id_batch = @id_batch
92
96
  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
+ NULLIF(RTRIM(LTRIM(rs.code)), '') IS NULL OR
98
+ NULLIF(RTRIM(LTRIM(rs.name)), '') IS NULL OR
99
+ NULLIF(RTRIM(LTRIM(rs.group_name)), '') IS NULL OR
100
+ NULLIF(RTRIM(LTRIM(rs.id_responsible_user)), '') IS NULL
97
101
  );
98
102
 
99
103
  -- Validação 6: Validação de Situação (Ativo / Inativo) com Regra Estrita
100
104
  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
+ SELECT @id_batch, rs.row_num, 'Situação inválida (selecione Ativo ou Inativo na planilha)'
106
+ FROM import.risks_staging rs WITH (NOLOCK)
107
+ WHERE rs.id_batch = @id_batch
108
+ AND ISNULL(rs.is_active, '') NOT IN ('Ativo', 'Inativo');
105
109
 
106
110
  -- Validação 7: Grupo não encontrado
107
111
  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)
112
+ SELECT @id_batch, rs.row_num, 'Grupo de risco não encontrado ou inativo'
113
+ FROM import.risks_staging rs WITH (NOLOCK)
110
114
  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
115
+ ON g.name COLLATE Latin1_General_CS_AS = rs.group_name
116
+ AND g.id_company COLLATE Latin1_General_CS_AS = rs.id_company
113
117
  AND g.removed = 0
114
- WHERE s.id_batch = @id_batch
115
- AND NULLIF(RTRIM(LTRIM(s.group_name)), '') IS NOT NULL
118
+ WHERE rs.id_batch = @id_batch
119
+ AND NULLIF(RTRIM(LTRIM(rs.group_name)), '') IS NOT NULL
116
120
  AND g.id IS NULL;
117
121
 
118
- -- Validação 8: Responsável não encontrado
122
+ -- Validação 8: Responsável não encontrado ou sem acesso à unidade
119
123
  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)
124
+ SELECT @id_batch, rs.row_num, 'Usuário responsável não encontrado ou sem acesso à unidade'
125
+ FROM import.risks_staging rs WITH (NOLOCK)
122
126
  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;
127
+ ON u.id COLLATE Latin1_General_CS_AS = rs.id_responsible_user AND u.removed = 0
128
+ LEFT JOIN dbo.companies_users cu WITH (NOLOCK)
129
+ ON cu.id_user COLLATE Latin1_General_CS_AS = u.id AND cu.id_company COLLATE Latin1_General_CS_AS = rs.id_company AND cu.removed = 0
130
+ WHERE rs.id_batch = @id_batch
131
+ AND NULLIF(RTRIM(LTRIM(rs.id_responsible_user)), '') IS NOT NULL
132
+ AND (u.id IS NULL OR cu.id IS NULL);
129
133
 
130
134
  -- Validação 9: Local (Place) não encontrado
131
135
  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)
136
+ SELECT @id_batch, rs.row_num, 'Local não encontrado ou inativo'
137
+ FROM import.risks_staging rs WITH (NOLOCK)
134
138
  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
139
+ ON p.name COLLATE Latin1_General_CS_AS = rs.place_name
140
+ AND p.id_company COLLATE Latin1_General_CS_AS = rs.id_company
137
141
  AND p.removed = 0
138
- WHERE s.id_batch = @id_batch
139
- AND NULLIF(RTRIM(LTRIM(s.place_name)), '') IS NOT NULL
142
+ WHERE rs.id_batch = @id_batch
143
+ AND NULLIF(RTRIM(LTRIM(rs.place_name)), '') IS NOT NULL
140
144
  AND p.id IS NULL;
141
145
 
142
146
  -- Validação 10: Categoria não encontrada
143
147
  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;
148
+ SELECT @id_batch, rs.row_num, 'Categoria não encontrada ou inativa'
149
+ FROM import.risks_staging rs WITH (NOLOCK)
150
+ LEFT JOIN risks.risks_categories rc WITH (NOLOCK)
151
+ ON rc.title COLLATE Latin1_General_CS_AS = rs.category_name
152
+ AND rc.id_company COLLATE Latin1_General_CS_AS = rs.id_company
153
+ AND rc.removed = 0
154
+ WHERE rs.id_batch = @id_batch
155
+ AND NULLIF(RTRIM(LTRIM(rs.category_name)), '') IS NOT NULL
156
+ AND rc.id IS NULL;
153
157
 
154
158
  -- INSERÇÃO DOS DADOS VÁLIDOS
155
159
  INSERT INTO risks.risks
156
160
  (
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
161
+ id_company, code, name, description, description_text, id_group, id_place, id_category,
162
+ id_creation_user, id_responsible_user, creation_date, last_modified, is_active, removed
171
163
  )
172
164
  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,
165
+ rs.id_company,
166
+ LTRIM(RTRIM(rs.code)) AS code,
167
+ rs.name,
168
+ NULLIF(rs.description, '') AS description,
169
+ NULLIF(rs.description, '') AS description_text,
178
170
  g.id AS id_group,
179
171
  p.id AS id_place,
180
- c.id AS id_category,
181
- s.id_creation_user,
182
- u.id AS id_responsible_user,
172
+ rc.id AS id_category,
173
+ rs.id_creation_user,
174
+ rs.id_responsible_user,
183
175
  SYSDATETIMEOFFSET() AS creation_date,
184
176
  SYSDATETIMEOFFSET() AS last_modified,
185
- CASE WHEN s.is_active COLLATE Latin1_General_CS_AS = 'Inativo' THEN 0 ELSE 1 END AS is_active,
177
+ CASE WHEN rs.is_active = 'Inativo' THEN 0 ELSE 1 END AS is_active,
186
178
  0 AS removed
187
- FROM import.risks_staging s WITH (NOLOCK)
179
+ FROM import.risks_staging rs WITH (NOLOCK)
188
180
  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
181
+ ON g.name COLLATE Latin1_General_CS_AS = rs.group_name AND g.id_company COLLATE Latin1_General_CS_AS = rs.id_company AND g.removed = 0
196
182
  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
183
+ ON p.name COLLATE Latin1_General_CS_AS = rs.place_name AND p.id_company COLLATE Latin1_General_CS_AS = rs.id_company AND p.removed = 0
184
+ LEFT JOIN risks.risks_categories rc WITH (NOLOCK)
185
+ ON rc.title COLLATE Latin1_General_CS_AS = rs.category_name AND rc.id_company COLLATE Latin1_General_CS_AS = rs.id_company AND rc.removed = 0
186
+ WHERE rs.id_batch = @id_batch
205
187
  AND NOT EXISTS (
206
188
  SELECT 1
207
189
  FROM import.errors e
208
- WHERE e.id_batch = s.id_batch
209
- AND e.row_num = s.row_num
190
+ WHERE e.id_batch = rs.id_batch
191
+ AND e.row_num = rs.row_num
210
192
  );
211
-
212
193
  END
213
194
  GO
214
195
 
196
+ USE [qualiex_common]
197
+ GO
198
+
215
199
  CREATE OR ALTER PROCEDURE [import].[get_errors_risks]
216
200
  (
217
201
  @id_batch UNIQUEIDENTIFIER
@@ -221,29 +205,17 @@ BEGIN
221
205
  SET NOCOUNT ON;
222
206
 
223
207
  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
-
208
+ STRING_AGG(CAST(e.error_msg AS NVARCHAR(MAX)), '; ') WITHIN GROUP (ORDER BY e.error_msg) AS error_msg,
229
209
  e.row_num,
230
- s.code,
231
- s.name,
232
- s.id_creation_user
233
-
210
+ rs.code,
211
+ rs.name,
212
+ rs.id_creation_user
234
213
  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
214
+ JOIN import.risks_staging rs WITH (NOLOCK)
215
+ ON rs.row_num = e.row_num
216
+ AND rs.id_batch = e.id_batch
238
217
  WHERE e.id_batch = @id_batch
239
- GROUP BY
240
- e.row_num,
241
- s.code,
242
- s.name,
243
- s.id_creation_user
218
+ GROUP BY e.row_num, rs.code, rs.name, rs.id_creation_user
244
219
  ORDER BY e.row_num;
245
220
  END
246
221
  GO
247
-
248
- -- commit
249
- -- rollback
@@ -1,8 +1,15 @@
1
+ -- =============================================================================
2
+ -- Importação: Riscos | Categorias
3
+ -- Banco: qualiex_common (SQL Server)
4
+ -- Objetos: import.risks_categories_staging, import.validate_risks_categories,
5
+ -- import.get_errors_risks_categories
6
+ -- Destino: risks.risks_categories
7
+ -- Aplicação no banco é MANUAL. Este arquivo é a fonte documentada.
8
+ -- =============================================================================
9
+
1
10
  USE [qualiex_common]
2
11
  GO
3
12
 
4
- begin tran
5
-
6
13
  IF EXISTS (SELECT * FROM sys.objects
7
14
  WHERE object_id = OBJECT_ID(N'[import].[risks_categories_staging]')
8
15
  AND type IN (N'U'))
@@ -12,17 +19,17 @@ GO
12
19
  CREATE TABLE [import].[risks_categories_staging](
13
20
  [id_batch] [uniqueidentifier] NOT NULL,
14
21
  [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
+ [title] [varchar](200) COLLATE Latin1_General_CS_AS NOT NULL,
23
+ [icon] [varchar](30) COLLATE Latin1_General_CS_AS NULL,
24
+ [color] [nvarchar](20) COLLATE Latin1_General_CS_AS NULL,
25
+ [description] [nvarchar](max) COLLATE Latin1_General_CS_AS NULL,
26
+ [is_active] [varchar](20) COLLATE Latin1_General_CS_AS NULL,
27
+ [has_risks_reduction] [varchar](20) COLLATE Latin1_General_CS_AS NULL,
28
+ [periodicity_value] [varchar](20) COLLATE Latin1_General_CS_AS NULL,
22
29
  [id_category_periodicity_type] [int] NULL,
23
30
  [id_category_periodicity_unit_type] [int] NULL,
24
- [id_creation_user] [char](8) NOT NULL,
25
- [id_company] [char](8) NOT NULL,
31
+ [id_creation_user] [char](8) COLLATE Latin1_General_CS_AS NOT NULL,
32
+ [id_company] [char](8) COLLATE Latin1_General_CS_AS NOT NULL,
26
33
  CONSTRAINT [pk_risks_categories_staging] PRIMARY KEY CLUSTERED
27
34
  (
28
35
  [id_batch] ASC,
@@ -33,6 +40,9 @@ CREATE TABLE [import].[risks_categories_staging](
33
40
  ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
34
41
  GO
35
42
 
43
+ USE [qualiex_common]
44
+ GO
45
+
36
46
  CREATE OR ALTER PROCEDURE [import].[validate_risks_categories]
37
47
  @id_batch UNIQUEIDENTIFIER
38
48
  AS
@@ -41,81 +51,81 @@ BEGIN
41
51
 
42
52
  -- Validação 1: Título duplicado no arquivo
43
53
  INSERT INTO import.errors (id_batch, row_num, error_msg)
44
- SELECT @id_batch, s.row_num, 'Título duplicado no arquivo'
54
+ SELECT @id_batch, sub.row_num, 'Título duplicado no arquivo'
45
55
  FROM (
46
56
  SELECT *, COUNT(*) OVER (PARTITION BY title) AS cnt
47
57
  FROM import.risks_categories_staging WITH (NOLOCK)
48
58
  WHERE id_batch = @id_batch
49
- ) s
50
- WHERE s.cnt > 1;
59
+ ) sub
60
+ WHERE sub.cnt > 1;
51
61
 
52
62
  -- Validação 2: Título já existente na produção (mesma unidade)
53
63
  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;
64
+ SELECT @id_batch, rcs.row_num, 'Categoria já existe na base para esta unidade'
65
+ FROM import.risks_categories_staging rcs WITH (NOLOCK)
66
+ INNER JOIN risks.risks_categories rc WITH (NOLOCK)
67
+ ON rc.title COLLATE Latin1_General_CS_AS = rcs.title
68
+ AND rc.id_company COLLATE Latin1_General_CS_AS = rcs.id_company
69
+ AND rc.removed = 0
70
+ WHERE rcs.id_batch = @id_batch;
61
71
 
62
72
  -- Validação 3: Situação (is_active) inválida - Validação Estrita
63
73
  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', '');
74
+ SELECT @id_batch, rcs.row_num, 'Situação inválida (selecione Ativo ou Inativo na planilha)'
75
+ FROM import.risks_categories_staging rcs WITH (NOLOCK)
76
+ WHERE rcs.id_batch = @id_batch
77
+ AND ISNULL(rcs.is_active, '') NOT IN ('Ativo', 'Inativo', '');
68
78
 
69
79
  -- Validação 4: Redução de riscos (has_risks_reduction) inválida - Validação Estrita
70
80
  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');
81
+ SELECT @id_batch, rcs.row_num, 'Valor inválido para redução de riscos (selecione Sim ou Não na planilha)'
82
+ FROM import.risks_categories_staging rcs WITH (NOLOCK)
83
+ WHERE rcs.id_batch = @id_batch
84
+ AND rcs.has_risks_reduction IS NOT NULL
85
+ AND rcs.has_risks_reduction NOT IN ('Sim', 'Não');
76
86
 
77
87
  -- Validação 5: Valor de periodicidade (periodicity_value) deve ser um número inteiro
78
88
  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;
89
+ SELECT @id_batch, rcs.row_num, 'O valor da periodicidade deve ser um número inteiro válido'
90
+ FROM import.risks_categories_staging rcs WITH (NOLOCK)
91
+ WHERE rcs.id_batch = @id_batch
92
+ AND rcs.periodicity_value IS NOT NULL
93
+ AND TRY_CAST(rcs.periodicity_value AS INT) IS NULL;
84
94
 
85
95
  -- Validação 6: Tipo de periodicidade (id_category_periodicity_type) obrigatório e válido
86
96
  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));
97
+ SELECT @id_batch, rcs.row_num, 'Tipo de periodicidade é obrigatório (Sem periodicidade, Padrão ou Definido pela análise anterior)'
98
+ FROM import.risks_categories_staging rcs WITH (NOLOCK)
99
+ WHERE rcs.id_batch = @id_batch
100
+ AND (rcs.id_category_periodicity_type IS NULL
101
+ OR rcs.id_category_periodicity_type NOT IN (1, 2, 3));
92
102
 
93
103
  -- Validação 7: Se Tipo = 2 (Padrão), Valor da periodicidade é obrigatório e > 0
94
104
  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);
105
+ SELECT @id_batch, rcs.row_num, 'Valor da periodicidade é obrigatório e deve ser maior que zero quando o Tipo é "Padrão"'
106
+ FROM import.risks_categories_staging rcs WITH (NOLOCK)
107
+ WHERE rcs.id_batch = @id_batch
108
+ AND rcs.id_category_periodicity_type = 2
109
+ AND (rcs.periodicity_value IS NULL
110
+ OR TRY_CAST(rcs.periodicity_value AS INT) IS NULL
111
+ OR TRY_CAST(rcs.periodicity_value AS INT) <= 0);
102
112
 
103
113
  -- Validação 8: Se Tipo = 2 (Padrão), Unidade de tempo é obrigatória
104
114
  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));
115
+ SELECT @id_batch, rcs.row_num, 'Unidade de tempo é obrigatória quando o Tipo é "Padrão" (Dia, Semana, Mês ou Ano)'
116
+ FROM import.risks_categories_staging rcs WITH (NOLOCK)
117
+ WHERE rcs.id_batch = @id_batch
118
+ AND rcs.id_category_periodicity_type = 2
119
+ AND (rcs.id_category_periodicity_unit_type IS NULL
120
+ OR rcs.id_category_periodicity_unit_type NOT IN (1, 2, 3, 4));
111
121
 
112
122
  -- Validação 9: Unidade de tempo, se preenchida, deve estar no intervalo 1..4
113
123
  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);
124
+ SELECT @id_batch, rcs.row_num, 'Unidade de tempo inválida (selecione Dia, Semana, Mês ou Ano na planilha)'
125
+ FROM import.risks_categories_staging rcs WITH (NOLOCK)
126
+ WHERE rcs.id_batch = @id_batch
127
+ AND rcs.id_category_periodicity_unit_type IS NOT NULL
128
+ AND rcs.id_category_periodicity_unit_type NOT IN (1, 2, 3, 4);
119
129
 
120
130
 
121
131
  -- INSERÇÃO DOS DADOS VÁLIDOS
@@ -139,53 +149,56 @@ BEGIN
139
149
  removed
140
150
  )
141
151
  SELECT
142
- s.id_company,
143
- s.title,
144
- NULLIF(s.icon, '') AS icon,
145
- COALESCE(NULLIF(s.color, ''), '#000000ff') AS color,
152
+ rcs.id_company,
153
+ rcs.title,
154
+ NULLIF(rcs.icon, '') AS icon,
155
+ COALESCE(NULLIF(rcs.color, ''), '#000000ff') AS color,
146
156
 
147
157
  CASE
148
- WHEN s.is_active COLLATE Latin1_General_CS_AS = 'Inativo' THEN 0
158
+ WHEN rcs.is_active = 'Inativo' THEN 0
149
159
  ELSE 1
150
- END AS is_active,
160
+ END AS is_active,
151
161
 
152
- NULLIF(s.description, '') AS description,
153
- NULLIF(s.description, '') AS description_text,
162
+ NULLIF(rcs.description, '') AS description,
163
+ NULLIF(rcs.description, '') AS description_text,
154
164
 
155
165
  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
166
+ WHEN rcs.has_risks_reduction = 'Sim' THEN 1
167
+ WHEN rcs.has_risks_reduction IS NOT NULL THEN 0
158
168
  ELSE NULL
159
- END AS has_risks_reduction,
169
+ END AS has_risks_reduction,
160
170
 
161
171
  CASE
162
- WHEN s.id_category_periodicity_type = 2 THEN TRY_CAST(s.periodicity_value AS INT)
172
+ WHEN rcs.id_category_periodicity_type = 2 THEN TRY_CAST(rcs.periodicity_value AS INT)
163
173
  ELSE NULL
164
- END AS periodicity_value,
174
+ END AS periodicity_value,
165
175
 
166
- s.id_category_periodicity_type,
176
+ rcs.id_category_periodicity_type,
167
177
  CASE
168
- WHEN s.id_category_periodicity_type = 2 THEN s.id_category_periodicity_unit_type
178
+ WHEN rcs.id_category_periodicity_type = 2 THEN rcs.id_category_periodicity_unit_type
169
179
  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
180
+ END AS id_category_periodicity_unit_type,
181
+
182
+ rcs.id_creation_user,
183
+ rcs.id_creation_user AS id_last_modified_user,
184
+ SYSDATETIMEOFFSET() AS creation_date,
185
+ SYSDATETIMEOFFSET() AS last_modified,
186
+ 0 AS removed
187
+ FROM import.risks_categories_staging rcs WITH (NOLOCK)
188
+ WHERE rcs.id_batch = @id_batch
179
189
  AND NOT EXISTS (
180
190
  SELECT 1
181
191
  FROM import.errors e
182
- WHERE e.id_batch = s.id_batch
183
- AND e.row_num = s.row_num
192
+ WHERE e.id_batch = rcs.id_batch
193
+ AND e.row_num = rcs.row_num
184
194
  );
185
195
 
186
196
  END
187
197
  GO
188
198
 
199
+ USE [qualiex_common]
200
+ GO
201
+
189
202
  CREATE OR ALTER PROCEDURE [import].[get_errors_risks_categories]
190
203
  (
191
204
  @id_batch UNIQUEIDENTIFIER
@@ -201,21 +214,18 @@ BEGIN
201
214
  ) WITHIN GROUP (ORDER BY e.error_msg) AS error_msg,
202
215
 
203
216
  e.row_num,
204
- s.title,
205
- s.id_creation_user
217
+ rcs.title,
218
+ rcs.id_creation_user
206
219
 
207
220
  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
221
+ JOIN import.risks_categories_staging rcs WITH (NOLOCK)
222
+ ON rcs.row_num = e.row_num
223
+ AND rcs.id_batch = e.id_batch
211
224
  WHERE e.id_batch = @id_batch
212
225
  GROUP BY
213
226
  e.row_num,
214
- s.title,
215
- s.id_creation_user
227
+ rcs.title,
228
+ rcs.id_creation_user
216
229
  ORDER BY e.row_num;
217
230
  END
218
231
  GO
219
-
220
- -- commit
221
- -- rollback