DECLARE @TaxaProRata REAL, @BDEmpresaV9 VARCHAR (30), @IdCabecOrig VARCHAR(40) --Definir nome da empresa na v9: SET @BDEmpresaV9 = 'PRINOMEEMPRESA' --Definir Id do cabeçalho que pretende corrigir: SET @IdCabecOrig = 'identificador do cabeçalho' SELECT @TaxaProRata = TaxaProRata FROM ParametrosGCP INSERT INTO LinhasInternos ( [Id],[IdCabecInternos],[NumLinha],[TipoLinha],[Artigo],[Armazem],[Localizacao],[Lote],[Descricao],[Quantidade],[Unidade],[PrecUnit],[PrecoLiquido],[TaxaIva],[CodIva],[RegimeIva],[Desconto1],[Desconto2],[Desconto3],[DescontoComercial],[DATA],[DataEntrega],[FactorConv],[ArredFConv],[MovStk],[DataDocStk],[NumLinhaStkGerada],[Estado],[Anulado],[Fechado],[Formula],[VariavelA],[VariavelB],[VariavelC],[QntFormula],[ObraId],[ClasseId],[SubEmpId],[CategoriaId],[IdLinhaPai],[ModuloOrigemCopia],[IdLinhaOrigemCopia],[TaxaRecargo],[PercIncidenciaIVA],[TotalIliquido],[TotalDA],[TotalDC],[TotalDF],[TotalRecargo],[TotalIva],[IdLinhaReqInterna],[PCPadrao],[QntSatisfeita],[Margem],[PercentagemMargem],[ContabilizaTotais],[TipoCustoPrevisto],[CustoPrevisto],[PercIvaDedutivel],[TaxaProRata],[IvaNaoDedutivel],[Ecotaxa],[TaxaIvaEcotaxa],[TotalEcotaxa],[IvaRegraCalculo],[ItemId],[ItemCod],[ItemDesc],[WBSItem],[BaseIncidencia],[BaseCalculoIncidencia],[RegraCalculoIncidencia],[IdLinhaOrdemFabrico]--Especifico GPR ,[EstadoOrigem], [EstadoDestino] ) SELECT CASE WHEN L.Modulo = 'S' THEN L.Id ELSE L.IdLinhaOrig END AS [Id] , C.ID AS [IdCabecInternos],[NumLinha],[TipoLinha],L.[Artigo],[Armazem],[Localizacao],[Lote],L.[Descricao] , CASE DS.TipoDocumento WHEN '0' THEN -1 -- Stock Inicial WHEN '1' THEN -1 -- Entrada WHEN '8' THEN -1 -- Ganho ELSE 1 END * L.Quantidade AS [Quantidade] , L.[Unidade] , CASE DS.TipoDocumento WHEN '0' THEN -1 -- Stock Inicial WHEN '1' THEN -1 -- Entrada WHEN '8' THEN -1 -- Ganho ELSE 1 END * [PrecUnit] --DC , CASE DS.TipoDocumento WHEN '0' THEN -1 -- Stock Inicial WHEN '1' THEN -1 -- Entrada WHEN '8' THEN -1 -- Ganho ELSE 1 END * ((L.PrecUnit * L.Quantidade) - DescontoComercial) AS [PrecoLiquido] , I.Taxa AS [TaxaIva] , I.Iva AS [CodIva] , '0' AS [RegimeIva] , '0' AS [Desconto1] , '0' AS [Desconto2] , '0' AS [Desconto3] , [DescontoComercial] , L.[DATA] , L.DATA AS [DataEntrega] , [FactorConv],L.Arred [ArredFConv],'1' AS [MovStk],L.DATA AS [DataDocStk],L.NumLinha AS [NumLinhaStkGerada],'B' AS [Estado],'0' AS [Anulado],'0' AS [Fechado] , [Formula],[VariavelA],[VariavelB],[VariavelC] , [QntFormula],L.[ObraId],[ClasseId],[SubEmpId],[CategoriaId],[IdLinhaPai] , [ModuloOrigemCopia],[IdLinhaOrigemCopia],'0' AS [TaxaRecargo],A.PercIncidenciaIVA AS [PercIncidenciaIVA] , CASE DS.TipoDocumento WHEN '0' THEN -1 -- Stock Inicial WHEN '1' THEN -1 -- Entrada WHEN '8' THEN -1 -- Ganho ELSE 1 END * ROUND((L.PrecUnit*L.FactorConv*L.Quantidade),L.Arred) [TotalIliquido] , '0' AS [TotalDA],'0' AS [TotalDC],'0' AS [TotalDF],'0' AS [TotalRecargo] , '0' AS [TotalIva],[IdLinhaReqInterna],[PCPadrao],'0' AS [QntSatisfeita],'0' AS [Margem],'0' AS [PercentagemMargem],'1' AS [ContabilizaTotais],'0' AS [TipoCustoPrevisto] , CASE DS.TipoDocumento WHEN '0' THEN -1 -- Stock Inicial WHEN '1' THEN -1 -- Entrada WHEN '8' THEN -1 -- Ganho ELSE 1 END * L.PCM AS [CustoPrevisto] , A.[PercIvaDedutivel], @TaxaProRata AS [TaxaProRata] , A.PercIvaDedutivel [IvaNaoDedutivel] , '0' AS [Ecotaxa],'0' AS [TaxaIvaEcotaxa],'0' AS [TotalEcotaxa],'0' AS [IvaRegraCalculo],[ItemId],[ItemCod] , [ItemDesc],L.[WBSItem],'0' AS [BaseIncidencia],'0' AS [BaseCalculoIncidencia],'0' AS [RegraCalculoIncidencia] , [IdLinhaOrdemFabrico] -- Especifico GPR , CASE DS.TipoDocumento WHEN '0' THEN '' -- Stock Inicial WHEN '1' THEN '' -- Entrada WHEN '8' THEN '' -- Ganho ELSE 'DISP' END AS EstadoOrigem , CASE DS.TipoDocumento WHEN '0' THEN 'DISP' -- Stock Inicial WHEN '1' THEN 'DISP' -- Entrada WHEN '8' THEN 'DISP' -- Ganho ELSE '' END AS EstadoDestino FROM @BDEmpresaV9..LinhasSTK L WITH (NOLOCK) INNER JOIN Artigo A WITH (NOLOCK) ON L.Artigo=A.Artigo LEFT JOIN Iva I WITH (NOLOCK) ON A.IVA=I.Iva INNER JOIN CabecInternos C ON C.TipoDoc = L.TipoDoc AND C.NumDoc=l.NumDoc AND C.Serie=l.Serie AND C.Filial=l.Filial INNER JOIN DocumentosStk AS DS WITH (NOLOCK) ON L.TipoDoc=DS.Documento WHERE ds.Documento NOT IN ('ACM', 'DES', 'ENC', 'VPT') AND ds.TipoDocumento NOT IN ('3', '4', '5', '6', '7') AND ( ds.Interno = '0' OR ( ds.Interno = '1' AND ds.Documento IN ('AIN', 'AIP', 'DFM', 'DOF', 'EDR', 'EOF', 'SFM', 'SOF') ) ) AND L.Modulo = 'S' AND L.Id NOT IN (SELECT DISTINCT ID FROM LinhasInternos) ORDER BY L.NumLinha INSERT INTO [dbo].[LinhasInternosStatus] ( [IdLinha], [Quantidade], [QuantCopiada] ) SELECT IdLinha = L.Id, Quantidade = L.Quantidade, QuantCopiada = '0' FROM @BDEmpresaV9..LinhasSTK L WITH (NOLOCK) INNER JOIN DocumentosStk DS WITH (NOLOCK) ON L.TipoDoc = DS.Documento LEFT JOIN LinhasInternosStatus LIS ON L.id = LIS.idLinha WHERE ds.Documento NOT IN ('ACM', 'DES', 'ENC', 'VPT') AND ds.TipoDocumento NOT IN ('3', '4', '5', '6', '7') AND ( ds.Interno = '0' OR ( ds.Interno = '1' AND ds.Documento IN ('AIN', 'AIP', 'DFM', 'DOF', 'EDR', 'EOF', 'SFM', 'SOF') ) ) AND L.Modulo = 'S' AND LIS.Quantidade IS NULL INSERT INTO LinhasInternosStatus ( IdLinha, Quantidade, QuantCopiada ) SELECT LinhasInternos.id, LinhasInternos.Quantidade, 0 FROM LinhasInternos LEFT JOIN LinhasInternosStatus ON LinhasInternosStatus.IdLinha = LinhasInternos.Id WHERE LinhasInternosStatus.IdLinha IS NULL -- Inserir na tabela INV_Origens INSERT INTO [INV_Origens] ( Id, IdTipoOrigem, IdChave1, IdChave2, NumLinha, Moeda, Cambio, CambioMBase, CambioMAlt , ValorUnitario, ValorAdicional, ValorAbater, Quantidade, Unidade, FactorConv , ActualizaStock, ActualizaCusto, ActualizaPCU, ActualizaDUE, ActualizaDUS , DATA, Documento, Filial, Chave1, Chave2, NumChave1 , IDProjecto, WBSItem ) SELECT Id = NEWID() , IdTipoOrigem = tori.Id , IdCabecOrig = c.ID , IdLinhaOrig = CASE WHEN ls.Modulo = 'S' THEN ls.Id ELSE ls.IdLinhaOrig END , NumLinha = ls.NumLinha , Moeda = cori.Moeda , Cambio = ISNULL(cori.Cambio, 1) , CambioMBase = ISNULL(cori.CambioMBase, 1) , CambioMAlt = ISNULL(cori.CambioMAlt, 1) , ValorUnitario = ABS(ISNULL(ls.PrecUnit, 0)) , ValorAdicional = ISNULL(ls.DespesaAdicionalCompra, 0) , ValorAbater = ISNULL(ls.DescontoComercial, 0) , Quantidade = ls.Quantidade , Unidade = ls.Unidade , FactorConv = CASE WHEN ISNULL(ls.FactorConv, 0) = 0 THEN 1 ELSE ls.FactorConv END , ActualizaStock = 1 , ActualizaPC = CASE WHEN ISNULL(ds.TipoDocumento, -1) = 2 THEN 0 ELSE ls.ActPCM END , ActualizaPCU = CASE WHEN ISNULL(ds.TipoDocumento, -1) IN (2, 9) THEN 0 ELSE ls.ActPCU END , ActualizaDUE = CASE WHEN ISNULL(ds.TipoDocumento, -1) IN (2, 9) THEN 0 ELSE ls.ActUltEntrada END , ActualizaDUS = CASE WHEN ISNULL(ds.TipoDocumento, -1) IN (0, 1, 8) THEN 0 ELSE ls.ActUltSaida END , DATA = ls.DATA , Documento = cori.TipoDoc + ' ' + cori.Serie + '/' + CAST(cori.NumDoc AS NVARCHAR(15)) , Filial = cori.Filial , Chave1 = cori.TipoDoc , Chave2 = cori.Serie , NumChave1 = cori.NumDoc , IDProjecto = ls.ObraID , WBSItem = ls.WBSItem FROM @BDEmpresaV9..LinhasSTK ls INNER JOIN @BDEmpresaV9..CabecStk C WITH (NOLOCK) ON C.TipoDoc = ls.TipoDoc AND c.NumDoc=ls.NumDoc AND c.Serie=ls.Serie AND c.Filial=ls.Filial INNER JOIN CabecInternos cori ON C.id = cori.Id INNER JOIN INV_TiposOrigem tori ON tori.Apl = 'INT' LEFT JOIN INV_Origens ori ON ls.IdCabecOrig = ori.IdChave1 AND ((ls.Modulo <> 'S' AND ls.IdLinhaOrig = ori.IdChave2) OR (ls.Modulo = 'S' AND ls.Id = ori.IdChave2)) LEFT JOIN DocumentosStk ds ON ls.Modulo = 'S' AND ls.TipoDoc = ds.Documento WHERE ls.Artigo IS NOT NULL AND ori.DATA IS NULL GO EXEC STD_DropTempTable '#TMP_OrderedLinhasStk' GO SELECT ROW_NUMBER() OVER (ORDER BY l.Artigo, l.DATA, l.EntradaSaida, l.Armazem, l.Localizacao, l.Lote, l.Filial, l.TipoDoc, l.Serie, l.NumDoc, CASE WHEN L.Modulo = 'S' AND L.TipoDoc = 'VPT' THEN CAST(l.NumLinha AS NVARCHAR) ELSE '0' END, l.NumLinha ) ROW, l.NumLinha, l.DATA, l.Artigo, l.Armazem, l.Localizacao, l.Lote, l.EntradaSaida, l.Quantidade, l.TipoDoc, C.Id AS IdCabecOrig, l.IdLinhaOrig, l.Id, l.Modulo INTO #TMP_OrderedLinhasStk FROM @BDEmpresaV9..LinhasSTK l WITH (NOLOCK) INNER JOIN @BDEmpresaV9..CabecStk C WITH (NOLOCK) ON C.TipoDoc = L.TipoDoc AND c.NumDoc=l.NumDoc AND c.Serie=l.Serie AND c.Filial=l.Filial LEFT JOIN [Artigo] a WITH (NOLOCK) ON a.Artigo = l.Artigo WHERE ISNULL(a.TratamentoDim, 0) <> 1 --Artigos PAi SELECT Id = NEWID() , IdOrigem = ori.Id , DATA = CASE WHEN tori.Modulo = 'T' THEN (CASE WHEN ls.NumLinha > 10000 THEN DATEADD(s, ls.NumLinha - 10000, ls.DATA) ELSE DATEADD(s, ls.NumLinha, DATEADD(ms, 20, ls.DATA)) END) ELSE LS.DATA END , Artigo = ls.Artigo , Armazem = ls.Armazem , Localizacao = ls.Localizacao , Lote = ISNULL(ls.Lote, '') , TipoMovimento = CASE WHEN ls.Quantidade < 0 THEN CASE WHEN ls.EntradaSaida = 'S' THEN 'E' ELSE 'S' END ELSE ls.EntradaSaida END , Quantidade = ABS(ls.Quantidade * ori.FactorConv) , EstadoStock = 'DISP' , DataIntegracao = DATEADD (ms,ls.ROW *10, GETDATE()) , LinhaRow = ls.[ROW] INTO #TMP_Movimentos FROM #TMP_OrderedLinhasStk ls LEFT JOIN [DocumentosStk] ds WITH (NOLOCK) ON ls.TipoDoc=ds.Documento AND ls.Modulo = 'S' LEFT JOIN [DocumentosStk] ds1 WITH (NOLOCK) ON ls.TipoDoc = ds1.Documento AND ls.Modulo = 'S' AND ds1.Documento IN ('AIN', 'AIP') INNER JOIN [INV_Origens] ori WITH (NOLOCK) ON ls.IdCabecOrig = ori.IdChave1 AND ((ls.IdLinhaOrig = ori.IdChave2 AND ds1.Documento IS NULL) OR (ls.Id = ori.IdChave2 AND ds1.Documento IS NOT NULL)) INNER JOIN [INV_TiposOrigem] tori WITH (NOLOCK) ON ori.IdTipoOrigem = tori.Id LEFT JOIN [INV_Movimentos] mov WITH (NOLOCK) ON ori.Id = mov.IdOrigem WHERE tori.apl IN ('CMP', 'VND', 'INT', 'INV') AND ((ls.Tipodoc NOT IN ('ACM', 'DES', 'ENC', 'VPT') AND ls.Modulo = 'S') OR (ls.Modulo <> 'S')) AND (ds.Documento IS NULL OR ( ds.Interno ='0' OR ( ds.Interno ='1' AND ds.Documento IN ('AIN', 'AIP', 'DFM', 'DOF', 'EDR', 'EOF', 'SFM', 'SOF') ) ) ) AND ls.IdCabecOrig=@IdCabecOrig AND mov.Artigo IS NULL -- Inserir na tabela Inv_Movimentos INSERT INTO [INV_Movimentos] ( Id, IdOrigem, DATA, Artigo, Armazem, Localizacao, Lote, TipoMovimento, Quantidade, EstadoStock, DataIntegracao ) SELECT Id, IdOrigem, DATA, Artigo, Armazem, Localizacao, Lote, TipoMovimento, Quantidade, EstadoStock, DataIntegracao FROM #TMP_Movimentos ORDER BY DATA, LinhaRow SELECT Id = NEWID() , IdOrigem = ori.Id , IdMovimentoStock = mov.id , DATA = CASE WHEN tori.Modulo = 'T' THEN (CASE WHEN ls.NumLinha > 10000 THEN DATEADD(s, ls.NumLinha - 10000, ls.DATA) ELSE DATEADD(s, ls.NumLinha, DATEADD(ms, 20, ls.DATA)) END) ELSE LS.DATA END , TipoLancamentoCusteio = 0 --Normal , Artigo = ls.Artigo , GrupoCustos = arm.GrupoCustos , Lote = CASE WHEN grp.ValorizacaoLote = 1 THEN ISNULL(ls.Lote,'') ELSE '' END , PrecUnit = ABS(ls.PrecUnit)/(CASE WHEN ori.FactorConv = 0 THEN 1 ELSE ori.FactorConv END) , CustosAdicionais = CASE WHEN ls.Quantidade = 0 THEN ABS(ls.DespesaAdicionalCompra) ELSE ABS(ls.DespesaAdicionalCompra/(ls.Quantidade * (CASE WHEN ori.FactorConv = 0 THEN 1 ELSE ori.FactorConv END))) END , Desconto = CASE WHEN ls.Quantidade = 0 THEN ABS(ls.DescontoComercial) ELSE ABS(ls.DescontoComercial/(ls.Quantidade * (CASE WHEN ori.FactorConv = 0 THEN 1 ELSE ori.FactorConv END))) END , TipoMovimento = CASE WHEN ls.EntradaSaida = 'I' THEN 'E' ELSE CASE WHEN ls.PrecUnit < 0 THEN CASE WHEN ls.EntradaSaida = 'S' THEN 'E' ELSE 'S' END ELSE ls.EntradaSaida END END , Quantidade = ABS(ls.Quantidade * ori.FactorConv) , LinhaRow = ls.[ROW] INTO #TMP_Custeio FROM (SELECT ROW_NUMBER() OVER (ORDER BY Artigo, ls.DATA, EntradaSaida, Armazem, Localizacao, Lote, ls.Filial, ls.TipoDoc, ls.Serie, ls.NumDoc, CASE WHEN Modulo = 'S' AND ls.TipoDoc = 'VPT' THEN CAST(NumLinha AS NVARCHAR) ELSE '0' END, NumLinha ) ROW, NumLinha, Ls.DATA, Artigo, Armazem, Localizacao, Lote, EntradaSaida, Quantidade, ls.TipoDoc, C.ID AS IdCabecOrig, IdLinhaOrig, Modulo,ActPCM,TipoLinha, PrecUnit, DespesaAdicionalCompra,DescontoComercial, Arred FROM @BDEmpresaV9..LinhasSTK ls INNER JOIN @BDEmpresaV9..CabecStk C WITH (NOLOCK) ON C.TipoDoc = ls.TipoDoc AND c.NumDoc=ls.NumDoc AND c.Serie=ls.Serie AND c.Filial=ls.Filial ) ls INNER JOIN [INV_Origens] ori ON ls.IdCabecOrig = ori.IdChave1 AND ls.IdLinhaOrig = ori.IdChave2 AND ori.ActualizaCusto = 1 INNER JOIN [INV_Movimentos] mov ON mov.IdOrigem = ori.Id INNER JOIN [INV_TiposOrigem] tori ON ori.IdTipoOrigem = tori.Id INNER JOIN [Armazens] arm ON arm.Armazem=ls.Armazem INNER JOIN [INV_GruposCustos] grp ON grp.Grupo = arm.GrupoCustos LEFT JOIN [INV_Custeio] csut ON ori.Id = csut.IdOrigem LEFT JOIN [INV_Origens] ori2 ON ori2.IdChave1 = ori.IdChave1 AND ori2.IdChave3 = ori.IdChave3 AND ori2.NumLinha = ori.NumLinha + 10000 LEFT JOIN [INV_Movimentos] mov2 ON mov2.IdOrigem = ori2.Id LEFT JOIN [Armazens] arm2 ON arm2.Armazem = mov2.Armazem WHERE ls.Modulo IN ('C', 'V', 'N', 'T', 'S') AND ((ls.Tipodoc NOT IN ('ACM', 'DES', 'ENC', 'VPT', 'DFM', 'DOF', 'EDR', 'SFM', 'SOF') AND ls.Modulo = 'S') OR (ls.Modulo <> 'S')) AND (LS.ActPCM = 1 OR (tori.Apl = 'INV' AND tori.Modulo = 'T' AND arm2.GrupoCustos <> arm.GrupoCustos)) AND LS.TipoLinha <> '65' AND csut.DATA IS NULL AND ((ls.EntradaSaida = 'E' AND (tori.Apl = 'INV' AND tori.Modulo = 'S')) OR (tori.Apl <> 'INV' OR tori.Modulo <> 'S')) -- Ignora as saídas de Stock das composições que atualizam PCM e não faz sentido AND ls.IdCabecOrig=@IdCabecOrig INSERT INTO [INV_Custeio] ( [Id], [IdOrigem], [IdMovimentoStock], [DATA], [TipoLancamentoCusteio], [Artigo], [GrupoCustos], [Lote], [ValorMBase], [TipoMovimento], [Quantidade] ) SELECT Id, IdOrigem, IdMovimentoStock, DATA, TipoLancamentoCusteio, Artigo, GrupoCustos, Lote, PrecUnit+CustosAdicionais-Desconto, TipoMovimento, Quantidade FROM #TMP_Custeio ORDER BY DATA, LinhaRow