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
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
-- =============================================================
|
|
2
|
+
-- Procedures de importação — Categorias de Fornecedores
|
|
3
|
+
-- Banco: qualiex_common (SQL Server)
|
|
4
|
+
-- Dispatch dinâmico: import.process_batch resolve pelo table_name
|
|
5
|
+
-- (@tablename = 'suppliers_categories').
|
|
6
|
+
--
|
|
7
|
+
-- Tabela destino: suppliers.categories
|
|
8
|
+
-- `id char(8)` é auto-gerado (default dbo.new_id()) — não incluir no INSERT.
|
|
9
|
+
-- `color` default oficial do produto: '#000000ff' (quando o CSV vier vazio).
|
|
10
|
+
-- `description_text` recebe o mesmo conteúdo de `description`.
|
|
11
|
+
-- NÃO possui coluna `code`; a deduplicação usa `title`.
|
|
12
|
+
-- =============================================================
|
|
13
|
+
|
|
14
|
+
USE [qualiex_common]
|
|
15
|
+
GO
|
|
16
|
+
|
|
17
|
+
IF EXISTS (SELECT * FROM sys.objects
|
|
18
|
+
WHERE object_id = OBJECT_ID(N'[import].[supplier_categories_staging]')
|
|
19
|
+
AND type IN (N'U'))
|
|
20
|
+
DROP TABLE [import].[supplier_categories_staging]
|
|
21
|
+
GO
|
|
22
|
+
|
|
23
|
+
IF EXISTS (SELECT * FROM sys.objects
|
|
24
|
+
WHERE object_id = OBJECT_ID(N'[import].[suppliers_categories_staging]')
|
|
25
|
+
AND type IN (N'U'))
|
|
26
|
+
DROP TABLE [import].[suppliers_categories_staging]
|
|
27
|
+
GO
|
|
28
|
+
|
|
29
|
+
CREATE TABLE [import].[suppliers_categories_staging](
|
|
30
|
+
[id_batch] [uniqueidentifier] NOT NULL,
|
|
31
|
+
[row_num] [int] NOT NULL,
|
|
32
|
+
[title] [varchar](200) COLLATE Latin1_General_CS_AS NOT NULL,
|
|
33
|
+
[description] [varchar](max) COLLATE Latin1_General_CS_AS NULL,
|
|
34
|
+
[color] [varchar](9) COLLATE Latin1_General_CS_AS NULL,
|
|
35
|
+
[icon] [varchar](100) COLLATE Latin1_General_CS_AS NULL,
|
|
36
|
+
[id_form] [char](8) COLLATE Latin1_General_CS_AS NULL,
|
|
37
|
+
[id_form_action_plans] [char](8) COLLATE Latin1_General_CS_AS NULL,
|
|
38
|
+
[id_creation_user] [char](8) COLLATE Latin1_General_CS_AS NOT NULL,
|
|
39
|
+
[id_company] [char](8) COLLATE Latin1_General_CS_AS NOT NULL,
|
|
40
|
+
CONSTRAINT [pk_suppliers_categories_staging] PRIMARY KEY CLUSTERED
|
|
41
|
+
(
|
|
42
|
+
[id_batch] ASC,
|
|
43
|
+
[row_num] ASC
|
|
44
|
+
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
|
|
45
|
+
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON,
|
|
46
|
+
OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
|
|
47
|
+
) ON [PRIMARY]
|
|
48
|
+
GO
|
|
49
|
+
|
|
50
|
+
use [qualiex_common]
|
|
51
|
+
go
|
|
52
|
+
|
|
53
|
+
CREATE OR ALTER PROCEDURE [import].[validate_suppliers_categories]
|
|
54
|
+
@id_batch UNIQUEIDENTIFIER
|
|
55
|
+
AS
|
|
56
|
+
BEGIN
|
|
57
|
+
SET NOCOUNT ON;
|
|
58
|
+
|
|
59
|
+
-- Validação 1: Título duplicado dentro do próprio lote
|
|
60
|
+
INSERT INTO import.errors (id_batch, row_num, error_msg)
|
|
61
|
+
SELECT @id_batch, sub.row_num, 'Título duplicado no arquivo'
|
|
62
|
+
FROM (
|
|
63
|
+
SELECT *, COUNT(*) OVER (PARTITION BY title) AS cnt
|
|
64
|
+
FROM import.suppliers_categories_staging WITH (NOLOCK)
|
|
65
|
+
WHERE id_batch = @id_batch
|
|
66
|
+
) sub
|
|
67
|
+
WHERE sub.cnt > 1;
|
|
68
|
+
|
|
69
|
+
-- Validação 2: Título já existente na produção (mesma unidade)
|
|
70
|
+
INSERT INTO import.errors (id_batch, row_num, error_msg)
|
|
71
|
+
SELECT @id_batch, scs.row_num, 'Título já existe na base'
|
|
72
|
+
FROM import.suppliers_categories_staging scs WITH (NOLOCK)
|
|
73
|
+
INNER JOIN suppliers.categories sc WITH (NOLOCK)
|
|
74
|
+
ON sc.title COLLATE Latin1_General_CS_AS = scs.title
|
|
75
|
+
AND sc.id_company COLLATE Latin1_General_CS_AS = scs.id_company
|
|
76
|
+
AND sc.removed = 0
|
|
77
|
+
WHERE scs.id_batch = @id_batch;
|
|
78
|
+
|
|
79
|
+
-- INSERÇÃO: apenas registros sem erro
|
|
80
|
+
INSERT INTO suppliers.categories
|
|
81
|
+
(
|
|
82
|
+
title,
|
|
83
|
+
description,
|
|
84
|
+
description_text,
|
|
85
|
+
color,
|
|
86
|
+
icon,
|
|
87
|
+
id_form,
|
|
88
|
+
id_form_action_plans,
|
|
89
|
+
id_company,
|
|
90
|
+
is_active,
|
|
91
|
+
removed,
|
|
92
|
+
id_creation_user,
|
|
93
|
+
id_last_modified_user,
|
|
94
|
+
creation_date,
|
|
95
|
+
last_modified
|
|
96
|
+
)
|
|
97
|
+
SELECT
|
|
98
|
+
scs.title,
|
|
99
|
+
NULLIF(scs.description, '') AS description,
|
|
100
|
+
NULLIF(scs.description, '') AS description_text,
|
|
101
|
+
COALESCE(NULLIF(scs.color, ''), '#000000ff') AS color,
|
|
102
|
+
NULLIF(scs.icon, '') AS icon,
|
|
103
|
+
NULLIF(scs.id_form, '') AS id_form,
|
|
104
|
+
NULLIF(scs.id_form_action_plans, '') AS id_form_action_plans,
|
|
105
|
+
scs.id_company,
|
|
106
|
+
1 AS is_active,
|
|
107
|
+
0 AS removed,
|
|
108
|
+
scs.id_creation_user,
|
|
109
|
+
scs.id_creation_user AS id_last_modified_user,
|
|
110
|
+
SYSDATETIMEOFFSET() AS creation_date,
|
|
111
|
+
SYSDATETIMEOFFSET() AS last_modified
|
|
112
|
+
FROM import.suppliers_categories_staging scs WITH (NOLOCK)
|
|
113
|
+
WHERE scs.id_batch = @id_batch
|
|
114
|
+
AND NOT EXISTS (
|
|
115
|
+
SELECT 1
|
|
116
|
+
FROM import.errors e
|
|
117
|
+
WHERE e.id_batch = scs.id_batch
|
|
118
|
+
AND e.row_num = scs.row_num
|
|
119
|
+
);
|
|
120
|
+
END
|
|
121
|
+
GO
|
|
122
|
+
|
|
123
|
+
USE [qualiex_common]
|
|
124
|
+
GO
|
|
125
|
+
|
|
126
|
+
CREATE OR ALTER PROCEDURE [import].[get_errors_suppliers_categories]
|
|
127
|
+
(
|
|
128
|
+
@id_batch UNIQUEIDENTIFIER
|
|
129
|
+
)
|
|
130
|
+
AS
|
|
131
|
+
BEGIN
|
|
132
|
+
SET NOCOUNT ON;
|
|
133
|
+
|
|
134
|
+
SELECT
|
|
135
|
+
STRING_AGG(CAST(e.error_msg AS NVARCHAR(MAX)), '; ') WITHIN GROUP (ORDER BY e.error_msg) AS error_msg,
|
|
136
|
+
e.row_num,
|
|
137
|
+
scs.title,
|
|
138
|
+
scs.id_creation_user
|
|
139
|
+
FROM import.errors e WITH (NOLOCK)
|
|
140
|
+
JOIN import.suppliers_categories_staging scs WITH (NOLOCK)
|
|
141
|
+
ON scs.row_num = e.row_num
|
|
142
|
+
AND scs.id_batch = e.id_batch
|
|
143
|
+
WHERE e.id_batch = @id_batch
|
|
144
|
+
GROUP BY
|
|
145
|
+
e.row_num,
|
|
146
|
+
scs.title,
|
|
147
|
+
scs.id_creation_user
|
|
148
|
+
ORDER BY e.row_num;
|
|
149
|
+
END
|
|
150
|
+
GO
|
|
@@ -1,31 +1,15 @@
|
|
|
1
1
|
-- =============================================================
|
|
2
2
|
-- Procedures de importação — Tipo de Fornecimento
|
|
3
3
|
-- Banco: qualiex_common (SQL Server)
|
|
4
|
-
-- Padrão: espelha import.validate_suppliers_categories.
|
|
5
4
|
-- Dispatch dinâmico: import.process_batch resolve pelo table_name
|
|
6
5
|
-- (@tablename = 'supply_types').
|
|
7
6
|
--
|
|
8
|
-
-- Tabela destino: suppliers.supply_types
|
|
9
|
-
-- Colunas relevantes:
|
|
10
|
-
-- id char(8) NOT NULL -- default new_id()
|
|
11
|
-
-- id_company char(8) NOT NULL
|
|
12
|
-
-- title varchar(200) NOT NULL
|
|
13
|
-
-- description nvarchar(max) NULL -- HTML/richtext
|
|
14
|
-
-- description_text nvarchar(max) NULL -- texto puro (fallback = description)
|
|
15
|
-
-- is_active bit NOT NULL -- default 1
|
|
16
|
-
-- id_form char(8) NULL -- FK dbo.forms (informado pelo usuário)
|
|
17
|
-
-- id_creation_user char(8) NOT NULL
|
|
18
|
-
-- id_last_modified_user char(8) NOT NULL
|
|
19
|
-
-- creation_date datetimeoffset(7) NOT NULL default SYSDATETIMEOFFSET()
|
|
20
|
-
-- last_modified datetimeoffset(7) NOT NULL default SYSDATETIMEOFFSET()
|
|
21
|
-
-- removed bit NOT NULL -- default 0
|
|
22
|
-
--
|
|
23
7
|
-- Colunas esperadas no CSV (ordem do template):
|
|
24
|
-
-- 1) Título -> title
|
|
25
|
-
-- 2)
|
|
26
|
-
-- 3)
|
|
27
|
-
-- 4)
|
|
28
|
-
-- 5)
|
|
8
|
+
-- 1) Título -> title (obrigatório)
|
|
9
|
+
-- 2) Formulário do tipo de fornecimento -> id_form (opcional, char(8))
|
|
10
|
+
-- 3) Descrição -> description (opcional)
|
|
11
|
+
-- 4) Situação (Ativo/Inativo) -> is_active (opcional, default Ativo)
|
|
12
|
+
-- 5) Emissor (lookup usuários) -> id_creation_user (obrigatório)
|
|
29
13
|
--
|
|
30
14
|
-- Sem coluna `code` (tabela não possui).
|
|
31
15
|
-- id_company é resolvido pelo backend a partir do contexto da unidade.
|
|
@@ -34,105 +18,13 @@
|
|
|
34
18
|
USE [qualiex_common]
|
|
35
19
|
GO
|
|
36
20
|
|
|
37
|
-
-- =============================================================
|
|
38
|
-
-- Cleanup — versões anteriores (idempotência)
|
|
39
|
-
-- =============================================================
|
|
40
|
-
IF OBJECT_ID('import.get_errors_supply_types', 'P') IS NOT NULL
|
|
41
|
-
DROP PROCEDURE import.get_errors_supply_types;
|
|
42
|
-
GO
|
|
43
|
-
IF OBJECT_ID('import.validate_supply_types', 'P') IS NOT NULL
|
|
44
|
-
DROP PROCEDURE import.validate_supply_types;
|
|
45
|
-
GO
|
|
46
|
-
|
|
47
|
-
-- =============================================================
|
|
48
|
-
-- Staging table
|
|
49
|
-
-- =============================================================
|
|
50
|
-
IF EXISTS (SELECT * FROM sys.objects
|
|
51
|
-
WHERE object_id = OBJECT_ID(N'[import].[supply_types_staging]')
|
|
52
|
-
AND type IN (N'U'))
|
|
53
|
-
DROP TABLE [import].[supply_types_staging]
|
|
54
|
-
GO
|
|
55
|
-
|
|
56
|
-
SET ANSI_NULLS ON
|
|
57
|
-
GO
|
|
58
|
-
SET QUOTED_IDENTIFIER ON
|
|
59
|
-
GO
|
|
60
|
-
|
|
61
|
-
CREATE TABLE [import].[supply_types_staging](
|
|
62
|
-
[id_batch] [uniqueidentifier] NOT NULL,
|
|
63
|
-
[row_num] [int] NOT NULL,
|
|
64
|
-
[title] [varchar](200) NOT NULL,
|
|
65
|
-
[description] [nvarchar](max) NULL,
|
|
66
|
-
[is_active] [varchar](20) NULL, -- "Ativo" / "Inativo" vindo do CSV
|
|
67
|
-
[id_form] [char](8) NULL,
|
|
68
|
-
[id_creation_user] [char](8) NOT NULL,
|
|
69
|
-
[id_company] [char](8) NOT NULL,
|
|
70
|
-
CONSTRAINT [pk_supply_types_staging] PRIMARY KEY CLUSTERED
|
|
71
|
-
(
|
|
72
|
-
[id_batch] ASC,
|
|
73
|
-
[row_num] ASC
|
|
74
|
-
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
|
|
75
|
-
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON,
|
|
76
|
-
OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
|
|
77
|
-
) ON [PRIMARY]
|
|
78
|
-
GO
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
-- =============================================================
|
|
82
|
-
-- import.get_errors_supply_types
|
|
83
|
-
-- Retorna erros consolidados por linha para exibição no frontend.
|
|
84
|
-
-- =============================================================
|
|
85
|
-
CREATE OR ALTER PROCEDURE [import].[get_errors_supply_types]
|
|
86
|
-
(
|
|
87
|
-
@id_batch UNIQUEIDENTIFIER
|
|
88
|
-
)
|
|
89
|
-
AS
|
|
90
|
-
BEGIN
|
|
91
|
-
SET NOCOUNT ON;
|
|
92
|
-
|
|
93
|
-
SELECT
|
|
94
|
-
STRING_AGG(
|
|
95
|
-
CAST(e.error_msg AS NVARCHAR(MAX)),
|
|
96
|
-
'; '
|
|
97
|
-
) WITHIN GROUP (ORDER BY e.error_msg) AS error_msg,
|
|
98
|
-
|
|
99
|
-
e.row_num,
|
|
100
|
-
|
|
101
|
-
s.title,
|
|
102
|
-
s.id_creation_user
|
|
103
|
-
|
|
104
|
-
FROM import.errors e
|
|
105
|
-
JOIN import.supply_types_staging s
|
|
106
|
-
ON s.row_num = e.row_num
|
|
107
|
-
AND s.id_batch = e.id_batch
|
|
108
|
-
WHERE e.id_batch = @id_batch
|
|
109
|
-
GROUP BY
|
|
110
|
-
e.row_num,
|
|
111
|
-
s.title,
|
|
112
|
-
s.id_creation_user
|
|
113
|
-
ORDER BY e.row_num;
|
|
114
|
-
END
|
|
115
|
-
GO
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
-- =============================================================
|
|
119
|
-
-- import.validate_supply_types
|
|
120
|
-
-- 1) Título duplicado no arquivo
|
|
121
|
-
-- 2) Título já existente na base (mesma unidade, removed = 0)
|
|
122
|
-
-- 3) Situação inválida (aceita EXCLUSIVAMENTE 'Ativo' ou 'Inativo',
|
|
123
|
-
-- espelhando os valores do dropdown do template .xlsx —
|
|
124
|
-
-- comparação case/acento-insensitive para tolerar variações do Excel)
|
|
125
|
-
-- 4) INSERT das linhas sem erro em suppliers.supply_types
|
|
126
|
-
-- =============================================================
|
|
127
21
|
CREATE OR ALTER PROCEDURE [import].[validate_supply_types]
|
|
128
22
|
@id_batch UNIQUEIDENTIFIER
|
|
129
23
|
AS
|
|
130
24
|
BEGIN
|
|
131
25
|
SET NOCOUNT ON;
|
|
132
26
|
|
|
133
|
-
--
|
|
134
|
-
-- VALIDAÇÃO 1: Título duplicado dentro do próprio lote
|
|
135
|
-
-- ---------------------------------------------------------
|
|
27
|
+
-- Validação 1: Título duplicado dentro do próprio lote
|
|
136
28
|
INSERT INTO import.errors (id_batch, row_num, error_msg)
|
|
137
29
|
SELECT @id_batch, s.row_num, 'Título duplicado no arquivo'
|
|
138
30
|
FROM (
|
|
@@ -142,9 +34,7 @@ BEGIN
|
|
|
142
34
|
) s
|
|
143
35
|
WHERE s.cnt > 1;
|
|
144
36
|
|
|
145
|
-
--
|
|
146
|
-
-- VALIDAÇÃO 2: Título já existente na produção (mesma unidade)
|
|
147
|
-
-- ---------------------------------------------------------
|
|
37
|
+
-- Validação 2: Título já existente na produção (mesma unidade)
|
|
148
38
|
INSERT INTO import.errors (id_batch, row_num, error_msg)
|
|
149
39
|
SELECT @id_batch, s.row_num, 'Título já existe na base'
|
|
150
40
|
FROM import.supply_types_staging s WITH (NOLOCK)
|
|
@@ -154,11 +44,7 @@ BEGIN
|
|
|
154
44
|
AND t.id_company = s.id_company COLLATE Latin1_General_CS_AS
|
|
155
45
|
WHERE s.id_batch = @id_batch;
|
|
156
46
|
|
|
157
|
-
--
|
|
158
|
-
-- VALIDAÇÃO 3: Situação inválida
|
|
159
|
-
-- Aceita EXCLUSIVAMENTE 'Ativo' ou 'Inativo' (case/acento-insensitive).
|
|
160
|
-
-- Campo é obrigatório — vazio também é considerado inválido.
|
|
161
|
-
-- ---------------------------------------------------------
|
|
47
|
+
-- Validação 3: Situação inválida
|
|
162
48
|
INSERT INTO import.errors (id_batch, row_num, error_msg)
|
|
163
49
|
SELECT @id_batch, s.row_num, 'Situação inválida (use Ativo ou Inativo)'
|
|
164
50
|
FROM import.supply_types_staging s WITH (NOLOCK)
|
|
@@ -166,10 +52,7 @@ BEGIN
|
|
|
166
52
|
AND LTRIM(RTRIM(ISNULL(s.is_active, ''))) COLLATE Latin1_General_CI_AI
|
|
167
53
|
NOT IN ('ativo','inativo');
|
|
168
54
|
|
|
169
|
-
|
|
170
|
-
-- ---------------------------------------------------------
|
|
171
55
|
-- INSERÇÃO: apenas registros sem erro
|
|
172
|
-
-- ---------------------------------------------------------
|
|
173
56
|
INSERT INTO suppliers.supply_types
|
|
174
57
|
(
|
|
175
58
|
title,
|
|
@@ -187,9 +70,6 @@ BEGIN
|
|
|
187
70
|
SELECT
|
|
188
71
|
s.title,
|
|
189
72
|
NULLIF(s.description, '') AS description,
|
|
190
|
-
-- Fallback: description_text recebe o mesmo valor de description.
|
|
191
|
-
-- Caso o backend .NET possua helper para extrair texto puro do HTML,
|
|
192
|
-
-- substituir este valor antes/depois do INSERT.
|
|
193
73
|
NULLIF(s.description, '') AS description_text,
|
|
194
74
|
CASE
|
|
195
75
|
WHEN LTRIM(RTRIM(ISNULL(s.is_active, ''))) COLLATE Latin1_General_CI_AI
|
|
@@ -213,7 +93,73 @@ BEGIN
|
|
|
213
93
|
AND e.row_num = s.row_num
|
|
214
94
|
);
|
|
215
95
|
|
|
216
|
-
-- Observação:
|
|
217
|
-
-- `id` (char(8)) é gerado pelo DEFAULT dbo.new_id() da tabela — não incluir no INSERT.
|
|
218
96
|
END
|
|
219
97
|
GO
|
|
98
|
+
|
|
99
|
+
use [qualiex_common]
|
|
100
|
+
go
|
|
101
|
+
|
|
102
|
+
IF EXISTS (SELECT * FROM sys.objects
|
|
103
|
+
WHERE object_id = OBJECT_ID(N'[import].[supply_types_staging]')
|
|
104
|
+
AND type IN (N'U'))
|
|
105
|
+
DROP TABLE [import].[supply_types_staging]
|
|
106
|
+
GO
|
|
107
|
+
|
|
108
|
+
SET ANSI_NULLS ON
|
|
109
|
+
GO
|
|
110
|
+
SET QUOTED_IDENTIFIER ON
|
|
111
|
+
GO
|
|
112
|
+
|
|
113
|
+
CREATE TABLE [import].[supply_types_staging](
|
|
114
|
+
[id_batch] [uniqueidentifier] NOT NULL,
|
|
115
|
+
[row_num] [int] NOT NULL,
|
|
116
|
+
[title] [varchar](200) NOT NULL,
|
|
117
|
+
[description] [nvarchar](max) NULL,
|
|
118
|
+
[is_active] [varchar](20) NULL,
|
|
119
|
+
[id_form] [char](8) NULL,
|
|
120
|
+
[id_creation_user] [char](8) NOT NULL,
|
|
121
|
+
[id_company] [char](8) NOT NULL,
|
|
122
|
+
CONSTRAINT [pk_supply_types_staging] PRIMARY KEY CLUSTERED
|
|
123
|
+
(
|
|
124
|
+
[id_batch] ASC,
|
|
125
|
+
[row_num] ASC
|
|
126
|
+
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
|
|
127
|
+
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON,
|
|
128
|
+
OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
|
|
129
|
+
) ON [PRIMARY]
|
|
130
|
+
GO
|
|
131
|
+
|
|
132
|
+
use [qualiex_common]
|
|
133
|
+
go
|
|
134
|
+
|
|
135
|
+
CREATE OR ALTER PROCEDURE [import].[get_errors_supply_types]
|
|
136
|
+
(
|
|
137
|
+
@id_batch UNIQUEIDENTIFIER
|
|
138
|
+
)
|
|
139
|
+
AS
|
|
140
|
+
BEGIN
|
|
141
|
+
SET NOCOUNT ON;
|
|
142
|
+
|
|
143
|
+
SELECT
|
|
144
|
+
STRING_AGG(
|
|
145
|
+
CAST(e.error_msg AS NVARCHAR(MAX)),
|
|
146
|
+
'; '
|
|
147
|
+
) WITHIN GROUP (ORDER BY e.error_msg) AS error_msg,
|
|
148
|
+
|
|
149
|
+
e.row_num,
|
|
150
|
+
|
|
151
|
+
s.title,
|
|
152
|
+
s.id_creation_user
|
|
153
|
+
|
|
154
|
+
FROM import.errors e
|
|
155
|
+
JOIN import.supply_types_staging s
|
|
156
|
+
ON s.row_num = e.row_num
|
|
157
|
+
AND s.id_batch = e.id_batch
|
|
158
|
+
WHERE e.id_batch = @id_batch
|
|
159
|
+
GROUP BY
|
|
160
|
+
e.row_num,
|
|
161
|
+
s.title,
|
|
162
|
+
s.id_creation_user
|
|
163
|
+
ORDER BY e.row_num;
|
|
164
|
+
END
|
|
165
|
+
GO
|
package/package.json
CHANGED
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
-- =============================================================
|
|
2
|
-
-- Procedures de importação — Categorias de Fornecedores
|
|
3
|
-
-- Banco: qualiex_common (SQL Server)
|
|
4
|
-
-- Padrão: espelha import.validate_suppliers / import.get_errors_suppliers
|
|
5
|
-
-- Dispatch dinâmico: import.process_batch resolve pelo nome da tabela
|
|
6
|
-
-- (@tablename = 'suppliers_categories').
|
|
7
|
-
--
|
|
8
|
-
-- Decisões confirmadas com o backend:
|
|
9
|
-
-- 1) `id char(8)` é auto-gerado pelo SQL Server — não incluir no INSERT.
|
|
10
|
-
-- 2) `color` default oficial do produto: '#000000ff' (usado quando o CSV vier vazio).
|
|
11
|
-
-- 3) `creation_date` / `last_modified` são populados via SYSDATETIMEOFFSET()
|
|
12
|
-
-- diretamente no INSERT.
|
|
13
|
-
--
|
|
14
|
-
-- A tabela suppliers.categories NÃO possui coluna `code`.
|
|
15
|
-
-- O identificador de negócio para deduplicação é `title` (varchar 200, NOT NULL).
|
|
16
|
-
-- =============================================================
|
|
17
|
-
|
|
18
|
-
USE [qualiex_common]
|
|
19
|
-
GO
|
|
20
|
-
|
|
21
|
-
-- =============================================================
|
|
22
|
-
-- Cleanup — procedures antigas com nomenclatura errada (supplier_*)
|
|
23
|
-
-- =============================================================
|
|
24
|
-
IF OBJECT_ID('import.get_errors_supplier_categories', 'P') IS NOT NULL
|
|
25
|
-
DROP PROCEDURE import.get_errors_supplier_categories;
|
|
26
|
-
GO
|
|
27
|
-
IF OBJECT_ID('import.validate_supplier_categories', 'P') IS NOT NULL
|
|
28
|
-
DROP PROCEDURE import.validate_supplier_categories;
|
|
29
|
-
GO
|
|
30
|
-
|
|
31
|
-
-- =============================================================
|
|
32
|
-
-- Staging table — espelha padrão de import.suppliers_staging
|
|
33
|
-
-- Colunas alinhadas com common.imports_template_fields do template
|
|
34
|
-
-- "Fornecedores | Parâmetros | Categorias"
|
|
35
|
-
-- =============================================================
|
|
36
|
-
/****** Object: Table [import].[suppliers_categories_staging] ******/
|
|
37
|
-
IF EXISTS (SELECT * FROM sys.objects
|
|
38
|
-
WHERE object_id = OBJECT_ID(N'[import].[suppliers_categories_staging]')
|
|
39
|
-
AND type IN (N'U'))
|
|
40
|
-
DROP TABLE [import].[suppliers_categories_staging]
|
|
41
|
-
GO
|
|
42
|
-
|
|
43
|
-
SET ANSI_NULLS ON
|
|
44
|
-
GO
|
|
45
|
-
SET QUOTED_IDENTIFIER ON
|
|
46
|
-
GO
|
|
47
|
-
|
|
48
|
-
CREATE TABLE [import].[suppliers_categories_staging](
|
|
49
|
-
[id_batch] [uniqueidentifier] NOT NULL,
|
|
50
|
-
[row_num] [int] NOT NULL,
|
|
51
|
-
[title] [varchar](200) NOT NULL,
|
|
52
|
-
[description] [varchar](max) NULL,
|
|
53
|
-
[color] [varchar](9) NULL,
|
|
54
|
-
[icon] [varchar](100) NULL,
|
|
55
|
-
[id_form] [char](8) NULL,
|
|
56
|
-
[id_form_action_plans] [char](8) NULL,
|
|
57
|
-
[id_creation_user] [char](8) NOT NULL,
|
|
58
|
-
[id_company] [char](8) NOT NULL,
|
|
59
|
-
CONSTRAINT [pk_suppliers_categories_staging] PRIMARY KEY CLUSTERED
|
|
60
|
-
(
|
|
61
|
-
[id_batch] ASC,
|
|
62
|
-
[row_num] ASC
|
|
63
|
-
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
|
|
64
|
-
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON,
|
|
65
|
-
OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
|
|
66
|
-
) ON [PRIMARY]
|
|
67
|
-
GO
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
CREATE OR ALTER PROCEDURE [import].[get_errors_suppliers_categories]
|
|
72
|
-
(
|
|
73
|
-
@id_batch UNIQUEIDENTIFIER
|
|
74
|
-
)
|
|
75
|
-
AS
|
|
76
|
-
BEGIN
|
|
77
|
-
SET NOCOUNT ON;
|
|
78
|
-
|
|
79
|
-
SELECT
|
|
80
|
-
STRING_AGG(
|
|
81
|
-
CAST(e.error_msg AS NVARCHAR(MAX)),
|
|
82
|
-
'; '
|
|
83
|
-
) WITHIN GROUP (ORDER BY e.error_msg) AS error_msg,
|
|
84
|
-
|
|
85
|
-
e.row_num,
|
|
86
|
-
|
|
87
|
-
s.title,
|
|
88
|
-
s.id_creation_user
|
|
89
|
-
|
|
90
|
-
FROM import.errors e
|
|
91
|
-
JOIN import.suppliers_categories_staging s
|
|
92
|
-
ON s.row_num = e.row_num
|
|
93
|
-
AND s.id_batch = e.id_batch
|
|
94
|
-
WHERE e.id_batch = @id_batch
|
|
95
|
-
GROUP BY
|
|
96
|
-
e.row_num,
|
|
97
|
-
s.title,
|
|
98
|
-
s.id_creation_user
|
|
99
|
-
ORDER BY e.row_num;
|
|
100
|
-
END
|
|
101
|
-
GO
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
USE [qualiex_common]
|
|
105
|
-
GO
|
|
106
|
-
|
|
107
|
-
CREATE OR ALTER PROCEDURE [import].[validate_suppliers_categories]
|
|
108
|
-
@id_batch UNIQUEIDENTIFIER
|
|
109
|
-
AS
|
|
110
|
-
BEGIN
|
|
111
|
-
SET NOCOUNT ON;
|
|
112
|
-
|
|
113
|
-
-- VALIDAÇÃO 1: Título duplicado dentro do próprio lote
|
|
114
|
-
INSERT INTO import.errors (id_batch, row_num, error_msg)
|
|
115
|
-
SELECT @id_batch, s.row_num, 'Título duplicado no arquivo'
|
|
116
|
-
FROM (
|
|
117
|
-
SELECT *, COUNT(*) OVER (PARTITION BY title) AS cnt
|
|
118
|
-
FROM import.suppliers_categories_staging WITH (NOLOCK)
|
|
119
|
-
WHERE id_batch = @id_batch
|
|
120
|
-
) s
|
|
121
|
-
WHERE s.cnt > 1;
|
|
122
|
-
|
|
123
|
-
-- VALIDAÇÃO 2: Título já existente na produção (mesma unidade)
|
|
124
|
-
INSERT INTO import.errors (id_batch, row_num, error_msg)
|
|
125
|
-
SELECT @id_batch, s.row_num, 'Título já existe na base'
|
|
126
|
-
FROM import.suppliers_categories_staging s WITH (NOLOCK)
|
|
127
|
-
INNER JOIN suppliers.categories t WITH (NOLOCK)
|
|
128
|
-
ON t.title = s.title COLLATE Latin1_General_CS_AS
|
|
129
|
-
AND t.removed = 0
|
|
130
|
-
AND t.id_company = s.id_company COLLATE Latin1_General_CS_AS
|
|
131
|
-
WHERE s.id_batch = @id_batch;
|
|
132
|
-
|
|
133
|
-
-- INSERÇÃO: apenas registros sem erro
|
|
134
|
-
INSERT INTO suppliers.categories
|
|
135
|
-
(
|
|
136
|
-
title,
|
|
137
|
-
description,
|
|
138
|
-
color,
|
|
139
|
-
icon,
|
|
140
|
-
id_form,
|
|
141
|
-
id_form_action_plans,
|
|
142
|
-
id_company,
|
|
143
|
-
is_active,
|
|
144
|
-
removed,
|
|
145
|
-
id_creation_user,
|
|
146
|
-
id_last_modified_user,
|
|
147
|
-
creation_date,
|
|
148
|
-
last_modified
|
|
149
|
-
)
|
|
150
|
-
SELECT
|
|
151
|
-
s.title,
|
|
152
|
-
NULLIF(s.description, '') AS description,
|
|
153
|
-
COALESCE(NULLIF(s.color, ''), '#000000ff') AS color,
|
|
154
|
-
NULLIF(s.icon, '') AS icon,
|
|
155
|
-
NULLIF(s.id_form, '') AS id_form,
|
|
156
|
-
NULLIF(s.id_form_action_plans, '') AS id_form_action_plans,
|
|
157
|
-
s.id_company,
|
|
158
|
-
1 AS is_active,
|
|
159
|
-
0 AS removed,
|
|
160
|
-
s.id_creation_user,
|
|
161
|
-
s.id_creation_user AS id_last_modified_user,
|
|
162
|
-
SYSDATETIMEOFFSET() AS creation_date,
|
|
163
|
-
SYSDATETIMEOFFSET() AS last_modified
|
|
164
|
-
FROM import.suppliers_categories_staging s WITH (NOLOCK)
|
|
165
|
-
WHERE s.id_batch = @id_batch
|
|
166
|
-
AND NOT EXISTS (
|
|
167
|
-
SELECT 1
|
|
168
|
-
FROM import.errors e
|
|
169
|
-
WHERE e.id_batch = s.id_batch
|
|
170
|
-
AND e.row_num = s.row_num
|
|
171
|
-
);
|
|
172
|
-
END
|
|
173
|
-
GO
|