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.
- package/dist/auth/services/TokenManager.d.ts +3 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/docs/sql/import/00_infra.sql +210 -0
- package/docs/sql/import/validate_criteria.sql +209 -0
- package/docs/sql/import/validate_occurrences.sql +295 -0
- package/docs/sql/import/validate_occurrences_categories.sql +129 -105
- package/docs/sql/import/validate_occurrences_causes_classification.sql +112 -0
- package/docs/sql/import/validate_occurrences_types.sql +113 -0
- package/docs/sql/import/validate_risks.sql +112 -140
- package/docs/sql/import/validate_risks_categories.sql +104 -94
- package/docs/sql/import/validate_risks_groups.sql +98 -120
- package/docs/sql/import/validate_suppliers.sql +131 -52
- package/docs/sql/import/validate_suppliers_categories.sql +150 -0
- package/docs/sql/import/validate_supply_types.sql +76 -130
- package/package.json +1 -1
- package/docs/sql/import/validate_supplier_categories.sql +0 -173
|
@@ -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,
|
|
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
|
-
)
|
|
49
|
-
WHERE
|
|
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,
|
|
54
|
-
FROM import.risks_groups_staging
|
|
55
|
-
INNER JOIN risks.groups
|
|
56
|
-
ON
|
|
57
|
-
AND
|
|
58
|
-
AND
|
|
59
|
-
WHERE
|
|
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,
|
|
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
|
-
)
|
|
69
|
-
WHERE
|
|
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,
|
|
74
|
-
FROM import.risks_groups_staging
|
|
75
|
-
INNER JOIN risks.groups
|
|
76
|
-
ON
|
|
77
|
-
AND
|
|
78
|
-
AND
|
|
79
|
-
WHERE
|
|
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,
|
|
84
|
-
FROM import.risks_groups_staging
|
|
85
|
-
WHERE
|
|
86
|
-
AND ISNULL(
|
|
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,
|
|
91
|
-
FROM import.risks_groups_staging
|
|
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 =
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
WHERE
|
|
97
|
-
AND NULLIF(RTRIM(LTRIM(
|
|
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,
|
|
103
|
-
FROM import.risks_groups_staging
|
|
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 =
|
|
106
|
-
AND p.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
|
|
109
|
-
AND NULLIF(RTRIM(LTRIM(
|
|
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,
|
|
115
|
-
FROM import.risks_groups_staging
|
|
116
|
-
LEFT JOIN risks.analysis_rules
|
|
117
|
-
ON
|
|
118
|
-
AND (
|
|
119
|
-
AND
|
|
120
|
-
WHERE
|
|
121
|
-
AND NULLIF(RTRIM(LTRIM(
|
|
122
|
-
AND
|
|
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
|
-
|
|
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
|
-
|
|
143
|
-
LTRIM(RTRIM(
|
|
144
|
-
|
|
145
|
-
NULLIF(
|
|
146
|
-
NULLIF(
|
|
147
|
-
CASE
|
|
148
|
-
|
|
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
|
-
|
|
154
|
-
|
|
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
|
|
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 =
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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 =
|
|
176
|
-
AND e.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
|
-
|
|
198
|
-
|
|
199
|
-
|
|
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
|
|
203
|
-
ON
|
|
204
|
-
AND
|
|
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:
|
|
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
|
|
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
|
|
14
|
-
-- code preenchido → valida duplicidade e insere livremente
|
|
13
|
+
-- code obrigatório, formato livre (até 20 caracteres)
|
|
15
14
|
--
|
|
16
|
-
--
|
|
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
|
|
26
|
-
--
|
|
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
|
-
|
|
32
|
-
|
|
25
|
+
use [qualiex_common]
|
|
26
|
+
go
|
|
33
27
|
|
|
34
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
--
|
|
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
|
|
114
|
+
ON t.code = s.code
|
|
103
115
|
AND t.removed = 0
|
|
104
|
-
AND t.id_company = s.id_company
|
|
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
|