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,8 +1,6 @@
1
1
  USE [qualiex_common]
2
2
  GO
3
3
 
4
- begin tran
5
-
6
4
  IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[import].[occurrences_categories_staging]') AND type IN (N'U'))
7
5
  DROP TABLE [import].[occurrences_categories_staging]
8
6
  GO
@@ -10,25 +8,30 @@ GO
10
8
  CREATE TABLE [import].[occurrences_categories_staging](
11
9
  [id_batch] [uniqueidentifier] NOT NULL,
12
10
  [row_num] [int] NOT NULL,
13
- [name] [nvarchar](150) NOT NULL,
14
- [description] [nvarchar](1000) NULL,
15
- [is_active] [varchar](20) NULL,
11
+ [name] [nvarchar](150) COLLATE Latin1_General_CS_AS NOT NULL,
12
+ [description] [nvarchar](1000) COLLATE Latin1_General_CS_AS NULL,
13
+ [is_active] [varchar](20) COLLATE Latin1_General_CS_AS NULL,
16
14
  [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
15
+ [icon] [varchar](30) COLLATE Latin1_General_CS_AS NULL,
16
+ [days_causes_analysis] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
17
+ [days_action_plan_elaboration] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
18
+ [days_action_plan_execution] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
19
+ [days_effectiveness_check] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
20
+ [days_standardization] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
21
+ [days_evaluation] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
22
+ [active_cause_analysis] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
23
+ [active_effectiveness_check] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
24
+ [active_standardization] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
25
+ [aprove_cause_analysis] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
26
+ [aprove_action_plan_elaboration] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
27
+ [aprove_action_plan_execution] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
28
+ [aprove_effectiveness_check] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
29
+ [aprove_standardization] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
30
+ [aprove_evaluation] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
31
+ [all_types_associated] [varchar](10) COLLATE Latin1_General_CS_AS NULL,
32
+ [id_rule_prioritization] [char](8) COLLATE Latin1_General_CS_AS NULL,
33
+ [id_company] [char](8) COLLATE Latin1_General_CS_AS NOT NULL,
34
+ CONSTRAINT [pk_occurrences_categories_staging] PRIMARY KEY CLUSTERED
32
35
  (
33
36
  [id_batch] ASC,
34
37
  [row_num] ASC
@@ -36,6 +39,9 @@ CREATE TABLE [import].[occurrences_categories_staging](
36
39
  ) ON [PRIMARY]
37
40
  GO
38
41
 
42
+ USE [qualiex_common]
43
+ GO
44
+
39
45
  CREATE OR ALTER PROCEDURE [import].[validate_occurrences_categories]
40
46
  @id_batch UNIQUEIDENTIFIER
41
47
  AS
@@ -44,93 +50,100 @@ BEGIN
44
50
 
45
51
  -- Validação 1: Nome duplicado no arquivo
46
52
  INSERT INTO import.errors (id_batch, row_num, error_msg)
47
- SELECT @id_batch, s.row_num, 'Nome duplicado no arquivo'
53
+ SELECT @id_batch, sub.row_num, 'Nome duplicado no arquivo'
48
54
  FROM (
49
55
  SELECT *, COUNT(*) OVER (PARTITION BY name) AS cnt
50
56
  FROM import.occurrences_categories_staging WITH (NOLOCK)
51
57
  WHERE id_batch = @id_batch
52
- ) s
53
- WHERE s.cnt > 1;
58
+ ) sub
59
+ WHERE sub.cnt > 1;
54
60
 
55
61
  -- Validação 2: Nome já existente na produção
62
+ -- Correção: Collate explícito para resolver o conflito
56
63
  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
+ SELECT @id_batch, ocs.row_num, 'Categoria de ocorrência já existe na base para esta unidade'
65
+ FROM import.occurrences_categories_staging ocs WITH (NOLOCK)
66
+ INNER JOIN occurrences.categories oc WITH (NOLOCK)
67
+ ON oc.name COLLATE Latin1_General_CS_AS = ocs.name
68
+ AND oc.id_company COLLATE Latin1_General_CS_AS = ocs.id_company
69
+ AND oc.removed = 0
70
+ WHERE ocs.id_batch = @id_batch;
64
71
 
65
72
  -- Validação 3: Situação (is_active) inválida
66
73
  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');
74
+ SELECT @id_batch, ocs.row_num, 'Situação inválida (selecione Ativo ou Inativo na planilha)'
75
+ FROM import.occurrences_categories_staging ocs WITH (NOLOCK)
76
+ WHERE ocs.id_batch = @id_batch
77
+ AND ISNULL(ocs.is_active, '') NOT IN ('Ativo', 'Inativo');
71
78
 
72
79
  -- Validação 4: Booleanos inválidos (Sim / Não)
73
80
  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
81
+ SELECT @id_batch, ocs.row_num, 'Valor inválido para campos de Sim/Não (Certifique-se de escolher Sim ou Não na planilha)'
82
+ FROM import.occurrences_categories_staging ocs WITH (NOLOCK)
83
+ WHERE ocs.id_batch = @id_batch
77
84
  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'))
85
+ (ocs.active_cause_analysis IS NOT NULL AND ocs.active_cause_analysis NOT IN ('Sim','Não'))
86
+ OR (ocs.active_effectiveness_check IS NOT NULL AND ocs.active_effectiveness_check NOT IN ('Sim','Não'))
87
+ OR (ocs.active_standardization IS NOT NULL AND ocs.active_standardization NOT IN ('Sim','Não'))
88
+ OR (ocs.aprove_cause_analysis IS NOT NULL AND ocs.aprove_cause_analysis NOT IN ('Sim','Não'))
89
+ OR (ocs.aprove_action_plan_elaboration IS NOT NULL AND ocs.aprove_action_plan_elaboration NOT IN ('Sim','Não'))
90
+ OR (ocs.aprove_action_plan_execution IS NOT NULL AND ocs.aprove_action_plan_execution NOT IN ('Sim','Não'))
91
+ OR (ocs.aprove_effectiveness_check IS NOT NULL AND ocs.aprove_effectiveness_check NOT IN ('Sim','Não'))
92
+ OR (ocs.aprove_standardization IS NOT NULL AND ocs.aprove_standardization NOT IN ('Sim','Não'))
93
+ OR (ocs.aprove_evaluation IS NOT NULL AND ocs.aprove_evaluation NOT IN ('Sim','Não'))
94
+ OR (ocs.all_types_associated IS NOT NULL AND ocs.all_types_associated NOT IN ('Sim','Não'))
83
95
  );
84
96
 
85
97
  -- Validação 5: Prazos (Dias) devem ser numéricos
86
98
  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
99
+ SELECT @id_batch, ocs.row_num, 'Os valores de prazos/dias devem ser números inteiros'
100
+ FROM import.occurrences_categories_staging ocs WITH (NOLOCK)
101
+ WHERE ocs.id_batch = @id_batch
90
102
  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)
