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,15 @@
1
+ -- =============================================================================
2
+ -- Importação: Riscos | Grupo de risco
3
+ -- Banco: qualiex_common (SQL Server)
4
+ -- Objetos: import.risks_groups_staging, import.validate_risks_groups,
5
+ -- import.get_errors_risks_groups
6
+ -- Destino: risks.groups
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_groups_staging]')
8
15
  AND type IN (N'U'))
@@ -12,15 +19,15 @@ GO
12
19
  CREATE TABLE [import].[risks_groups_staging](
13
20
  [id_batch] [uniqueidentifier] NOT NULL,
14
21
  [row_num] [int] NOT NULL,
15
- [code] [nvarchar](10) NOT NULL,
16
- [name] [nvarchar](200) NOT NULL,
17
- [description] [nvarchar](max) NULL,
18
- [is_active] [varchar](20) NULL,
19
- [id_responsible_user] [char](8) NOT NULL,
20
- [place_name] [nvarchar](200) NULL,
21
- [rule_name] [nvarchar](200) NULL,
22
- [id_creation_user] [char](8) NOT NULL,
23
- [id_company] [char](8) NOT NULL,
22
+ [code] [nvarchar](10) COLLATE Latin1_General_CS_AS NOT NULL,
23
+ [name] [nvarchar](200) COLLATE Latin1_General_CS_AS NOT NULL,
24
+ [description] [nvarchar](max) COLLATE Latin1_General_CS_AS NULL,
25
+ [is_active] [varchar](20) COLLATE Latin1_General_CS_AS NULL,
26
+ [id_responsible_user] [char](8) COLLATE Latin1_General_CS_AS NOT NULL,
27
+ [place_name] [nvarchar](200) COLLATE Latin1_General_CS_AS NULL,
28
+ [rule_name] [nvarchar](200) 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,
24
31
  CONSTRAINT [pk_risks_groups_staging] PRIMARY KEY CLUSTERED
25
32
  (
26
33
  [id_batch] ASC,
@@ -31,6 +38,9 @@ CREATE TABLE [import].[risks_groups_staging](
31
38
  ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
32
39
  GO
33
40
 
41
+ USE [qualiex_common]
42
+ GO
43
+
34
44
  CREATE OR ALTER PROCEDURE [import].[validate_risks_groups]
35
45
  @id_batch UNIQUEIDENTIFIER
36
46
  AS
@@ -39,146 +49,126 @@ BEGIN
39
49
 
40
50
  -- Validação 1: Código duplicado no arquivo
41
51
  INSERT INTO import.errors (id_batch, row_num, error_msg)
42
- SELECT @id_batch, s.row_num, 'Código duplicado no arquivo'
52
+ SELECT @id_batch, sub.row_num, 'Código duplicado no arquivo'
43
53
  FROM (
44
54
  SELECT *, COUNT(*) OVER (PARTITION BY code) AS cnt
45
55
  FROM import.risks_groups_staging WITH (NOLOCK)
46
56
  WHERE id_batch = @id_batch
47
57
  AND NULLIF(RTRIM(LTRIM(code)), '') IS NOT NULL
48
- ) s
49
- WHERE s.cnt > 1;
58
+ ) sub
59
+ WHERE sub.cnt > 1;
50
60
 
51
61
  -- Validação 2: Código já existente na produção (mesma unidade)
52
62
  INSERT INTO import.errors (id_batch, row_num, error_msg)
53
- SELECT @id_batch, s.row_num, 'Código de grupo já existe na base para esta unidade'
54
- FROM import.risks_groups_staging s WITH (NOLOCK)
55
- INNER JOIN risks.groups t WITH (NOLOCK)
56
- ON t.code COLLATE Latin1_General_CS_AS = s.code COLLATE Latin1_General_CS_AS
57
- AND t.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
58
- AND t.removed = 0
59
- WHERE s.id_batch = @id_batch;
63
+ SELECT @id_batch, rgs.row_num, 'Código de grupo já existe na base para esta unidade'
64
+ FROM import.risks_groups_staging rgs WITH (NOLOCK)
65
+ INNER JOIN risks.groups g WITH (NOLOCK)
66
+ ON g.code COLLATE Latin1_General_CS_AS = rgs.code
67
+ AND g.id_company COLLATE Latin1_General_CS_AS = rgs.id_company
68
+ AND g.removed = 0
69
+ WHERE rgs.id_batch = @id_batch;
60
70
 
61
71
  -- Validação 3: Nome duplicado no arquivo
62
72
  INSERT INTO import.errors (id_batch, row_num, error_msg)
63
- SELECT @id_batch, s.row_num, 'Nome do grupo duplicado no arquivo'
73
+ SELECT @id_batch, sub.row_num, 'Nome do grupo duplicado no arquivo'
64
74
  FROM (
65
75
  SELECT *, COUNT(*) OVER (PARTITION BY name) AS cnt
66
76
  FROM import.risks_groups_staging WITH (NOLOCK)
67
77
  WHERE id_batch = @id_batch
68
- ) s
69
- WHERE s.cnt > 1;
78
+ ) sub
79
+ WHERE sub.cnt > 1;
70
80
 
71
81
  -- Validação 4: Nome já existente na produção (mesma unidade)
72
82
  INSERT INTO import.errors (id_batch, row_num, error_msg)
73
- SELECT @id_batch, s.row_num, 'Nome do grupo já existe na base para esta unidade'
74
- FROM import.risks_groups_staging s WITH (NOLOCK)
75
- INNER JOIN risks.groups t WITH (NOLOCK)
76
- ON t.name COLLATE Latin1_General_CS_AS = s.name COLLATE Latin1_General_CS_AS
77
- AND t.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
78
- AND t.removed = 0
79
- WHERE s.id_batch = @id_batch;
83
+ SELECT @id_batch, rgs.row_num, 'Nome do grupo já existe na base para esta unidade'
84
+ FROM import.risks_groups_staging rgs WITH (NOLOCK)
85
+ INNER JOIN risks.groups g WITH (NOLOCK)
86
+ ON g.name COLLATE Latin1_General_CS_AS = rgs.name
87
+ AND g.id_company COLLATE Latin1_General_CS_AS = rgs.id_company
88
+ AND g.removed = 0
89
+ WHERE rgs.id_batch = @id_batch;
80
90
 
81
91
  -- Validação 5: Situação (is_active) inválida - Validação Estrita
82
92
  INSERT INTO import.errors (id_batch, row_num, error_msg)
83
- SELECT @id_batch, s.row_num, 'Situação inválida (selecione Ativo ou Inativo na planilha)'
84
- FROM import.risks_groups_staging s WITH (NOLOCK)
85
- WHERE s.id_batch = @id_batch
86
- AND ISNULL(s.is_active, '') COLLATE Latin1_General_CS_AS NOT IN ('Ativo', 'Inativo', '');
93
+ SELECT @id_batch, rgs.row_num, 'Situação inválida (selecione Ativo ou Inativo na planilha)'
94
+ FROM import.risks_groups_staging rgs WITH (NOLOCK)
95
+ WHERE rgs.id_batch = @id_batch
96
+ AND ISNULL(rgs.is_active, '') NOT IN ('Ativo', 'Inativo', '');
87
97
 
88
- -- Validação 6: Responsável não encontrado
98
+ -- Validação 6: Responsável não encontrado ou sem acesso à unidade
89
99
  INSERT INTO import.errors (id_batch, row_num, error_msg)
90
- SELECT @id_batch, s.row_num, 'Usuário responsável não encontrado'
91
- FROM import.risks_groups_staging s WITH (NOLOCK)
100
+ SELECT @id_batch, rgs.row_num, 'Usuário responsável não encontrado ou sem acesso à unidade'
101
+ FROM import.risks_groups_staging rgs WITH (NOLOCK)
92
102
  LEFT JOIN dbo.users u WITH (NOLOCK)
93
- ON u.id COLLATE Latin1_General_CS_AS = s.id_responsible_user COLLATE Latin1_General_CS_AS
94
- AND u.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
95
- AND u.removed = 0
96
- WHERE s.id_batch = @id_batch
97
- AND NULLIF(RTRIM(LTRIM(s.id_responsible_user)), '') IS NOT NULL
98
- AND u.id IS NULL;
103
+ ON u.id COLLATE Latin1_General_CS_AS = rgs.id_responsible_user AND u.removed = 0
104
+ LEFT JOIN dbo.companies_users cu WITH (NOLOCK)
105
+ ON cu.id_user COLLATE Latin1_General_CS_AS = u.id AND cu.id_company COLLATE Latin1_General_CS_AS = rgs.id_company AND cu.removed = 0
106
+ WHERE rgs.id_batch = @id_batch
107
+ AND NULLIF(RTRIM(LTRIM(rgs.id_responsible_user)), '') IS NOT NULL
108
+ AND (u.id IS NULL OR cu.id IS NULL);
99
109
 
100
110
  -- Validação 7: Local (Place) não encontrado (Opcional)
101
111
  INSERT INTO import.errors (id_batch, row_num, error_msg)
102
- SELECT @id_batch, s.row_num, 'Local não encontrado ou inativo'
103
- FROM import.risks_groups_staging s WITH (NOLOCK)
112
+ SELECT @id_batch, rgs.row_num, 'Local não encontrado ou inativo'
113
+ FROM import.risks_groups_staging rgs WITH (NOLOCK)
104
114
  LEFT JOIN dbo.places p WITH (NOLOCK)
105
- ON p.name COLLATE Latin1_General_CS_AS = s.place_name COLLATE Latin1_General_CS_AS
106
- AND p.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
115
+ ON p.name COLLATE Latin1_General_CS_AS = rgs.place_name
116
+ AND p.id_company COLLATE Latin1_General_CS_AS = rgs.id_company
107
117
  AND p.removed = 0
108
- WHERE s.id_batch = @id_batch
109
- AND NULLIF(RTRIM(LTRIM(s.place_name)), '') IS NOT NULL
118
+ WHERE rgs.id_batch = @id_batch
119
+ AND NULLIF(RTRIM(LTRIM(rgs.place_name)), '') IS NOT NULL
110
120
  AND p.id IS NULL;
111
121
 
112
122
  -- Validação 8: Regra (Rule) não encontrada (Opcional)
113
123
  INSERT INTO import.errors (id_batch, row_num, error_msg)
114
- SELECT @id_batch, s.row_num, 'Regra não encontrada ou inativa'
115
- FROM import.risks_groups_staging s WITH (NOLOCK)
116
- LEFT JOIN risks.analysis_rules r WITH (NOLOCK)
117
- ON r.name COLLATE Latin1_General_CS_AS = s.rule_name COLLATE Latin1_General_CS_AS
118
- AND (r.id_company IS NULL OR r.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS)
119
- AND r.removed = 0
120
- WHERE s.id_batch = @id_batch
121
- AND NULLIF(RTRIM(LTRIM(s.rule_name)), '') IS NOT NULL
122
- AND r.id IS NULL;
124
+ SELECT @id_batch, rgs.row_num, 'Regra não encontrada ou inativa'
125
+ FROM import.risks_groups_staging rgs WITH (NOLOCK)
126
+ LEFT JOIN risks.analysis_rules ar WITH (NOLOCK)
127
+ ON ar.name COLLATE Latin1_General_CS_AS = rgs.rule_name
128
+ AND (ar.id_company IS NULL OR ar.id_company COLLATE Latin1_General_CS_AS = rgs.id_company)
129
+ AND ar.removed = 0
130
+ WHERE rgs.id_batch = @id_batch
131
+ AND NULLIF(RTRIM(LTRIM(rgs.rule_name)), '') IS NOT NULL
132
+ AND ar.id IS NULL;
123
133
 
124
134
  -- INSERÇÃO DOS DADOS VÁLIDOS
125
135
  INSERT INTO risks.groups
126
136
  (
127
- id_company,
128
- code,
129
- name,
130
- description,
131
- description_text,
132
- is_active,
133
- id_responsible_user,
134
- id_place,
135
- id_rule,
136
- id_creation_user,
137
- creation_date,
138
- last_modified,
139
- removed
137
+ id_company, code, name, description, description_text, is_active,
138
+ id_responsible_user, id_place, id_rule, id_creation_user, creation_date, last_modified, removed
140
139
  )
141
140
  SELECT
142
- s.id_company,
143
- LTRIM(RTRIM(s.code)) AS code,
144
- s.name,
145
- NULLIF(s.description, '') AS description,
146
- NULLIF(s.description, '') AS description_text,
147
- CASE
148
- WHEN s.is_active COLLATE Latin1_General_CS_AS = 'Inativo' THEN 0
149
- ELSE 1
150
- END AS is_active,
151
- u.id AS id_responsible_user,
141
+ rgs.id_company,
142
+ LTRIM(RTRIM(rgs.code)) AS code,
143
+ rgs.name,
144
+ NULLIF(rgs.description, '') AS description,
145
+ NULLIF(rgs.description, '') AS description_text,
146
+ CASE WHEN rgs.is_active = 'Inativo' THEN 0 ELSE 1 END AS is_active,
147
+ rgs.id_responsible_user,
152
148
  p.id AS id_place,
153
- r.id AS id_rule,
154
- s.id_creation_user,
149
+ ar.id AS id_rule,
150
+ rgs.id_creation_user,
155
151
  SYSDATETIMEOFFSET() AS creation_date,
156
152
  SYSDATETIMEOFFSET() AS last_modified,
157
153
  0 AS removed
158
- FROM import.risks_groups_staging s WITH (NOLOCK)
159
- LEFT JOIN dbo.users u WITH (NOLOCK)
160
- ON u.id COLLATE Latin1_General_CS_AS = s.id_responsible_user COLLATE Latin1_General_CS_AS
161
- AND u.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
162
- AND u.removed = 0
154
+ FROM import.risks_groups_staging rgs WITH (NOLOCK)
163
155
  LEFT JOIN dbo.places p WITH (NOLOCK)
164
- ON p.name COLLATE Latin1_General_CS_AS = s.place_name COLLATE Latin1_General_CS_AS
165
- AND p.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS
166
- AND p.removed = 0
167
- LEFT JOIN risks.analysis_rules r WITH (NOLOCK)
168
- ON r.name COLLATE Latin1_General_CS_AS = s.rule_name COLLATE Latin1_General_CS_AS
169
- AND (r.id_company IS NULL OR r.id_company COLLATE Latin1_General_CS_AS = s.id_company COLLATE Latin1_General_CS_AS)
170
- AND r.removed = 0
171
- WHERE s.id_batch = @id_batch
156
+ ON p.name COLLATE Latin1_General_CS_AS = rgs.place_name AND p.id_company COLLATE Latin1_General_CS_AS = rgs.id_company AND p.removed = 0
157
+ LEFT JOIN risks.analysis_rules ar WITH (NOLOCK)
158
+ ON ar.name COLLATE Latin1_General_CS_AS = rgs.rule_name AND (ar.id_company IS NULL OR ar.id_company COLLATE Latin1_General_CS_AS = rgs.id_company) AND ar.removed = 0
159
+ WHERE rgs.id_batch = @id_batch
172
160
  AND NOT EXISTS (
173
161
  SELECT 1
174
162
  FROM import.errors e
175
- WHERE e.id_batch = s.id_batch
176
- AND e.row_num = s.row_num
163
+ WHERE e.id_batch = rgs.id_batch
164
+ AND e.row_num = rgs.row_num
177
165
  );
178
-
179
166
  END
180
167
  GO
181
168
 
169
+ USE [qualiex_common]
170
+ GO
171
+
182
172
  CREATE OR ALTER PROCEDURE [import].[get_errors_risks_groups]
183
173
  (
184
174
  @id_batch UNIQUEIDENTIFIER
@@ -188,29 +178,17 @@ BEGIN
188
178
  SET NOCOUNT ON;
189
179
 
190
180
  SELECT
191
- STRING_AGG(
192
- CAST(e.error_msg AS NVARCHAR(MAX)),
193
- '; '
194
- ) WITHIN GROUP (ORDER BY e.error_msg) AS error_msg,
195
-
181
+ STRING_AGG(CAST(e.error_msg AS NVARCHAR(MAX)), '; ') WITHIN GROUP (ORDER BY e.error_msg) AS error_msg,
196
182
  e.row_num,
197
- s.code,
198
- s.name,
199
- s.id_creation_user
200
-
183
+ rgs.code,
184
+ rgs.name,
185
+ rgs.id_creation_user
201
186
  FROM import.errors e WITH (NOLOCK)
202
- JOIN import.risks_groups_staging s WITH (NOLOCK)
203
- ON s.row_num = e.row_num
204
- AND s.id_batch = e.id_batch
187
+ JOIN import.risks_groups_staging rgs WITH (NOLOCK)
188
+ ON rgs.row_num = e.row_num
189
+ AND rgs.id_batch = e.id_batch
205
190
  WHERE e.id_batch = @id_batch
206
- GROUP BY
207
- e.row_num,
208
- s.code,
209
- s.name,
210
- s.id_creation_user
191
+ GROUP BY e.row_num, rgs.code, rgs.name, rgs.id_creation_user
211
192
  ORDER BY e.row_num;
212
193
  END
213
194
  GO
214
-
215
- -- commit
216
- -- rollback
@@ -1,50 +1,73 @@
1
1
  -- =============================================================
2
2
  -- Procedures de importação — Fornecedores (code + is_custom_supplier)
3
- -- Banco: qualiex_common_15 (SQL Server)
3
+ -- Banco: qualiex_common (SQL Server)
4
+ --
5
+ -- O código NÃO é auto-gerado: é sempre obrigatório.
4
6
  --
5
7
  -- Regras conforme suppliers.suppliers_configurations.is_custom_supplier:
6
8
  --
7
9
  -- is_custom = 0 (padrão do sistema)
8
- -- code vazio → ERRO "Código obrigatório no padrão AA-NNNNN"
9
- -- code fora padrão → ERRO "Código fora do padrão do sistema (AA-NNNNN)"
10
- -- code no padrão → valida duplicidade (lote + base) e insere
10
+ -- code obrigatório e no formato AA-NNNNN (ex.: 25-00001)
11
11
  --
12
12
  -- is_custom = 1 (customizável)
13
- -- code vazio → insere com code = NULL
14
- -- code preenchido → valida duplicidade e insere livremente
13
+ -- code obrigatório, formato livre (até 20 caracteres)
15
14
  --
16
- -- Formato padrão do sistema: AA-NNNNN
17
- -- AA = 2 dígitos (ano)
18
- -- NNNNN = 5 dígitos (sequencial dentro do ano)
19
- -- Ex.: 25-00001
15
+ -- Em ambos os casos: valida duplicidade no lote e na base (mesma unidade).
20
16
  --
21
17
  -- Premissa: 1 unidade por lote (id_company constante no staging).
22
18
  --
23
19
  -- Nota de collation:
24
20
  -- Colunas de ID (char(8)) na base de produção usam
25
- -- `Latin1_General_CS_AS`, enquanto o staging herda o collation
26
- -- padrão do banco (`Latin1_General_CI_AI`). Todas as comparações
27
- -- de IDs recebem COLLATE Latin1_General_CS_AS explícito para
28
- -- evitar "Cannot resolve the collation conflict".
21
+ -- `Latin1_General_CS_AS`; o staging declara o mesmo collation
22
+ -- explicitamente por coluna para evitar conflito de collation.
29
23
  -- =============================================================
30
24
 
31
- USE [qualiex_common_15]
32
- GO
25
+ use [qualiex_common]
26
+ go
33
27
 
34
- SET ANSI_NULLS ON
28
+ IF EXISTS (SELECT * FROM sys.objects
29
+ WHERE object_id = OBJECT_ID(N'[import].[suppliers_staging]')
30
+ AND type IN (N'U'))
31
+ DROP TABLE [import].[suppliers_staging]
35
32
  GO
36
- SET QUOTED_IDENTIFIER ON
33
+
34
+ CREATE TABLE [import].[suppliers_staging](
35
+ [id_batch] UNIQUEIDENTIFIER NOT NULL,
36
+ [row_num] INT NOT NULL,
37
+ [code] VARCHAR(20) COLLATE Latin1_General_CS_AS NOT NULL,
38
+ [name] NVARCHAR(500) COLLATE Latin1_General_CS_AS NOT NULL,
39
+ [id_type] INT NOT NULL,
40
+ [id_category] CHAR(8) COLLATE Latin1_General_CS_AS NULL,
41
+ [e_document_type] INT NOT NULL,
42
+ [document_number] NVARCHAR(20) COLLATE Latin1_General_CS_AS NOT NULL,
43
+ [corporate_name] VARCHAR(500) COLLATE Latin1_General_CS_AS NOT NULL,
44
+ [email] VARCHAR(200) COLLATE Latin1_General_CS_AS NULL,
45
+ [website] VARCHAR(200) COLLATE Latin1_General_CS_AS NULL,
46
+ [phone] VARCHAR(50) COLLATE Latin1_General_CS_AS NULL,
47
+ [municipal_registration] VARCHAR(50) COLLATE Latin1_General_CS_AS NULL,
48
+ [state_registration] VARCHAR(50) COLLATE Latin1_General_CS_AS NULL,
49
+ [observations] VARCHAR(500) COLLATE Latin1_General_CS_AS NULL,
50
+ [cep] VARCHAR(9) COLLATE Latin1_General_CS_AS NULL,
51
+ [state] VARCHAR(50) COLLATE Latin1_General_CS_AS NULL,
52
+ [city] VARCHAR(150) COLLATE Latin1_General_CS_AS NULL,
53
+ [neighborhood] VARCHAR(200) COLLATE Latin1_General_CS_AS NULL,
54
+ [address] VARCHAR(500) COLLATE Latin1_General_CS_AS NULL,
55
+ [address_number] VARCHAR(100) COLLATE Latin1_General_CS_AS NULL,
56
+ [complement] VARCHAR(500) COLLATE Latin1_General_CS_AS NULL,
57
+ [id_creation_user] CHAR(8) COLLATE Latin1_General_CS_AS NOT NULL,
58
+ [id_company] CHAR(8) COLLATE Latin1_General_CS_AS NOT NULL,
59
+ CONSTRAINT pk_suppliers_staging PRIMARY KEY CLUSTERED (id_batch, row_num)
60
+ ) ON [PRIMARY]
37
61
  GO
38
62
 
39
- CREATE OR ALTER PROCEDURE [import].[validate_suppliers]
63
+
64
+ CREATE OR ALTER PROCEDURE [import].[validate_suppliers]
40
65
  @id_batch UNIQUEIDENTIFIER
41
66
  AS
42
67
  BEGIN
43
68
  SET NOCOUNT ON;
44
69
 
45
- -- =========================================================
46
- -- 0) Lê is_custom_supplier da unidade do lote
47
- -- =========================================================
70
+ -- Lê is_custom_supplier da unidade do lote
48
71
  DECLARE @is_custom BIT = 0;
49
72
 
50
73
  SELECT TOP 1 @is_custom = ISNULL(sc.is_custom_supplier, 0)
@@ -54,36 +77,25 @@ BEGIN
54
77
  AND sc.removed = 0
55
78
  WHERE s.id_batch = @id_batch;
56
79
 
57
- -- =========================================================
58
- -- 1) VALIDAÇÃO DE FORMATO — apenas quando is_custom = 0
59
- -- =========================================================
80
+ -- Validação 1: código é obrigatório (não é auto-gerado)
81
+ INSERT INTO import.errors (id_batch, row_num, error_msg)
82
+ SELECT @id_batch, s.row_num, 'Código é obrigatório'
83
+ FROM import.suppliers_staging s WITH (NOLOCK)
84
+ WHERE s.id_batch = @id_batch
85
+ AND LTRIM(RTRIM(ISNULL(s.code, ''))) = '';
86
+
87
+ -- Validação 2: unidade padrão exige formato AA-NNNNN (ex.: 25-00001)
60
88
  IF @is_custom = 0
