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.
@@ -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 (obrigatório)
25
- -- 2) Descrição -> description (opcional)
26
- -- 3) Situação (Ativo/Inativo) -> is_active (opcional, default Ativo)
27
- -- 4) Emissor (lookup usuários) -> id_creation_user (obrigatório)
28
- -- 5) Formulário do tipo de fornecimento -> id_form (opcional, char(8))
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,6 +1,6 @@
1
1
  {
2
2
  "name": "forlogic-core",
3
- "version": "2.5.1",
3
+ "version": "2.5.2",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
@@ -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