103
+ (ocs.days_causes_analysis IS NOT NULL AND TRY_CAST(ocs.days_causes_analysis AS INT) IS NULL)
104
+ OR (ocs.days_action_plan_elaboration IS NOT NULL AND TRY_CAST(ocs.days_action_plan_elaboration AS INT) IS NULL)
105
+ OR (ocs.days_action_plan_execution IS NOT NULL AND TRY_CAST(ocs.days_action_plan_execution AS INT) IS NULL)
106
+ OR (ocs.days_effectiveness_check IS NOT NULL AND TRY_CAST(ocs.days_effectiveness_check AS INT) IS NULL)
107
+ OR (ocs.days_standardization IS NOT NULL AND TRY_CAST(ocs.days_standardization AS INT) IS NULL)
108
+ OR (ocs.days_evaluation IS NOT NULL AND TRY_CAST(ocs.days_evaluation AS INT) IS NULL)
97
109
  );
98
110
 
99
111
  -- Validação 6: Prazo da Análise de causa é obrigatório quando a etapa está ativa
100
112
  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)) = '');
113
+ SELECT @id_batch, ocs.row_num, 'Prazo de Análise de causa é obrigatório quando a etapa está ativa'
114
+ FROM import.occurrences_categories_staging ocs WITH (NOLOCK)
115
+ WHERE ocs.id_batch = @id_batch
116
+ AND ocs.active_cause_analysis = 'Sim'
117
+ AND (ocs.days_causes_analysis IS NULL OR LTRIM(RTRIM(ocs.days_causes_analysis)) = '');
106
118
 
107
119
  -- Validação 7: Prazo da Verificação de eficácia é obrigatório quando a etapa está ativa
108
120
  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)) = '');