61
89
  BEGIN
62
- -- 1.1) Código obrigatório
63
- INSERT INTO import.errors (id_batch, row_num, error_msg)
64
- SELECT @id_batch, s.row_num, 'Código obrigatório no padrão AA-NNNNN'
65
- FROM import.suppliers_staging s WITH (NOLOCK)
66
- WHERE s.id_batch = @id_batch
67
- AND ISNULL(s.code, '') = '';
68
-
69
- -- 1.2) Código fora do padrão AA-NNNNN (2 dígitos, hífen, 5 dígitos)
70
90
  INSERT INTO import.errors (id_batch, row_num, error_msg)
71
- SELECT @id_batch, s.row_num, 'Código fora do padrão do sistema (AA-NNNNN)'
91
+ SELECT @id_batch, s.row_num, 'Código fora do padrão AA-NNNNN (ex.: 25-00001)'
72
92
  FROM import.suppliers_staging s WITH (NOLOCK)
73
93
  WHERE s.id_batch = @id_batch
74
- AND s.code <> ''
75
- AND (
76
- LEN(s.code) <> 8
77
- OR s.code NOT LIKE '[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9]'
78
- );
94
+ AND LTRIM(RTRIM(ISNULL(s.code, ''))) <> ''
95
+ AND s.code NOT LIKE '[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9]';
79
96
  END
