-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSP_ProcessarEventosXML.sql
More file actions
151 lines (126 loc) · 6.35 KB
/
SP_ProcessarEventosXML.sql
File metadata and controls
151 lines (126 loc) · 6.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE OR ALTER PROCEDURE [dbo].[sp_ProcessarEventosXML]
@EventIds VARCHAR(MAX)
AS
BEGIN
DROP TABLE IF EXISTS #EventsToUpdate;
DROP TABLE IF EXISTS #Events_WithCredits;
WITH Events AS (
SELECT
e.Id EventId, e.RelatedYear, e.RelatedMonth, e.EntityCode, CONVERT(XML, c.Content) ContentXML
FROM Event e
JOIN XMLContent c ON c.ReferenceId = e.Id
WHERE e.EventTypeEnum = 8
AND e.Id IN (SELECT CAST(value AS INT) FROM STRING_SPLIT(@EventIds, ','))
AND e.EventStatusEnum = 0
AND c.ContentReferenceEnum = 0
), Events_EConsignado AS (
SELECT
*
FROM Events
WHERE ContentXML.value('count(/eSocial/evtRemun/dmDev/infoPerApur/ideEstabLot/remunPerApur/itensRemun/descFolha)', 'int') > 0
)
SELECT
EventId, RelatedYear, RelatedMonth, ContentXML
INTO #EventsToUpdate
FROM Events;
SELECT eu.EventId, wc.*
INTO #Events_WithCredits
FROM (
SELECT
EventId, RelatedYear, RelatedMonth,
t.n.value('(../../matricula)[1]', 'varchar(50)') AS Matricula,
t.n.value('(../../../nrInsc)[1]', 'varchar(14)') AS Estabelecimento,
t.n.value('(../codRubr)[1]', 'varchar(10)') AS CodigoRubrica,
t.n.value('(/eSocial/evtRemun/ideTrabalhador/cpfTrab)[1]', 'varchar(11)') CPF
FROM #EventsToUpdate
CROSS APPLY ContentXML.nodes('/eSocial/evtRemun/dmDev/infoPerApur/ideEstabLot/remunPerApur/itensRemun[descFolha]/descFolha') AS t(n)
) eu
JOIN WorkerCredit wc ON UPPER(wc.Matricula) = UPPER(eu.Matricula) AND wc.Rubrica = eu.CodigoRubrica
AND wc.Competencia = RIGHT(CONCAT('0', eu.RelatedMonth, '/', eu.RelatedYear), 7);
DECLARE @EventId INT, @XML XML;
DECLARE events_cursor CURSOR FOR
SELECT DISTINCT EventId
FROM #EventsToUpdate;
OPEN events_cursor;
FETCH NEXT FROM events_cursor INTO @EventId;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @XML = ContentXML
FROM #EventsToUpdate
WHERE EventId = @EventId;
DECLARE @Matricula VARCHAR(50), @Rubrica VARCHAR(10), @InstFinanc VARCHAR(3), @NrContrato VARCHAR(50);
DECLARE descfolha_cursor CURSOR FOR
SELECT IfConcessoraCodigo, Contrato, Matricula, Rubrica
FROM #Events_WithCredits
WHERE EventId = @EventId;
OPEN descfolha_cursor;
FETCH NEXT FROM descfolha_cursor INTO @InstFinanc, @NrContrato, @Matricula, @Rubrica;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @InstFinanc = ISNULL(@InstFinanc, '');
SET @NrContrato = ISNULL(@NrContrato, '');
DECLARE @InstFinancXML XML = '<instFinanc>' + RIGHT('000' + @InstFinanc, 3) + '</instFinanc>';
DECLARE @ContratoXML XML = '<nrDoc>' + @NrContrato + '</nrDoc>';
DECLARE @MatriculaUpper VARCHAR(50) = UPPER(@Matricula);
DECLARE @MatriculaXML VARCHAR(50);
SELECT @MatriculaXML = t.n.value('.', 'varchar(50)')
FROM @XML.nodes('/eSocial/evtRemun/dmDev/infoPerApur/ideEstabLot/remunPerApur/matricula') AS t(n)
WHERE UPPER(t.n.value('.', 'varchar(50)')) = @MatriculaUpper;
DECLARE @DescFolhaCount INT = 0;
IF @MatriculaXML IS NOT NULL
BEGIN
SET @DescFolhaCount = @XML.value(
'count(/eSocial/evtRemun/dmDev/infoPerApur/ideEstabLot/remunPerApur[matricula=sql:variable("@MatriculaXML")]/itensRemun[codRubr=sql:variable("@Rubrica")]/descFolha)',
'int'
);
END
IF @DescFolhaCount > 0 AND @MatriculaXML IS NOT NULL
BEGIN
SET @XML.modify('
delete /eSocial/evtRemun/dmDev/infoPerApur/ideEstabLot/remunPerApur[matricula=sql:variable("@MatriculaXML")]/itensRemun[codRubr=sql:variable("@Rubrica")]/descFolha/instFinanc
');
SET @XML.modify('
delete /eSocial/evtRemun/dmDev/infoPerApur/ideEstabLot/remunPerApur[matricula=sql:variable("@MatriculaXML")]/itensRemun[codRubr=sql:variable("@Rubrica")]/descFolha/nrDoc
');
SET @XML.modify('
insert sql:variable("@InstFinancXML")
as last into (/eSocial/evtRemun/dmDev/infoPerApur/ideEstabLot/remunPerApur[matricula=sql:variable("@MatriculaXML")]/itensRemun[codRubr=sql:variable("@Rubrica")]/descFolha)[1]
');
SET @XML.modify('
insert sql:variable("@ContratoXML")
as last into (/eSocial/evtRemun/dmDev/infoPerApur/ideEstabLot/remunPerApur[matricula=sql:variable("@MatriculaXML")]/itensRemun[codRubr=sql:variable("@Rubrica")]/descFolha)[1]
');
END
ELSE
BEGIN
IF @MatriculaXML IS NOT NULL
BEGIN
DECLARE @AvisoXML XML = '<observacao>AVISO: Dados do credito nao encontrados na WorkerCredit para Matricula: ' + @Matricula + ', Rubrica: ' + @Rubrica + '</observacao>';
SET @XML.modify('
delete /eSocial/evtRemun/dmDev/infoPerApur/ideEstabLot/remunPerApur[matricula=sql:variable("@MatriculaXML")]/itensRemun[codRubr=sql:variable("@Rubrica")]/descFolha/observacao
');
SET @XML.modify('
insert sql:variable("@AvisoXML")
as last into (/eSocial/evtRemun/dmDev/infoPerApur/ideEstabLot/remunPerApur[matricula=sql:variable("@MatriculaXML")]/itensRemun[codRubr=sql:variable("@Rubrica")]/descFolha)[1]
');
END
END
FETCH NEXT FROM descfolha_cursor INTO @InstFinanc, @NrContrato, @Matricula, @Rubrica;
END
CLOSE descfolha_cursor;
DEALLOCATE descfolha_cursor;
UPDATE XMLContent
SET Content = CONVERT(NVARCHAR(MAX), @XML)
WHERE ReferenceId = @EventId AND ContentReferenceEnum = 0;
FETCH NEXT FROM events_cursor INTO @EventId;
END
CLOSE events_cursor;
DEALLOCATE events_cursor;
DROP TABLE #Events_WithCredits;
DROP TABLE #EventsToUpdate;
END
GO