121
+ SELECT @id_batch, ocs.row_num, 'Prazo de Verificação de eficácia é obrigatório quando a etapa está ativa'
122
+ FROM import.occurrences_categories_staging ocs WITH (NOLOCK)
123
+ WHERE ocs.id_batch = @id_batch
124
+ AND ocs.active_effectiveness_check = 'Sim'
125
+ AND (ocs.days_effectiveness_check IS NULL OR LTRIM(RTRIM(ocs.days_effectiveness_check)) = '');
114
126
 
115
127
  -- Validação 8: Prazo da Padronização/Divulgação é obrigatório quando a etapa está ativa
116
128
  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)) = '');
129
+ SELECT @id_batch, ocs.row_num, 'Prazo de Padronização/Divulgação é obrigatório quando a etapa está ativa'
130
+ FROM import.occurrences_categories_staging ocs WITH (NOLOCK)
131
+ WHERE ocs.id_batch = @id_batch
132
+ AND ocs.active_standardization = 'Sim'
133
+ AND (ocs.days_standardization IS NULL OR LTRIM(RTRIM(ocs.days_standardization)) = '');
122
134
 
123
135
  -- Validação 9: Regra de priorização informada deve existir
124
136
  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)) <> ''
137
+ SELECT @id_batch, ocs.row_num, 'Regra de priorização não encontrada'
138
+ FROM import.occurrences_categories_staging ocs WITH (NOLOCK)
139
+ WHERE ocs.id_batch = @id_batch
140
+ AND ocs.id_rule_prioritization IS NOT NULL
141
+ AND LTRIM(RTRIM(ocs.id_rule_prioritization)) <> ''
130
142
  AND NOT EXISTS (
131
143
  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
144
+ -- Correção: Collation explícito aqui também!
145
+ WHERE rp.id COLLATE Latin1_General_CS_AS = ocs.id_rule_prioritization
146
+ AND rp.id_company COLLATE Latin1_General_CS_AS = ocs.id_company
134
147
  );
135
148
 
136
149
  -- INSERÇÃO DOS DADOS VÁLIDOS
@@ -140,40 +153,52 @@ BEGIN
140
153
  days_causes_analysis, days_action_plan_elaboration, days_action_plan_execution,
141
154
  days_effectiveness_check, days_standardization, days_evaluation,
142
155
  active_cause_analysis, active_effectiveness_check, active_standardization,
143
- aprove_evaluation, all_types_associated, id_rule_prioritization
156
+ aprove_cause_analysis, aprove_action_plan_elaboration, aprove_action_plan_execution,
157
+ aprove_effectiveness_check, aprove_standardization, aprove_evaluation, all_types_associated,
158
+ id_rule_prioritization
144
159
  )
145
160
  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,
161
+ ocs.id_company,
162
+ ISNULL(ocs.id_method, 1) AS id_method,
163
+ ocs.name,
164
+ NULLIF(ocs.description, '') AS description,
165
+ NULLIF(ocs.icon, '') AS icon,
166
+ CASE WHEN ocs.is_active = 'Inativo' THEN 0 ELSE 1 END AS is_active,
152
167
  SYSDATETIMEOFFSET() AS creation_date,
153
168
  SYSDATETIMEOFFSET() AS last_modified,
154
169
  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);
170
+ CASE WHEN ocs.active_cause_analysis = 'Sim' THEN TRY_CAST(ocs.days_causes_analysis AS INT) ELSE NULL END,
171
+ ISNULL(TRY_CAST(ocs.days_action_plan_elaboration AS INT), 0),
172
+ ISNULL(TRY_CAST(ocs.days_action_plan_execution AS INT), 0),
173
+ CASE WHEN ocs.active_effectiveness_check = 'Sim' THEN TRY_CAST(ocs.days_effectiveness_check AS INT) ELSE NULL END,
174
+ CASE WHEN ocs.active_standardization = 'Sim' THEN TRY_CAST(ocs.days_standardization AS INT) ELSE NULL END,
175
+ TRY_CAST(ocs.days_evaluation AS INT),
176
+ CASE WHEN ocs.active_cause_analysis = 'Sim' THEN 1 ELSE 0 END,
177
+ CASE WHEN ocs.active_effectiveness_check = 'Sim' THEN 1 ELSE 0 END,
178
+ CASE WHEN ocs.active_standardization = 'Sim' THEN 1 ELSE 0 END,
179
+ CASE WHEN ocs.aprove_cause_analysis = 'Sim' THEN 1 ELSE 0 END,
180
+ CASE WHEN ocs.aprove_action_plan_elaboration = 'Sim' THEN 1 ELSE 0 END,
181
+ CASE WHEN ocs.aprove_action_plan_execution = 'Sim' THEN 1 ELSE 0 END,
182
+ CASE WHEN ocs.aprove_effectiveness_check = 'Sim' THEN 1 ELSE 0 END,
183
+ CASE WHEN ocs.aprove_standardization = 'Sim' THEN 1 ELSE 0 END,
184
+ CASE WHEN ocs.aprove_evaluation = 'Sim' THEN 1 ELSE 0 END,
185
+ CASE WHEN ocs.all_types_associated = 'Sim' THEN 1 ELSE 0 END,
186
+ NULLIF(LTRIM(RTRIM(ocs.id_rule_prioritization)), '')
187
+ FROM import.occurrences_categories_staging ocs WITH (NOLOCK)
188
+ WHERE ocs.id_batch = @id_batch
189
+ AND NOT EXISTS (
190
+ SELECT 1
191
+ FROM import.errors e
192
+ WHERE e.id_batch = ocs.id_batch
193
+ AND e.row_num = ocs.row_num
194
+ );
173
195
 