80
97
 
81
- -- =========================================================
82
- -- 2) VALIDAÇÃO DE DUPLICIDADE — para code preenchido
83
- -- (aplica em ambos os modos)
84
- -- =========================================================
85
-
86
- -- 2.1) Duplicado dentro do próprio lote
98
+ -- Validação 3.1: duplicado dentro do próprio lote
87
99
  INSERT INTO import.errors (id_batch, row_num, error_msg)
88
100
  SELECT @id_batch, s.row_num, 'Código duplicado no arquivo'
89
101
  FROM (
@@ -94,21 +106,17 @@ BEGIN
94
106
  ) s
95
107
  WHERE s.cnt > 1;
96
108
 
97
- -- 2.2) Código já existente na produção (mesma unidade)
109
+ -- Validação 3.2: código já existente na produção (mesma unidade)
98
110
  INSERT INTO import.errors (id_batch, row_num, error_msg)
99
111
  SELECT @id_batch, s.row_num, 'Código já existe na base'
100
112
  FROM import.suppliers_staging s WITH (NOLOCK)
101
113
  INNER JOIN suppliers.suppliers t WITH (NOLOCK)
102
- ON t.code = s.code COLLATE Latin1_General_CS_AS
114
+ ON t.code = s.code
103
115
  AND t.removed = 0