174
196
  END
175
197
  GO
176
198
 
199
+ USE [qualiex_common]
200
+ GO
201
+
177
202
  CREATE OR ALTER PROCEDURE [import].[get_errors_occurrences_categories]
178
203
  (
179
204
  @id_batch UNIQUEIDENTIFIER
@@ -185,14 +210,13 @@ BEGIN
185
210
  SELECT
186
211
  STRING_AGG(CAST(e.error_msg AS NVARCHAR(MAX)), '; ') WITHIN GROUP (ORDER BY e.error_msg) AS error_msg,
187
212
  e.row_num,
188
- s.name
213
+ ocs.name
189
214
  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
215
+ JOIN import.occurrences_categories_staging ocs WITH (NOLOCK)
216
+ ON ocs.row_num = e.row_num
217
+ AND ocs.id_batch = e.id_batch
191
218
  WHERE e.id_batch = @id_batch
192
- GROUP BY e.row_num, s.name
219
+ GROUP BY e.row_num, ocs.name
193
220
  ORDER BY e.row_num;
194
221
  END
195
- GO
196
-
197
- -- commit
198
- -- rollback
222
+ GO
@@ -0,0 +1,112 @@
1
+ USE [qualiex_common]
2
+ GO
3
+
4
+ IF EXISTS (SELECT * FROM sys.objects
5
+ WHERE object_id = OBJECT_ID(N'[import].[occurrences_causes_classification_staging]')
6
+ AND type IN (N'U'))
7
+ DROP TABLE [import].[occurrences_causes_classification_staging]
8
+ GO
9
+
10
+ CREATE TABLE [import].[occurrences_causes_classification_staging](
11
+ [id_batch] [uniqueidentifier] NOT NULL,
12
+ [row_num] [int] NOT NULL,
13
+ [name] [nvarchar](150) COLLATE Latin1_General_CS_AS NOT NULL,
14
+ [description] [nvarchar](1000) COLLATE Latin1_General_CS_AS NULL,
15
+ [is_active] [varchar](20) COLLATE Latin1_General_CS_AS NULL,
16
+ [id_creation_user] [char](8) COLLATE Latin1_General_CS_AS NOT NULL,
17
+ [id_company] [char](8) COLLATE Latin1_General_CS_AS NOT NULL,
18
+ CONSTRAINT [pk_occurrences_causes_classification_staging] PRIMARY KEY CLUSTERED
19
+ (
20
+ [id_batch] ASC,
21
+ [row_num] ASC
22
+ ) ON [PRIMARY]
23
+ ) ON [PRIMARY]
24
+ GO
25
+
26
+ USE [qualiex_common]
27
+ GO
28
+
29
+ CREATE OR ALTER PROCEDURE [import].[validate_occurrences_causes_classification]
30
+ @id_batch UNIQUEIDENTIFIER
31
+ AS
32
+ BEGIN
33
+ SET NOCOUNT ON;
34
+
35
+ -- Validação 1: Nome duplicado no arquivo
36
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
37
+ SELECT @id_batch, sub.row_num, 'Nome duplicado no arquivo'
38
+ FROM (
39
+ SELECT *, COUNT(*) OVER (PARTITION BY name) AS cnt
40
+ FROM import.occurrences_causes_classification_staging WITH (NOLOCK)
41
+ WHERE id_batch = @id_batch
42
+ ) sub
43
+ WHERE sub.cnt > 1;
44
+
45
+ -- Validação 2: Nome já existente na produção
46
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
47
+ SELECT @id_batch, occs.row_num, 'Classificação de causa já existe na base para esta unidade'
48
+ FROM import.occurrences_causes_classification_staging occs WITH (NOLOCK)
49
+ INNER JOIN occurrences.causes_classification occ WITH (NOLOCK)
50
+ ON occ.name COLLATE Latin1_General_CS_AS = occs.name
51
+ AND occ.id_company COLLATE Latin1_General_CS_AS = occs.id_company
52
+ AND occ.removed = 0
53
+ WHERE occs.id_batch = @id_batch;
54
+
55
+ -- Validação 3: Situação (is_active) inválida
56
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
57
+ SELECT @id_batch, occs.row_num, 'Situação inválida (selecione Ativo ou Inativo na planilha)'
58
+ FROM import.occurrences_causes_classification_staging occs WITH (NOLOCK)
59
+ WHERE occs.id_batch = @id_batch
60
+ AND ISNULL(occs.is_active, '') NOT IN ('Ativo', 'Inativo');
61
+
62
+ -- INSERÇÃO DOS DADOS VÁLIDOS (Sem id_creation_user)
63
+ INSERT INTO occurrences.causes_classification
64
+ (
65
+ id_company, name, description, is_active,
66
+ creation_date, last_modified, removed
67
+ )
68
+ SELECT
69
+ occs.id_company,
70
+ occs.name,
71
+ NULLIF(occs.description, '') AS description,
72
+ CASE WHEN occs.is_active = 'Inativo' THEN 0 ELSE 1 END AS is_active,
73
+ SYSDATETIMEOFFSET() AS creation_date,
74
+ SYSDATETIMEOFFSET() AS last_modified,
75
+ 0 AS removed
76
+ FROM import.occurrences_causes_classification_staging occs WITH (NOLOCK)
77
+ WHERE occs.id_batch = @id_batch
78
+ AND NOT EXISTS (
79
+ SELECT 1
80
+ FROM import.errors e
81
+ WHERE e.id_batch = occs.id_batch
82
+ AND e.row_num = occs.row_num
83
+ );
84
+
85
+ END
86
+ GO
87
+
88
+ USE [qualiex_common]
89
+ GO
90
+
91
+ CREATE OR ALTER PROCEDURE [import].[get_errors_occurrences_causes_classification]
92
+ (
93
+ @id_batch UNIQUEIDENTIFIER
94
+ )
95
+ AS
96
+ BEGIN
97
+ SET NOCOUNT ON;
98
+
99
+ SELECT
100
+ STRING_AGG(CAST(e.error_msg AS NVARCHAR(MAX)), '; ') WITHIN GROUP (ORDER BY e.error_msg) AS error_msg,
101
+ e.row_num,
102
+ occs.name,
103
+ occs.id_creation_user
104
+ FROM import.errors e WITH (NOLOCK)
105
+ JOIN import.occurrences_causes_classification_staging occs WITH (NOLOCK)
106
+ ON occs.row_num = e.row_num
107
+ AND occs.id_batch = e.id_batch
108
+ WHERE e.id_batch = @id_batch
109
+ GROUP BY e.row_num, occs.name, occs.id_creation_user
110
+ ORDER BY e.row_num;
111
+ END
112
+ GO
@@ -0,0 +1,113 @@
1
+ USE [qualiex_common]
2
+ GO
3
+
4
+ IF EXISTS (SELECT * FROM sys.objects
5
+ WHERE object_id = OBJECT_ID(N'[import].[occurrences_types_staging]')
6
+ AND type IN (N'U'))
7
+ DROP TABLE [import].[occurrences_types_staging]
8
+ GO
9
+
10
+ CREATE TABLE [import].[occurrences_types_staging](
11
+ [id_batch] [uniqueidentifier] NOT NULL,
12
+ [row_num] [int] NOT NULL,
13
+ [name] [nvarchar](150) COLLATE Latin1_General_CS_AS NOT NULL,
14
+ [description] [nvarchar](1000) COLLATE Latin1_General_CS_AS NULL,
15
+ [color] [nvarchar](10) COLLATE Latin1_General_CS_AS NULL,
16
+ [is_active] [varchar](20) COLLATE Latin1_General_CS_AS NULL,
17
+ [id_creation_user] [char](8) COLLATE Latin1_General_CS_AS NOT NULL,
18
+ [id_company] [char](8) COLLATE Latin1_General_CS_AS NOT NULL,
19
+ CONSTRAINT [pk_occurrences_types_staging] PRIMARY KEY CLUSTERED
20
+ (
21
+ [id_batch] ASC,
22
+ [row_num] ASC
23
+ ) ON [PRIMARY]
24
+ ) ON [PRIMARY]
25
+ GO
26
+
27
+ USE [qualiex_common]
28
+ GO
29
+
30
+ CREATE OR ALTER PROCEDURE [import].[validate_occurrences_types]
31
+ @id_batch UNIQUEIDENTIFIER
32
+ AS
33
+ BEGIN
34
+ SET NOCOUNT ON;
35
+
36
+ -- Validação 1: Nome duplicado no arquivo
37
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
38
+ SELECT @id_batch, sub.row_num, 'Nome duplicado no arquivo'
39
+ FROM (
40
+ SELECT *, COUNT(*) OVER (PARTITION BY name) AS cnt
41
+ FROM import.occurrences_types_staging WITH (NOLOCK)
42
+ WHERE id_batch = @id_batch
43
+ ) sub
44
+ WHERE sub.cnt > 1;
45
+
46
+ -- Validação 2: Nome já existente na produção
47
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
48
+ SELECT @id_batch, ots.row_num, 'Tipo de ocorrência já existe na base para esta unidade'
49
+ FROM import.occurrences_types_staging ots WITH (NOLOCK)
50
+ INNER JOIN occurrences.types ot WITH (NOLOCK)
51
+ ON ot.name COLLATE Latin1_General_CS_AS = ots.name
52
+ AND ot.id_company COLLATE Latin1_General_CS_AS = ots.id_company
53
+ AND ot.removed = 0
54
+ WHERE ots.id_batch = @id_batch;
55
+
56
+ -- Validação 3: Situação (is_active) inválida
57
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
58
+ SELECT @id_batch, ots.row_num, 'Situação inválida (selecione Ativo ou Inativo na planilha)'
59
+ FROM import.occurrences_types_staging ots WITH (NOLOCK)
60
+ WHERE ots.id_batch = @id_batch
61
+ AND ISNULL(ots.is_active, '') NOT IN ('Ativo', 'Inativo');
62
+
63
+ INSERT INTO occurrences.types
64
+ (
65
+ id_company, name, description, color, is_active,
66
+ creation_date, last_modified, removed
67
+ )
68
+ SELECT
69
+ ots.id_company,
70
+ ots.name,
71
+ NULLIF(ots.description, '') AS description,
72
+ NULLIF(ots.color, '') AS color,
73
+ CASE WHEN ots.is_active = 'Inativo' THEN 0 ELSE 1 END AS is_active,
74
+ SYSDATETIMEOFFSET() AS creation_date,
75
+ SYSDATETIMEOFFSET() AS last_modified,
76
+ 0 AS removed
77
+ FROM import.occurrences_types_staging ots WITH (NOLOCK)
78
+ WHERE ots.id_batch = @id_batch
79
+ AND NOT EXISTS (
80
+ SELECT 1
81
+ FROM import.errors e
82
+ WHERE e.id_batch = ots.id_batch
83
+ AND e.row_num = ots.row_num
84
+ );
85
+
86
+ END
87
+ GO
88
+
89
+ USE [qualiex_common]
90
+ GO
91
+
92
+ CREATE OR ALTER PROCEDURE [import].[get_errors_occurrences_types]
93
+ (
94
+ @id_batch UNIQUEIDENTIFIER
95
+ )
96
+ AS
97
+ BEGIN
98
+ SET NOCOUNT ON;
99
+
100
+ SELECT
101
+ STRING_AGG(CAST(e.error_msg AS NVARCHAR(MAX)), '; ') WITHIN GROUP (ORDER BY e.error_msg) AS error_msg,
102
+ e.row_num,
103
+ ots.name,
104
+ ots.id_creation_user
105
+ FROM import.errors e WITH (NOLOCK)
106
+ JOIN import.occurrences_types_staging ots WITH (NOLOCK)
107
+ ON ots.row_num = e.row_num
108
+ AND ots.id_batch = e.id_batch
109
+ WHERE e.id_batch = @id_batch
110
+ GROUP BY e.row_num, ots.name, ots.id_creation_user
111
+ ORDER BY e.row_num;
112
+ END
113
+ GO