104
- AND t.id_company = s.id_company COLLATE Latin1_General_CS_AS
116
+ AND t.id_company = s.id_company
105
117
  WHERE s.id_batch = @id_batch
106
118
  AND s.code <> '';
107
119
 
108
- -- =========================================================
109
- -- 3) INSERÇÃO — apenas registros válidos
110
- -- (code vazio entra como NULL — permitido só em is_custom = 1)
111
- -- =========================================================
112
120
  INSERT INTO suppliers.suppliers
113
121
  (
114
122
  code,
@@ -167,5 +175,76 @@ BEGIN
167
175
  WHERE e.id_batch = s.id_batch
168
176
  AND e.row_num = s.row_num
169
177
  );
178
+
170
179
  END
180
+
171
181
  GO
182
+
183
+ use [qualiex_common]
184
+ go
185
+
186
+ CREATE OR ALTER PROCEDURE [import].[get_errors_suppliers]
187
+ (
188
+ @id_batch UNIQUEIDENTIFIER
189
+ )
190
+ AS
191
+ BEGIN
192
+ SET NOCOUNT ON;
193
+
194
+ SELECT
195
+ STRING_AGG(CAST(e.error_msg AS NVARCHAR(MAX)), '; ') WITHIN GROUP (ORDER BY e.error_msg) AS error_msg,
196
+
197
+ e.row_num,
198
+ ss.code,
199
+ ss.name,
200
+ ss.id_type,
201
+ ss.id_category,
202
+ ss.e_document_type,
203
+ ss.document_number,
204
+ ss.corporate_name,
205
+ ss.email,
206
+ ss.website,
207
+ ss.phone,
208
+ ss.municipal_registration,
209
+ ss.state_registration,
210
+ ss.observations,
211
+ ss.cep,
212
+ ss.state,
213
+ ss.city,
214
+ ss.neighborhood,
215
+ ss.address,
216
+ ss.address_number,
217
+ ss.complement,
218
+ ss.id_creation_user
219
+
220
+ FROM import.errors e WITH (NOLOCK)
221
+ JOIN import.suppliers_staging ss WITH (NOLOCK)
222
+ ON ss.row_num = e.row_num
223
+ AND ss.id_batch = e.id_batch
224
+ WHERE e.id_batch = @id_batch
225
+ GROUP BY
226
+ e.row_num,
227
+ ss.code,
228
+ ss.name,
229
+ ss.id_type,
230
+ ss.id_category,
231
+ ss.e_document_type,
232
+ ss.document_number,
233
+ ss.corporate_name,
234
+ ss.email,
235
+ ss.website,
236
+ ss.phone,
237
+ ss.municipal_registration,
238
+ ss.state_registration,
239
+ ss.observations,
240
+ ss.cep,
241
+ ss.state,
242
+ ss.city,
243
+ ss.neighborhood,
244
+ ss.address,
245
+ ss.address_number,
246
+ ss.complement,
247
+ ss.id_creation_user
248
+ ORDER BY e.row_num;
249
+ END
250
+ GO